| 1616 | } |
| 1617 | |
| 1618 | bool 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 | } |
no test coverage detected