37#include <glm/geometric.hpp>
47#include <glm/gtc/type_ptr.hpp>
60 const float aaa = aTransparency * aTransparency * aTransparency;
63 float ca = 1.0f - aTransparency;
64 ca = 1.00f - 1.05f * ca * ca * ca;
68 return glm::clamp( aGrayColorValue * aGrayColorValue * ca + aaa, 0.0f, 1.0f );
74#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
80 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
117 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
138 int fbWidth, fbHeight;
139 glGetIntegerv( GL_VIEWPORT, viewport );
152 glEnable( GL_LIGHT0 );
154 glDisable( GL_LIGHT0 );
161 glEnable( GL_LIGHT1 );
163 glDisable( GL_LIGHT1 );
170 glEnable( GL_LIGHT2 );
172 glDisable( GL_LIGHT2 );
229 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
238 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
266 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
279 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
283 m_materials.m_SolderMask.m_Shininess = 0.85f * 128.0f;
293 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
323 const float solderMask_gray = ( layerColor.r + layerColor.g + layerColor.b ) / 3.0f;
327 const float baseTransparency = 1.0f - layerColor.a;
340 const float minSolderMaskShininess = 0.85f * 128.0f;
341 const float maxSolderMaskShininess = 512.0f;
342 m_materials.m_SolderMask.m_Shininess = minSolderMaskShininess
343 + ( maxSolderMaskShininess - minSolderMaskShininess ) * ( 1.0f - solderMask_gray );
398 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
421 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
439 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
440 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
441 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
443 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
444 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
445 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
447 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
448 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
451 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
455 glm::pi<float>() * 0.25f );
457 position[0] = vectorLight.x;
458 position[1] = vectorLight.y;
459 position[2] = vectorLight.z;
461 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
462 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
463 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
464 glLightfv( GL_LIGHT1, GL_POSITION, position );
467 position[2] = -position[2];
469 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
470 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
471 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
472 glLightfv( GL_LIGHT2, GL_POSITION, position );
474 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
476 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
478 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
490 glEnable( GL_POLYGON_OFFSET_FILL );
491 glPolygonOffset( -0.1f, -2.0f );
498 glDisable( GL_POLYGON_OFFSET_FILL );
513 if( aSkipRenderHoles )
541 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
561 if( aStatusReporter )
562 aStatusReporter->
Report(
_(
"Loading..." ) );
569 reload( aStatusReporter, aWarningReporter );
590 glDepthFunc( GL_LESS );
591 glEnable( GL_CULL_FACE );
592 glFrontFace( GL_CCW );
593 glEnable( GL_NORMALIZE );
597 glDisable( GL_MULTISAMPLE );
599 glEnable( GL_MULTISAMPLE );
602 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
603 glClearDepth( 1.0f );
604 glClearStencil( 0x00 );
605 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
613 glEnable( GL_DEPTH_TEST );
616 glMatrixMode( GL_PROJECTION );
617 glLoadMatrixf( glm::value_ptr(
m_camera.GetProjectionMatrix() ) );
618 glMatrixMode( GL_MODELVIEW );
620 glLoadMatrixf( glm::value_ptr(
m_camera.GetViewMatrix() ) );
627 glEnable( GL_LIGHTING );
636 if( cameraPos.z > 0.0f )
637 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
639 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
642 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
644 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
650 bool showThickness = !skipThickness;
652 std::bitset<LAYER_3D_END> layerFlags =
m_boardAdapter.GetVisibleLayers();
663 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
677 const double opacity_min = 0.8;
702 if( !skipRenderHoles )
748 if( !skipRenderHoles )
757 anti_board =
nullptr;
764 if( throughHolesOuter )
773 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
779 glm::mat4 cameraViewMatrix;
781 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
796 glEnable( GL_POLYGON_OFFSET_FILL );
797 glPolygonOffset( 0.0f, -2.0f );
804 showThickness, skipRenderHoles );
810 showThickness, skipRenderHoles );
818 showThickness, skipRenderHoles );
824 showThickness, skipRenderHoles );
828 glDisable( GL_POLYGON_OFFSET_FILL );
829 glPolygonOffset( 0.0f, 0.0f );
835 glDepthMask( GL_FALSE );
836 glEnable( GL_BLEND );
837 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
840 glEnable( GL_TEXTURE_2D );
841 glActiveTexture( GL_TEXTURE0 );
846 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
847 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
848 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
850 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
851 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
853 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
854 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
856 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
857 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
858 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
859 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
863 glDisable( GL_BLEND );
866 glDepthMask( GL_TRUE );
871 glDisable( GL_LIGHTING );
876 glEnable( GL_LIGHTING );
893 glEnable( GL_LINE_SMOOTH );
894 glShadeModel( GL_SMOOTH );
897 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
918 delete circleImageBlured;
919 circleImageBlured =
nullptr;
922 circleImage =
nullptr;
936 glEnable( GL_COLOR_MATERIAL );
937 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
944 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
945 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
947 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
948 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
949 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
955#define DELETE_AND_FREE( ptr ) \
961#define DELETE_AND_FREE_MAP( map ) \
963 for( auto& [ layer, ptr ] : map ) \
970 glDeleteLists(
m_grid, 1 );
1010 bool aShowThickness,
bool aSkipRenderHoles )
1012 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
1025 m_board->SetItIsTransparent(
true );
1026 m_board->DrawCulled( aShowThickness, solder_mask, via_holes );
1043 bool aGetBot,
bool aRenderTransparentOnly,
1044 bool aRenderSelectedOnly )
1046 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
1052 const wxString currentVariant =
m_boardAdapter.GetBoard()->GetCurrentVariant();
1057 bool highlight =
false;
1061 if( fp->IsSelected() )
1067 if( aRenderSelectedOnly != highlight )
1071 if( !fp->Models().empty() )
1076 if( fp->GetDNPForVariant( currentVariant ) )
1079 const bool isFlipped = fp->IsFlipped();
1081 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1092 bool aRenderTransparentOnly,
bool aIsSelected )
1094 if( !aFootprint->
Models().empty() )
1100 glm::mat4 fpMatrix( 1.0f );
1109 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1114 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1115 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1120 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1125 if( !sM.m_Show || sM.m_Filename.empty() )
1134 if(
const MODEL_3D* modelPtr = cache_i->second )
1136 bool opaque = sM.m_Opacity >= 1.0;
1138 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1139 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1141 glm::mat4 modelworldMatrix = fpMatrix;
1143 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1144 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1148 std::vector<float> key = { offset.x, offset.y, offset.z,
1149 rotation.x, rotation.y, rotation.z,
1156 modelworldMatrix *= it->second;
1160 glm::mat4 mtx( 1.0f );
1161 mtx = glm::translate( mtx, offset );
1162 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1163 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1164 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1165 mtx = glm::scale( mtx,
scale );
1168 modelworldMatrix *= mtx;
1171 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1172 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1173 aRenderTransparentOnly,
1190 std::list<MODELTORENDER> renderList;
1198 if( !renderList.empty() )
1203 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1212 if( !renderList.empty() )
1217 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1232 std::list<MODELTORENDER> renderListModels;
1243 if( renderListModels.empty() )
1246 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1248 transparentModelList.reserve( renderListModels.size() );
1255 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1257 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1259 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1261 transparentModelList.emplace_back( &mtr, distanceToCamera );
1265 std::sort( transparentModelList.begin(), transparentModelList.end(),
1266 [&]( std::pair<const MODELTORENDER *, float>& a,
1267 std::pair<const MODELTORENDER *, float>& b )
1269 if( a.second != b.second )
1270 return a.second > b.second;
1272 return a.first > b.first;
1278 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1283 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1288 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1290 isUsingColorInformation =
true;
1292 glEnableClientState( GL_COLOR_ARRAY );
1293 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1294 glEnable( GL_COLOR_MATERIAL );
1296 else if( isUsingColorInformation && mtr.first->m_isSelected )
1298 isUsingColorInformation =
false;
1300 glDisableClientState( GL_COLOR_ARRAY );
1301 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1302 glDisable( GL_COLOR_MATERIAL );
1308 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1323 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1325 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1333 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1335 if( !wasBlendEnabled )
1337 glEnable( GL_BLEND );
1338 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1341 glDisable( GL_LIGHTING );
1349 glEnable( GL_LIGHTING );
1351 if( !wasBlendEnabled )
1352 glDisable( GL_BLEND );
1360 glDeleteLists(
m_grid, 1 );
1367 m_grid = glGenLists( 1 );
1369 if( !glIsList(
m_grid ) )
1372 glNewList(
m_grid, GL_COMPILE );
1374 glEnable( GL_BLEND );
1375 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1377 const double zpos = 0.0;
1385 const GLfloat transparency = 0.35f;
1387 double griSizeMM = 0.0;
1400 glNormal3f( 0.0, 0.0, 1.0 );
1405 brd_center_pos.
y = -brd_center_pos.
y;
1407 const int xsize = std::max( brd_size.
x,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1408 const int ysize = std::max( brd_size.
y,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1411 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1412 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1413 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1414 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1422 for(
int ii = 0; ; ii++ )
1425 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1427 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1432 if(
delta <= xsize / 2 )
1434 glBegin( GL_LINES );
1435 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1436 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1441 glBegin( GL_LINES );
1442 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1443 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1448 if(
delta <= ysize / 2 )
1450 glBegin( GL_LINES );
1451 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1452 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1457 glBegin( GL_LINES );
1458 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1459 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1464 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1469 glNormal3f( 0.0, -1.0, 0.0 );
1472 double posy = -brd_center_pos.
y *
scale;
1474 for(
int ii = 0; ; ii++ )
1477 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1479 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1484 glBegin( GL_LINES );
1487 glVertex3f( xmax, posy, zmin );
1488 glVertex3f( xmax, posy, zmax );
1493 glBegin( GL_LINES );
1495 glVertex3f( xmin, posy, zmin );
1496 glVertex3f( xmin, posy, zmax );
1500 if(
delta > xsize / 2.0f )
1505 for(
int ii = 0; ; ii++ )
1508 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1510 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1517 glBegin( GL_LINES );
1518 glVertex3f( xmin, posy,
delta );
1519 glVertex3f( xmax, posy,
delta );
1523 if(
delta <= -zmin && ( ii != 0 ) )
1526 glBegin( GL_LINES );
1527 glVertex3f( xmin, posy, -
delta );
1528 glVertex3f( xmax, posy, -
delta );
1536 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.
A class used to derive camera objects from.
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()
std::unique_ptr< BUSY_INDICATOR > CreateBusyIndicator() const
Return a created busy indicator, if a factory has been set, else a null pointer.
RENDER_3D_BASE(BOARD_ADAPTER &aBoardAdapter, CAMERA &aCamera)
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
OPENGL_RENDER_LIST * m_viaBackCover
OPENGL_RENDER_LIST * m_viaFrontCover
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()
struct RENDER_3D_OPENGL::@136145154067207014164113243162246125147361200233 m_materials
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)
OPENGL_RENDER_LIST * m_postMachinePlugs
Board material plugs for backdrill/counterbore/countersink.
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)
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.
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)
static float TransparencyControl(float aGrayColorValue, float aTransparency)
Attempt to control the transparency based on the gray value of the color.
#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
glm::mat4 m_modelWorldMat
VECTOR2< int32_t > VECTOR2I