public void FlipEdge(int eid, bool bInteractive) { if (PreviewMesh.IsEdge(eid) == false) { DebugUtil.Log("MeshEditorTool.FlipEdge: invalid eid!"); return; } RemoveTrianglesMeshChange removeChange = null; AddTrianglesMeshChange addChange = null; previewSO.EditAndUpdateMesh((mesh) => { removeChange = new RemoveTrianglesMeshChange(); removeChange.InitializeFromExisting(mesh, get_edge_tris(mesh, eid)); DMesh3.EdgeFlipInfo flipInfo; if (mesh.FlipEdge(eid, out flipInfo) == MeshResult.Ok) { PreviewSpatial.RemoveTriangle(flipInfo.t0); PreviewSpatial.RemoveTriangle(flipInfo.t1); PreviewSpatial.AddTriangle(flipInfo.t0); PreviewSpatial.AddTriangle(flipInfo.t1); addChange = new AddTrianglesMeshChange(); addChange.InitializeFromExisting(mesh, null, get_edge_tris(mesh, eid)); } }, GeometryEditTypes.ArbitraryEdit); if (addChange != null) { add_replace_change(removeChange, addChange, bInteractive); } }
void bake_hole_mesh() { CavityPreviewSO.EditAndUpdateMesh((mesh) => { MeshTransforms.Scale(mesh, new Vector3d(HoleSize, HoleSize, (float)CurHoleDepth), Vector3d.Zero); }, GeometryEditTypes.VertexDeformation); CavityPreviewSO.SetLocalScale(Vector3f.One); }
virtual public void CutMesh() { Frame3f frameL = SceneTransforms.SceneToObject(target, cut_plane); Action <DMesh3> editF = (mesh) => { MeshPlaneCut cut = new MeshPlaneCut(mesh, frameL.Origin, frameL.Y); cut.Cut(); PlaneProjectionTarget planeTarget = new PlaneProjectionTarget() { Origin = frameL.Origin, Normal = frameL.Y }; if (GenerateFillSurface) { double min, max, avg; MeshQueries.EdgeLengthStats(mesh, out min, out max, out avg); cut.FillHoles(); MeshFaceSelection selection = new MeshFaceSelection(mesh); foreach (var tris in cut.LoopFillTriangles) { selection.Select(tris); } RegionRemesher.QuickRemesh(mesh, selection.ToArray(), 2 * avg, 1.0f, 25, planeTarget); MeshNormals normals = new MeshNormals(mesh); normals.Compute(); normals.CopyTo(mesh); } }; target.EditAndUpdateMesh(editF, GeometryEditTypes.ArbitraryEdit); }
virtual public void Apply() { TargetSO.EditAndUpdateMesh((mesh) => { DMesh3 fromMesh = PreviewSO.Mesh; foreach (int vid in mesh.VertexIndices()) { mesh.SetVertex(vid, fromMesh.GetVertex(vid)); mesh.SetVertexNormal(vid, fromMesh.GetVertexNormal(vid)); } }, GeometryEditTypes.VertexDeformation); }
public virtual void BakeDisplacements(DMeshSO so, VertexChangeBuilder changeBuilder) { so.EditAndUpdateMesh((mesh) => { foreach (int vid in ModifiedV) { changeBuilder.SetPosition(vid, Displacements[vid]); } gParallel.ForEach(ModifiedV, (vid) => { MeshNormals.QuickCompute(Mesh, vid); }); }, GeometryEditTypes.VertexDeformation); }
public bool FillHole(int hitHoleID, bool bInteractive) { if (is_computing) { return(false); } EdgeLoop loop = Loops[hitHoleID]; AddTrianglesMeshChange addChange = null; previewSO.EditAndUpdateMesh((mesh) => { switch (FillType) { case FillTypes.Trivial: addChange = fill_trivial(mesh, loop); break; case FillTypes.Minimal: addChange = fill_minimal(mesh, loop); break; case FillTypes.Smooth: addChange = fill_smooth(mesh, loop); break; } }, GeometryEditTypes.ArbitraryEdit); if (addChange != null) { add_change(addChange, bInteractive); // we know what changed visibility-wise, so we can avoid full visibility update boundaryGeom.SetVisibility(hitHoleID, false); numHolesFilled++; visibility_valid = true; return(true); } else { return(false); } }
public void apply(DMeshSO meshSO) { meshSO.EditAndUpdateMesh((mesh) => { MeshTransforms.FlipLeftRightCoordSystems(mesh); }, GeometryEditTypes.ArbitraryEdit); // reverses orientation, too! }