protected virtual DMesh3 compute_standard() { DMesh3 sourceMesh = MeshSource.GetDMeshUnsafe(); ISpatial sourceSpatial = MeshSource.GetSpatial(); DMesh3 meshIn = new DMesh3(sourceMesh); RemesherPro remesh = new RemesherPro(meshIn); //Remesher remesh = new Remesher(meshIn); remesh.SetTargetEdgeLength(TargetEdgeLength); remesh.PreventNormalFlips = this.PreventNormalFlips; remesh.EnableFlips = this.EnableFlips; remesh.EnableSplits = this.EnableSplits; remesh.EnableCollapses = this.EnableCollapses; remesh.EnableSmoothing = this.EnableSmoothing; remesh.SmoothSpeedT = this.SmoothingSpeed; if (ReprojectToInput) { MeshProjectionTarget target = new MeshProjectionTarget(sourceMesh, sourceSpatial); remesh.SetProjectionTarget(target); } // if we are preserving creases, this will also automatically constrain boundary // edges boundary loops/spans. if (preserve_creases) { if (remesh.Constraints == null) { remesh.SetExternalConstraints(new MeshConstraints()); } MeshTopology topo = new MeshTopology(meshIn); topo.CreaseAngle = this.CreaseAngle; topo.AddRemeshConstraints(remesh.Constraints); // replace boundary edge constraints if we want other behaviors if (BoundaryMode == BoundaryModes.FixedBoundaries) { MeshConstraintUtil.FixEdges(remesh.Constraints, meshIn, topo.BoundaryEdges); } } else if (sourceMesh.CachedIsClosed == false) { if (remesh.Constraints == null) { remesh.SetExternalConstraints(new MeshConstraints()); } if (BoundaryMode == BoundaryModes.FreeBoundaries) { MeshConstraintUtil.PreserveBoundaryLoops(remesh.Constraints, meshIn); } else if (BoundaryMode == BoundaryModes.FixedBoundaries) { MeshConstraintUtil.FixAllBoundaryEdges(remesh.Constraints, meshIn); } else if (BoundaryMode == BoundaryModes.ConstrainedBoundaries) { MeshConstraintUtil.FixAllBoundaryEdges_AllowSplit(remesh.Constraints, meshIn, 0); } } remesh.Progress = new ProgressCancel(is_invalidated); remesh.FastestRemesh(RemeshRounds, true); //for (int k = 0; k < RemeshRounds; ++k) // remesh.BasicRemeshPass(); // free boundary remesh can leave sliver triangles around the border. clean that up. if (sourceMesh.CachedIsClosed == false && BoundaryMode == BoundaryModes.FreeBoundaries) { MeshEditor.RemoveFinTriangles(meshIn, (mesh, tid) => { Index3i tv = mesh.GetTriangle(tid); return(MathUtil.AspectRatio(mesh.GetVertex(tv.a), mesh.GetVertex(tv.b), mesh.GetVertex(tv.c)) > 2); }); } if (is_invalidated()) { return(null); } return(meshIn); }