protected virtual DMesh3 compute_sharp_edge_flow() { DMesh3 sourceMesh = MeshSource.GetDMeshUnsafe(); ISpatial inputSpatial = MeshSource.GetSpatial(); DMesh3 targetMesh = TargetSource.GetDMeshUnsafe(); ISpatial targetSpatial = TargetSource.GetSpatial(); DMesh3 meshIn = new DMesh3(sourceMesh); if (is_invalidated()) { return(null); } RemesherPro remesher = new RemesherPro(meshIn); remesher.SetTargetEdgeLength(TargetEdgeLength); remesher.PreventNormalFlips = this.PreventNormalFlips; remesher.EnableFlips = this.EnableFlips; remesher.EnableSplits = this.EnableSplits; remesher.EnableCollapses = this.EnableCollapses; remesher.EnableSmoothing = this.EnableSmoothing; remesher.SmoothSpeedT = this.SmoothingSpeed; TransformedMeshProjectionTarget target = new TransformedMeshProjectionTarget(targetMesh, targetSpatial) { SourceToTargetXForm = source_to_target, TargetToSourceXForm = target_to_source }; remesher.SetProjectionTarget(target); if (sourceMesh.CachedIsClosed == false) { if (remesher.Constraints == null) { remesher.SetExternalConstraints(new MeshConstraints()); } if (BoundaryMode == BoundaryModes.FreeBoundaries) { MeshConstraintUtil.PreserveBoundaryLoops(remesher.Constraints, meshIn); } else if (BoundaryMode == BoundaryModes.FixedBoundaries) { MeshConstraintUtil.FixAllBoundaryEdges(remesher.Constraints, meshIn); } else if (BoundaryMode == BoundaryModes.ConstrainedBoundaries) { MeshConstraintUtil.FixAllBoundaryEdges_AllowSplit(remesher.Constraints, meshIn, 0); } } if (is_invalidated()) { return(null); } remesher.Progress = new ProgressCancel(is_invalidated); remesher.SharpEdgeReprojectionRemesh(RemeshRounds, ProjectionRounds); if (is_invalidated()) { return(null); } return(meshIn); }
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); }
protected virtual DMesh3 compute_bounded_distance() { DMesh3 sourceMesh = MeshSource.GetDMeshUnsafe(); ISpatial inputSpatial = MeshSource.GetSpatial(); DMesh3 targetMesh = TargetSource.GetDMeshUnsafe(); ISpatial targetSpatial = TargetSource.GetSpatial(); double max_dist = (TargetMaxDistance == double.MaxValue) ? double.MaxValue : TargetMaxDistance; DMesh3 meshIn = new DMesh3(sourceMesh); bool target_closed = targetMesh.IsClosed(); MeshVertexSelection roiV = new MeshVertexSelection(meshIn); SpinLock roi_lock = new SpinLock(); gParallel.ForEach(meshIn.VertexIndices(), (vid) => { Vector3d pos = meshIn.GetVertex(vid); Vector3d posTarget = TransformToTarget.TransformP(pos); double dist = MeshQueries.NearestPointDistance(targetMesh, targetSpatial, posTarget, max_dist); bool inside = (target_closed && targetSpatial.IsInside(posTarget)); if (dist < max_dist || inside) { bool taken = false; roi_lock.Enter(ref taken); roiV.Select(vid); roi_lock.Exit(); } }); if (is_invalidated()) { return(null); } MeshFaceSelection roi_faces = new MeshFaceSelection(meshIn, roiV, 1); roi_faces.ExpandToOneRingNeighbours(3); roi_faces.LocalOptimize(); if (is_invalidated()) { return(null); } RegionOperator op = new RegionOperator(meshIn, roi_faces); DMesh3 meshROI = op.Region.SubMesh; if (is_invalidated()) { return(null); } RemesherPro remesher = new RemesherPro(meshROI); remesher.SetTargetEdgeLength(TargetEdgeLength); remesher.PreventNormalFlips = this.PreventNormalFlips; remesher.EnableFlips = this.EnableFlips; remesher.EnableSplits = this.EnableSplits; remesher.EnableCollapses = this.EnableCollapses; remesher.EnableSmoothing = this.EnableSmoothing; remesher.SmoothSpeedT = this.SmoothingSpeed; BoundedProjectionTarget target = new BoundedProjectionTarget() { Source = sourceMesh, SourceSpatial = inputSpatial, Target = targetMesh, TargetSpatial = targetSpatial, SourceToTargetXForm = source_to_target, TargetToSourceXForm = target_to_source, MaxDistance = max_dist, Smoothness = transition_smoothness }; remesher.SetProjectionTarget(target); if (remesher.Constraints == null) { remesher.SetExternalConstraints(new MeshConstraints()); } MeshConstraintUtil.FixAllBoundaryEdges(remesher.Constraints, meshROI); if (is_invalidated()) { return(null); } remesher.Progress = new ProgressCancel(is_invalidated); remesher.FastestRemesh(RemeshRounds); if (is_invalidated()) { return(null); } op.BackPropropagate(); return(meshIn); }