public override void Embody(Form parent) { int[] triangles = mesh.mesh.triangles; Vector3[] verts = mesh.mesh.vertices; Vector2[] uvs = mesh.mesh.uv; Vector4[] tans = mesh.mesh.tangents; Vector3[] nors = mesh.mesh.normals; float[] triangleAreas = new float[triangles.Length / 3]; float totalArea = 0; int tri0; int tri1; int tri2; for (int i = 0; i < triangles.Length / 3; i++) { tri0 = i * 3; tri1 = tri0 + 1; tri2 = tri0 + 2; tri0 = triangles[tri0]; tri1 = triangles[tri1]; tri2 = triangles[tri2]; float area = 1; if (noiseType == "even") { area = HELP.AreaOfTriangle(verts[tri0], verts[tri1], verts[tri2]); } else if (noiseType == "fractal") { area = HELP.NoiseTriangleArea(noiseSize, verts[tri0], verts[tri1], verts[tri2]); area = Mathf.Pow(area, 10); } triangleAreas[i] = area; totalArea += area; } for (int i = 0; i < triangleAreas.Length; i++) { triangleAreas[i] /= totalArea; } float[] values = new float[count * structSize]; int index = 0; Vector3 pos; Vector3 uv; Vector3 tan; Vector3 nor; int baseTri; for (int i = 0; i < count; i++) { baseTri = 3 * HELP.getTri(Random.value, triangleAreas); tri0 = baseTri + 0; tri1 = baseTri + 1; tri2 = baseTri + 2; tri0 = triangles[tri0]; tri1 = triangles[tri1]; tri2 = triangles[tri2]; pos = HELP.GetRandomPointInTriangle(i, verts[tri0], verts[tri1], verts[tri2]); float a0 = HELP.AreaOfTriangle(pos, verts[tri1], verts[tri2]); float a1 = HELP.AreaOfTriangle(pos, verts[tri0], verts[tri2]); float a2 = HELP.AreaOfTriangle(pos, verts[tri0], verts[tri1]); float aTotal = a0 + a1 + a2; float p0 = a0 / aTotal; float p1 = a1 / aTotal; float p2 = a2 / aTotal; nor = (nors[tri0] * p0 + nors[tri1] * p1 + nors[tri2] * p2).normalized; uv = uvs[tri0] * p0 + uvs[tri1] * p1 + uvs[tri2] * p2; tan = (HELP.ToV3(tans[tri0]) * p0 + HELP.ToV3(tans[tri1]) * p1 + HELP.ToV3(tans[tri2]) * p2).normalized; // print( pos); values[index++] = pos.x; values[index++] = pos.y; values[index++] = pos.z; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = nor.x; values[index++] = nor.y; values[index++] = nor.z; values[index++] = tan.x; values[index++] = tan.y; values[index++] = tan.z; values[index++] = uv.x; values[index++] = uv.y; values[index++] = i; values[index++] = i / count; } SetData(values); }
public override void Embody() { float[] triangleAreas = new float[tris.count / 3]; int[] triData = tris.GetIntData(); float[] vertData = verts.GetFloatData(); float totalArea = 0; int tri0; int tri1; int tri2; for (int i = 0; i < tris.count / 3; i++) { tri0 = i * 3; tri1 = tri0 + 1; tri2 = tri0 + 2; tri0 = triData[tri0]; tri1 = triData[tri1]; tri2 = triData[tri2]; float area = 1; Vector3 p0 = extractToVector(tri0, 0, vertData, verts); Vector3 p1 = extractToVector(tri1, 0, vertData, verts); Vector3 p2 = extractToVector(tri2, 0, vertData, verts); if (noiseType == "even") { area = HELP.AreaOfTriangle(p0, p1, p2); } else if (noiseType == "fractal") { area = HELP.NoiseTriangleArea(noiseSize, p0, p1, p2); area = Mathf.Pow(area, 10); } triangleAreas[i] = area; totalArea += area; } for (int i = 0; i < triangleAreas.Length; i++) { triangleAreas[i] /= totalArea; } float[] values = new float[count * structSize]; int index = 0; Vector3 pos; Vector3 uv; Vector3 tan; Vector3 nor; int baseTri; for (int i = 0; i < count; i++) { baseTri = 3 * HELP.getTri(Random.value, triangleAreas); tri0 = baseTri + 0; tri1 = baseTri + 1; tri2 = baseTri + 2; tri0 = triData[tri0]; tri1 = triData[tri1]; tri2 = triData[tri2]; Vector3 v0 = extractToVector(tri0, 0, vertData, verts); Vector3 v1 = extractToVector(tri1, 0, vertData, verts); Vector3 v2 = extractToVector(tri2, 0, vertData, verts); pos = HELP.GetRandomPointInTriangle(i, v0, v1, v2); float a0 = HELP.AreaOfTriangle(pos, v1, v2); float a1 = HELP.AreaOfTriangle(pos, v0, v2); float a2 = HELP.AreaOfTriangle(pos, v0, v1); float aTotal = a0 + a1 + a2; float p0 = a0 / aTotal; float p1 = a1 / aTotal; float p2 = a2 / aTotal; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = 0; values[index++] = (float)i / (float)count; values[index++] = tri0; values[index++] = tri1; values[index++] = tri2; values[index++] = p0; values[index++] = p1; values[index++] = p2; values[index++] = 1; values[index++] = 0; values[index++] = 0; } SetData(values); }