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

Function fromFaceSoup

source/MRMesh/MRMeshBuilder.cpp:264–319  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

262}
263
264MeshTopology fromFaceSoup( const std::vector<VertId> & verts, const Vector<VertSpan, FaceId> & faces,
265 const BuildSettings & settings, ProgressCallback progressCb )
266{
267 MR_TIMER;
268
269 MeshTopology res;
270 if ( faces.empty() || verts.empty() )
271 return res;
272
273 // reserve enough elements for faces and vertices
274 auto sizeFaces = settings.region ? settings.region->size() : faces.size();
275 auto maxVertId = findMaxVertId( verts );
276 res.faceResize( sizeFaces + settings.shiftFaceId );
277 res.vertResize( maxVertId + 1 );
278
279 size_t faceAdded = 0;
280 size_t target = settings.region ? settings.region->count() : faces.size();
281 float rtarget = 1.0f / target;
282
283 FaceAdder fa;
284 // we will try to add these triangles in the current pass
285 FaceBitSet active = getLocalRegion( settings.region, faces.size() );
286 // these are faces that cannot be added even after other faces
287 FaceBitSet bad;
288 for (;;)
289 {
290 size_t faceAddedOnThisPass = 0;
291 for ( FaceId f : active )
292 {
293 auto x = fa.add( res, f + settings.shiftFaceId,
294 verts.data() + faces[f].firstVertex, verts.data() + faces[f].lastVertex, settings.allowNonManifoldEdge );
295 if ( x == AddFaceResult::UnsafeTryLater )
296 continue;
297 active.reset( f );
298 if ( x != AddFaceResult::Success )
299 bad.autoResizeSet( f );
300 else
301 ++faceAddedOnThisPass;
302 }
303
304 if ( faceAddedOnThisPass == 0 )
305 break; // no single triangle added during the pass
306
307 faceAdded += faceAddedOnThisPass;
308 reportProgress( progressCb, faceAdded * rtarget );
309 }
310 if ( settings.region || settings.skippedFaceCount )
311 {
312 active |= bad;
313 if ( settings.skippedFaceCount )
314 *settings.skippedFaceCount = (int)active.count();
315 if ( settings.region )
316 *settings.region = std::move( active );
317 }
318 return res;
319}
320
321size_t addTriangles( MeshTopology & res, const Triangulation & t, const BuildSettings & settings )

Callers 3

TESTFunction · 0.85
fromOffFunction · 0.85
fromFaceSoupMethod · 0.85

Calls 12

findMaxVertIdFunction · 0.85
getLocalRegionFunction · 0.85
reportProgressFunction · 0.85
faceResizeMethod · 0.80
countMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45
vertResizeMethod · 0.45
addMethod · 0.45
dataMethod · 0.45
resetMethod · 0.45
autoResizeSetMethod · 0.45

Tested by 1

TESTFunction · 0.68