34#include "../3d_rendering/opengl/opengl_utils.h"
35#include "../3d_cache/3d_cache.h"
36#include <wx/dcclient.h>
47#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
72#ifdef USE_OSX_MAGNIFY_EVENT
73 EVT_MAGNIFY( EDA_3D_MODEL_VIEWER::OnMagnify )
84#define RANGE_SCALE_3D 8.0f
89 HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize,
90 wxFULL_REPAINT_ON_RESIZE ),
92 m_cacheManager( aCacheManager )
94 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::EDA_3D_MODEL_VIEWER" ) );
113 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::~EDA_3D_MODEL_VIEWER" ) );
130 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a S3DMODEL" ) );
134 wxASSERT( a3DModel.
m_Meshes !=
nullptr );
157 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::Set3DModel with a wxString" ) );
187 const GLenum err = glewInit();
191 const wxString msgError = (
const char*) glewGetErrorString( err );
193 wxLogMessage( msgError );
197 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::ogl_initialize Using GLEW version %s" ),
198 FROM_UTF8( (
char*) glewGetString( GLEW_VERSION ) ) );
201 glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
202 glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
203 glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
205 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
206 glEnable( GL_DEPTH_TEST );
207 glEnable( GL_CULL_FACE );
208 glShadeModel( GL_SMOOTH );
209 glEnable( GL_LINE_SMOOTH );
210 glEnable( GL_NORMALIZE );
214 const GLfloat ambient[] = { 0.01f, 0.01f, 0.01f, 1.0f };
215 const GLfloat diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
216 const GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
219 const GLfloat position[] = { 0.0f, 0.0f, 2.0f *
RANGE_SCALE_3D, 0.0f };
221 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
223 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
224 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
225 glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
226 glLightfv( GL_LIGHT0, GL_POSITION, position );
227 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
233 glEnable( GL_COLOR_MATERIAL );
234 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
238 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
239 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
248 if( !IsShownOnScreen() )
250 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint !IsShown" ) );
263 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint creating gl context failed" ) );
285 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnPaint m_reload_is_needed" ) );
297 glViewport( 0, 0, clientSize.x, clientSize.y );
302 glEnable( GL_DEPTH_TEST );
303 glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
304 glClearDepth( 1.0f );
305 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
308 glMatrixMode( GL_PROJECTION );
310 glMatrixMode( GL_MODELVIEW );
312 glEnable( GL_LIGHTING );
313 glEnable( GL_LIGHT0 );
322 glScaled( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
323 modelunit_to_3d_units_factor );
328 glTranslatef( -model_center.x, -model_center.y, -model_center.z );
334 glDepthMask( GL_FALSE );
335 glEnable( GL_BLEND );
336 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
340 glDisable( GL_BLEND );
341 glDepthMask( GL_TRUE );
349 glViewport( 0, 0, clientSize.y / 8 , clientSize.y / 8 );
350 glClear( GL_DEPTH_BUFFER_BIT );
352 glMatrixMode( GL_PROJECTION );
356 glMatrixMode( GL_MODELVIEW );
359 const glm::mat4 TranslationMatrix = glm::translate( glm::mat4(1.0f),
364 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
368 glColor3f( 0.9f, 0.0f, 0.0f );
372 glColor3f( 0.0f, 0.9f, 0.0f );
376 glColor3f( 0.0f, 0.0f, 0.9f );
391 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnEraseBackground" ) );
398 wxLogTrace(
m_logTrace, wxT(
"EDA_3D_MODEL_VIEWER::OnMouseWheel" ) );
400 if( event.ShiftDown() )
407 else if( event.ControlDown() )
426#ifdef USE_OSX_MAGNIFY_EVENT
427void EDA_3D_MODEL_VIEWER::OnMagnify( wxMouseEvent& event )
440 if( event.Dragging() )
442 if( event.LeftIsDown() )
#define RANGE_SCALE_3D
This defines the range that all coord will have to be rendered.
glm::mat4 GetRotationMatrix() const
Get the rotation matrix to be applied in a transformation camera.
const glm::mat4 & GetProjectionMatrix() const
bool SetCurWindowSize(const wxSize &aSize)
Update the windows size of the camera.
const glm::mat4 & GetViewMatrix() const
void SetCurMousePosition(const wxPoint &aPosition)
Update the current mouse position without make any new calculations on camera.
Class to handle configuration and automatic determination of the DPI scale to use for canvases.
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)
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)
EDA_3D_MODEL_VIEWER(wxWindow *aParent, const int *aAttribList=nullptr, S3D_CACHE *aCacheManager=nullptr)
Create a new 3D Canvas with a attribute list.
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.
static GL_CONTEXT_MANAGER & Get()
Return the GL_CONTEXT_MANAGER instance (singleton).
wxGLContext * CreateCtx(wxGLCanvas *aCanvas, const wxGLContext *aOther=nullptr)
Create a managed OpenGL context.
wxGLCanvas wrapper for HiDPI/Retina support.
void SetScaleFactor(double aFactor)
Set the canvas scale factor, probably for a hi-DPI display.
virtual wxSize GetNativePixelSize() const
wxPoint GetNativePosition(const wxPoint &aPoint) const
Convert the given point from client coordinates to native pixel coordinates.
static void EndDrawMulti()
Cleanup render states after drawing multiple models.
static void BeginDrawMulti(bool aUseColorInformation)
Set some basic render states before drawing multiple models.
void DrawTransparent(float aOpacity, bool aUseSelectedMaterial, SFVEC3F aSelectionColor=SFVEC3F(0.0f)) const
Render the model into the current context.
void DrawOpaque(bool aUseSelectedMaterial, SFVEC3F aSelectionColor=SFVEC3F(0.0f)) const
Render the model into the current context.
const BBOX_3D & GetBBox() const
Get the main bounding box.
Cache for storing the 3D shapes.
S3DMODEL * GetModel(const wxString &aModelFileName, const wxString &aBasePath)
Attempt to load the scene data for a model and to translate it into an S3D_MODEL structure for displa...
void Drag(const wxPoint &aNewMousePosition) override
Calculate a new mouse drag position.
#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.
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
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...
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
SFVEC3F GetCenter() const
Return the center point of the bounding box.
float GetMaxDimension() const
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.