37#include <glm/geometric.hpp>
50#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
57 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
89 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
118 glEnable( GL_LIGHT0 );
120 glDisable( GL_LIGHT0 );
127 glEnable( GL_LIGHT1 );
129 glDisable( GL_LIGHT1 );
136 glEnable( GL_LIGHT2 );
138 glDisable( GL_LIGHT2 );
146 glDisable( GL_CULL_FACE );
150 glClear( GL_DEPTH_BUFFER_BIT );
152 glMatrixMode( GL_PROJECTION );
156 glMatrixMode( GL_MODELVIEW );
159 const glm::mat4 TranslationMatrix =
160 glm::translate( glm::mat4( 1.0f ),
SFVEC3F( 0.0f, 0.0f, -( arrow_size * 2.75f ) ) );
164 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
168 glColor3f( 0.9f, 0.0f, 0.0f );
171 glColor3f( 0.0f, 0.9f, 0.0f );
174 glColor3f( 0.0f, 0.0f, 0.9f );
177 glEnable( GL_CULL_FACE );
204 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
213 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
241 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
254 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
257 m_materials.m_SolderMask.m_Shininess = 0.8f * 128.0f;
267 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
299 m_materials.m_SolderMask.m_Transparency = 1.0f - layerColor.a;
359 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
376 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
377 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
378 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
380 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
381 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
382 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
384 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
385 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
388 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
392 glm::pi<float>() * 0.25f );
394 position[0] = vectorLight.x;
395 position[1] = vectorLight.y;
396 position[2] = vectorLight.z;
398 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
399 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
400 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
401 glLightfv( GL_LIGHT1, GL_POSITION, position );
404 position[2] = -position[2];
406 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
407 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
408 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
409 glLightfv( GL_LIGHT2, GL_POSITION, position );
411 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
413 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
415 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
427 glEnable( GL_POLYGON_OFFSET_FILL );
428 glPolygonOffset( -0.1f, -2.0f );
435 glDisable( GL_POLYGON_OFFSET_FILL );
450 if( aSkipRenderHoles )
468 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
488 if( aStatusReporter )
489 aStatusReporter->
Report(
_(
"Loading..." ) );
496 reload( aStatusReporter, aWarningReporter );
517 glDepthFunc( GL_LESS );
518 glEnable( GL_CULL_FACE );
519 glFrontFace( GL_CCW );
520 glEnable( GL_NORMALIZE );
524 glDisable( GL_MULTISAMPLE );
526 glEnable( GL_MULTISAMPLE );
529 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
530 glClearDepth( 1.0f );
531 glClearStencil( 0x00 );
532 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
540 glEnable( GL_DEPTH_TEST );
543 glMatrixMode( GL_PROJECTION );
545 glMatrixMode( GL_MODELVIEW );
554 glEnable( GL_LIGHTING );
563 if( cameraPos.z > 0.0f )
564 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
566 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
569 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
571 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
577 bool showThickness = !skipThickness;
583 if( !( skipRenderVias || skipRenderHoles ) &&
m_vias )
590 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
604 const double opacity_min = 0.8;
629 if( !skipRenderHoles )
667 else if( isPasteLayer && skipRenderHoles )
685 anti_board =
nullptr;
692 if( throughHolesOuter )
701 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
707 glm::mat4 cameraViewMatrix;
709 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
724 glEnable( GL_POLYGON_OFFSET_FILL );
725 glPolygonOffset( 0.0f, -2.0f );
732 showThickness, skipRenderHoles );
738 showThickness, skipRenderHoles );
746 showThickness, skipRenderHoles );
752 showThickness, skipRenderHoles );
756 glDisable( GL_POLYGON_OFFSET_FILL );
757 glPolygonOffset( 0.0f, 0.0f );
763 glDepthMask( GL_FALSE );
764 glEnable( GL_BLEND );
765 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
768 glEnable( GL_TEXTURE_2D );
769 glActiveTexture( GL_TEXTURE0 );
774 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
775 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
776 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
778 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
779 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
781 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
782 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
784 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
785 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
786 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
787 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
791 glDisable( GL_BLEND );
794 glDepthMask( GL_TRUE );
799 glDisable( GL_LIGHTING );
804 glEnable( GL_LIGHTING );
821 glEnable( GL_LINE_SMOOTH );
822 glShadeModel( GL_SMOOTH );
825 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
842 circleImageBlured->
EfxFilter_SkipCenter( circleImage, IMAGE_FILTER::GAUSSIAN_BLUR, circleRadius - 8 );
846 delete circleImageBlured;
847 circleImageBlured =
nullptr;
850 circleImage =
nullptr;
864 glEnable( GL_COLOR_MATERIAL );
865 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
872 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
873 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
875 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
876 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
877 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
883#define DELETE_AND_FREE( ptr ) \
889#define DELETE_AND_FREE_MAP( map ) \
891 for( auto& [ layer, ptr ] : map ) \
898 glDeleteLists(
m_grid, 1 );
935 bool aShowThickness,
bool aSkipRenderHoles )
937 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
957 bool aGetBot,
bool aRenderTransparentOnly,
958 bool aRenderSelectedOnly )
960 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
970 bool highlight =
false;
974 if( fp->IsSelected() )
980 if( aRenderSelectedOnly != highlight )
984 if( !fp->Models().empty() )
988 const bool isFlipped = fp->IsFlipped();
990 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1001 bool aRenderTransparentOnly,
bool aIsSelected )
1003 if( !aFootprint->
Models().empty() )
1009 glm::mat4 fpMatrix( 1.0f );
1018 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1023 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1024 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1029 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1034 if( !sM.m_Show || sM.m_Filename.empty() )
1043 if(
const MODEL_3D* modelPtr = cache_i->second )
1045 bool opaque = sM.m_Opacity >= 1.0;
1047 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1048 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1050 glm::mat4 modelworldMatrix = fpMatrix;
1052 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1053 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1057 std::vector<float> key = { offset.x, offset.y, offset.z,
1058 rotation.x, rotation.y, rotation.z,
1065 modelworldMatrix *= it->second;
1069 glm::mat4 mtx( 1.0f );
1070 mtx = glm::translate( mtx, offset );
1071 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1072 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1073 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1074 mtx = glm::scale( mtx,
scale );
1077 modelworldMatrix *= mtx;
1080 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1081 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1082 aRenderTransparentOnly,
1099 std::list<MODELTORENDER> renderList;
1107 if( !renderList.empty() )
1112 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1121 if( !renderList.empty() )
1126 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1141 std::list<MODELTORENDER> renderListModels;
1152 if( renderListModels.empty() )
1155 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1157 transparentModelList.reserve( renderListModels.size() );
1164 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1166 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1168 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1170 transparentModelList.emplace_back( &mtr, distanceToCamera );
1174 std::sort( transparentModelList.begin(), transparentModelList.end(),
1175 [&]( std::pair<const MODELTORENDER *, float>& a,
1176 std::pair<const MODELTORENDER *, float>& b )
1178 if( a.second != b.second )
1179 return a.second > b.second;
1181 return a.first > b.first;
1187 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1192 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1197 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1199 isUsingColorInformation =
true;
1201 glEnableClientState( GL_COLOR_ARRAY );
1202 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1203 glEnable( GL_COLOR_MATERIAL );
1205 else if( isUsingColorInformation && mtr.first->m_isSelected )
1207 isUsingColorInformation =
false;
1209 glDisableClientState( GL_COLOR_ARRAY );
1210 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1211 glDisable( GL_COLOR_MATERIAL );
1217 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1232 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1234 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1242 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1244 if( !wasBlendEnabled )
1246 glEnable( GL_BLEND );
1247 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1250 glDisable( GL_LIGHTING );
1258 glEnable( GL_LIGHTING );
1260 if( !wasBlendEnabled )
1261 glDisable( GL_BLEND );
1269 glDeleteLists(
m_grid, 1 );
1273 if( aGridType == GRID3D_TYPE::NONE )
1276 m_grid = glGenLists( 1 );
1278 if( !glIsList(
m_grid ) )
1281 glNewList(
m_grid, GL_COMPILE );
1283 glEnable( GL_BLEND );
1284 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1286 const double zpos = 0.0;
1294 const GLfloat transparency = 0.35f;
1296 double griSizeMM = 0.0;
1300 case GRID3D_TYPE::GRID_1MM: griSizeMM = 1.0;
break;
1301 case GRID3D_TYPE::GRID_2P5MM: griSizeMM = 2.5;
break;
1302 case GRID3D_TYPE::GRID_5MM: griSizeMM = 5.0;
break;
1303 case GRID3D_TYPE::GRID_10MM: griSizeMM = 10.0;
break;
1306 case GRID3D_TYPE::NONE:
return;
1309 glNormal3f( 0.0, 0.0, 1.0 );
1314 brd_center_pos.
y = -brd_center_pos.
y;
1320 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1321 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1322 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1323 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1331 for(
int ii = 0; ; ii++ )
1334 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1336 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1341 if(
delta <= xsize / 2 )
1343 glBegin( GL_LINES );
1344 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1345 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1350 glBegin( GL_LINES );
1351 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1352 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1357 if(
delta <= ysize / 2 )
1359 glBegin( GL_LINES );
1360 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1361 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1366 glBegin( GL_LINES );
1367 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1368 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1373 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1378 glNormal3f( 0.0, -1.0, 0.0 );
1381 double posy = -brd_center_pos.
y *
scale;
1383 for(
int ii = 0; ; ii++ )
1386 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1388 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1393 glBegin( GL_LINES );
1396 glVertex3f( xmax, posy, zmin );
1397 glVertex3f( xmax, posy, zmax );
1402 glBegin( GL_LINES );
1404 glVertex3f( xmin, posy, zmin );
1405 glVertex3f( xmin, posy, zmax );
1409 if(
delta > xsize / 2.0f )
1414 for(
int ii = 0; ; ii++ )
1417 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1419 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1426 glBegin( GL_LINES );
1427 glVertex3f( xmin, posy,
delta );
1428 glVertex3f( xmax, posy,
delta );
1432 if(
delta <= -zmin && ( ii != 0 ) )
1435 glBegin( GL_LINES );
1436 glVertex3f( xmin, posy, -
delta );
1437 glVertex3f( xmax, posy, -
delta );
1445 glDisable( GL_BLEND );
Defines math related functions.
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
SFVEC3F SphericalToCartesian(float aInclination, float aAzimuth)
https://en.wikipedia.org/wiki/Spherical_coordinate_system
constexpr EDA_IU_SCALE pcbIUScale
#define RANGE_SCALE_3D
This defines the range that all coord will have to be rendered.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Helper class to handle information needed to display 3D board.
std::map< int, COLOR4D > m_BoardEditorColors
list of colors used by the board editor
double BiuTo3dUnits() const noexcept
Board integer units To 3D units.
SFVEC4F m_BgColorTop
background top color
SFVEC4F m_SolderPasteColor
in realistic mode: solder paste color
bool IsFootprintShown(FOOTPRINT_ATTR_T aFPAttributes) const
Test if footprint should be displayed in relation to attributes and the flags.
VECTOR2I GetBoardSize() const noexcept
Get the board size.
std::bitset< LAYER_3D_END > GetVisibleLayers() const
SFVEC4F m_SolderMaskColorBot
in realistic mode: solder mask color ( bot )
VECTOR2I GetBoardPos() const noexcept
Get the board center.
float GetLayerBottomZPos(PCB_LAYER_ID aLayerId) const noexcept
Get the bottom z position.
SFVEC4F m_SolderMaskColorTop
in realistic mode: solder mask color ( top )
SFVEC4F GetColor(const COLOR4D &aColor) const
SFVEC4F m_CopperColor
in realistic mode: copper color
const BOARD * GetBoard() const noexcept
float GetFootprintZPos(bool aIsFlipped) const
Get the position of the footprint in 3d integer units considering if it is flipped or not.
float GetNonCopperLayerThickness() const noexcept
Get the non copper layers thickness (in 3D units).
float GetLayerTopZPos(PCB_LAYER_ID aLayerId) const noexcept
Get the top z position.
EDA_3D_VIEWER_SETTINGS * m_Cfg
SFVEC4F m_SilkScreenColorTop
in realistic mode: SilkScreen color ( top )
SFVEC4F m_SilkScreenColorBot
in realistic mode: SilkScreen color ( bot )
float GetBoardBodyThickness() const noexcept
Get the board body thickness, including internal copper layers (in 3D units).
SFVEC4F m_BoardBodyColor
in realistic mode: FR4 board color
SFVEC4F m_UserCommentsColor
SFVEC4F GetLayerColor(PCB_LAYER_ID aLayerId) const
Get the technical color of a layer.
SFVEC4F m_UserDrawingsColor
SFVEC4F m_BgColorBot
background bottom color
const FOOTPRINTS & Footprints() const
A class used to derive camera objects from.
glm::mat4 GetRotationMatrix() const
Get the rotation matrix to be applied in a transformation camera.
const glm::mat4 & GetProjectionMatrix() const
const SFVEC3F & GetPos() const
const glm::mat4 & GetViewMatrix() const
Implement a canvas based on a wxGLCanvas.
auto RunWithoutCtxLock(Func &&aFunction, Args &&... args)
Run the given function first releasing the GL context lock, then restoring it.
Manage an 8-bit channel image.
void CircleFilled(int aCx, int aCy, int aRadius, unsigned char aValue)
void EfxFilter_SkipCenter(IMAGE *aInImg, IMAGE_FILTER aFilterType, unsigned int aRadius)
Apply a filter to the input image and store it in the image class.
unsigned int GetHeight() const
unsigned int GetWidth() const
A color representation with 4 components: red, green, blue, alpha.
static LSET PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
void DrawBbox() const
Draw main bounding box of the model.
static void EndDrawMulti()
Cleanup render states after drawing multiple models.
void Draw(bool aTransparent, float aOpacity, bool aUseSelectedMaterial, const SFVEC3F &aSelectionColor, const glm::mat4 *aModelWorldMatrix, const SFVEC3F *aCameraWorldPos) const
Render the model into the current context.
static void BeginDrawMulti(bool aUseColorInformation)
Set some basic render states before drawing multiple models.
void DrawBboxes() const
Draw individual bounding boxes of each mesh.
Store the OpenGL display lists to related with a layer.
void ApplyScalePosition(float aZposition, float aZscale)
void SetItIsTransparent(bool aSetTransparent)
void DrawCulled(bool aDrawMiddle, const OPENGL_RENDER_LIST *aSubtractList=nullptr, const OPENGL_RENDER_LIST *bSubtractList=nullptr, const OPENGL_RENDER_LIST *cSubtractList=nullptr, const OPENGL_RENDER_LIST *dSubtractList=nullptr) const
Draw all layers if they are visible by the camera if camera position is above the layer.
void DrawAll(bool aDrawMiddle=true) const
Call to draw all the display lists.
GL_CONTEXT_MANAGER * GetGLContextManager()
This is a base class to hold data and functions for render targets.
std::unique_ptr< BUSY_INDICATOR > CreateBusyIndicator() const
Return a created busy indicator, if a factory has been set, else a null pointer.
bool m_canvasInitialized
Flag if the canvas specific for this render was already initialized.
wxSize m_windowSize
The window size that this camera is working.
BOARD_ADAPTER & m_boardAdapter
Settings reference in use for this render.
OPENGL_RENDER_LIST * m_board
OPENGL_RENDER_LIST * m_vias
OPENGL_RENDER_LIST * m_outerThroughHoleRings
OPENGL_RENDER_LIST * m_offboardPadsFront
GRID3D_TYPE m_lastGridType
Stores the last grid type.
void renderOpaqueModels(const glm::mat4 &aCameraViewMatrix)
void generate3dGrid(GRID3D_TYPE aGridType)
Create a 3D grid to an OpenGL display list.
void setLightFront(bool enabled)
bool Redraw(bool aIsMoving, REPORTER *aStatusReporter, REPORTER *aWarningReporter) override
Redraw the view.
MAP_OGL_DISP_LISTS m_layers
MAP_OGL_DISP_LISTS m_innerLayerHoles
OPENGL_RENDER_LIST * m_boardWithHoles
RENDER_3D_OPENGL(EDA_3D_CANVAS *aCanvas, BOARD_ADAPTER &aAdapter, CAMERA &aCamera)
MAP_OGL_DISP_LISTS m_outerLayerHoles
OPENGL_RENDER_LIST * m_offboardPadsBack
BOARD_ITEM * m_currentRollOverItem
void renderBoardBody(bool aSkipRenderHoles)
std::map< std::vector< float >, glm::mat4 > m_3dModelMatrixMap
std::map< wxString, MODEL_3D * > m_3dModelMap
LIST_TRIANGLES m_triangles
store pointers so can be deleted latter
OPENGL_RENDER_LIST * m_outerViaThroughHoles
OPENGL_RENDER_LIST * m_outerThroughHoles
void setLayerMaterial(PCB_LAYER_ID aLayerID)
OPENGL_RENDER_LIST * m_platedPadsFront
void renderModel(const glm::mat4 &aCameraViewMatrix, const MODELTORENDER &aModelToRender, const SFVEC3F &aSelColor, const SFVEC3F *aCameraWorldPos)
int GetWaitForEditingTimeOut() override
Give the interface the time (in ms) that it should wait for editing or movements before (this works f...
void renderSolderMaskLayer(PCB_LAYER_ID aLayerID, float aZPos, bool aShowThickness, bool aSkipRenderHoles)
void renderTransparentModels(const glm::mat4 &aCameraViewMatrix)
void get3dModelsSelected(std::list< MODELTORENDER > &aDstRenderList, bool aGetTop, bool aGetBot, bool aRenderTransparentOnly, bool aRenderSelectedOnly)
void setPlatedCopperAndDepthOffset(PCB_LAYER_ID aLayer_id)
OPENGL_RENDER_LIST * m_antiBoard
void SetCurWindowSize(const wxSize &aSize) override
Before each render, the canvas will tell the render what is the size of its windows,...
OPENGL_RENDER_LIST * m_padHoles
GLuint m_grid
oGL list that stores current grid
OPENGL_RENDER_LIST * m_platedPadsBack
void get3dModelsFromFootprint(std::list< MODELTORENDER > &aDstRenderList, const FOOTPRINT *aFootprint, bool aRenderTransparentOnly, bool aIsSelected)
struct RENDER_3D_OPENGL::@2 m_materials
void setLightBottom(bool enabled)
void setLightTop(bool enabled)
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
Store arrays of triangles to be used to create display lists.
#define DELETE_AND_FREE_MAP(map)
#define DELETE_AND_FREE(ptr)
#define UNITS3D_TO_UNITSPCB
Implements a model viewer canvas.
static const wxChar * m_logTrace
Trace mask used to enable or disable the trace output of this class.
@ LAYER_3D_SOLDERMASK_TOP
@ LAYER_3D_SOLDERMASK_BOTTOM
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
void OglResetTextureState()
Reset to default state the texture settings.
void OglSetMaterial(const SMATERIAL &aMaterial, float aOpacity, bool aUseSelectedMaterial, SFVEC3F aSelectionColor)
Set OpenGL materials.
GLuint OglLoadTexture(const IMAGE &aImage)
Generate a new OpenGL texture.
void OglDrawBackground(const SFVEC4F &aTopColor, const SFVEC4F &aBotColor)
Define generic OpenGL functions that are common to any OpenGL target.
void DrawRoundArrow(SFVEC3F aPosition, SFVEC3F aTargetPos, float aSize)
Draw a round arrow.
PGM_BASE & Pgm()
The global program "get" accessor.
static SFVEC4F premultiplyAlpha(const SFVEC4F &aInput)
#define SIZE_OF_CIRCLE_TEXTURE
Manage a bounding box defined by two SFVEC3F min max points.
SFVEC3F GetCenter() const
Return the center point of the bounding box.
bool opengl_thickness_disableOnMove
bool use_board_editor_copper_colors
KIGFX::COLOR4D opengl_selection_color
bool clip_silk_on_via_annuli
bool subtract_mask_from_silk
bool highlight_on_rollover
bool DifferentiatePlatedCopper()
return true if platted copper aeras and non platted copper areas must be drawn using a different colo...
bool opengl_holes_disableOnMove
bool opengl_AA_disableOnMove
bool opengl_vias_disableOnMove
constexpr int mmToIU(double mm) const
glm::mat4 m_modelWorldMat