Ejemplo n.º 1
0
 private TriangleMesh generate(int[] tris, float[] verts, bool smoothNormals)
 {
     ParameterList pl = new ParameterList();
     pl.addIntegerArray("triangles", tris);
     pl.addPoints("points", ParameterList.InterpolationType.VERTEX, verts);
     if (smoothNormals)
     {
         float[] normals = new float[verts.Length]; // filled with 0's
         Point3 p0 = new Point3();
         Point3 p1 = new Point3();
         Point3 p2 = new Point3();
         Vector3 n = new Vector3();
         for (int i3 = 0; i3 < tris.Length; i3 += 3)
         {
             int v0 = tris[i3 + 0];
             int v1 = tris[i3 + 1];
             int v2 = tris[i3 + 2];
             p0.set(verts[3 * v0 + 0], verts[3 * v0 + 1], verts[3 * v0 + 2]);
             p1.set(verts[3 * v1 + 0], verts[3 * v1 + 1], verts[3 * v1 + 2]);
             p2.set(verts[3 * v2 + 0], verts[3 * v2 + 1], verts[3 * v2 + 2]);
             Point3.normal(p0, p1, p2, n); // compute normal
             // add face normal to each vertex
             // note that these are not normalized so this in fact weights
             // each normal by the area of the triangle
             normals[3 * v0 + 0] += n.x;
             normals[3 * v0 + 1] += n.y;
             normals[3 * v0 + 2] += n.z;
             normals[3 * v1 + 0] += n.x;
             normals[3 * v1 + 1] += n.y;
             normals[3 * v1 + 2] += n.z;
             normals[3 * v2 + 0] += n.x;
             normals[3 * v2 + 1] += n.y;
             normals[3 * v2 + 2] += n.z;
         }
         // normalize all the vectors
         for (int i3 = 0; i3 < normals.Length; i3 += 3)
         {
             n.set(normals[i3 + 0], normals[i3 + 1], normals[i3 + 2]);
             n.normalize();
             normals[i3 + 0] = n.x;
             normals[i3 + 1] = n.y;
             normals[i3 + 2] = n.z;
         }
         pl.addVectors("normals", ParameterList.InterpolationType.VERTEX, normals);
     }
     TriangleMesh m = new TriangleMesh();
     if (m.update(pl, null))
         return m;
     // something failed in creating the mesh, the error message will be
     // printed by the mesh itself - no need to repeat it here
     return null;
 }
Ejemplo n.º 2
0
 public BakingSurface(TriangleMesh mesh)
 {
     triangleMesh = mesh;
 }
Ejemplo n.º 3
0
 public WaldTriangle(TriangleMesh mesh, int tri)
 {
     k = 0;
     tri *= 3;
     int index0 = mesh.triangles[tri + 0];
     int index1 = mesh.triangles[tri + 1];
     int index2 = mesh.triangles[tri + 2];
     Point3 v0p = mesh.getPoint(index0);
     Point3 v1p = mesh.getPoint(index1);
     Point3 v2p = mesh.getPoint(index2);
     Vector3 ng = Point3.normal(v0p, v1p, v2p);
     if (Math.Abs(ng.x) > Math.Abs(ng.y) && Math.Abs(ng.x) > Math.Abs(ng.z))
         k = 0;
     else if (Math.Abs(ng.y) > Math.Abs(ng.z))
         k = 1;
     else
         k = 2;
     float ax, ay, bx, by, cx, cy;
     switch (k)
     {
         case 0:
             {
                 nu = ng.y / ng.x;
                 nv = ng.z / ng.x;
                 nd = v0p.x + (nu * v0p.y) + (nv * v0p.z);
                 ax = v0p.y;
                 ay = v0p.z;
                 bx = v2p.y - ax;
                 by = v2p.z - ay;
                 cx = v1p.y - ax;
                 cy = v1p.z - ay;
                 break;
             }
         case 1:
             {
                 nu = ng.z / ng.y;
                 nv = ng.x / ng.y;
                 nd = (nv * v0p.x) + v0p.y + (nu * v0p.z);
                 ax = v0p.z;
                 ay = v0p.x;
                 bx = v2p.z - ax;
                 by = v2p.x - ay;
                 cx = v1p.z - ax;
                 cy = v1p.x - ay;
                 break;
             }
         case 2:
         default:
             {
                 nu = ng.x / ng.z;
                 nv = ng.y / ng.z;
                 nd = (nu * v0p.x) + (nv * v0p.y) + v0p.z;
                 ax = v0p.x;
                 ay = v0p.y;
                 bx = v2p.x - ax;
                 by = v2p.y - ay;
                 cx = v1p.x - ax;
                 cy = v1p.y - ay;
                 break;
             }
     }
     float det = bx * cy - by * cx;
     bnu = -by / det;
     bnv = bx / det;
     bnd = (by * ax - bx * ay) / det;
     cnu = cy / det;
     cnv = -cx / det;
     cnd = (cx * ay - cy * ax) / det;
 }
Ejemplo n.º 4
0
            public WaldTriangle(TriangleMesh mesh, int tri)
            {
                k    = 0;
                tri *= 3;
                int     index0 = mesh.triangles[tri + 0];
                int     index1 = mesh.triangles[tri + 1];
                int     index2 = mesh.triangles[tri + 2];
                Point3  v0p    = mesh.getPoint(index0);
                Point3  v1p    = mesh.getPoint(index1);
                Point3  v2p    = mesh.getPoint(index2);
                Vector3 ng     = Point3.normal(v0p, v1p, v2p);

                if (Math.Abs(ng.x) > Math.Abs(ng.y) && Math.Abs(ng.x) > Math.Abs(ng.z))
                {
                    k = 0;
                }
                else if (Math.Abs(ng.y) > Math.Abs(ng.z))
                {
                    k = 1;
                }
                else
                {
                    k = 2;
                }
                float ax, ay, bx, by, cx, cy;

                switch (k)
                {
                case 0:
                {
                    nu = ng.y / ng.x;
                    nv = ng.z / ng.x;
                    nd = v0p.x + (nu * v0p.y) + (nv * v0p.z);
                    ax = v0p.y;
                    ay = v0p.z;
                    bx = v2p.y - ax;
                    by = v2p.z - ay;
                    cx = v1p.y - ax;
                    cy = v1p.z - ay;
                    break;
                }

                case 1:
                {
                    nu = ng.z / ng.y;
                    nv = ng.x / ng.y;
                    nd = (nv * v0p.x) + v0p.y + (nu * v0p.z);
                    ax = v0p.z;
                    ay = v0p.x;
                    bx = v2p.z - ax;
                    by = v2p.x - ay;
                    cx = v1p.z - ax;
                    cy = v1p.x - ay;
                    break;
                }

                case 2:
                default:
                {
                    nu = ng.x / ng.z;
                    nv = ng.y / ng.z;
                    nd = (nu * v0p.x) + (nv * v0p.y) + v0p.z;
                    ax = v0p.x;
                    ay = v0p.y;
                    bx = v2p.x - ax;
                    by = v2p.y - ay;
                    cx = v1p.x - ax;
                    cy = v1p.y - ay;
                    break;
                }
                }
                float det = bx * cy - by * cx;

                bnu = -by / det;
                bnv = bx / det;
                bnd = (by * ax - bx * ay) / det;
                cnu = cy / det;
                cnv = -cx / det;
                cnd = (cx * ay - cy * ax) / det;
            }
Ejemplo n.º 5
0
 public BakingSurface(TriangleMesh mesh)
 {
     triangleMesh = mesh;
 }