// TriMesh.java public class TriMesh { public TriMesh (Vertex av [], int ai [], Color ac []) { lit = new Color (); working = new Vector (); backface = true; vertices = av; faces = new TriFace [ai.length / 3]; int j = 0; for (int k = 0; k < faces.length; k++) { faces [k] = new TriFace (vertices [ai [j+0]], vertices [ai [j+1]], vertices [ai [j+2]], ac [k]); j += 3; } } public void backface (boolean flag) {backface = flag;} public void draw (Pipeline pipeline, Vector vector) { if (backface) { for (int i = 0; i < faces.length; i++) { working.load (faces [i].a.vector); working.subtract (vector); float f = working.dot (faces [i].normal); if (f > 0.0F) { pipeline.diffuse (faces [i].color); pipeline.triangle (faces [i].a.vector, faces [i].b.vector, faces [i].c.vector); } } } else { for (int j = 0; j < faces.length; j++) { pipeline.diffuse (faces [j].color); pipeline.triangle (faces [j].a.vector, faces [j].b.vector, faces [j].c.vector); } } } public void draw (Pipeline pipeline, Vector vector, Vector vector1, float f) { if (backface) { for (int i = 0; i < faces.length; i++) { working.load (faces [i].a.vector); working.subtract (vector); float f1 = working.dot (faces [i].normal); if (f1 > 0.0F) { Color color1 = faces [i].color; working.load (faces [i].a.vector); working.subtract (vector1); working.normalize (); float f3 = working.dot (faces [i].normal); if (f3 < f) f3 = f; lit.r = color1.r * f3; lit.g = color1.g * f3; lit.b = color1.b * f3; lit.clamp (); pipeline.diffuse (lit); pipeline.triangle (faces [i].a.vector, faces [i].b.vector, faces [i].c.vector); } } } else { for (int j = 0; j < faces.length; j++) { Color color = faces [j].color; working.load (faces [j].a.vector); working.subtract (vector1); working.normalize (); float f2 = working.dot (faces [j].normal); if (f2 < f) f2 = f; lit.r = color.r * f2; lit.g = color.g * f2; lit.b = color.b * f2; lit.clamp (); pipeline.diffuse (lit); pipeline.triangle (faces [j].a.vector, faces [j].b.vector, faces [j].c.vector); } } } public TriMesh subdivide (float f) { int i = faces.length; Vertex av [] = new Vertex [i * 6]; int ai [] = new int [i * 4 * 3]; Color ac [] = new Color [i * 4]; int j = 0; int k = 0; int l = 0; for (int i1 = 0; i1 < i; i1++) { av [j+0] = faces [i1].a; av [j+1] = faces [i1].b; av [j+2] = faces [i1].c; av [j+3] = new Vertex (0.0F, 0.0F, 0.0F); av [j+4] = new Vertex (0.0F, 0.0F, 0.0F); av [j+5] = new Vertex (0.0F, 0.0F, 0.0F); av [j+3].vector.add (faces [i1].a.vector); av [j+3].vector.add (faces [i1].b.vector); av [j+3].vector.scale (0.5F); av [j+3].vector.normalize (); av [j+3].vector.scale (f); av [j+4].vector.add (faces [i1].b.vector); av [j+4].vector.add (faces [i1].c.vector); av [j+4].vector.scale (0.5F); av [j+4].vector.normalize (); av [j+4].vector.scale (f); av [j+5].vector.add (faces [i1].c.vector); av [j+5].vector.add (faces [i1].a.vector); av [j+5].vector.scale (0.5F); av [j+5].vector.normalize (); av [j+5].vector.scale (f); ai [k+0] = j; ai [k+1] = j + 3; ai [k+2] = j + 5; ai [k+3] = j + 3; ai [k+4] = j + 1; ai [k+5] = j + 4; ai [k+6] = j + 5; ai [k+7] = j + 4; ai [k+8] = j + 2; ai [k+9] = j + 3; ai [k+10] = j + 4; ai [k+11] = j + 5; ac [l+0] = faces [i1].color; ac [l+1] = faces [i1].color; ac [l+2] = faces [i1].color; ac [l+3] = faces [i1].color; j += 6; k += 12; l += 4; } return new TriMesh (av, ai, ac); } public Vertex vertices []; public TriFace faces []; Color lit; Vector working; boolean backface; }