35#include <wx/dcclient.h>
53#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
78#ifdef USE_OSX_MAGNIFY_EVENT
79 EVT_MAGNIFY( EDA_3D_MODEL_VIEWER::OnMagnify )
90#define RANGE_SCALE_3D 8.0f
96 wxDefaultPosition, wxDefaultSize,
97 wxFULL_REPAINT_ON_RESIZE ),
101 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::EDA_3D_MODEL_VIEWER" ) );
115 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::~EDA_3D_MODEL_VIEWER" ) );
134 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a S3DMODEL" ) );
138 wxASSERT( a3DModel.
m_Meshes !=
nullptr );
161 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a wxString" ) );
193 const int glVersion = gladLoaderLoadGL();
197 wxLogMessage( wxT(
"Failed to load OpenGL via loader" ) );
201 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::ogl_initialize Using OpenGL version %s" ),
202 From_UTF8( (
char*) glGetString( GL_VERSION ) ) );
205 SetOpenGLInfo( (
const char*) glGetString( GL_VENDOR ), (
const char*) glGetString( GL_RENDERER ),
206 (
const char*) glGetString( GL_VERSION ) );
208 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
209 glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
210 glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
212 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
213 glEnable( GL_DEPTH_TEST );
214 glEnable( GL_CULL_FACE );
215 glShadeModel( GL_SMOOTH );
216 glEnable( GL_LINE_SMOOTH );
217 glEnable( GL_NORMALIZE );
221 const GLfloat ambient[] = { 0.01f, 0.01f, 0.01f, 1.0f };
222 const GLfloat diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
223 const GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
226 const GLfloat position[] = { 0.0f, 0.0f, 2.0f *
RANGE_SCALE_3D, 0.0f };
228 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
230 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
231 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
232 glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
233 glLightfv( GL_LIGHT0, GL_POSITION, position );
234 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
240 glEnable( GL_COLOR_MATERIAL );
241 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
245 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
246 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
255 if( !IsShownOnScreen() )
257 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint !IsShown" ) );
275 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint creating gl context failed" ) );
297 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint m_reload_is_needed" ) );
309 glViewport( 0, 0, clientSize.x, clientSize.y );
314 glEnable( GL_DEPTH_TEST );
315 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
316 glClearDepth( 1.0f );
317 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
320 glMatrixMode( GL_PROJECTION );
322 glMatrixMode( GL_MODELVIEW );
324 glEnable( GL_LIGHTING );
325 glEnable( GL_LIGHT0 );
334 glScaled( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
335 modelunit_to_3d_units_factor );
340 glTranslatef( -model_center.x, -model_center.y, -model_center.z );
346 glDepthMask( GL_FALSE );
347 glEnable( GL_BLEND );
348 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
352 glDisable( GL_BLEND );
353 glDepthMask( GL_TRUE );
361 glViewport( 0, 0, clientSize.y / 8 , clientSize.y / 8 );
362 glClear( GL_DEPTH_BUFFER_BIT );
364 glMatrixMode( GL_PROJECTION );
368 glMatrixMode( GL_MODELVIEW );
371 const glm::mat4 TranslationMatrix = glm::translate( glm::mat4(1.0f),
374 const glm::mat4 ViewMatrix = TranslationMatrix *
m_trackBallCamera.GetRotationMatrix();
376 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
380 glColor3f( 0.9f, 0.0f, 0.0f );
384 glColor3f( 0.0f, 0.9f, 0.0f );
388 glColor3f( 0.0f, 0.0f, 0.9f );
403 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnEraseBackground" ) );
410 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnMouseWheel" ) );
412 if( event.ShiftDown() )
419 else if( event.ControlDown() )
438#ifdef USE_OSX_MAGNIFY_EVENT
439void EDA_3D_MODEL_VIEWER::OnMagnify( wxMouseEvent& event )
452 if( event.Dragging() )
454 if( event.LeftIsDown() )
@ NORMAL
Use all material properties from model file.
#define RANGE_SCALE_3D
This defines the range that all coord will have to be rendered.
void SetOpenGLInfo(const char *aVendor, const char *aRenderer, const char *aVersion)
A setter for OpenGL info when it's initialized.
void SetOpenGLBackendInfo(wxString aBackend)
A setter for OpenGL backend info after the canvas is created.
Implement a canvas based on a wxGLCanvas.
MODEL_3D * m_ogl_3dmodel
Class holder for 3d model to display on openGL.
void OnMiddleDown(wxMouseEvent &event)
EDA_3D_MODEL_VIEWER(wxWindow *aParent, const wxGLAttributes &aGLAttribs, S3D_CACHE *aCacheManager=nullptr)
Create a new 3D Canvas with a attribute list.
void OnMouseMove(wxMouseEvent &event)
void OnEraseBackground(wxEraseEvent &event)
S3D_CACHE * m_cacheManager
Optional cache manager.
void ogl_set_arrow_material()
void Clear3DModel()
Unload the displayed 3D model.
bool m_reload_is_needed
Flag that we have a new model and it need to be reloaded when the paint is called.
void OnLeftDown(wxMouseEvent &event)
double m_BiuTo3dUnits
factor to convert the model or any other items to keep it in relation to the +/-RANGE_SCALE_3D (it is...
void OnRightClick(wxMouseEvent &event)
void Set3DModel(const S3DMODEL &a3DModel)
Set this model to be displayed.
void OnPaint(wxPaintEvent &event)
bool m_ogl_initialized
Flag if open gl was initialized.
const S3DMODEL * m_3d_model
Original 3d model data.
TRACK_BALL m_trackBallCamera
Camera used in this canvas.
wxGLContext * m_glRC
openGL context
void OnMiddleUp(wxMouseEvent &event)
void OnLeftUp(wxMouseEvent &event)
void OnMouseWheel(wxMouseEvent &event)
void UnlockCtx(wxGLContext *aContext)
Allow other canvases to bind an OpenGL context.
void DestroyCtx(wxGLContext *aContext)
Destroy a managed OpenGL context.
void LockCtx(wxGLContext *aContext, wxGLCanvas *aCanvas)
Set a context as current and prevents other canvases from switching it.
wxGLContext * CreateCtx(wxGLCanvas *aCanvas, const wxGLContext *aOther=nullptr)
Create a managed OpenGL context.
static wxString DetectGLBackend(wxGLCanvas *aCanvas)
HIDPI_GL_CANVAS(const KIGFX::VC_SETTINGS &aSettings, wxWindow *aParent, const wxGLAttributes &aGLAttribs, wxWindowID aId=wxID_ANY, const wxPoint &aPos=wxDefaultPosition, const wxSize &aSize=wxDefaultSize, long aStyle=0, const wxString &aName=wxGLCanvasName, const wxPalette &aPalette=wxNullPalette)
virtual wxSize GetNativePixelSize() const
wxPoint GetNativePosition(const wxPoint &aPoint) const
Convert the given point from client coordinates to native pixel coordinates.
GL_CONTEXT_MANAGER * GetGLContextManager()
Cache for storing the 3D shapes.
#define UNITS3D_TO_UNITSPCB
Implements a model viewer canvas.
Implements a model viewer canvas.
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
This file contains miscellaneous commonly used macros and functions.
void DrawRoundArrow(SFVEC3F aPosition, SFVEC3F aTargetPos, float aSize)
Draw a round arrow.
PGM_BASE & Pgm()
The global program "get" accessor.
wxString From_UTF8(const char *cstring)
Store the a model based on meshes and materials.
SMATERIAL * m_Materials
The materials list of this model.
unsigned int m_MeshesSize
Number of meshes in the array.
SMESH * m_Meshes
The meshes list of this model.
unsigned int m_MaterialsSize
Number of materials in the material array.