37#include <glm/geometric.hpp>
49#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
56 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
88 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
117 glEnable( GL_LIGHT0 );
119 glDisable( GL_LIGHT0 );
126 glEnable( GL_LIGHT1 );
128 glDisable( GL_LIGHT1 );
135 glEnable( GL_LIGHT2 );
137 glDisable( GL_LIGHT2 );
145 glDisable( GL_CULL_FACE );
149 glClear( GL_DEPTH_BUFFER_BIT );
151 glMatrixMode( GL_PROJECTION );
155 glMatrixMode( GL_MODELVIEW );
158 const glm::mat4 TranslationMatrix =
159 glm::translate( glm::mat4( 1.0f ),
SFVEC3F( 0.0f, 0.0f, -( arrow_size * 2.75f ) ) );
163 glLoadMatrixf( glm::value_ptr( ViewMatrix ) );
167 glColor3f( 0.9f, 0.0f, 0.0f );
170 glColor3f( 0.0f, 0.9f, 0.0f );
173 glColor3f( 0.0f, 0.0f, 0.9f );
176 glEnable( GL_CULL_FACE );
203 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
212 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
240 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
253 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
256 m_materials.m_SolderMask.m_Shininess = 0.8f * 128.0f;
266 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
298 m_materials.m_SolderMask.m_Transparency = 1.0f - layerColor.a;
358 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
375 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
376 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
377 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
379 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
380 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
381 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
383 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
384 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
387 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
391 glm::pi<float>() * 0.25f );
393 position[0] = vectorLight.x;
394 position[1] = vectorLight.y;
395 position[2] = vectorLight.z;
397 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
398 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
399 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
400 glLightfv( GL_LIGHT1, GL_POSITION, position );
403 position[2] = -position[2];
405 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
406 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
407 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
408 glLightfv( GL_LIGHT2, GL_POSITION, position );
410 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
412 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
414 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
426 glEnable( GL_POLYGON_OFFSET_FILL );
427 glPolygonOffset( -0.1f, -2.0f );
434 glDisable( GL_POLYGON_OFFSET_FILL );
449 if( aSkipRenderHoles )
467 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
487 if( aStatusReporter )
488 aStatusReporter->
Report(
_(
"Loading..." ) );
495 reload( aStatusReporter, aWarningReporter );
516 glDepthFunc( GL_LESS );
517 glEnable( GL_CULL_FACE );
518 glFrontFace( GL_CCW );
519 glEnable( GL_NORMALIZE );
523 glDisable( GL_MULTISAMPLE );
525 glEnable( GL_MULTISAMPLE );
528 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
529 glClearDepth( 1.0f );
530 glClearStencil( 0x00 );
531 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
539 glEnable( GL_DEPTH_TEST );
542 glMatrixMode( GL_PROJECTION );
544 glMatrixMode( GL_MODELVIEW );
553 glEnable( GL_LIGHTING );
562 if( cameraPos.z > 0.0f )
563 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
565 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
568 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
570 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
576 bool showThickness = !skipThickness;
582 if( !( skipRenderVias || skipRenderHoles ) &&
m_vias )
589 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
603 const double opacity_min = 0.8;
628 if( !skipRenderHoles )
666 else if( isPasteLayer && skipRenderHoles )
684 anti_board =
nullptr;
691 if( throughHolesOuter )
700 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
706 glm::mat4 cameraViewMatrix;
708 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
722 glEnable( GL_POLYGON_OFFSET_FILL );
723 glPolygonOffset( 0.0f, -2.0f );
730 showThickness, skipRenderHoles );
736 showThickness, skipRenderHoles );
744 showThickness, skipRenderHoles );
750 showThickness, skipRenderHoles );
754 glDisable( GL_POLYGON_OFFSET_FILL );
755 glPolygonOffset( 0.0f, 0.0f );
761 glDepthMask( GL_FALSE );
762 glEnable( GL_BLEND );
763 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
766 glEnable( GL_TEXTURE_2D );
767 glActiveTexture( GL_TEXTURE0 );
770 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
771 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
772 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
774 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
775 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
777 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
778 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
780 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
781 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
782 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
783 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
787 glDisable( GL_BLEND );
790 glDepthMask( GL_TRUE );
795 glDisable( GL_LIGHTING );
800 glEnable( GL_LIGHTING );
817 glEnable( GL_LINE_SMOOTH );
818 glShadeModel( GL_SMOOTH );
821 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
838 circleImageBlured->
EfxFilter_SkipCenter( circleImage, IMAGE_FILTER::GAUSSIAN_BLUR, circleRadius - 8 );
842 delete circleImageBlured;
843 circleImageBlured =
nullptr;
846 circleImage =
nullptr;
860 glEnable( GL_COLOR_MATERIAL );
861 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
868 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
869 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
871 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
872 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
873 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
879#define DELETE_AND_FREE( ptr ) \
885#define DELETE_AND_FREE_MAP( map ) \
887 for( auto& [ layer, ptr ] : map ) \
894 glDeleteLists(
m_grid, 1 );
931 bool aShowThickness,
bool aSkipRenderHoles )
933 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
953 bool aGetBot,
bool aRenderTransparentOnly,
954 bool aRenderSelectedOnly )
956 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
966 bool highlight =
false;
970 if( fp->IsSelected() )
976 if( aRenderSelectedOnly != highlight )
980 if( !fp->Models().empty() )
984 const bool isFlipped = fp->IsFlipped();
986 if( aGetTop == !isFlipped || aGetBot == isFlipped )
996 bool aRenderTransparentOnly,
bool aIsSelected )
998 if( !aFootprint->
Models().empty() )
1004 glm::mat4 fpMatrix( 1.0f );
1013 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1018 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1019 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1024 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1029 if( !sM.m_Show || sM.m_Filename.empty() )
1038 if(
const MODEL_3D* modelPtr = cache_i->second )
1040 bool opaque = sM.m_Opacity >= 1.0;
1042 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1043 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1045 glm::mat4 modelworldMatrix = fpMatrix;
1047 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1048 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y, sM.m_Rotation.z );
1051 std::vector<float> key = { offset.x, offset.y, offset.z,
1052 rotation.x, rotation.y, rotation.z,
1059 modelworldMatrix *= it->second;
1063 glm::mat4 mtx( 1.0f );
1064 mtx = glm::translate( mtx, offset );
1065 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1066 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1067 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1068 mtx = glm::scale( mtx,
scale );
1071 modelworldMatrix *= mtx;
1074 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1075 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1076 aRenderTransparentOnly,
1093 std::list<MODELTORENDER> renderList;
1101 if( !renderList.empty() )
1106 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1115 if( !renderList.empty() )
1120 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1135 std::list<MODELTORENDER> renderListModels;
1146 if( renderListModels.empty() )
1149 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1151 transparentModelList.reserve( renderListModels.size() );
1158 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1160 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1162 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1164 transparentModelList.emplace_back( &mtr, distanceToCamera );
1168 std::sort( transparentModelList.begin(), transparentModelList.end(),
1169 [&]( std::pair<const MODELTORENDER *, float>& a,
1170 std::pair<const MODELTORENDER *, float>& b )
1172 if( a.second != b.second )
1173 return a.second > b.second;
1175 return a.first > b.first;
1181 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1186 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1191 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1193 isUsingColorInformation =
true;
1195 glEnableClientState( GL_COLOR_ARRAY );
1196 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1197 glEnable( GL_COLOR_MATERIAL );
1199 else if( isUsingColorInformation && mtr.first->m_isSelected )
1201 isUsingColorInformation =
false;
1203 glDisableClientState( GL_COLOR_ARRAY );
1204 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1205 glDisable( GL_COLOR_MATERIAL );
1211 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1226 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1228 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1236 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1238 if( !wasBlendEnabled )
1240 glEnable( GL_BLEND );
1241 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1244 glDisable( GL_LIGHTING );
1252 glEnable( GL_LIGHTING );
1254 if( !wasBlendEnabled )
1255 glDisable( GL_BLEND );
1263 glDeleteLists(
m_grid, 1 );
1267 if( aGridType == GRID3D_TYPE::NONE )
1270 m_grid = glGenLists( 1 );
1272 if( !glIsList(
m_grid ) )
1275 glNewList(
m_grid, GL_COMPILE );
1277 glEnable( GL_BLEND );
1278 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1280 const double zpos = 0.0;
1288 const GLfloat transparency = 0.35f;
1290 double griSizeMM = 0.0;
1294 case GRID3D_TYPE::GRID_1MM: griSizeMM = 1.0;
break;
1295 case GRID3D_TYPE::GRID_2P5MM: griSizeMM = 2.5;
break;
1296 case GRID3D_TYPE::GRID_5MM: griSizeMM = 5.0;
break;
1297 case GRID3D_TYPE::GRID_10MM: griSizeMM = 10.0;
break;
1300 case GRID3D_TYPE::NONE:
return;
1303 glNormal3f( 0.0, 0.0, 1.0 );
1308 brd_center_pos.
y = -brd_center_pos.
y;
1314 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1315 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1316 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1317 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1325 for(
int ii = 0; ; ii++ )
1328 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1330 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1335 if(
delta <= xsize / 2 )
1337 glBegin( GL_LINES );
1338 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1339 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1344 glBegin( GL_LINES );
1345 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1346 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1351 if(
delta <= ysize / 2 )
1353 glBegin( GL_LINES );
1354 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1355 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1360 glBegin( GL_LINES );
1361 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1362 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1367 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1372 glNormal3f( 0.0, -1.0, 0.0 );
1375 double posy = -brd_center_pos.
y *
scale;
1377 for(
int ii = 0; ; ii++ )
1380 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1382 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1387 glBegin( GL_LINES );
1390 glVertex3f( xmax, posy, zmin );
1391 glVertex3f( xmax, posy, zmax );
1396 glBegin( GL_LINES );
1398 glVertex3f( xmin, posy, zmin );
1399 glVertex3f( xmin, posy, zmax );
1403 if(
delta > xsize / 2.0f )
1408 for(
int ii = 0; ; ii++ )
1411 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1413 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1420 glBegin( GL_LINES );
1421 glVertex3f( xmin, posy,
delta );
1422 glVertex3f( xmax, posy,
delta );
1426 if(
delta <= -zmin && ( ii != 0 ) )
1429 glBegin( GL_LINES );
1430 glVertex3f( xmin, posy, -
delta );
1431 glVertex3f( xmax, posy, -
delta );
1439 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.
static GL_CONTEXT_MANAGER & Get()
Return the GL_CONTEXT_MANAGER instance (singleton).
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.
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
bool IsCopperLayer(int aLayerId)
Tests 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.
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