| 149 | } |
| 150 | |
| 151 | std::optional<VariableEdgeTri2Index> findNext( AccumulativeSet& accumulativeSet, const VarEdgeTri& curr ) |
| 152 | { |
| 153 | auto currB2Aedge = curr.isEdgeATriB() ? curr.edge : curr.edge.sym(); |
| 154 | const auto& edgeTopology = accumulativeSet.topologyByEdge( curr.isEdgeATriB() ); |
| 155 | const auto& triTopology = accumulativeSet.topologyByTri( curr.isEdgeATriB() ); |
| 156 | auto leftTri = edgeTopology.left( currB2Aedge ); |
| 157 | auto leftEdge = triTopology.edgePerFace()[curr.tri()]; |
| 158 | |
| 159 | assert( curr.edge ); |
| 160 | |
| 161 | if ( leftTri.valid() ) |
| 162 | { |
| 163 | VarEdgeTri variants[5] = |
| 164 | { |
| 165 | { curr.isEdgeATriB(), edgeTopology.next( currB2Aedge ), curr.tri() }, |
| 166 | { curr.isEdgeATriB(), edgeTopology.prev( currB2Aedge.sym() ), curr.tri() }, |
| 167 | |
| 168 | { !curr.isEdgeATriB(), leftEdge, leftTri }, |
| 169 | { !curr.isEdgeATriB(), triTopology.next( leftEdge ), leftTri }, |
| 170 | { !curr.isEdgeATriB(), triTopology.prev( leftEdge.sym() ), leftTri } |
| 171 | }; |
| 172 | |
| 173 | for ( const auto& v : variants ) |
| 174 | { |
| 175 | if ( !v.edge.valid() ) |
| 176 | continue; |
| 177 | if ( auto pIndex = accumulativeSet.edgeTri2IndexMap.findIndex( v ) ) |
| 178 | return VariableEdgeTri2Index{ v, *pIndex }; |
| 179 | } |
| 180 | } |
| 181 | return {}; |
| 182 | } |
| 183 | |
| 184 | void parallelPrepareLinkedLists( const std::vector<VarEdgeTri>& intersections, AccumulativeSet& accumulativeSet ) |
| 185 | { |
no test coverage detected