37#include <glm/geometric.hpp>
50#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
56 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
90 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
111 int fbWidth, fbHeight;
112 glGetIntegerv( GL_VIEWPORT, viewport );
125 glEnable( GL_LIGHT0 );
127 glDisable( GL_LIGHT0 );
134 glEnable( GL_LIGHT1 );
136 glDisable( GL_LIGHT1 );
143 glEnable( GL_LIGHT2 );
145 glDisable( GL_LIGHT2 );
202 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
211 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
239 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
252 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
255 m_materials.m_SolderMask.m_Shininess = 0.8f * 128.0f;
265 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
295 m_materials.m_SolderMask.m_Transparency = 1.0f - layerColor.a;
355 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
378 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
396 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
397 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
398 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
400 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
401 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
402 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
404 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
405 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
408 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
412 glm::pi<float>() * 0.25f );
414 position[0] = vectorLight.x;
415 position[1] = vectorLight.y;
416 position[2] = vectorLight.z;
418 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
419 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
420 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
421 glLightfv( GL_LIGHT1, GL_POSITION, position );
424 position[2] = -position[2];
426 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
427 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
428 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
429 glLightfv( GL_LIGHT2, GL_POSITION, position );
431 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
433 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
435 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
447 glEnable( GL_POLYGON_OFFSET_FILL );
448 glPolygonOffset( -0.1f, -2.0f );
455 glDisable( GL_POLYGON_OFFSET_FILL );
470 if( aSkipRenderHoles )
488 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
508 if( aStatusReporter )
509 aStatusReporter->
Report(
_(
"Loading..." ) );
516 reload( aStatusReporter, aWarningReporter );
537 glDepthFunc( GL_LESS );
538 glEnable( GL_CULL_FACE );
539 glFrontFace( GL_CCW );
540 glEnable( GL_NORMALIZE );
544 glDisable( GL_MULTISAMPLE );
546 glEnable( GL_MULTISAMPLE );
549 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
550 glClearDepth( 1.0f );
551 glClearStencil( 0x00 );
552 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
560 glEnable( GL_DEPTH_TEST );
563 glMatrixMode( GL_PROJECTION );
565 glMatrixMode( GL_MODELVIEW );
574 glEnable( GL_LIGHTING );
583 if( cameraPos.z > 0.0f )
584 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
586 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
589 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
591 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
597 bool showThickness = !skipThickness;
610 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
624 const double opacity_min = 0.8;
649 if( !skipRenderHoles )
695 if( !skipRenderHoles )
704 anti_board =
nullptr;
711 if( throughHolesOuter )
720 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
726 glm::mat4 cameraViewMatrix;
728 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
743 glEnable( GL_POLYGON_OFFSET_FILL );
744 glPolygonOffset( 0.0f, -2.0f );
751 showThickness, skipRenderHoles );
757 showThickness, skipRenderHoles );
765 showThickness, skipRenderHoles );
771 showThickness, skipRenderHoles );
775 glDisable( GL_POLYGON_OFFSET_FILL );
776 glPolygonOffset( 0.0f, 0.0f );
782 glDepthMask( GL_FALSE );
783 glEnable( GL_BLEND );
784 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
787 glEnable( GL_TEXTURE_2D );
788 glActiveTexture( GL_TEXTURE0 );
793 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
794 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
795 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
797 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
798 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
800 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
801 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
803 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
804 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
805 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
806 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
810 glDisable( GL_BLEND );
813 glDepthMask( GL_TRUE );
818 glDisable( GL_LIGHTING );
823 glEnable( GL_LIGHTING );
840 glEnable( GL_LINE_SMOOTH );
841 glShadeModel( GL_SMOOTH );
844 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
861 circleImageBlured->
EfxFilter_SkipCenter( circleImage, IMAGE_FILTER::GAUSSIAN_BLUR, circleRadius - 8 );
865 delete circleImageBlured;
866 circleImageBlured =
nullptr;
869 circleImage =
nullptr;
883 glEnable( GL_COLOR_MATERIAL );
884 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
891 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
892 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
894 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
895 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
896 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
902#define DELETE_AND_FREE( ptr ) \
908#define DELETE_AND_FREE_MAP( map ) \
910 for( auto& [ layer, ptr ] : map ) \
917 glDeleteLists(
m_grid, 1 );
954 bool aShowThickness,
bool aSkipRenderHoles )
956 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
976 bool aGetBot,
bool aRenderTransparentOnly,
977 bool aRenderSelectedOnly )
979 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
989 bool highlight =
false;
993 if( fp->IsSelected() )
999 if( aRenderSelectedOnly != highlight )
1003 if( !fp->Models().empty() )
1007 const bool isFlipped = fp->IsFlipped();
1009 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1020 bool aRenderTransparentOnly,
bool aIsSelected )
1022 if( !aFootprint->
Models().empty() )
1028 glm::mat4 fpMatrix( 1.0f );
1037 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1042 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1043 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1048 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1053 if( !sM.m_Show || sM.m_Filename.empty() )
1062 if(
const MODEL_3D* modelPtr = cache_i->second )
1064 bool opaque = sM.m_Opacity >= 1.0;
1066 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1067 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1069 glm::mat4 modelworldMatrix = fpMatrix;
1071 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1072 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1076 std::vector<float> key = { offset.x, offset.y, offset.z,
1077 rotation.x, rotation.y, rotation.z,
1084 modelworldMatrix *= it->second;
1088 glm::mat4 mtx( 1.0f );
1089 mtx = glm::translate( mtx, offset );
1090 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1091 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1092 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1093 mtx = glm::scale( mtx,
scale );
1096 modelworldMatrix *= mtx;
1099 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1100 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1101 aRenderTransparentOnly,
1118 std::list<MODELTORENDER> renderList;
1126 if( !renderList.empty() )
1131 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1140 if( !renderList.empty() )
1145 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1160 std::list<MODELTORENDER> renderListModels;
1171 if( renderListModels.empty() )
1174 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1176 transparentModelList.reserve( renderListModels.size() );
1183 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1185 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1187 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1189 transparentModelList.emplace_back( &mtr, distanceToCamera );
1193 std::sort( transparentModelList.begin(), transparentModelList.end(),
1194 [&]( std::pair<const MODELTORENDER *, float>& a,
1195 std::pair<const MODELTORENDER *, float>& b )
1197 if( a.second != b.second )
1198 return a.second > b.second;
1200 return a.first > b.first;
1206 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1211 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1216 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1218 isUsingColorInformation =
true;
1220 glEnableClientState( GL_COLOR_ARRAY );
1221 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1222 glEnable( GL_COLOR_MATERIAL );
1224 else if( isUsingColorInformation && mtr.first->m_isSelected )
1226 isUsingColorInformation =
false;
1228 glDisableClientState( GL_COLOR_ARRAY );
1229 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1230 glDisable( GL_COLOR_MATERIAL );
1236 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1251 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1253 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1261 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1263 if( !wasBlendEnabled )
1265 glEnable( GL_BLEND );
1266 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1269 glDisable( GL_LIGHTING );
1277 glEnable( GL_LIGHTING );
1279 if( !wasBlendEnabled )
1280 glDisable( GL_BLEND );
1288 glDeleteLists(
m_grid, 1 );
1292 if( aGridType == GRID3D_TYPE::NONE )
1295 m_grid = glGenLists( 1 );
1297 if( !glIsList(
m_grid ) )
1300 glNewList(
m_grid, GL_COMPILE );
1302 glEnable( GL_BLEND );
1303 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1305 const double zpos = 0.0;
1313 const GLfloat transparency = 0.35f;
1315 double griSizeMM = 0.0;
1319 case GRID3D_TYPE::GRID_1MM: griSizeMM = 1.0;
break;
1320 case GRID3D_TYPE::GRID_2P5MM: griSizeMM = 2.5;
break;
1321 case GRID3D_TYPE::GRID_5MM: griSizeMM = 5.0;
break;
1322 case GRID3D_TYPE::GRID_10MM: griSizeMM = 10.0;
break;
1325 case GRID3D_TYPE::NONE:
return;
1328 glNormal3f( 0.0, 0.0, 1.0 );
1333 brd_center_pos.
y = -brd_center_pos.
y;
1339 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1340 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1341 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1342 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1350 for(
int ii = 0; ; ii++ )
1353 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1355 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1360 if(
delta <= xsize / 2 )
1362 glBegin( GL_LINES );
1363 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1364 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1369 glBegin( GL_LINES );
1370 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1371 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1376 if(
delta <= ysize / 2 )
1378 glBegin( GL_LINES );
1379 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1380 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1385 glBegin( GL_LINES );
1386 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1387 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1392 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1397 glNormal3f( 0.0, -1.0, 0.0 );
1400 double posy = -brd_center_pos.
y *
scale;
1402 for(
int ii = 0; ; ii++ )
1405 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1407 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1412 glBegin( GL_LINES );
1415 glVertex3f( xmax, posy, zmin );
1416 glVertex3f( xmax, posy, zmax );
1421 glBegin( GL_LINES );
1423 glVertex3f( xmin, posy, zmin );
1424 glVertex3f( xmin, posy, zmax );
1428 if(
delta > xsize / 2.0f )
1433 for(
int ii = 0; ; ii++ )
1436 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1438 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1445 glBegin( GL_LINES );
1446 glVertex3f( xmin, posy,
delta );
1447 glVertex3f( xmax, posy,
delta );
1451 if(
delta <= -zmin && ( ii != 0 ) )
1454 glBegin( GL_LINES );
1455 glVertex3f( xmin, posy, -
delta );
1456 glVertex3f( xmax, posy, -
delta );
1464 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
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 const 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_outerThroughHoleRings
OPENGL_RENDER_LIST * m_offboardPadsFront
SPHERES_GIZMO::GizmoSphereSelection getSelectedGizmoSphere() const
GRID3D_TYPE m_lastGridType
Stores the last grid type.
std::tuple< int, int, int, int > getGizmoViewport() const
OPENGL_RENDER_LIST * m_microviaHoles
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 resetSelectedGizmoSphere()
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
SPHERES_GIZMO * m_spheres_gizmo
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 handleGizmoMouseInput(int mouseX, int mouseY)
void setLightBottom(bool enabled)
void setGizmoViewport(int x, int y, int width, int height)
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)
Report a string with a given severity.
Renders a set of colored spheres in 3D space that act as a directional orientation gizmo.
GizmoSphereSelection
Enum to indicate which sphere (direction) is selected.
void handleMouseInput(int aMouseX, int aMouseY)
void render3dSpheresGizmo(glm::mat4 aCameraRotationMatrix)
GizmoSphereSelection getSelectedGizmoSphere() const
std::tuple< int, int, int, int > getViewport() const
void setViewport(int ax, int ay, int aWidth, int aHeight)
void resetSelectedGizmoSphere()
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.
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 opengl_microvias_disableOnMove
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
constexpr int mmToIU(double mm) const
glm::mat4 m_modelWorldMat