38#include <glm/geometric.hpp>
48#include <glm/gtc/type_ptr.hpp>
61 const float aaa = aTransparency * aTransparency * aTransparency;
64 float ca = 1.0f - aTransparency;
65 ca = 1.00f - 1.05f * ca * ca * ca;
67 return glm::clamp( aGrayColorValue * ca + aaa, 0.0f, 1.0f );
73#define UNITS3D_TO_UNITSPCB ( pcbIUScale.IU_PER_MM )
79 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
116 wxLogTrace(
m_logTrace, wxT(
"RENDER_3D_OPENGL::RENDER_3D_OPENGL" ) );
139 int fbWidth, fbHeight;
140 glGetIntegerv( GL_VIEWPORT, viewport );
153 glEnable( GL_LIGHT0 );
155 glDisable( GL_LIGHT0 );
162 glEnable( GL_LIGHT1 );
164 glDisable( GL_LIGHT1 );
171 glEnable( GL_LIGHT2 );
173 glDisable( GL_LIGHT2 );
236 m_materials.m_Copper.m_Shininess = shininessfactor * 128.0f;
245 m_materials.m_NonPlatedCopper.m_Shininess = 0.1f * 128.0f;
273 m_materials.m_SilkSTop.m_Shininess = 0.078125f * 128.0f;
286 m_materials.m_SilkSBot.m_Shininess = 0.078125f * 128.0f;
290 m_materials.m_SolderMask.m_Shininess = 0.85f * 128.0f;
300 m_materials.m_EpoxyBoard.m_Shininess = 0.1f * 128.0f;
330 const float solderMask_gray = ( layerColor.r + layerColor.g + layerColor.b ) / 3.0f;
334 const float baseTransparency = 1.0f - layerColor.a;
347 const float minSolderMaskShininess = 0.85f * 128.0f;
348 const float maxSolderMaskShininess = 512.0f;
349 m_materials.m_SolderMask.m_Shininess = minSolderMaskShininess
350 + ( maxSolderMaskShininess - minSolderMaskShininess ) * ( 1.0f - solderMask_gray );
405 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
428 m_materials.m_Plastic.m_Shininess = 0.078125f * 128.0f;
446 const GLfloat ambient[] = { 0.084f, 0.084f, 0.084f, 1.0f };
447 const GLfloat diffuse0[] = { 0.3f, 0.3f, 0.3f, 1.0f };
448 const GLfloat specular0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
450 glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
451 glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0 );
452 glLightfv( GL_LIGHT0, GL_SPECULAR, specular0 );
454 const GLfloat diffuse12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
455 const GLfloat specular12[] = { 0.7f, 0.7f, 0.7f, 1.0f };
458 GLfloat position[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
462 glm::pi<float>() * 0.25f );
464 position[0] = vectorLight.x;
465 position[1] = vectorLight.y;
466 position[2] = vectorLight.z;
468 glLightfv( GL_LIGHT1, GL_AMBIENT, ambient );
469 glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse12 );
470 glLightfv( GL_LIGHT1, GL_SPECULAR, specular12 );
471 glLightfv( GL_LIGHT1, GL_POSITION, position );
474 position[2] = -position[2];
476 glLightfv( GL_LIGHT2, GL_AMBIENT, ambient );
477 glLightfv( GL_LIGHT2, GL_DIFFUSE, diffuse12 );
478 glLightfv( GL_LIGHT2, GL_SPECULAR, specular12 );
479 glLightfv( GL_LIGHT2, GL_POSITION, position );
481 const GLfloat lmodel_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
483 glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
485 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
497 glEnable( GL_POLYGON_OFFSET_FILL );
498 glPolygonOffset( -0.1f, -2.0f );
505 glDisable( GL_POLYGON_OFFSET_FILL );
520 if( aSkipRenderHoles )
548 return SFVEC4F( aInput.r * aInput.a, aInput.g * aInput.a, aInput.b * aInput.a, aInput.a );
568 if( aStatusReporter )
569 aStatusReporter->
Report(
_(
"Loading..." ) );
576 reload( aStatusReporter, aWarningReporter );
597 glDepthFunc( GL_LESS );
598 glEnable( GL_CULL_FACE );
599 glFrontFace( GL_CCW );
600 glEnable( GL_NORMALIZE );
604 glDisable( GL_MULTISAMPLE );
606 glEnable( GL_MULTISAMPLE );
609 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
610 glClearDepth( 1.0f );
611 glClearStencil( 0x00 );
612 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
620 glEnable( GL_DEPTH_TEST );
623 glMatrixMode( GL_PROJECTION );
624 glLoadMatrixf( glm::value_ptr(
m_camera.GetProjectionMatrix() ) );
625 glMatrixMode( GL_MODELVIEW );
627 glLoadMatrixf( glm::value_ptr(
m_camera.GetViewMatrix() ) );
634 glEnable( GL_LIGHTING );
643 if( cameraPos.z > 0.0f )
644 zpos = glm::max( cameraPos.z, 0.5f ) + cameraPos.z * cameraPos.z;
646 zpos = glm::min( cameraPos.z,-0.5f ) - cameraPos.z * cameraPos.z;
649 const GLfloat headlight_pos[] = { cameraPos.x, cameraPos.y, zpos, 1.0f };
651 glLightfv( GL_LIGHT0, GL_POSITION, headlight_pos );
657 bool showThickness = !skipThickness;
659 std::bitset<LAYER_3D_END> layerFlags =
m_boardAdapter.GetVisibleLayers();
670 for( MAP_OGL_DISP_LISTS::const_iterator ii =
m_layers.begin(); ii !=
m_layers.end(); ++ii )
684 const double opacity_min = 0.8;
709 if( !skipRenderHoles )
755 if( !skipRenderHoles )
764 anti_board =
nullptr;
771 if( throughHolesOuter )
780 pLayerDispList->
DrawCulled( showThickness, solder_mask, throughHolesOuter, anti_board );
786 glm::mat4 cameraViewMatrix;
788 glGetFloatv( GL_MODELVIEW_MATRIX, glm::value_ptr( cameraViewMatrix ) );
803 bool highlight =
false;
807 if( fp->IsSelected() )
821 renderList->DrawAll();
834 bool highlight =
false;
838 if( fp->IsSelected() )
863 renderList->DrawAll();
878 glEnable( GL_POLYGON_OFFSET_FILL );
879 glPolygonOffset( 0.0f, -2.0f );
886 showThickness, skipRenderHoles );
892 showThickness, skipRenderHoles );
900 showThickness, skipRenderHoles );
906 showThickness, skipRenderHoles );
910 glDisable( GL_POLYGON_OFFSET_FILL );
911 glPolygonOffset( 0.0f, 0.0f );
917 glDepthMask( GL_FALSE );
918 glEnable( GL_BLEND );
919 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
922 glEnable( GL_TEXTURE_2D );
923 glActiveTexture( GL_TEXTURE0 );
928 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
929 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
930 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
932 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR );
933 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
935 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
936 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
938 glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR );
939 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
940 glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_CONSTANT );
941 glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
945 glDisable( GL_BLEND );
948 glDepthMask( GL_TRUE );
953 glDisable( GL_LIGHTING );
958 glEnable( GL_LIGHTING );
975 glEnable( GL_LINE_SMOOTH );
976 glShadeModel( GL_SMOOTH );
979 glPixelStorei( GL_UNPACK_ALIGNMENT, 4 );
1000 delete circleImageBlured;
1001 circleImageBlured =
nullptr;
1004 circleImage =
nullptr;
1018 glEnable( GL_COLOR_MATERIAL );
1019 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
1026 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r );
1027 glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 96.0f );
1029 glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r );
1030 glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r );
1031 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.r );
1037#define DELETE_AND_FREE( ptr ) \
1043#define DELETE_AND_FREE_MAP( map ) \
1045 for( auto& [ layer, ptr ] : map ) \
1052 glDeleteLists(
m_grid, 1 );
1096 bool aShowThickness,
bool aSkipRenderHoles )
1098 wxASSERT( (aLayerID ==
B_Mask) || (aLayerID ==
F_Mask) );
1111 m_board->SetItIsTransparent(
true );
1112 m_board->DrawCulled( aShowThickness, solder_mask, via_holes );
1129 bool aGetBot,
bool aRenderTransparentOnly,
1130 bool aRenderSelectedOnly )
1132 wxASSERT( ( aGetTop ==
true ) || ( aGetBot ==
true ) );
1142 bool highlight =
false;
1146 if( fp->IsSelected() )
1152 if( aRenderSelectedOnly != highlight )
1156 bool hasModels = !fp->Models().empty();
1157 bool showMissing =
m_boardAdapter.m_Cfg->m_Render.show_missing_models;
1159 if( hasModels || showMissing )
1163 const bool isFlipped = fp->IsFlipped();
1165 if( aGetTop == !isFlipped || aGetBot == isFlipped )
1176 bool aRenderTransparentOnly,
bool aIsSelected )
1178 if( !aFootprint->
Models().empty() )
1184 glm::mat4 fpMatrix( 1.0f );
1192 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1197 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1198 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1203 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1208 if( !sM.m_Show || sM.m_Filename.empty() )
1217 aIsSelected, aRenderTransparentOnly ? sM.m_Opacity : 1.0f );
1221 if(
const MODEL_3D* modelPtr = cache_i->second )
1223 bool opaque = sM.m_Opacity >= 1.0;
1225 if( ( !aRenderTransparentOnly && modelPtr->HasOpaqueMeshes() && opaque ) ||
1226 ( aRenderTransparentOnly && ( modelPtr->HasTransparentMeshes() || !opaque ) ) )
1228 glm::mat4 modelworldMatrix = fpMatrix;
1230 const SFVEC3F offset =
SFVEC3F( sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z );
1231 const SFVEC3F rotation =
SFVEC3F( sM.m_Rotation.x, sM.m_Rotation.y,
1235 std::vector<float> key = { offset.x, offset.y, offset.z,
1236 rotation.x, rotation.y, rotation.z,
1243 modelworldMatrix *= it->second;
1247 glm::mat4 mtx( 1.0f );
1248 mtx = glm::translate( mtx, offset );
1249 mtx = glm::rotate( mtx, glm::radians( -rotation.z ), { 0.0f, 0.0f, 1.0f } );
1250 mtx = glm::rotate( mtx, glm::radians( -rotation.y ), { 0.0f, 1.0f, 0.0f } );
1251 mtx = glm::rotate( mtx, glm::radians( -rotation.x ), { 1.0f, 0.0f, 0.0f } );
1252 mtx = glm::scale( mtx,
scale );
1255 modelworldMatrix *= mtx;
1258 aDstRenderList.emplace_back( modelworldMatrix, modelPtr,
1259 aRenderTransparentOnly ? sM.m_Opacity : 1.0f,
1260 aRenderTransparentOnly,
1272 glm::mat4 fpMatrix( 1.0f );
1280 SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1285 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
1286 fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
1291 fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor ) );
1300 const glm::mat4& aFpMatrix,
const FOOTPRINT* aFootprint,
1301 bool aRenderTransparentOnly,
bool aIsSelected,
float aOpacity )
1315 float scaleX = bboxW;
1316 float scaleY = bboxH;
1317 float scaleZ = std::min( bboxW, bboxH ) * 0.5f;
1320 float offsetX = localCenter.
x /
pcbIUScale.IU_PER_MM;
1321 float offsetY = -localCenter.
y /
pcbIUScale.IU_PER_MM;
1322 float offsetZ = scaleZ * 0.5f;
1327 glm::mat4 mtx = aFpMatrix;
1328 mtx = glm::translate( mtx,
SFVEC3F( offsetX, offsetY, offsetZ ) );
1329 mtx = glm::scale( mtx,
SFVEC3F( scaleX, scaleY, scaleZ ) );
1331 bool placeholderOpaque = aOpacity >= 1.0;
1333 if( ( !aRenderTransparentOnly &&
m_placeholderModel->HasOpaqueMeshes() && placeholderOpaque )
1334 || ( aRenderTransparentOnly && (
m_placeholderModel->HasTransparentMeshes() || !placeholderOpaque ) ) )
1336 aDstRenderList.emplace_back( mtx,
m_placeholderModel, aOpacity, aRenderTransparentOnly,
1350 std::list<MODELTORENDER> renderList;
1358 if( !renderList.empty() )
1363 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1372 if( !renderList.empty() )
1377 renderModel( aCameraViewMatrix, mtr, selColor,
nullptr );
1392 std::list<MODELTORENDER> renderListModels;
1403 if( renderListModels.empty() )
1406 std::vector<std::pair<const MODELTORENDER *, float>> transparentModelList;
1408 transparentModelList.reserve( renderListModels.size() );
1415 const BBOX_3D& bBox = mtr.m_model->GetBBox();
1417 const SFVEC3F bBoxWorld = mtr.m_modelWorldMat * glm::vec4( bBoxCenter, 1.0f );
1419 const float distanceToCamera = glm::length( cameraPos - bBoxWorld );
1421 transparentModelList.emplace_back( &mtr, distanceToCamera );
1425 std::sort( transparentModelList.begin(), transparentModelList.end(),
1426 [&]( std::pair<const MODELTORENDER *, float>& a,
1427 std::pair<const MODELTORENDER *, float>& b )
1429 if( a.second != b.second )
1430 return a.second > b.second;
1432 return a.first > b.first;
1438 bool isUsingColorInformation = !( transparentModelList.begin()->first->m_isSelected &&
1443 for(
const std::pair<const MODELTORENDER *, float>& mtr : transparentModelList )
1448 if( !isUsingColorInformation && !mtr.first->m_isSelected )
1450 isUsingColorInformation =
true;
1452 glEnableClientState( GL_COLOR_ARRAY );
1453 glEnableClientState( GL_TEXTURE_COORD_ARRAY );
1454 glEnable( GL_COLOR_MATERIAL );
1456 else if( isUsingColorInformation && mtr.first->m_isSelected )
1458 isUsingColorInformation =
false;
1460 glDisableClientState( GL_COLOR_ARRAY );
1461 glDisableClientState( GL_TEXTURE_COORD_ARRAY );
1462 glDisable( GL_COLOR_MATERIAL );
1468 renderModel( aCameraViewMatrix, *mtr.first, selColor, &cameraPos );
1483 const glm::mat4 modelviewMatrix = aCameraViewMatrix * aModelToRender.
m_modelWorldMat;
1485 glLoadMatrixf( glm::value_ptr( modelviewMatrix ) );
1493 const bool wasBlendEnabled = glIsEnabled( GL_BLEND );
1495 if( !wasBlendEnabled )
1497 glEnable( GL_BLEND );
1498 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1501 glDisable( GL_LIGHTING );
1509 glEnable( GL_LIGHTING );
1511 if( !wasBlendEnabled )
1512 glDisable( GL_BLEND );
1520 glDeleteLists(
m_grid, 1 );
1527 m_grid = glGenLists( 1 );
1529 if( !glIsList(
m_grid ) )
1532 glNewList(
m_grid, GL_COMPILE );
1534 glEnable( GL_BLEND );
1535 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
1537 const double zpos = 0.0;
1545 const GLfloat transparency = 0.35f;
1547 double griSizeMM = 0.0;
1560 glNormal3f( 0.0, 0.0, 1.0 );
1565 brd_center_pos.
y = -brd_center_pos.
y;
1567 const int xsize = std::max( brd_size.
x,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1568 const int ysize = std::max( brd_size.
y,
pcbIUScale.mmToIU( 100 ) ) * 1.2;
1571 double xmin = ( brd_center_pos.
x - xsize / 2 ) *
scale;
1572 double xmax = ( brd_center_pos.
x + xsize / 2 ) *
scale;
1573 double ymin = ( brd_center_pos.
y - ysize / 2 ) *
scale;
1574 double ymax = ( brd_center_pos.
y + ysize / 2 ) *
scale;
1582 for(
int ii = 0; ; ii++ )
1585 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1587 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1592 if(
delta <= xsize / 2 )
1594 glBegin( GL_LINES );
1595 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymin, zpos );
1596 glVertex3f( (brd_center_pos.
x +
delta) *
scale, -ymax, zpos );
1601 glBegin( GL_LINES );
1602 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymin, zpos );
1603 glVertex3f( (brd_center_pos.
x -
delta) *
scale, -ymax, zpos );
1608 if(
delta <= ysize / 2 )
1610 glBegin( GL_LINES );
1611 glVertex3f( xmin, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1612 glVertex3f( xmax, -( brd_center_pos.
y +
delta ) *
scale, zpos );
1617 glBegin( GL_LINES );
1618 glVertex3f( xmin, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1619 glVertex3f( xmax, -( brd_center_pos.
y -
delta ) *
scale, zpos );
1624 if( (
delta > ysize / 2 ) && (
delta > xsize / 2 ) )
1629 glNormal3f( 0.0, -1.0, 0.0 );
1632 double posy = -brd_center_pos.
y *
scale;
1634 for(
int ii = 0; ; ii++ )
1637 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1639 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b,
1644 glBegin( GL_LINES );
1647 glVertex3f( xmax, posy, zmin );
1648 glVertex3f( xmax, posy, zmax );
1653 glBegin( GL_LINES );
1655 glVertex3f( xmin, posy, zmin );
1656 glVertex3f( xmin, posy, zmax );
1660 if(
delta > xsize / 2.0f )
1665 for(
int ii = 0; ; ii++ )
1668 glColor4f( gridColor.r, gridColor.g, gridColor.b, transparency );
1670 glColor4f( gridColor_marker.r, gridColor_marker.g, gridColor_marker.b, transparency );
1677 glBegin( GL_LINES );
1678 glVertex3f( xmin, posy,
delta );
1679 glVertex3f( xmax, posy,
delta );
1683 if(
delta <= -zmin && ( ii != 0 ) )
1686 glBegin( GL_LINES );
1687 glVertex3f( xmin, posy, -
delta );
1688 glVertex3f( xmax, posy, -
delta );
1696 glDisable( GL_BLEND );
1705 static SFVEC3F positions[24] = {
1706 { -0.5f, -0.5f, 0.5f },
1707 { 0.5f, -0.5f, 0.5f },
1708 { 0.5f, 0.5f, 0.5f },
1709 { -0.5f, 0.5f, 0.5f },
1712 { -0.5f, 0.5f, -0.5f },
1713 { 0.5f, 0.5f, -0.5f },
1714 { 0.5f, -0.5f, -0.5f },
1715 { -0.5f, -0.5f, -0.5f },
1718 { 0.5f, -0.5f, -0.5f },
1719 { 0.5f, 0.5f, -0.5f },
1720 { 0.5f, 0.5f, 0.5f },
1721 { 0.5f, -0.5f, 0.5f },
1724 { -0.5f, -0.5f, 0.5f },
1725 { -0.5f, 0.5f, 0.5f },
1726 { -0.5f, 0.5f, -0.5f },
1727 { -0.5f, -0.5f, -0.5f },
1730 { -0.5f, 0.5f, 0.5f },
1731 { 0.5f, 0.5f, 0.5f },
1732 { 0.5f, 0.5f, -0.5f },
1733 { -0.5f, 0.5f, -0.5f },
1736 { -0.5f, -0.5f, -0.5f },
1737 { 0.5f, -0.5f, -0.5f },
1738 { 0.5f, -0.5f, 0.5f },
1739 { -0.5f, -0.5f, 0.5f }
1742 static SFVEC3F normals[24] = {
1774 static unsigned int indices[36] = {
1777 8, 9, 10, 8, 10, 11,
1778 12, 13, 14, 12, 14, 15,
1779 16, 17, 18, 16, 18, 19,
1780 20, 21, 22, 20, 22, 23
1792 static SMESH mesh = { 24, positions, normals,
nullptr,
nullptr, 36, indices, 0 };
@ NORMAL
Use all material properties from model file.
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
EXTRUSION_MATERIAL_PROPS GetMaterialProps(EXTRUSION_MATERIAL aMaterial, const SFVEC3F &aDiffuse)
BOX2I CalcPlaceholderLocalBox(const FOOTPRINT *aFootprint)
Calculate a local space bounding box for a placeholder 3D model.
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Helper class to handle information needed to display 3D board.
constexpr size_type GetWidth() const
constexpr const Vec GetCenter() const
constexpr size_type GetHeight() const
A class used to derive camera objects from.
Implement a canvas based on a wxGLCanvas.
static KIGFX::COLOR4D GetDefaultColor(EXTRUSION_MATERIAL aMaterial)
EXTRUSION_MATERIAL m_material
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 COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
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)
std::map< const FOOTPRINT *, OPENGL_RENDER_LIST * > m_extrudedPadLists
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
MODEL_3D * m_placeholderModel
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 createPlaceholderModel()
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)
std::map< const FOOTPRINT *, OPENGL_RENDER_LIST * > m_extrudedBodyLists
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)
void updateGizmoSelection(glm::mat4 aCameraRotationMatrix)
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,...
void renderPlaceholderForFootprint(std::list< MODELTORENDER > &aDstRenderList, const glm::mat4 &aFpMatrix, const FOOTPRINT *aFootprint, bool aRenderTransparentOnly, bool aIsSelected, float aOpacity)
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:
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
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
Store the a model based on meshes and materials.
float m_Transparency
1.0 is completely transparent, 0.0 completely opaque
SFVEC3F m_Diffuse
Default diffuse color if m_Color is NULL.
Per-vertex normal/color/texcoors structure.
VECTOR2< int32_t > VECTOR2I