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 int glVersion = gladLoaderLoadGL();
196 wxLogMessage( wxT(
"Failed to load OpenGL via loader" ) );
200 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::ogl_initialize Using OpenGL version %s" ),
201 From_UTF8( (
char*) glGetString( GL_VERSION ) ) );
204 SetOpenGLInfo( (
const char*) glGetString( GL_VENDOR ), (
const char*) glGetString( GL_RENDERER ),
205 (
const char*) glGetString( GL_VERSION ) );
207 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
208 glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
209 glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
211 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
212 glEnable( GL_DEPTH_TEST );
213 glEnable( GL_CULL_FACE );
214 glShadeModel( GL_SMOOTH );
215 glEnable( GL_LINE_SMOOTH );
216 glEnable( GL_NORMALIZE );
220 const GLfloat ambient[] = { 0.01f, 0.01f, 0.01f, 1.0f };
221 const GLfloat diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
222 const GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
225 const GLfloat position[] = { 0.0f, 0.0f, 2.0f *
RANGE_SCALE_3D, 0.0f };
227 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
229 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
230 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
231 glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
232 glLightfv( GL_LIGHT0, GL_POSITION, position );
233 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
239 glEnable( GL_COLOR_MATERIAL );
240 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
244 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
245 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
254 if( !IsShownOnScreen() )
256 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint !IsShown" ) );
269 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint creating gl context failed" ) );
291 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint m_reload_is_needed" ) );
303 glViewport( 0, 0, clientSize.x, clientSize.y );
308 glEnable( GL_DEPTH_TEST );
309 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
310 glClearDepth( 1.0f );
311 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
314 glMatrixMode( GL_PROJECTION );
316 glMatrixMode( GL_MODELVIEW );
318 glEnable( GL_LIGHTING );
319 glEnable( GL_LIGHT0 );
328 glScaled( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
329 modelunit_to_3d_units_factor );
334 glTranslatef( -model_center.x, -model_center.y, -model_center.z );
340 glDepthMask( GL_FALSE );
341 glEnable( GL_BLEND );
342 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
346 glDisable( GL_BLEND );
347 glDepthMask( GL_TRUE );
355 glViewport( 0, 0, clientSize.y / 8 , clientSize.y / 8 );
356 glClear( GL_DEPTH_BUFFER_BIT );
358 glMatrixMode( GL_PROJECTION );
362 glMatrixMode( GL_MODELVIEW );
365 const glm::mat4 TranslationMatrix = glm::translate( glm::mat4(1.0f),
368 const glm::mat4 ViewMatrix = TranslationMatrix *
m_trackBallCamera.GetRotationMatrix();
370 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
374 glColor3f( 0.9f, 0.0f, 0.0f );
378 glColor3f( 0.0f, 0.9f, 0.0f );
382 glColor3f( 0.0f, 0.0f, 0.9f );
397 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnEraseBackground" ) );
404 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnMouseWheel" ) );
406 if( event.ShiftDown() )
413 else if( event.ControlDown() )
432#ifdef USE_OSX_MAGNIFY_EVENT
433void EDA_3D_MODEL_VIEWER::OnMagnify( wxMouseEvent& event )
446 if( event.Dragging() )
448 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.