36#include <wx/dcclient.h> 
   49#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM ) 
   74#ifdef USE_OSX_MAGNIFY_EVENT 
   75     EVT_MAGNIFY(   EDA_3D_MODEL_VIEWER::OnMagnify )
 
   86#define RANGE_SCALE_3D 8.0f 
   92                         wxDefaultPosition, wxDefaultSize,
 
   93                         wxFULL_REPAINT_ON_RESIZE ),
 
   97    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::EDA_3D_MODEL_VIEWER" ) );
 
 
  111    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::~EDA_3D_MODEL_VIEWER" ) );
 
 
  129    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::Set3DModel with a S3DMODEL" ) );
 
  133    wxASSERT( a3DModel.
m_Meshes != 
nullptr );
 
 
  156    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::Set3DModel with a wxString" ) );
 
 
  186    const GLenum err = glewInit();
 
  190        const wxString msgError = (
const char*) glewGetErrorString( err );
 
  192        wxLogMessage( msgError );
 
  196        wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::ogl_initialize Using GLEW version %s" ),
 
  197                    From_UTF8( (
char*) glewGetString( GLEW_VERSION ) ) );
 
  200    SetOpenGLInfo( (
const char*) glGetString( GL_VENDOR ), (
const char*) glGetString( GL_RENDERER ),
 
  201                   (
const char*) glGetString( GL_VERSION ) );
 
  203    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
 
  204    glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
 
  205    glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
 
  207    glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
 
  208    glEnable( GL_DEPTH_TEST );
 
  209    glEnable( GL_CULL_FACE );
 
  210    glShadeModel( GL_SMOOTH );
 
  211    glEnable( GL_LINE_SMOOTH );
 
  212    glEnable( GL_NORMALIZE );
 
  216    const GLfloat ambient[]  = { 0.01f, 0.01f, 0.01f, 1.0f };
 
  217    const GLfloat diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
 
  218    const GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
 
  221    const GLfloat position[] = { 0.0f, 0.0f, 2.0f * 
RANGE_SCALE_3D, 0.0f };
 
  223    const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
 
  225    glLightfv( GL_LIGHT0, GL_AMBIENT,  ambient );
 
  226    glLightfv( GL_LIGHT0, GL_DIFFUSE,  diffuse );
 
  227    glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
 
  228    glLightfv( GL_LIGHT0, GL_POSITION, position );
 
  229    glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
 
 
  235    glEnable( GL_COLOR_MATERIAL );
 
  236    glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
 
  240    glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
 
  241    glMaterialf(  GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
 
 
  250    if( !IsShownOnScreen() )
 
  252        wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::OnPaint !IsShown" ) );
 
  265        wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::OnPaint creating gl context failed" ) );
 
  287        wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::OnPaint m_reload_is_needed" ) );
 
  299    glViewport( 0, 0, clientSize.x, clientSize.y );
 
  304    glEnable( GL_DEPTH_TEST );
 
  305    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
 
  306    glClearDepth( 1.0f );
 
  307    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
  310    glMatrixMode( GL_PROJECTION );
 
  312    glMatrixMode( GL_MODELVIEW );
 
  314    glEnable( GL_LIGHTING );
 
  315    glEnable( GL_LIGHT0 );
 
  324        glScaled( modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
 
  325                  modelunit_to_3d_units_factor );
 
  330        glTranslatef( -model_center.x, -model_center.y, -model_center.z );
 
  336        glDepthMask( GL_FALSE );
 
  337        glEnable( GL_BLEND );
 
  338        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 
  342        glDisable( GL_BLEND );
 
  343        glDepthMask( GL_TRUE );
 
  351    glViewport( 0, 0, clientSize.y / 8 , clientSize.y / 8 );
 
  352    glClear( GL_DEPTH_BUFFER_BIT );
 
  354    glMatrixMode( GL_PROJECTION );
 
  358    glMatrixMode( GL_MODELVIEW );
 
  361    const glm::mat4 TranslationMatrix = glm::translate( glm::mat4(1.0f),
 
  364    const glm::mat4 ViewMatrix = TranslationMatrix * 
m_trackBallCamera.GetRotationMatrix();
 
  366    glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
 
  370    glColor3f( 0.9f, 0.0f, 0.0f );
 
  374    glColor3f( 0.0f, 0.9f, 0.0f );
 
  378    glColor3f( 0.0f, 0.0f, 0.9f );
 
 
  393    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::OnEraseBackground" ) );
 
 
  400    wxLogTrace( 
m_logTrace, wxT( 
"EDA_3D_MODEL_VIEWER::OnMouseWheel" ) );
 
  402    if( event.ShiftDown() )
 
  409    else if( event.ControlDown() )
 
 
  428#ifdef USE_OSX_MAGNIFY_EVENT 
  429void EDA_3D_MODEL_VIEWER::OnMagnify( wxMouseEvent& event )
 
  442    if( event.Dragging() )
 
  444        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.
 
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.
 
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.