Example #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);
            }
        }
Example #2
0
        bool is_back_facing(int tid)
        {
            Vector3d n = PreviewMesh.GetTriNormal(tid);
            Vector3d c = PreviewMesh.GetTriCentroid(tid);

            return((c - cameraFrameL.Origin).Dot(n) > -0.1);
        }
Example #3
0
        public bool FindHitTriangle(Ray3f sceneRay, bool snap_to_center, ref Frame3f hitFrameS, ref int hitTID)
        {
            Ray3f objRay = SceneTransforms.SceneToObject(Target, sceneRay);

            hitTID = PreviewSpatial.FindNearestHitTriangle(objRay);
            if (hitTID == DMesh3.InvalidID)
            {
                return(false);
            }
            if (allow_backface_hits == false && is_back_facing(hitTID))
            {
                return(false);
            }

            var intr = MeshQueries.TriangleIntersection(PreviewMesh, hitTID, objRay);

            if (snap_to_center)
            {
                Frame3f hitFrameL = new Frame3f(PreviewMesh.GetTriCentroid(hitTID), PreviewMesh.GetTriNormal(hitTID));
                hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL);
            }
            else
            {
                Vector3f hitPoint  = objRay.PointAt((float)intr.RayParameter);
                Frame3f  hitFrameL = new Frame3f(hitPoint, PreviewMesh.GetTriNormal(hitTID));
                hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL);
            }

            return(true);
        }
Example #4
0
        public bool FindHitEdge(Ray3f sceneRay, MeshEditorOpType.BoundaryType boundaryMode, bool snap_to_center, ref Frame3f hitFrameS, ref int hitEID)
        {
            Ray3f objRay = SceneTransforms.SceneToObject(Target, sceneRay);

            int hit_tri = PreviewSpatial.FindNearestHitTriangle(objRay);

            if (hit_tri == DMesh3.InvalidID)
            {
                return(false);
            }
            if (allow_backface_hits == false && is_back_facing(hit_tri))
            {
                return(false);
            }

            var intr = MeshQueries.TriangleIntersection(PreviewMesh, hit_tri, objRay);
            int e_idx = -1; double near_sqr = double.MaxValue; DistRay3Segment3 near_dist = null;

            for (int j = 0; j < 3; ++j)
            {
                Segment3d        seg  = new Segment3d(intr.Triangle[j], intr.Triangle[(j + 1) % 3]);
                DistRay3Segment3 dist = new DistRay3Segment3(objRay, seg);
                if (dist.GetSquared() < near_sqr)
                {
                    near_sqr  = dist.GetSquared();
                    near_dist = dist;
                    e_idx     = j;
                }
            }
            int eid = PreviewMesh.GetTriEdge(hit_tri, e_idx);

            if (boundaryMode != MeshEditorOpType.BoundaryType.Any)
            {
                bool is_boundary = PreviewMesh.IsBoundaryEdge(eid);
                if ((is_boundary && boundaryMode == MeshEditorOpType.BoundaryType.OnlyInternal) ||
                    (is_boundary == false && boundaryMode == MeshEditorOpType.BoundaryType.OnlyBoundary))
                {
                    return(false);
                }
            }

            if (snap_to_center)
            {
                Frame3f hitFrameL = new Frame3f(PreviewMesh.GetEdgePoint(eid, 0.5), PreviewMesh.GetTriNormal(hit_tri));
                hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL);
            }
            else
            {
                Frame3f hitFrameL = new Frame3f(near_dist.SegmentClosest, PreviewMesh.GetTriNormal(hit_tri));
                hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL);
            }

            hitEID = eid;
            return(true);
        }
Example #5
0
        public void RemoveComponent(int tid, bool bInteractive)
        {
            if (PreviewMesh.IsTriangle(tid) == false)
            {
                DebugUtil.Log("MeshEditorTool.RemoveComponent: invalid tid!");
                return;
            }
            var tris = MeshConnectedComponents.FindConnectedT(PreviewMesh, tid);

            do_remove_triangles(tris, bInteractive);
        }
Example #6
0
        public void RemoveEdge(int eid, bool bInteractive)
        {
            if (PreviewMesh.IsEdge(eid) == false)
            {
                DebugUtil.Log("MeshEditorTool.RemoveEdge: invalid eid!");
                return;
            }
            List <int> tris = get_edge_tris(PreviewMesh, eid);

            do_remove_triangles(tris, bInteractive);
        }
Example #7
0
        public void RemoveVertex(int vid, bool bInteractive)
        {
            if (PreviewMesh.IsVertex(vid) == false)
            {
                DebugUtil.Log("MeshEditorTool.RemoveVertex: invalid vid!");
                return;
            }
            List <int> tris = get_vtx_tris(PreviewMesh, vid);

            do_remove_triangles(tris, bInteractive);
        }
Example #8
0
        public void RemoveBorderRing(int vid, bool bInteractive)
        {
            if (PreviewMesh.IsVertex(vid) == false)
            {
                DebugUtil.Log("MeshEditorTool.RemoveBorderRing: invalid vid!");
                return;
            }
            MeshVertexSelection verts = new MeshVertexSelection(PreviewMesh); verts.SelectConnectedBoundaryV(vid);
            MeshFaceSelection   tris  = new MeshFaceSelection(PreviewMesh, verts, 1);

            do_remove_triangles(tris, bInteractive);
        }
Example #9
0
 public void RemoveTriangle(int tid, bool bInteractive)
 {
     if (PreviewMesh.IsTriangle(tid) == false)
     {
         DebugUtil.Log("MeshEditorTool.RemoveTriangle: invalid tid!");
         return;
     }
     do_remove_triangles(new List <int>()
     {
         tid
     }, bInteractive);
 }
Example #10
0
        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);
            }
        }
Example #11
0
    public override void OnInspectorGUI()
    {
        PreviewMesh script = (PreviewMesh)target;

        if (DrawDefaultInspector())
        {
            script.CreateAndDisplayMesh();
        }

        if (GUILayout.Button("Generate"))
        {
            script.CreateAndDisplayMesh();
        }
    }
Example #12
0
        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);
            }
        }
Example #13
0
        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);
            }
        }
Example #14
0
        public bool FindHitVertex(Ray3f sceneRay, MeshEditorOpType.BoundaryType boundaryMode, ref Frame3f hitFrameS, ref int hitVID)
        {
            Ray3f objRay = SceneTransforms.SceneToObject(Target, sceneRay);

            int hit_tri = PreviewSpatial.FindNearestHitTriangle(objRay);

            if (hit_tri == DMesh3.InvalidID)
            {
                return(false);
            }
            if (allow_backface_hits == false && is_back_facing(hit_tri))
            {
                return(false);
            }

            Index3i vt = PreviewMesh.GetTriangle(hit_tri);

            hitVID = -1; double near_sqr = double.MaxValue;
            for (int j = 0; j < 3; ++j)
            {
                Vector3f v = (Vector3f)PreviewMesh.GetVertex(vt[j]);
                if (objRay.DistanceSquared(v) < near_sqr)
                {
                    near_sqr = objRay.DistanceSquared(v);
                    hitVID   = vt[j];
                }
            }
            if (boundaryMode != MeshEditorOpType.BoundaryType.Any)
            {
                bool is_boundary = PreviewMesh.IsBoundaryVertex(hitVID);
                if ((is_boundary && boundaryMode == MeshEditorOpType.BoundaryType.OnlyInternal) ||
                    (is_boundary == false && boundaryMode == MeshEditorOpType.BoundaryType.OnlyBoundary))
                {
                    return(false);
                }
            }

            Frame3f hitFrameL = new Frame3f(PreviewMesh.GetVertex(hitVID), PreviewMesh.GetTriNormal(hit_tri));

            hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL);

            return(true);
        }
Example #15
0
        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);
            }
        }