diff options
Diffstat (limited to 'src/net/java/joglutils/msg/nodes/TriangleSet.java')
-rw-r--r-- | src/net/java/joglutils/msg/nodes/TriangleSet.java | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/src/net/java/joglutils/msg/nodes/TriangleSet.java b/src/net/java/joglutils/msg/nodes/TriangleSet.java index 0692738..8f708cb 100644 --- a/src/net/java/joglutils/msg/nodes/TriangleSet.java +++ b/src/net/java/joglutils/msg/nodes/TriangleSet.java @@ -37,6 +37,9 @@ package net.java.joglutils.msg.nodes; +import java.nio.*; +import java.util.*; + import javax.media.opengl.*; import com.sun.opengl.util.texture.*; @@ -49,7 +52,7 @@ import net.java.joglutils.msg.misc.*; node, and any auxiliary nodes such as a TextureCoordinate2 node, into a set of triangles. */ -public class TriangleSet extends Node { +public class TriangleSet extends TriangleBasedShape { private int numTriangles; /** Sets the number of triangles this TriangleSet references. */ @@ -110,6 +113,102 @@ public class TriangleSet extends Node { } } + public void generateTriangles(Action action, TriangleCallback cb) { + State state = action.getState(); + FloatBuffer coords = null; + FloatBuffer texCoords = null; + // FIXME: normals and lighting not supported yet + // FloatBuffer normals = null; + FloatBuffer colors = null; + if (CoordinateElement.isEnabled(state)) { + coords = CoordinateElement.get(state); + } + // No point in continuing if we don't have coordinates + if (coords == null) + return; + if (TextureCoordinateElement.isEnabled(state)) { + texCoords = TextureCoordinateElement.get(state); + } + // if (NormalElement.isEnabled(state)) { + // texCoords = NormalElement.get(state); + // } + if (ColorElement.isEnabled(state)) { + colors = ColorElement.get(state); + } + PrimitiveVertex v0 = new PrimitiveVertex(); + PrimitiveVertex v1 = new PrimitiveVertex(); + PrimitiveVertex v2 = new PrimitiveVertex(); + v0.setCoord(new Vec3f()); + v1.setCoord(new Vec3f()); + v2.setCoord(new Vec3f()); + if (texCoords != null) { + v0.setTexCoord(new Vec2f()); + v1.setTexCoord(new Vec2f()); + v2.setTexCoord(new Vec2f()); + } + if (colors != null) { + v0.setColor(new Vec4f()); + v1.setColor(new Vec4f()); + v2.setColor(new Vec4f()); + } + + int coordIdx = 0; + for (int i = 0; i < numTriangles; i++) { + // Vertex 0 + v0.getCoord().set(coords.get(3 * coordIdx + 0), + coords.get(3 * coordIdx + 1), + coords.get(3 * coordIdx + 2)); + if (texCoords != null) { + v0.getTexCoord().set(texCoords.get(2 * coordIdx + 0), + texCoords.get(2 * coordIdx + 1)); + } + if (colors != null) { + v0.getColor().set(colors.get(4 * coordIdx + 0), + colors.get(4 * coordIdx + 1), + colors.get(4 * coordIdx + 2), + colors.get(4 * coordIdx + 3)); + } + + // Vertex 1 + v1.getCoord().set(coords.get(3 * (coordIdx + 1) + 0), + coords.get(3 * (coordIdx + 1) + 1), + coords.get(3 * (coordIdx + 1) + 2)); + if (texCoords != null) { + v1.getTexCoord().set(texCoords.get(2 * (coordIdx + 1) + 0), + texCoords.get(2 * (coordIdx + 1) + 1)); + } + if (colors != null) { + v1.getColor().set(colors.get(4 * (coordIdx + 1) + 0), + colors.get(4 * (coordIdx + 1) + 1), + colors.get(4 * (coordIdx + 1) + 2), + colors.get(4 * (coordIdx + 1) + 3)); + } + + // Vertex 2 + v2.getCoord().set(coords.get(3 * (coordIdx + 2) + 0), + coords.get(3 * (coordIdx + 2) + 1), + coords.get(3 * (coordIdx + 2) + 2)); + if (texCoords != null) { + v2.getTexCoord().set(texCoords.get(2 * (coordIdx + 2) + 0), + texCoords.get(2 * (coordIdx + 2) + 1)); + } + if (colors != null) { + v2.getColor().set(colors.get(4 * (coordIdx + 2) + 0), + colors.get(4 * (coordIdx + 2) + 1), + colors.get(4 * (coordIdx + 2) + 2), + colors.get(4 * (coordIdx + 2) + 3)); + } + + // Call callback + cb.triangleCB(i, + v0, 3 * i + 0, + v1, 3 * i + 1, + v2, 3 * i + 2); + + coordIdx += 3; + } + } + // Helper routine for setting up a texture matrix to allow texture // coords in the scene graph to always be specified from (0..1) private Mat4f textureMatrix = new Mat4f(); |