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;
297 m_materials.m_SolderMask.m_Transparency = 1.0f - layerColor.a;
357 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
380 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
398 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
399 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
400 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
402 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
403 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
404 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
406 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
407 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
410 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
414 glm::pi<float>() * 0.25f );
416 position[0] = vectorLight.x;
417 position[1] = vectorLight.y;
418 position[2] = vectorLight.z;
420 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
421 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
422 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
423 glLightfv( GL_LIGHT1, GL_POSITION, position );
426 position[2] = -position[2];
428 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
429 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
430 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
431 glLightfv( GL_LIGHT2, GL_POSITION, position );
433 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
435 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
437 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
449 glEnable( GL_POLYGON_OFFSET_FILL );
450 glPolygonOffset( -0.1f, -2.0f );
457 glDisable( GL_POLYGON_OFFSET_FILL );
472 if( aSkipRenderHoles )
490 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
510 if( aStatusReporter )
511 aStatusReporter->
Report(
_(
"Loading..." ) );
518 reload( aStatusReporter, aWarningReporter );
539 glDepthFunc( GL_LESS );
540 glEnable( GL_CULL_FACE );
541 glFrontFace( GL_CCW );
542 glEnable( GL_NORMALIZE );
546 glDisable( GL_MULTISAMPLE );
548 glEnable( GL_MULTISAMPLE );
551 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
552 glClearDepth( 1.0f );
553 glClearStencil( 0x00 );
554 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
562 glEnable( GL_DEPTH_TEST );
565 glMatrixMode( GL_PROJECTION );
567 glMatrixMode( GL_MODELVIEW );
576 glEnable( GL_LIGHTING );
585 if( cameraPos.z > 0.0f )
586 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
588 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
591 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
593 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
599 bool showThickness = !skipThickness;
605 if( !( skipRenderVias || skipRenderHoles ) &&
m_vias )
612 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
626 const double opacity_min = 0.8;
651 if( !skipRenderHoles )
689 else if( isPasteLayer && skipRenderHoles )
707 anti_board =
nullptr;
714 if( throughHolesOuter )
723 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
729 glm::mat4 cameraViewMatrix;
731 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
746 glEnable( GL_POLYGON_OFFSET_FILL );
747 glPolygonOffset( 0.0f, -2.0f );
754 showThickness, skipRenderHoles );
760 showThickness, skipRenderHoles );
768 showThickness, skipRenderHoles );
774 showThickness, skipRenderHoles );
778 glDisable( GL_POLYGON_OFFSET_FILL );
779 glPolygonOffset( 0.0f, 0.0f );
785 glDepthMask( GL_FALSE );
786 glEnable( GL_BLEND );
787 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
790 glEnable( GL_TEXTURE_2D );
791 glActiveTexture( GL_TEXTURE0 );
796 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
797 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
798 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
800 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
801 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
803 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
804 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
806 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
807 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
808 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
809 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
813 glDisable( GL_BLEND );
816 glDepthMask( GL_TRUE );
821 glDisable( GL_LIGHTING );
826 glEnable( GL_LIGHTING );
843 glEnable( GL_LINE_SMOOTH );
844 glShadeModel( GL_SMOOTH );
847 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
864 circleImageBlured->
EfxFilter_SkipCenter( circleImage, IMAGE_FILTER::GAUSSIAN_BLUR, circleRadius - 8 );
868 delete circleImageBlured;
869 circleImageBlured =
nullptr;
872 circleImage =
nullptr;
886 glEnable( GL_COLOR_MATERIAL );
887 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
894 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
895 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
897 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
898 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
899 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
905#define DELETE_AND_FREE( ptr ) \
911#define DELETE_AND_FREE_MAP( map ) \
913 for( auto& [ layer, ptr ] : map ) \
920 glDeleteLists(
m_grid, 1 );
957 bool aShowThickness,
bool aSkipRenderHoles )
959 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
979 bool aGetBot,
bool aRenderTransparentOnly,
980 bool aRenderSelectedOnly )
982 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
992 bool highlight =
false;
996 if( fp->IsSelected() )
1002 if( aRenderSelectedOnly != highlight )
1006 if( !fp->Models().empty() )
1010 const bool isFlipped = fp->IsFlipped();
1012 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1023 bool aRenderTransparentOnly,
bool aIsSelected )
1025 if( !aFootprint->
Models().empty() )
1031 glm::mat4 fpMatrix( 1.0f );
1040 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1045 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1046 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1051 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1056 if( !sM.m_Show || sM.m_Filename.empty() )
1065 if(
const MODEL_3D* modelPtr = cache_i->second )
1067 bool opaque = sM.m_Opacity >= 1.0;
1069 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1070 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1072 glm::mat4 modelworldMatrix = fpMatrix;
1074 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1075 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1079 std::vector<float> key = { offset.x, offset.y, offset.z,
1080 rotation.x, rotation.y, rotation.z,
1087 modelworldMatrix *= it->second;
1091 glm::mat4 mtx( 1.0f );
1092 mtx = glm::translate( mtx, offset );
1093 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1094 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1095 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1096 mtx = glm::scale( mtx,
scale );
1099 modelworldMatrix *= mtx;
1102 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1103 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1104 aRenderTransparentOnly,
1121 std::list<MODELTORENDER> renderList;
1129 if( !renderList.empty() )
1134 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1143 if( !renderList.empty() )
1148 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1163 std::list<MODELTORENDER> renderListModels;
1174 if( renderListModels.empty() )
1177 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1179 transparentModelList.reserve( renderListModels.size() );
1186 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1188 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1190 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1192 transparentModelList.emplace_back( &mtr, distanceToCamera );
1196 std::sort( transparentModelList.begin(), transparentModelList.end(),
1197 [&]( std::pair<const MODELTORENDER *, float>& a,
1198 std::pair<const MODELTORENDER *, float>& b )
1200 if( a.second != b.second )
1201 return a.second > b.second;
1203 return a.first > b.first;
1209 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1214 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1219 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1221 isUsingColorInformation =
true;
1223 glEnableClientState( GL_COLOR_ARRAY );
1224 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1225 glEnable( GL_COLOR_MATERIAL );
1227 else if( isUsingColorInformation && mtr.first->m_isSelected )
1229 isUsingColorInformation =
false;
1231 glDisableClientState( GL_COLOR_ARRAY );
1232 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1233 glDisable( GL_COLOR_MATERIAL );
1239 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1254 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1256 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1264 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1266 if( !wasBlendEnabled )
1268 glEnable( GL_BLEND );
1269 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1272 glDisable( GL_LIGHTING );
1280 glEnable( GL_LIGHTING );
1282 if( !wasBlendEnabled )
1283 glDisable( GL_BLEND );
1291 glDeleteLists(
m_grid, 1 );
1295 if( aGridType == GRID3D_TYPE::NONE )
1298 m_grid = glGenLists( 1 );
1300 if( !glIsList(
m_grid ) )
1303 glNewList(
m_grid, GL_COMPILE );
1305 glEnable( GL_BLEND );
1306 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1308 const double zpos = 0.0;
1316 const GLfloat transparency = 0.35f;
1318 double griSizeMM = 0.0;
1322 case GRID3D_TYPE::GRID_1MM: griSizeMM = 1.0;
break;
1323 case GRID3D_TYPE::GRID_2P5MM: griSizeMM = 2.5;
break;
1324 case GRID3D_TYPE::GRID_5MM: griSizeMM = 5.0;
break;
1325 case GRID3D_TYPE::GRID_10MM: griSizeMM = 10.0;
break;
1328 case GRID3D_TYPE::NONE:
return;
1331 glNormal3f( 0.0, 0.0, 1.0 );
1336 brd_center_pos.
y = -brd_center_pos.
y;
1342 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1343 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1344 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1345 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1353 for(
int ii = 0; ; ii++ )
1356 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1358 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1363 if(
delta <= xsize / 2 )
1365 glBegin( GL_LINES );
1366 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1367 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1372 glBegin( GL_LINES );
1373 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1374 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1379 if(
delta <= ysize / 2 )
1381 glBegin( GL_LINES );
1382 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1383 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1388 glBegin( GL_LINES );
1389 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1390 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1395 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1400 glNormal3f( 0.0, -1.0, 0.0 );
1403 double posy = -brd_center_pos.
y *
scale;
1405 for(
int ii = 0; ; ii++ )
1408 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1410 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1415 glBegin( GL_LINES );
1418 glVertex3f( xmax, posy, zmin );
1419 glVertex3f( xmax, posy, zmax );
1424 glBegin( GL_LINES );
1426 glVertex3f( xmin, posy, zmin );
1427 glVertex3f( xmin, posy, zmax );
1431 if(
delta > xsize / 2.0f )
1436 for(
int ii = 0; ; ii++ )
1439 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1441 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1448 glBegin( GL_LINES );
1449 glVertex3f( xmin, posy,
delta );
1450 glVertex3f( xmax, posy,
delta );
1454 if(
delta <= -zmin && ( ii != 0 ) )
1457 glBegin( GL_LINES );
1458 glVertex3f( xmin, posy, -
delta );
1459 glVertex3f( xmax, posy, -
delta );
1467 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 GetLayerColor(int aLayerId) const
Get the technical color of a layer.
bool GetUseBoardEditorCopperLayerColors() const
SFVEC4F m_SolderPasteColor
in realistic mode: solder paste color
SFVEC4F m_UserDefinedLayerColor[45]
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 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.
int MapPCBLayerTo3DLayer(PCB_LAYER_ID aLayer)
@ 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
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