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); } }
bool is_back_facing(int tid) { Vector3d n = PreviewMesh.GetTriNormal(tid); Vector3d c = PreviewMesh.GetTriCentroid(tid); return((c - cameraFrameL.Origin).Dot(n) > -0.1); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }
public override void OnInspectorGUI() { PreviewMesh script = (PreviewMesh)target; if (DrawDefaultInspector()) { script.CreateAndDisplayMesh(); } if (GUILayout.Button("Generate")) { script.CreateAndDisplayMesh(); } }
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); } }
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); } }
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); }
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); } }