Exemple #1
0
        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);
            }
        }
Exemple #2
0
 void bake_hole_mesh()
 {
     CavityPreviewSO.EditAndUpdateMesh((mesh) => {
         MeshTransforms.Scale(mesh, new Vector3d(HoleSize, HoleSize, (float)CurHoleDepth), Vector3d.Zero);
     }, GeometryEditTypes.VertexDeformation);
     CavityPreviewSO.SetLocalScale(Vector3f.One);
 }
Exemple #3
0
        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);
 }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
 public void apply(DMeshSO meshSO)
 {
     meshSO.EditAndUpdateMesh((mesh) => {
         MeshTransforms.FlipLeftRightCoordSystems(mesh);
     }, GeometryEditTypes.ArbitraryEdit);    // reverses orientation, too!
 }