MCPcopy Create free account
hub / github.com/MeshInspector/MeshLib / buildGridMesh

Method buildGridMesh

source/MRMesh/MRMeshTopology.cpp:1618–1752  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1616}
1617
1618bool MeshTopology::buildGridMesh( const GridSettings & settings, ProgressCallback cb )
1619{
1620 MR_TIMER;
1621
1622 stopUpdatingValids();
1623
1624 // we use resizeNoInit because expect vertices/faces/edges to be tightly packed (no deleted elements within valid range)
1625 // note: some vertices might be valid but have no edge
1626 edgePerVertex_.resizeNoInit( settings.vertIds.tsize );
1627 edgePerFace_.resizeNoInit( settings.faceIds.tsize );
1628 edges_.resizeNoInit( 2 * settings.uedgeIds.tsize );
1629
1630 auto getVertId = [&]( Vector2i v ) -> VertId
1631 {
1632 if ( v.x < 0 || v.x > settings.dim.x || v.y < 0 || v.y > settings.dim.y )
1633 return VertId();
1634 return settings.vertIds.b[ v.x + v.y * ( settings.dim.x + 1 ) ];
1635 };
1636 auto getFaceId = [&]( Vector2i v, GridSettings::TriType triType ) -> FaceId
1637 {
1638 if ( v.x < 0 || v.x >= settings.dim.x || v.y < 0 || v.y >= settings.dim.y )
1639 return FaceId();
1640 return settings.faceIds.b[ 2 * ( v.x + v.y * settings.dim.x ) + (int)triType ];
1641 };
1642 auto getEdgeId = [&]( Vector2i v, GridSettings::EdgeType edgeType ) -> EdgeId
1643 {
1644 if ( v.x < 0 || v.x > settings.dim.x || v.y < 0 || v.y > settings.dim.y )
1645 return EdgeId();
1646 auto ue = settings.uedgeIds.b[ 4 * ( v.x + v.y * ( settings.dim.x + 1 ) ) + (int)edgeType ];
1647 return ue ? EdgeId( ue ) : EdgeId();
1648 };
1649
1650 struct EdgeFace
1651 {
1652 EdgeId e;
1653 FaceId f; //to the left of e
1654 };
1655 tbb::enumerable_thread_specific<std::vector<EdgeFace>> edgeRingPerThread;
1656 auto result = ParallelFor( 0, settings.dim.y + 1, edgeRingPerThread, [&]( int y, std::vector<EdgeFace> & edgeRing )
1657 {
1658 Vector2i pos;
1659 pos.y = y;
1660 for ( pos.x = 0; pos.x <= settings.dim.x; ++pos.x )
1661 {
1662 if ( auto da = getEdgeId( pos, GridSettings::EdgeType::DiagonalA ) )
1663 {
1664 if ( const auto fl = getFaceId( pos, GridSettings::TriType::Lower ) )
1665 edgePerFace_[fl] = da.sym();
1666 if ( const auto fu = getFaceId( pos, GridSettings::TriType::Upper ) )
1667 edgePerFace_[fu] = da;
1668 }
1669 else if ( auto db = getEdgeId( pos, GridSettings::EdgeType::DiagonalB ) )
1670 {
1671 if ( const auto fl = getFaceId( pos, GridSettings::TriType::Lower ) )
1672 edgePerFace_[fl] = db;
1673 if ( const auto fu = getFaceId( pos, GridSettings::TriType::Upper ) )
1674 edgePerFace_[fu] = db.sym();
1675 }

Callers 1

makeRegularGridMeshFunction · 0.80

Calls 7

ParallelForFunction · 0.85
subprogressFunction · 0.85
push_backMethod · 0.80
symMethod · 0.45
clearMethod · 0.45
emptyMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected