예제 #1
0
 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);
             }
         }
     }
 }
예제 #2
0
 public Pointer<SDVertex> PrevVert(SDVertex vert)
 {
     return v[PREV(vnum(vert))];
 }
예제 #3
0
 public Pointer<SDVertex> NextVert(SDVertex vert)
 {
     return v[NEXT(vnum(vert))];
 }
예제 #4
0
 public Pointer<SDFace> PrevFace(SDVertex vert)
 {
     return f[PREV(vnum(vert))];
 }
예제 #5
0
 public Pointer<SDFace> NextFace(SDVertex vert)
 {
     return f[vnum(vert)];
 }
예제 #6
0
 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)");
 }