コード例 #1
0
 public override OpStatus Cull()
 {
     Target       = null;
     RemoveChange = null;
     AddChange    = null;
     return(OpStatus.Success);
 }
コード例 #2
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        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);
            }
        }
コード例 #3
0
ファイル: FillHolesTool.cs プロジェクト: tomleetv/gsTools
        public AddTrianglesMeshChange fill_smooth(DMesh3 mesh, EdgeLoop loop)
        {
            AddTrianglesMeshChange addChange = null;
            SmoothedHoleFill       filler    = new SmoothedHoleFill(mesh, loop);

            filler.ConstrainToHoleInterior = true;
            if (this.AutoTargetEdgeLength)
            {
                double mine, maxe, avge;
                MeshQueries.EdgeLengthStatsFromEdges(mesh, loop.Edges, out mine, out maxe, out avge);
                filler.TargetEdgeLength = avge;
            }
            else
            {
                filler.TargetEdgeLength = this.TargetEdgeLength;
            }
            filler.SmoothSolveIterations = this.SmoothOptimizeRounds;

            bool fill_ok = filler.Apply();

            if (fill_ok)
            {
                addChange = new AddTrianglesMeshChange();
                addChange.InitializeFromExisting(mesh,
                                                 filler.FillVertices, filler.FillTriangles);
            }
            return(addChange);
        }
コード例 #4
0
ファイル: FillHolesTool.cs プロジェクト: tomleetv/gsTools
        void add_change(AddTrianglesMeshChange add, bool bInteractive)
        {
            AddTrianglesChange change = new AddTrianglesChange(previewSO, add);

            Scene.History.PushChange(change, true);
            if (bInteractive)
            {
                Scene.History.PushInteractionCheckpoint();
            }
        }
コード例 #5
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        void add_change(AddTrianglesMeshChange add, bool bInteractive)
        {
            add.OnApplyF = add_to_spatial; add.OnRevertF = remove_from_spatial;
            AddTrianglesChange change = new AddTrianglesChange(previewSO, add);

            Scene.History.PushChange(change, true);
            if (bInteractive)
            {
                Scene.History.PushInteractionCheckpoint();
            }
        }
コード例 #6
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        public void SplitEdge(int eid, Frame3f posL, bool bInteractive)
        {
            if (PreviewMesh.IsEdge(eid) == false)
            {
                DebugUtil.Log("MeshEditorTool.SplitEdge: invalid eid!");
                return;
            }
            Index2i et = PreviewMesh.GetEdgeT(eid);
            RemoveTrianglesMeshChange removeChange = null;
            AddTrianglesMeshChange    addChange    = null;

            previewSO.EditAndUpdateMesh((mesh) => {
                removeChange          = new RemoveTrianglesMeshChange();
                List <int> input_tris = get_edge_tris(mesh, eid);
                removeChange.InitializeFromExisting(mesh, input_tris);

                DMesh3.EdgeSplitInfo splitInfo;
                if (mesh.SplitEdge(eid, out splitInfo) == MeshResult.Ok)
                {
                    PreviewSpatial.RemoveTriangle(et.a);
                    if (et.b != DMesh3.InvalidID)
                    {
                        PreviewSpatial.RemoveTriangle(et.b);
                    }
                    PreviewSpatial.AddTriangle(et.a);
                    if (et.b != DMesh3.InvalidID)
                    {
                        PreviewSpatial.AddTriangle(et.b);
                    }
                    PreviewSpatial.AddTriangle(splitInfo.eNewT2);
                    input_tris.Add(splitInfo.eNewT2);
                    if (splitInfo.eNewT3 != DMesh3.InvalidID)
                    {
                        PreviewSpatial.AddTriangle(splitInfo.eNewT3);
                        input_tris.Add(splitInfo.eNewT3);
                    }
                    mesh.SetVertex(splitInfo.vNew, posL.Origin);

                    addChange = new AddTrianglesMeshChange();
                    addChange.InitializeFromExisting(mesh,
                                                     new List <int>()
                    {
                        splitInfo.vNew
                    }, input_tris);
                }
            }, GeometryEditTypes.ArbitraryEdit);

            if (addChange != null)
            {
                add_replace_change(removeChange, addChange, bInteractive);
            }
        }
コード例 #7
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        void add_replace_change(RemoveTrianglesMeshChange remove, AddTrianglesMeshChange add, bool bInteractive)
        {
            remove.OnApplyF = remove_from_spatial; remove.OnRevertF = add_to_spatial;
            add.OnApplyF    = add_to_spatial; add.OnRevertF = remove_from_spatial;

            ReplaceTrianglesChange change = new ReplaceTrianglesChange(previewSO, remove, add);

            Scene.History.PushChange(change, true);
            if (bInteractive)
            {
                Scene.History.PushInteractionCheckpoint();
            }
        }
コード例 #8
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        public void BridgeEdges(int ea, int eb, bool bInteractive)
        {
            if (PreviewMesh.IsEdge(ea) == false || PreviewMesh.IsEdge(eb) == false)
            {
                DebugUtil.Log("MeshEditorTool.BridgeEdges: invalid eid!");
                return;
            }
            if (PreviewMesh.IsBoundaryEdge(ea) == false || PreviewMesh.IsBoundaryEdge(eb) == false)
            {
                DebugUtil.Log("MeshEditorTool.BridgeEdges: edge is not boundary edge!");
                return;
            }
            Index2i eva = PreviewMesh.GetOrientedBoundaryEdgeV(ea);
            Index2i evb = PreviewMesh.GetOrientedBoundaryEdgeV(eb);

            AddTrianglesMeshChange addChange = null;

            previewSO.EditAndUpdateMesh((mesh) => {
                int shared_v = IndexUtil.find_shared_edge_v(ref eva, ref evb);
                if (shared_v == DMesh3.InvalidID)
                {
                    int t1 = mesh.AppendTriangle(eva.b, eva.a, evb.b);
                    int t2 = mesh.AppendTriangle(evb.b, evb.a, eva.b);
                    PreviewSpatial.AddTriangle(t1);
                    PreviewSpatial.AddTriangle(t2);
                    addChange = new AddTrianglesMeshChange();
                    addChange.InitializeFromExisting(mesh, null, new List <int>()
                    {
                        t1, t2
                    });
                }
                else
                {
                    int ovb = (evb.a == shared_v) ? evb.b : evb.a;
                    int t   = mesh.AppendTriangle(eva.b, eva.a, ovb);
                    PreviewSpatial.AddTriangle(t);
                    addChange = new AddTrianglesMeshChange();
                    addChange.InitializeFromExisting(mesh, null, new List <int>()
                    {
                        t
                    });
                }
            }, GeometryEditTypes.ArbitraryEdit);

            if (addChange != null)
            {
                add_change(addChange, bInteractive);
            }
        }
コード例 #9
0
ファイル: FillHolesTool.cs プロジェクト: tomleetv/gsTools
        public AddTrianglesMeshChange fill_trivial(DMesh3 mesh, EdgeLoop loop)
        {
            AddTrianglesMeshChange addChange = null;
            SimpleHoleFiller       filler    = new SimpleHoleFiller(mesh, loop);
            bool fill_ok = filler.Fill();

            if (fill_ok)
            {
                addChange = new AddTrianglesMeshChange();
                addChange.InitializeFromExisting(mesh,
                                                 new List <int>()
                {
                    filler.NewVertex
                },
                                                 filler.NewTriangles);
            }
            return(addChange);
        }
コード例 #10
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        public void PokeFace(int tid, Frame3f posL, bool bInteractive)
        {
            if (PreviewMesh.IsTriangle(tid) == false)
            {
                DebugUtil.Log("MeshEditorTool.PokeFace: invalid tid!");
                return;
            }
            Vector3d baryCoords = MeshQueries.BaryCoords(PreviewMesh, tid, posL.Origin);
            RemoveTrianglesMeshChange removeChange = null;
            AddTrianglesMeshChange    addChange    = null;

            previewSO.EditAndUpdateMesh((mesh) => {
                removeChange = new RemoveTrianglesMeshChange();
                removeChange.InitializeFromExisting(mesh, new List <int>()
                {
                    tid
                });

                DMesh3.PokeTriangleInfo pokeInfo;
                if (mesh.PokeTriangle(tid, baryCoords, out pokeInfo) == MeshResult.Ok)
                {
                    PreviewSpatial.RemoveTriangle(tid);
                    PreviewSpatial.AddTriangle(tid);
                    PreviewSpatial.AddTriangle(pokeInfo.new_t1);
                    PreviewSpatial.AddTriangle(pokeInfo.new_t2);

                    addChange = new AddTrianglesMeshChange();
                    addChange.InitializeFromExisting(mesh,
                                                     new List <int>()
                    {
                        pokeInfo.new_vid
                    },
                                                     new List <int>()
                    {
                        tid, pokeInfo.new_t1, pokeInfo.new_t2
                    });
                }
            }, GeometryEditTypes.ArbitraryEdit);

            if (addChange != null)
            {
                add_replace_change(removeChange, addChange, bInteractive);
            }
        }
コード例 #11
0
ファイル: FillHolesTool.cs プロジェクト: tomleetv/gsTools
        public AddTrianglesMeshChange fill_minimal(DMesh3 mesh, EdgeLoop loop)
        {
            AddTrianglesMeshChange addChange = null;
            MinimalHoleFill        filler    = new MinimalHoleFill(mesh, loop);

            filler.IgnoreBoundaryTriangles = false;
            filler.OptimizeDevelopability  = true;
            filler.OptimizeTriangles       = this.OptimizeTriangles;
            filler.DevelopabilityTolerance = this.OptimizeTrisDeviationThresh;

            bool fill_ok = filler.Apply();

            if (fill_ok)
            {
                addChange = new AddTrianglesMeshChange();
                addChange.InitializeFromExisting(mesh,
                                                 filler.FillVertices, filler.FillTriangles);
            }
            return(addChange);
        }
コード例 #12
0
        public static void test_add_change()
        {
            DMesh3 testMesh = TestUtil.LoadTestInputMesh("bunny_open_base.obj");
            DMesh3 copy     = new DMesh3(testMesh);

            MeshBoundaryLoops loops = new MeshBoundaryLoops(copy);

            foreach (var loop in loops)
            {
                SimpleHoleFiller filler = new SimpleHoleFiller(copy, loop);
                bool             ok     = filler.Fill();
                Util.gDevAssert(ok);

                AddTrianglesMeshChange change = new AddTrianglesMeshChange();
                change.InitializeFromExisting(copy,
                                              new List <int>()
                {
                    filler.NewVertex
                }, filler.NewTriangles);

                DMesh3 tmp = new DMesh3(copy);
                change.Revert(copy);
                copy.CheckValidity(true);

                if (!copy.IsSameMesh(testMesh, true))
                {
                    System.Console.WriteLine("FAILED copy.IsSameMesh() 1");
                }

                change.Apply(copy);
                copy.CheckValidity(true);
                if (!copy.IsSameMesh(tmp, true))
                {
                    System.Console.WriteLine("FAILED copy.IsSameMesh() 1");
                }
            }

            System.Console.WriteLine("test_add_change ok");
        }
コード例 #13
0
ファイル: FillHolesTool.cs プロジェクト: tomleetv/gsTools
        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);
            }
        }
コード例 #14
0
 public override OpStatus Cull()
 {
     Target     = null;
     MeshChange = null;
     return(OpStatus.Success);
 }
コード例 #15
0
ファイル: MeshEditorTool.cs プロジェクト: tomleetv/gsTools
        public void CollapseEdge(int eid, Frame3f posL, bool bInteractive)
        {
            if (PreviewMesh.IsEdge(eid) == false)
            {
                DebugUtil.Log("MeshEditorTool.CollapseEdge: invalid eid!");
                return;
            }
            Index2i ev = PreviewMesh.GetEdgeV(eid);
            int     keep = ev.a, discard = ev.b;
            bool    boundarya = PreviewMesh.IsBoundaryVertex(keep);
            bool    boundaryb = PreviewMesh.IsBoundaryVertex(discard);

            if (boundaryb && !boundarya)
            {
                keep = ev.b; discard = ev.a;
            }
            HashSet <int> removeT = new HashSet <int>();

            foreach (int tid in PreviewMesh.VtxTrianglesItr(keep))
            {
                removeT.Add(tid);
            }
            foreach (int tid in PreviewMesh.VtxTrianglesItr(discard))
            {
                removeT.Add(tid);
            }

            RemoveTrianglesMeshChange removeChange = null;
            AddTrianglesMeshChange    addChange    = null;

            previewSO.EditAndUpdateMesh((mesh) => {
                removeChange = new RemoveTrianglesMeshChange();
                removeChange.InitializeFromExisting(mesh, removeT);

                DMesh3.EdgeCollapseInfo collapseInfo;
                if (mesh.CollapseEdge(keep, discard, out collapseInfo) == MeshResult.Ok)
                {
                    foreach (int tid in removeT)
                    {
                        PreviewSpatial.RemoveTriangle(tid);
                    }
                    foreach (int tid in PreviewMesh.VtxTrianglesItr(keep))
                    {
                        PreviewSpatial.AddTriangle(tid);
                    }
                    if (boundarya == false & boundaryb == false)
                    {
                        mesh.SetVertex(keep, posL.Origin);
                    }

                    addChange = new AddTrianglesMeshChange();
                    addChange.InitializeFromExisting(mesh, new List <int>()
                    {
                        keep
                    }, get_vtx_tris(mesh, keep));
                }
            }, GeometryEditTypes.ArbitraryEdit);

            if (addChange != null)
            {
                add_replace_change(removeChange, addChange, bInteractive);
            }
        }
コード例 #16
0
 public AddTrianglesChange(DMeshSO target, AddTrianglesMeshChange change)
 {
     Target     = target;
     MeshChange = change;
 }
コード例 #17
0
 public ReplaceTrianglesChange(DMeshSO target, RemoveTrianglesMeshChange remove, AddTrianglesMeshChange add)
 {
     RemoveChange = remove;
     AddChange    = add;
     Target       = target;
 }