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; }
public BakingSurface(TriangleMesh mesh) { triangleMesh = mesh; }
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; }
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; }