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" ) );
133 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a S3DMODEL" ) );
137 wxASSERT( a3DModel.
m_Meshes !=
nullptr );
160 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a wxString" ) );
192 const GLenum err = glewInit();
196 const wxString msgError = (
const char*) glewGetErrorString( err );
198 wxLogMessage( msgError );
202 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::ogl_initialize Using GLEW version %s" ),
203 From_UTF8( (
char*) glewGetString( GLEW_VERSION ) ) );
206 SetOpenGLInfo( (
const char*) glGetString( GL_VENDOR ), (
const char*) glGetString( GL_RENDERER ),
207 (
const char*) glGetString( GL_VERSION ) );
209 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
210 glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
211 glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
213 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
214 glEnable( GL_DEPTH_TEST );
215 glEnable( GL_CULL_FACE );
216 glShadeModel( GL_SMOOTH );
217 glEnable( GL_LINE_SMOOTH );
218 glEnable( GL_NORMALIZE );
222 const GLfloat ambient[] = { 0.01f, 0.01f, 0.01f, 1.0f };
223 const GLfloat diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
224 const GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
227 const GLfloat position[] = { 0.0f, 0.0f, 2.0f *
RANGE_SCALE_3D, 0.0f };
229 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
231 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
232 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
233 glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
234 glLightfv( GL_LIGHT0, GL_POSITION, position );
235 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
241 glEnable( GL_COLOR_MATERIAL );
242 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
246 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
247 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
256 if( !IsShownOnScreen() )
258 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint !IsShown" ) );
271 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint creating gl context failed" ) );
293 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint m_reload_is_needed" ) );
305 glViewport( 0, 0, clientSize.x, clientSize.y );
310 glEnable( GL_DEPTH_TEST );
311 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
312 glClearDepth( 1.0f );
313 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
316 glMatrixMode( GL_PROJECTION );
318 glMatrixMode( GL_MODELVIEW );
320 glEnable( GL_LIGHTING );
321 glEnable( GL_LIGHT0 );
330 glScaled( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
331 modelunit_to_3d_units_factor );
336 glTranslatef( -model_center.x, -model_center.y, -model_center.z );
342 glDepthMask( GL_FALSE );
343 glEnable( GL_BLEND );
344 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
348 glDisable( GL_BLEND );
349 glDepthMask( GL_TRUE );
357 glViewport( 0, 0, clientSize.y / 8 , clientSize.y / 8 );
358 glClear( GL_DEPTH_BUFFER_BIT );
360 glMatrixMode( GL_PROJECTION );
364 glMatrixMode( GL_MODELVIEW );
367 const glm::mat4 TranslationMatrix = glm::translate( glm::mat4(1.0f),
370 const glm::mat4 ViewMatrix = TranslationMatrix *
m_trackBallCamera.GetRotationMatrix();
372 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
376 glColor3f( 0.9f, 0.0f, 0.0f );
380 glColor3f( 0.0f, 0.9f, 0.0f );
384 glColor3f( 0.0f, 0.0f, 0.9f );
399 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnEraseBackground" ) );
406 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnMouseWheel" ) );
408 if( event.ShiftDown() )
415 else if( event.ControlDown() )
434#ifdef USE_OSX_MAGNIFY_EVENT
435void EDA_3D_MODEL_VIEWER::OnMagnify( wxMouseEvent& event )
448 if( event.Dragging() )
450 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.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
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.