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;
66 return glm::clamp( aGrayColorValue * ca + aaa, 0.0f, 1.0f );
72#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
78 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
115 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
136 int fbWidth, fbHeight;
137 glGetIntegerv( GL_VIEWPORT, viewport );
150 glEnable( GL_LIGHT0 );
152 glDisable( GL_LIGHT0 );
159 glEnable( GL_LIGHT1 );
161 glDisable( GL_LIGHT1 );
168 glEnable( GL_LIGHT2 );
170 glDisable( GL_LIGHT2 );
227 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
236 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
264 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
277 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
281 m_materials.m_SolderMask.m_Shininess = 0.85f * 128.0f;
291 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
321 const float solderMask_gray = ( layerColor.r + layerColor.g + layerColor.b ) / 3.0f;
325 const float baseTransparency = 1.0f - layerColor.a;
338 const float minSolderMaskShininess = 0.85f * 128.0f;
339 const float maxSolderMaskShininess = 512.0f;
340 m_materials.m_SolderMask.m_Shininess = minSolderMaskShininess
341 + ( maxSolderMaskShininess - minSolderMaskShininess ) * ( 1.0f - solderMask_gray );
396 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
419 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
437 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
438 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
439 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
441 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
442 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
443 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
445 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
446 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
449 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
453 glm::pi<float>() * 0.25f );
455 position[0] = vectorLight.x;
456 position[1] = vectorLight.y;
457 position[2] = vectorLight.z;
459 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
460 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
461 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
462 glLightfv( GL_LIGHT1, GL_POSITION, position );
465 position[2] = -position[2];
467 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
468 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
469 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
470 glLightfv( GL_LIGHT2, GL_POSITION, position );
472 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
474 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
476 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
488 glEnable( GL_POLYGON_OFFSET_FILL );
489 glPolygonOffset( -0.1f, -2.0f );
496 glDisable( GL_POLYGON_OFFSET_FILL );
511 if( aSkipRenderHoles )
539 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
559 if( aStatusReporter )
560 aStatusReporter->
Report(
_(
"Loading..." ) );
567 reload( aStatusReporter, aWarningReporter );
588 glDepthFunc( GL_LESS );
589 glEnable( GL_CULL_FACE );
590 glFrontFace( GL_CCW );
591 glEnable( GL_NORMALIZE );
595 glDisable( GL_MULTISAMPLE );
597 glEnable( GL_MULTISAMPLE );
600 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
601 glClearDepth( 1.0f );
602 glClearStencil( 0x00 );
603 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
611 glEnable( GL_DEPTH_TEST );
614 glMatrixMode( GL_PROJECTION );
615 glLoadMatrixf( glm::value_ptr(
m_camera.GetProjectionMatrix() ) );
616 glMatrixMode( GL_MODELVIEW );
618 glLoadMatrixf( glm::value_ptr(
m_camera.GetViewMatrix() ) );
625 glEnable( GL_LIGHTING );
634 if( cameraPos.z > 0.0f )
635 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
637 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
640 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
642 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
648 bool showThickness = !skipThickness;
650 std::bitset<LAYER_3D_END> layerFlags =
m_boardAdapter.GetVisibleLayers();
661 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
675 const double opacity_min = 0.8;
700 if( !skipRenderHoles )
746 if( !skipRenderHoles )
755 anti_board =
nullptr;
762 if( throughHolesOuter )
771 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
777 glm::mat4 cameraViewMatrix;
779 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
794 glEnable( GL_POLYGON_OFFSET_FILL );
795 glPolygonOffset( 0.0f, -2.0f );
802 showThickness, skipRenderHoles );
808 showThickness, skipRenderHoles );
816 showThickness, skipRenderHoles );
822 showThickness, skipRenderHoles );
826 glDisable( GL_POLYGON_OFFSET_FILL );
827 glPolygonOffset( 0.0f, 0.0f );
833 glDepthMask( GL_FALSE );
834 glEnable( GL_BLEND );
835 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
838 glEnable( GL_TEXTURE_2D );
839 glActiveTexture( GL_TEXTURE0 );
844 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
845 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
846 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
848 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
849 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
851 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
852 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
854 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
855 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
856 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
857 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
861 glDisable( GL_BLEND );
864 glDepthMask( GL_TRUE );
869 glDisable( GL_LIGHTING );
874 glEnable( GL_LIGHTING );
891 glEnable( GL_LINE_SMOOTH );
892 glShadeModel( GL_SMOOTH );
895 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
916 delete circleImageBlured;
917 circleImageBlured =
nullptr;
920 circleImage =
nullptr;
934 glEnable( GL_COLOR_MATERIAL );
935 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
942 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
943 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
945 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
946 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
947 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
953#define DELETE_AND_FREE( ptr ) \
959#define DELETE_AND_FREE_MAP( map ) \
961 for( auto& [ layer, ptr ] : map ) \
968 glDeleteLists(
m_grid, 1 );
1008 bool aShowThickness,
bool aSkipRenderHoles )
1010 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
1023 m_board->SetItIsTransparent(
true );
1024 m_board->DrawCulled( aShowThickness, solder_mask, via_holes );
1041 bool aGetBot,
bool aRenderTransparentOnly,
1042 bool aRenderSelectedOnly )
1044 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
1050 const wxString currentVariant =
m_boardAdapter.GetBoard()->GetCurrentVariant();
1055 bool highlight =
false;
1059 if( fp->IsSelected() )
1065 if( aRenderSelectedOnly != highlight )
1069 if( !fp->Models().empty() )
1074 if( fp->GetDNPForVariant( currentVariant ) )
1077 const bool isFlipped = fp->IsFlipped();
1079 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1090 bool aRenderTransparentOnly,
bool aIsSelected )
1092 if( !aFootprint->
Models().empty() )
1098 glm::mat4 fpMatrix( 1.0f );
1107 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1112 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1113 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1118 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1123 if( !sM.m_Show || sM.m_Filename.empty() )
1132 if(
const MODEL_3D* modelPtr = cache_i->second )
1134 bool opaque = sM.m_Opacity >= 1.0;
1136 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1137 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1139 glm::mat4 modelworldMatrix = fpMatrix;
1141 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1142 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1146 std::vector<float> key = { offset.x, offset.y, offset.z,
1147 rotation.x, rotation.y, rotation.z,
1154 modelworldMatrix *= it->second;
1158 glm::mat4 mtx( 1.0f );
1159 mtx = glm::translate( mtx, offset );
1160 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1161 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1162 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1163 mtx = glm::scale( mtx,
scale );
1166 modelworldMatrix *= mtx;
1169 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1170 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1171 aRenderTransparentOnly,
1188 std::list<MODELTORENDER> renderList;
1196 if( !renderList.empty() )
1201 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1210 if( !renderList.empty() )
1215 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1230 std::list<MODELTORENDER> renderListModels;
1241 if( renderListModels.empty() )
1244 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1246 transparentModelList.reserve( renderListModels.size() );
1253 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1255 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1257 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1259 transparentModelList.emplace_back( &mtr, distanceToCamera );
1263 std::sort( transparentModelList.begin(), transparentModelList.end(),
1264 [&]( std::pair<const MODELTORENDER *, float>& a,
1265 std::pair<const MODELTORENDER *, float>& b )
1267 if( a.second != b.second )
1268 return a.second > b.second;
1270 return a.first > b.first;
1276 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1281 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1286 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1288 isUsingColorInformation =
true;
1290 glEnableClientState( GL_COLOR_ARRAY );
1291 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1292 glEnable( GL_COLOR_MATERIAL );
1294 else if( isUsingColorInformation && mtr.first->m_isSelected )
1296 isUsingColorInformation =
false;
1298 glDisableClientState( GL_COLOR_ARRAY );
1299 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1300 glDisable( GL_COLOR_MATERIAL );
1306 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1321 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1323 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1331 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1333 if( !wasBlendEnabled )
1335 glEnable( GL_BLEND );
1336 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1339 glDisable( GL_LIGHTING );
1347 glEnable( GL_LIGHTING );
1349 if( !wasBlendEnabled )
1350 glDisable( GL_BLEND );
1358 glDeleteLists(
m_grid, 1 );
1365 m_grid = glGenLists( 1 );
1367 if( !glIsList(
m_grid ) )
1370 glNewList(
m_grid, GL_COMPILE );
1372 glEnable( GL_BLEND );
1373 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1375 const double zpos = 0.0;
1383 const GLfloat transparency = 0.35f;
1385 double griSizeMM = 0.0;
1398 glNormal3f( 0.0, 0.0, 1.0 );
1403 brd_center_pos.
y = -brd_center_pos.
y;
1405 const int xsize = std::max( brd_size.
x,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1406 const int ysize = std::max( brd_size.
y,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1409 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1410 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1411 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1412 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1420 for(
int ii = 0; ; ii++ )
1423 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1425 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1430 if(
delta <= xsize / 2 )
1432 glBegin( GL_LINES );
1433 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1434 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1439 glBegin( GL_LINES );
1440 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1441 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1446 if(
delta <= ysize / 2 )
1448 glBegin( GL_LINES );
1449 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1450 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1455 glBegin( GL_LINES );
1456 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1457 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1462 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1467 glNormal3f( 0.0, -1.0, 0.0 );
1470 double posy = -brd_center_pos.
y *
scale;
1472 for(
int ii = 0; ; ii++ )
1475 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1477 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1482 glBegin( GL_LINES );
1485 glVertex3f( xmax, posy, zmin );
1486 glVertex3f( xmax, posy, zmax );
1491 glBegin( GL_LINES );
1493 glVertex3f( xmin, posy, zmin );
1494 glVertex3f( xmin, posy, zmax );
1498 if(
delta > xsize / 2.0f )
1503 for(
int ii = 0; ; ii++ )
1506 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1508 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1515 glBegin( GL_LINES );
1516 glVertex3f( xmin, posy,
delta );
1517 glVertex3f( xmax, posy,
delta );
1521 if(
delta <= -zmin && ( ii != 0 ) )
1524 glBegin( GL_LINES );
1525 glVertex3f( xmin, posy, -
delta );
1526 glVertex3f( xmax, posy, -
delta );
1534 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