// very simple edge smoothing by comparing distance between adjacent // points on edge and merging if close enough public void MergeClosePoints(float mergeDistance) { if (mergeDistance < 0.0f) { return; } ArrayList newOrderedEdges = new ArrayList(); // list to stick the joined edges //int originalCount = orderedEdges.Count; MC_Edge currentEdge = (MC_Edge)orderedEdges[0]; for (int i = 1; i < orderedEdges.Count; i++) // start with the second edge for comparison { MC_Edge testEdge = (MC_Edge)orderedEdges[i]; float dist = Vector2.Distance(new Vector2(currentEdge.v1.x, currentEdge.v1.y), new Vector2(testEdge.v2.x, testEdge.v2.y)); MC_Vertex v2 = testEdge.v2; if (dist < mergeDistance) // combine the two lines into current { currentEdge.v2 = v2; } else // there isn't a continuation of line, so add current to new ordered and set current to testEdge { newOrderedEdges.Add(currentEdge); currentEdge = testEdge; } } newOrderedEdges.Add(currentEdge); orderedEdges = newOrderedEdges; /*if (originalCount != orderedEdges.Count) * { * Debug.Log("SimpleSurfaceEdge::MergeClosePoints(): trimmed from " + originalCount + " to " + orderedEdges.Count + " edges."); * }*/ }
public MC_Edge(MC_Vertex _v1, MC_Vertex _v2) { v1 = _v1; v2 = _v2; isShared = false; attachedFaces = new ArrayList(); }
public bool AddEdge(MC_Edge e) { // see if it shares with the last edge MC_Vertex lastVertex = ((MC_Edge)orderedEdges[orderedEdges.Count - 1]).v2; if (e.v1 == lastVertex) // this is the correct vertex order { orderedEdges.Add(e); return(true); } else if (e.v2 == lastVertex) // incorrect order, switch before adding { e.SwitchVertices(); orderedEdges.Add(e); return(true); } // see if it shares with the first edge MC_Vertex firstVertex = ((MC_Edge)orderedEdges[0]).v1; if (e.v2 == firstVertex) // this is the correct vertex order { orderedEdges.Insert(0, e); return(true); } else if (e.v1 == firstVertex) // incorrect order, switch before adding { e.SwitchVertices(); orderedEdges.Insert(0, e); return(true); } return(false); }
public void SwitchVertices() { MC_Vertex hold = v1; v1 = v2; v2 = hold; }
public Vector2[] GetVertexList() { Vector2[] verts = new Vector2[orderedEdges.Count]; for (int i = 0; i < orderedEdges.Count; i++) { MC_Vertex v = ((MC_Edge)orderedEdges[i]).v1; verts[i] = new Vector2(v.x, v.y); } return(verts); }
public Vector2 GetUVForIndex(int i) { if (i >= orderedEdges.Count) { //Debug.Log("got " + i + " index for ordered edge with " + orderedEdges.Count + " elements"); return(new Vector2()); } MC_Vertex v = ((MC_Edge)orderedEdges[i]).v1; return(new Vector2(v.u, v.v)); }
public bool IsClosed() { if (orderedEdges.Count < 2) { return(false); } MC_Vertex lastVertex = ((MC_Edge)orderedEdges[orderedEdges.Count - 1]).v2; MC_Vertex firstVertex = ((MC_Edge)orderedEdges[0]).v1; if (firstVertex.x == lastVertex.x && firstVertex.y == lastVertex.y) { return(true); } return(false); }
MC_Vertex GetVertex(float x, float y, float u, float v) { for (int i = 0; i < vertices.Count; i++) { MC_Vertex ver = (MC_Vertex)vertices[i]; if (ver.x == x && ver.y == y) { return(ver); } } MC_Vertex newver = new MC_Vertex(x, y, u, v); vertices.Add(newver); return(newver); }
public MC_Face(MC_Edge _e1, MC_Edge _e2, MC_Edge _e3) { e1 = _e1; e2 = _e2; e3 = _e3; e1.AttachFace(this); e2.AttachFace(this); e3.AttachFace(this); v1 = e1.v1; v2 = e1.v2; if (e2.v1 != v1 && e2.v1 != v2) { v3 = e2.v1; } else { v3 = e2.v2; } }
/* * SimplifyEdge() searchs for edges in which the shared vertex is a point * on a line between the two outer points. */ public void SimplifyEdge() { ArrayList newOrderedEdges = new ArrayList(); // list to stick the joined edges MC_Edge currentEdge = (MC_Edge)orderedEdges[0]; for (int i = 1; i < orderedEdges.Count; i++) // start with the second edge for comparison { MC_Edge testEdge = (MC_Edge)orderedEdges[i]; MC_Vertex v1 = currentEdge.v1; MC_Vertex v2 = testEdge.v2; MC_Vertex sharedPoint = currentEdge.v2; if (sharedPoint != testEdge.v1) // oops, bad list, it should be closed by now { Debug.LogError("Mesh Creator EdgeLoop Error: list is not ordered when simplifying edge. Please create a new issue at https://github.com/uclagamelab/MeshCreator/issues."); return; } if (v1 == v2) { Debug.LogError("Mesh Creator EdgeLoop Error: found matching endpoints for a line when simplifying. Please create a new issue at https://github.com/uclagamelab/MeshCreator/issues."); return; } // determine if sharedPoint is on a line between the two endpoints //The point (x3, y3) is on the line determined by (x1, y1) and (x2, y2) if and only if (x3-x1)*(y2-y1)==(x2-x1)*(y3-y1). float slope1 = (sharedPoint.x - v1.x) * (v2.y - v1.y); float slope2 = (v2.x - v1.x) * (sharedPoint.y - v1.y); if (slope1 == slope2) // combine the two lines into current { currentEdge.v2 = v2; } else // there isn't a continuation of line, so add current to new ordered and set current to testEdge { newOrderedEdges.Add(currentEdge); currentEdge = testEdge; } } newOrderedEdges.Add(currentEdge); orderedEdges = newOrderedEdges; }
MC_Vertex GetVertex(float x, float y, float u, float v) { for (int i = 0; i < vertices.Count; i++) { MC_Vertex ver = (MC_Vertex) vertices[i]; if (ver.x == x && ver.y == y) { return ver; } } MC_Vertex newver = new MC_Vertex(x,y,u,v); vertices.Add(newver); return newver; }
public MC_Face(MC_Edge _e1, MC_Edge _e2, MC_Edge _e3) { e1 = _e1; e2 = _e2; e3 = _e3; e1.AttachFace(this); e2.AttachFace(this); e3.AttachFace(this); v1 = e1.v1; v2 = e1.v2; if (e2.v1 != v1 && e2.v1 != v2) v3 = e2.v1; else v3 = e2.v2; }