diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp index e3c75c7d42..2053ccbb10 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp +++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp @@ -275,7 +275,9 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER *aStatusTextReporter ) m_outlineBoard2dObjects = new CCONTAINER2D; - if( ((const SHAPE_POLY_SET &)m_settings.GetBoardPoly()).OutlineCount() == 1 ) + const int outlineCount = m_settings.GetBoardPoly().OutlineCount(); + + if( outlineCount > 0 ) { float divFactor = 0.0f; @@ -288,12 +290,16 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER *aStatusTextReporter ) SHAPE_POLY_SET boardPolyCopy = m_settings.GetBoardPoly(); boardPolyCopy.Fracture( SHAPE_POLY_SET::PM_FAST ); - Convert_path_polygon_to_polygon_blocks_and_dummy_blocks( - boardPolyCopy, - *m_outlineBoard2dObjects, - m_settings.BiuTo3Dunits(), - divFactor, - (const BOARD_ITEM &)*m_settings.GetBoard() ); + for( int iOutlinePolyIdx = 0; iOutlinePolyIdx < outlineCount; iOutlinePolyIdx++ ) + { + Convert_path_polygon_to_polygon_blocks_and_dummy_blocks( + boardPolyCopy, + *m_outlineBoard2dObjects, + m_settings.BiuTo3Dunits(), + divFactor, + *dynamic_cast( m_settings.GetBoard() ), + iOutlinePolyIdx ); + } if( m_settings.GetFlag( FL_SHOW_BOARD_BODY ) ) { diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp index e8eb797b87..c22e5f987f 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp +++ b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp @@ -406,17 +406,16 @@ void Convert_path_polygon_to_polygon_blocks_and_dummy_blocks( CGENERICCONTAINER2D &aDstContainer, float aBiuTo3DunitsScale, float aDivFactor, - const BOARD_ITEM &aBoardItem ) + const BOARD_ITEM &aBoardItem, + int aPolyIndex ) { - BOX2I pathBounds = aMainPath.BBox(); - // Get the path - wxASSERT( aMainPath.OutlineCount() == 1 ); - const SHAPE_POLY_SET::POLYGON& curr_polywithholes = aMainPath.CPolygon( 0 ); + wxASSERT( aPolyIndex < aMainPath.OutlineCount() ); - wxASSERT( curr_polywithholes.size() == 1 ); - const SHAPE_LINE_CHAIN& path = curr_polywithholes[0]; // a simple polygon + const SHAPE_LINE_CHAIN& path = aMainPath.COutline( aPolyIndex ); + + BOX2I pathBounds = path.BBox(); // Convert the points to segments class CBBOX2D bbox; diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h index a9b597962a..b37824b446 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h +++ b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h @@ -148,7 +148,8 @@ void Convert_path_polygon_to_polygon_blocks_and_dummy_blocks( CGENERICCONTAINER2D &aDstContainer, float aBiuTo3DunitsScale, float aDivFactor, - const BOARD_ITEM &aBoardItem ); + const BOARD_ITEM &aBoardItem, + int aPolyIndex ); void Polygon2d_TestModule();