static bool Test1() { var mesh = new BMesh(); Vertex v0 = mesh.AddVertex(new Vector3(-0.5f, 0.0f, -Mathf.Sqrt(3) / 6)); Vertex v1 = mesh.AddVertex(new Vector3(0.5f, 0.0f, -Mathf.Sqrt(3) / 6)); Vertex v2 = mesh.AddVertex(new Vector3(0, 0.0f, Mathf.Sqrt(3) / 3)); Face f = mesh.AddFace(v0, v1, v2); Debug.Assert(mesh.vertices.Count == 3, "vert count"); Debug.Assert(mesh.loops.Count == 3, "loop count"); Debug.Assert(mesh.edges.Count == 3, "edge count"); Debug.Assert(mesh.faces.Count == 1, "face count"); Loop l = mesh.loops[0]; for (int i = 0; i < 3; ++i) { var v = mesh.vertices[i]; Debug.Assert(mesh.loops[i].face == f, "loop has face"); Debug.Assert(mesh.loops[i].edge != null, "loop has edge"); Debug.Assert(mesh.edges[i].loop != null, "edge has loop"); Debug.Assert(v.edge != null, "vertex has edge"); Debug.Assert(v.edge.vert1 == v || v.edge.vert2 == v, "vertex is in vertex edge"); Debug.Assert(l.next != l, "loop has next"); Debug.Assert(l.next.prev == l, "loop has consistent next"); Debug.Assert(l.radial_next.radial_prev == l, "loop has consistent radial next"); l = l.next; } Debug.Assert(l == mesh.loops[0], "loop loops"); Debug.Assert(mesh.FindEdge(v0, v1) != null, "edge between v0 and v1"); Debug.Assert(mesh.FindEdge(v0, v2) != null, "edge between v0 and v2"); Debug.Assert(mesh.FindEdge(v2, v1) != null, "edge between v2 and v1"); Debug.Log("TestBMesh #1 passed."); return(true); }
static bool Test2() { var mesh = new BMesh(); Vertex v0 = mesh.AddVertex(new Vector3(-1, 0, -1)); Vertex v1 = mesh.AddVertex(new Vector3(-1, 0, 1)); Vertex v2 = mesh.AddVertex(new Vector3(1, 0, 1)); Vertex v3 = mesh.AddVertex(new Vector3(1, 0, -1)); Face f = mesh.AddFace(v0, v1, v2, v3); Debug.Assert(mesh.vertices.Count == 4, "vert count"); Debug.Assert(mesh.loops.Count == 4, "loop count"); Debug.Assert(mesh.edges.Count == 4, "edge count"); Debug.Assert(mesh.faces.Count == 1, "face count"); // Edges Edge e0 = mesh.FindEdge(v0, v1); Edge e1 = mesh.FindEdge(v1, v2); Edge e2 = mesh.FindEdge(v2, v3); Edge e3 = mesh.FindEdge(v3, v0); Debug.Assert(e0 != null, "found edge v0->v1"); Debug.Assert(e1 != null, "found edge v1->v2"); Debug.Assert(e2 != null, "found edge v2->v3"); Debug.Assert(e3 != null, "found edge v3->v0"); Vector3 expected; expected = new Vector3(-1, 0, 0); Debug.Assert(Vector3.Distance(expected, e0.Center()) < epsilon, "edge 0 center"); expected = new Vector3(0, 0, 1); Debug.Assert(Vector3.Distance(expected, e1.Center()) < epsilon, "edge 1 center"); expected = new Vector3(1, 0, 0); Debug.Assert(Vector3.Distance(expected, e2.Center()) < epsilon, "edge 2 center"); expected = new Vector3(0, 0, -1); Debug.Assert(Vector3.Distance(expected, e3.Center()) < epsilon, "edge 3 center"); // face expected = new Vector3(0, 0, 0); Debug.Assert(Vector3.Distance(expected, f.Center()) < epsilon, "face center"); // Loop consistency v0.id = 0; v1.id = 1; v2.id = 2; v3.id = 3; Loop l = v0.edge.loop; Loop it = l; int prevId = it.prev.vert.id; int forward = (prevId + 1) % 4 == it.vert.id ? 1 : 0; do { Debug.Assert((forward == 1 && (prevId + 1) % 4 == it.vert.id) || (it.vert.id + 1) % 4 == prevId, "valid quad loop order"); prevId = it.vert.id; it = it.next; } while (it != l); for (int i = 0; i < 4; ++i) { var v = mesh.vertices[i]; Debug.Assert(mesh.loops[i].face == f); Debug.Assert(v.edge != null); Debug.Assert(v.edge.vert1 == v || v.edge.vert2 == v); } Debug.Assert(mesh.FindEdge(v0, v1) != null, "edge between v0 and v1"); mesh.RemoveEdge(mesh.edges[0]); Debug.Assert(mesh.vertices.Count == 4, "vert count after removing edge"); Debug.Assert(mesh.loops.Count == 0, "loop count after removing edge"); Debug.Assert(mesh.edges.Count == 3, "edge count after removing edge"); Debug.Assert(mesh.faces.Count == 0, "face count after removing edge"); Debug.Log("TestBMesh #2 passed."); return(true); }