Fill in some missing 3D render code.

1) add footprint graphics and text to copper
polys when differentiating plated from non-plated
copper

2) simplify adding footprint graphics and text
for contour walls

3) add dimension text and shapes for contour walls

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20111
This commit is contained in:
Jeff Young 2025-04-23 10:40:59 +01:00
parent 1ec47a053b
commit 31100451c6

View File

@ -569,40 +569,38 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
} }
} }
// Add footprints PADs objects to containers // Add footprints copper items (pads, shapes and text) to containers
for( PCB_LAYER_ID layer : layer_ids ) for( PCB_LAYER_ID layer : layer_ids )
{ {
wxASSERT( m_layerMap.contains( layer ) ); wxASSERT( m_layerMap.contains( layer ) );
BVH_CONTAINER_2D *layerContainer = m_layerMap[layer]; BVH_CONTAINER_2D *layerContainer = m_layerMap[layer];
// ADD PADS for( FOOTPRINT* fp : m_board->Footprints() )
for( FOOTPRINT* footprint : m_board->Footprints() )
{ {
addPads( footprint, layerContainer, layer ); addPads( fp, layerContainer, layer );
addFootprintShapes( footprint, layerContainer, layer, visibilityFlags ); addFootprintShapes( fp, layerContainer, layer, visibilityFlags );
if( cfg.DifferentiatePlatedCopper() && layer == F_Cu ) // Add copper item to the plated copper polygon list if required
footprint->TransformPadsToPolySet( *m_frontPlatedCopperPolys, F_Cu, 0, maxError, ERROR_INSIDE ); if( cfg.DifferentiatePlatedCopper() && ( layer == F_Cu || layer == B_Cu ) )
else if( cfg.DifferentiatePlatedCopper() && layer == B_Cu )
footprint->TransformPadsToPolySet( *m_backPlatedCopperPolys, B_Cu, 0, maxError, ERROR_INSIDE );
}
}
// Add footprints PADs poly contours (vertical outlines)
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL )
{
for( PCB_LAYER_ID layer : layer_ids )
{
wxASSERT( m_layers_poly.contains( layer ) );
SHAPE_POLY_SET *layerPoly = m_layers_poly[layer];
// Add pads to polygon list
for( FOOTPRINT* footprint : m_board->Footprints() )
{ {
footprint->TransformPadsToPolySet( *layerPoly, layer, 0, maxError, ERROR_INSIDE ); SHAPE_POLY_SET* layerPoly = layer == F_Cu ? m_frontPlatedCopperPolys : m_backPlatedCopperPolys;
transformFPShapesToPolySet( footprint, layer, *layerPoly, maxError, ERROR_INSIDE );
fp->TransformPadsToPolySet( *layerPoly, layer, 0, maxError, ERROR_INSIDE );
transformFPTextToPolySet( fp, layer, visibilityFlags, *layerPoly, maxError, ERROR_INSIDE );
transformFPShapesToPolySet( fp, layer, *layerPoly, maxError, ERROR_INSIDE );
}
// Add copper item to poly contours (vertical outlines) if required
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL )
{
wxASSERT( m_layers_poly.contains( layer ) );
SHAPE_POLY_SET* layerPoly = m_layers_poly[layer];
fp->TransformPadsToPolySet( *layerPoly, layer, 0, maxError, ERROR_INSIDE );
transformFPTextToPolySet( fp, layer, visibilityFlags, *layerPoly, maxError, ERROR_INSIDE );
transformFPShapesToPolySet( fp, layer, *layerPoly, maxError, ERROR_INSIDE );
} }
} }
} }
@ -647,16 +645,14 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
break; break;
default: default:
wxLogTrace( m_logTrace, wxT( "createLayers: item type: %d not implemented" ), wxLogTrace( m_logTrace, wxT( "createLayers: item type: %d not implemented" ), item->Type() );
item->Type() );
break; break;
} }
// add also this shape to the plated copper polygon list if required // Add copper item to the plated copper polygon list if required
if( cfg.DifferentiatePlatedCopper() && ( layer == F_Cu || layer == B_Cu ) ) if( cfg.DifferentiatePlatedCopper() && ( layer == F_Cu || layer == B_Cu ) )
{ {
SHAPE_POLY_SET* copperPolys = layer == F_Cu ? m_frontPlatedCopperPolys SHAPE_POLY_SET* copperPolys = layer == F_Cu ? m_frontPlatedCopperPolys : m_backPlatedCopperPolys;
: m_backPlatedCopperPolys;
// Note: for TEXT and TEXTBOX, TransformShapeToPolygon returns the bounding // Note: for TEXT and TEXTBOX, TransformShapeToPolygon returns the bounding
// box shape, not the exact text shape. So it is not used for these items // box shape, not the exact text shape. So it is not used for these items
@ -677,23 +673,13 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
item->TransformShapeToPolySet( *copperPolys, layer, 0, maxError, ERROR_INSIDE ); item->TransformShapeToPolySet( *copperPolys, layer, 0, maxError, ERROR_INSIDE );
} }
} }
}
}
// Add graphic item on copper layers to poly contours (vertical outlines) // Add copper item to poly contours (vertical outlines) if required
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL )
{
for( PCB_LAYER_ID layer : layer_ids )
{
wxASSERT( m_layers_poly.contains( layer ) );
SHAPE_POLY_SET *layerPoly = m_layers_poly[layer];
// Add graphic items on copper layers (texts and other )
for( BOARD_ITEM* item : m_board->Drawings() )
{ {
if( !item->IsOnLayer( layer ) ) wxASSERT( m_layers_poly.contains( layer ) );
continue;
SHAPE_POLY_SET *layerPoly = m_layers_poly[layer];
switch( item->Type() ) switch( item->Type() )
{ {
@ -737,9 +723,24 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
break; break;
} }
case PCB_DIM_ALIGNED_T:
case PCB_DIM_CENTER_T:
case PCB_DIM_RADIAL_T:
case PCB_DIM_ORTHOGONAL_T:
case PCB_DIM_LEADER_T:
{
PCB_DIMENSION_BASE* dimension = static_cast<PCB_DIMENSION_BASE*>( item );
dimension->TransformTextToPolySet( *layerPoly, 0, maxError, ERROR_INSIDE );
for( const std::shared_ptr<SHAPE>& shape : dimension->GetShapes() )
shape->TransformToPolygon( *layerPoly, maxError, ERROR_INSIDE );
break;
}
default: default:
wxLogTrace( m_logTrace, wxT( "createLayers: item type: %d not implemented" ), wxLogTrace( m_logTrace, wxT( "createLayers: item type: %d not implemented" ), item->Type() );
item->Type() );
break; break;
} }
} }
@ -761,10 +762,12 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
zones.emplace_back( std::make_pair( zone, layer ) ); zones.emplace_back( std::make_pair( zone, layer ) );
layer_lock.emplace( layer, std::make_unique<std::mutex>() ); layer_lock.emplace( layer, std::make_unique<std::mutex>() );
if( cfg.DifferentiatePlatedCopper() && layer == F_Cu ) if( cfg.DifferentiatePlatedCopper() && ( layer == F_Cu || layer == B_Cu ) )
zone->TransformShapeToPolygon( *m_frontPlatedCopperPolys, F_Cu, 0, maxError, ERROR_INSIDE ); {
else if( cfg.DifferentiatePlatedCopper() && layer == B_Cu ) SHAPE_POLY_SET* copperPolys = layer == F_Cu ? m_frontPlatedCopperPolys : m_backPlatedCopperPolys;
zone->TransformShapeToPolygon( *m_backPlatedCopperPolys, B_Cu, 0, maxError, ERROR_INSIDE );
zone->TransformShapeToPolygon( *copperPolys, layer, 0, maxError, ERROR_INSIDE );
}
} }
} }