36#include <glm/geometric.hpp>
47#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
54 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
86 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
115 glEnable( GL_LIGHT0 );
117 glDisable( GL_LIGHT0 );
124 glEnable( GL_LIGHT1 );
126 glDisable( GL_LIGHT1 );
133 glEnable( GL_LIGHT2 );
135 glDisable( GL_LIGHT2 );
143 glDisable( GL_CULL_FACE );
147 glClear( GL_DEPTH_BUFFER_BIT );
149 glMatrixMode( GL_PROJECTION );
153 glMatrixMode( GL_MODELVIEW );
156 const glm::mat4 TranslationMatrix =
157 glm::translate( glm::mat4( 1.0f ),
SFVEC3F( 0.0f, 0.0f, -( arrow_size * 2.75f ) ) );
161 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
165 glColor3f( 0.9f, 0.0f, 0.0f );
168 glColor3f( 0.0f, 0.9f, 0.0f );
171 glColor3f( 0.0f, 0.0f, 0.9f );
174 glEnable( GL_CULL_FACE );
201 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
210 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
238 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
251 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
254 m_materials.m_SolderMask.m_Shininess = 0.8f * 128.0f;
264 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
282 m_materials.m_SolderMask.m_Transparency = 1.0f - layerColor.a;
342 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
359 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
360 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
361 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
363 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
364 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
365 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
367 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
368 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
371 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
375 glm::pi<float>() * 0.25f );
377 position[0] = vectorLight.x;
378 position[1] = vectorLight.y;
379 position[2] = vectorLight.z;
381 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
382 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
383 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
384 glLightfv( GL_LIGHT1, GL_POSITION, position );
387 position[2] = -position[2];
389 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
390 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
391 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
392 glLightfv( GL_LIGHT2, GL_POSITION, position );
394 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
396 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
398 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
410 glEnable( GL_POLYGON_OFFSET_FILL );
411 glPolygonOffset( -0.1f, -2.0f );
418 glDisable( GL_POLYGON_OFFSET_FILL );
433 if( aSkipRenderHoles )
451 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
471 if( aStatusReporter )
472 aStatusReporter->
Report(
_(
"Loading..." ) );
474 reload( aStatusReporter, aWarningReporter );
494 glDepthFunc( GL_LESS );
495 glEnable( GL_CULL_FACE );
496 glFrontFace( GL_CCW );
497 glEnable( GL_NORMALIZE );
501 glDisable( GL_MULTISAMPLE );
503 glEnable( GL_MULTISAMPLE );
506 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
507 glClearDepth( 1.0f );
508 glClearStencil( 0x00 );
509 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
517 glEnable( GL_DEPTH_TEST );
520 glMatrixMode( GL_PROJECTION );
522 glMatrixMode( GL_MODELVIEW );
531 glEnable( GL_LIGHTING );
540 if( cameraPos.z > 0.0f )
541 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
543 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
546 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
548 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
554 bool showThickness = !skipThickness;
560 if( !( skipRenderVias || skipRenderHoles ) &&
m_vias )
567 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
573 bool isCopperLayer = layer >=
F_Cu && layer <=
B_Cu;
582 const double opacity_min = 0.8;
604 if( !skipRenderHoles )
642 else if( isPasteLayer && skipRenderHoles )
660 anti_board =
nullptr;
667 if( throughHolesOuter )
676 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
682 glm::mat4 cameraViewMatrix;
684 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
698 glEnable( GL_POLYGON_OFFSET_FILL );
699 glPolygonOffset( 0.0f, -2.0f );
706 showThickness, skipRenderHoles );
712 showThickness, skipRenderHoles );
720 showThickness, skipRenderHoles );
726 showThickness, skipRenderHoles );
730 glDisable( GL_POLYGON_OFFSET_FILL );
731 glPolygonOffset( 0.0f, 0.0f );
737 glDepthMask( GL_FALSE );
738 glEnable( GL_BLEND );
739 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
742 glEnable( GL_TEXTURE_2D );
743 glActiveTexture( GL_TEXTURE0 );
746 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
747 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
748 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
750 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
751 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
753 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
754 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
756 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
757 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
758 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
759 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
763 glDisable( GL_BLEND );
766 glDepthMask( GL_TRUE );
771 glDisable( GL_LIGHTING );
776 glEnable( GL_LIGHTING );
793 glEnable( GL_LINE_SMOOTH );
794 glShadeModel( GL_SMOOTH );
797 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
814 circleImageBlured->
EfxFilter_SkipCenter( circleImage, IMAGE_FILTER::GAUSSIAN_BLUR, circleRadius - 8 );
818 delete circleImageBlured;
819 circleImageBlured =
nullptr;
822 circleImage =
nullptr;
836 glEnable( GL_COLOR_MATERIAL );
837 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
844 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
845 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
847 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
848 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
849 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
855#define DELETE_AND_FREE( ptr ) \
861#define DELETE_AND_FREE_MAP( map ) \
863 for( auto& [ layer, ptr ] : map ) \
870 glDeleteLists(
m_grid, 1 );
907 bool aShowThickness,
bool aSkipRenderHoles )
909 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
929 bool aGetBot,
bool aRenderTransparentOnly,
930 bool aRenderSelectedOnly )
932 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
942 bool highlight =
false;
946 if( fp->IsSelected() )
952 if( aRenderSelectedOnly != highlight )
956 if( !fp->Models().empty() )
960 const bool isFlipped = fp->IsFlipped();
962 if( aGetTop == !isFlipped || aGetBot == isFlipped )
972 bool aRenderTransparentOnly,
bool aIsSelected )
974 if( !aFootprint->
Models().empty() )
980 glm::mat4 fpMatrix( 1.0f );
994 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
995 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1000 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1005 if( !sM.m_Show || sM.m_Filename.empty() )
1014 if(
const MODEL_3D* modelPtr = cache_i->second )
1016 bool opaque = sM.m_Opacity >= 1.0;
1018 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1019 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1021 glm::mat4 modelworldMatrix = fpMatrix;
1023 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1024 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y, sM.m_Rotation.z );
1027 std::vector<float> key = { offset.x, offset.y, offset.z,
1028 rotation.x, rotation.y, rotation.z,
1035 modelworldMatrix *= it->second;
1039 glm::mat4 mtx( 1.0f );
1040 mtx = glm::translate( mtx, offset );
1041 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1042 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1043 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1044 mtx = glm::scale( mtx,
scale );
1047 modelworldMatrix *= mtx;
1050 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1051 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1052 aRenderTransparentOnly,
1069 std::list<MODELTORENDER> renderList;
1077 if( !renderList.empty() )
1082 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1091 if( !renderList.empty() )
1096 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1111 std::list<MODELTORENDER> renderListModels;
1122 if( renderListModels.empty() )
1125 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1127 transparentModelList.reserve( renderListModels.size() );
1134 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1136 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1138 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1140 transparentModelList.emplace_back( &mtr, distanceToCamera );
1144 std::sort( transparentModelList.begin(), transparentModelList.end(),
1145 [&]( std::pair<const MODELTORENDER *, float>& a,
1146 std::pair<const MODELTORENDER *, float>& b )
1148 if( a.second != b.second )
1149 return a.second > b.second;
1151 return a.first > b.first;
1157 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1162 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1167 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1169 isUsingColorInformation =
true;
1171 glEnableClientState( GL_COLOR_ARRAY );
1172 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1173 glEnable( GL_COLOR_MATERIAL );
1175 else if( isUsingColorInformation && mtr.first->m_isSelected )
1177 isUsingColorInformation =
false;
1179 glDisableClientState( GL_COLOR_ARRAY );
1180 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1181 glDisable( GL_COLOR_MATERIAL );
1187 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1202 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1204 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1212 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1214 if( !wasBlendEnabled )
1216 glEnable( GL_BLEND );
1217 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1220 glDisable( GL_LIGHTING );
1228 glEnable( GL_LIGHTING );
1230 if( !wasBlendEnabled )
1231 glDisable( GL_BLEND );
1239 glDeleteLists(
m_grid, 1 );
1243 if( aGridType == GRID3D_TYPE::NONE )
1246 m_grid = glGenLists( 1 );
1248 if( !glIsList(
m_grid ) )
1251 glNewList(
m_grid, GL_COMPILE );
1253 glEnable( GL_BLEND );
1254 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1256 const double zpos = 0.0;
1264 const GLfloat transparency = 0.35f;
1266 double griSizeMM = 0.0;
1270 case GRID3D_TYPE::GRID_1MM: griSizeMM = 1.0;
break;
1271 case GRID3D_TYPE::GRID_2P5MM: griSizeMM = 2.5;
break;
1272 case GRID3D_TYPE::GRID_5MM: griSizeMM = 5.0;
break;
1273 case GRID3D_TYPE::GRID_10MM: griSizeMM = 10.0;
break;
1276 case GRID3D_TYPE::NONE:
return;
1279 glNormal3f( 0.0, 0.0, 1.0 );
1284 brd_center_pos.
y = -brd_center_pos.
y;
1290 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1291 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1292 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1293 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1301 for(
int ii = 0; ; ii++ )
1304 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1306 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1311 if(
delta <= xsize / 2 )
1313 glBegin( GL_LINES );
1314 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1315 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1320 glBegin( GL_LINES );
1321 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1322 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1327 if(
delta <= ysize / 2 )
1329 glBegin( GL_LINES );
1330 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1331 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1336 glBegin( GL_LINES );
1337 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1338 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1343 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1348 glNormal3f( 0.0, -1.0, 0.0 );
1351 double posy = -brd_center_pos.
y *
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 glBegin( GL_LINES );
1366 glVertex3f( xmax, posy, zmin );
1367 glVertex3f( xmax, posy, zmax );
1372 glBegin( GL_LINES );
1374 glVertex3f( xmin, posy, zmin );
1375 glVertex3f( xmin, posy, zmax );
1379 if(
delta > xsize / 2.0f )
1384 for(
int ii = 0; ; ii++ )
1387 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1389 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1396 glBegin( GL_LINES );
1397 glVertex3f( xmin, posy,
delta );
1398 glVertex3f( xmax, posy,
delta );
1402 if(
delta <= -zmin && ( ii != 0 ) )
1405 glBegin( GL_LINES );
1406 glVertex3f( xmin, posy, -
delta );
1407 glVertex3f( xmax, posy, -
delta );
1415 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.
Helper class to handle information needed to display 3D board.
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.
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
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.
This is a base class to hold data and functions for render targets.
CAMERA & m_camera
Flag if the canvas specific for this render was already initialized.
std::unique_ptr< BUSY_INDICATOR > CreateBusyIndicator() const
Return a created busy indicator, if a factory has been set, else a null pointer.
bool m_reloadRequested
The window size that this camera is working.
BOARD_ADAPTER & m_boardAdapter
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
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.
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 differentiate_plated_copper
bool subtract_mask_from_silk
bool highlight_on_rollover
bool opengl_holes_disableOnMove
bool opengl_AA_disableOnMove
bool opengl_vias_disableOnMove
constexpr int mmToIU(double mm) const
glm::mat4 m_modelWorldMat
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".