public LoopSubDiv(Transform o2w, Transform w2o, bool ro, int nfaces, int nvertices, int[] vi, Point[] P, int nl) : base(o2w, w2o, ro) { nLevels = nl; int i; Pointer<SDVertex> verts = Pointer<SDVertex>.Allocate(nvertices); for (i = 0; i < nvertices; ++i) { verts[i] = new SDVertex(P[i]); vertices.Add((verts + i)); } Pointer<SDFace> fs = Pointer<SDFace>.Allocate(nfaces); for (i = 0; i < nfaces; ++i) { faces.Add((fs + i)); } int c = 0; for (i = 0; i < nfaces; ++i) { Pointer<SDFace> f = faces[i]; for (int j = 0; j < 3; j++) { Pointer<SDVertex> v = vertices[vi[c + j]]; f[0].v[j] = v; v[0].SetStartFace(f); } c += 3; } List<SDEdge> edges = new List<SDEdge>(); for (i = 0; i < nfaces; ++i) { Pointer<SDFace> f = faces[i]; for (int edgeNum = 0; edgeNum < 3; ++edgeNum) { int v0 = edgeNum, v1 = NEXT(edgeNum); SDEdge e = new SDEdge(f[0].v[v0], f[0].v[v1]); if (edges.IndexOf(e) == edges.Count - 1) { e.f[0] = f; e.f0edgeNum = edgeNum; edges.Add(e); } else { e = edges[edges.IndexOf(e)]; e.f[0][0].f[e.f0edgeNum] = f; f[0].f[edgeNum] = e.f[0]; edges.Remove(e); } } } }
public Pointer<SDVertex> PrevVert(SDVertex vert) { return v[PREV(vnum(vert))]; }
public Pointer<SDVertex> NextVert(SDVertex vert) { return v[NEXT(vnum(vert))]; }
public Pointer<SDFace> PrevFace(SDVertex vert) { return f[PREV(vnum(vert))]; }
public Pointer<SDFace> NextFace(SDVertex vert) { return f[vnum(vert)]; }
int vnum(SDVertex vert) { for (int i = 0; i < 3; ++i) { if (v[i][0] == vert) return i; } throw new Exception("Logic Error in SDFace.vnum(SDVertex)"); }