From c41ac67aaec87eb11913b0ff19139bd2c2adfbab Mon Sep 17 00:00:00 2001 From: Caspian Rychlik-Prince Date: Mon, 19 Apr 2004 21:54:58 +0000 Subject: [PATCH] Tweaks to the Vector package, and finalized the Model structure. So I hope. --- src/java/org/lwjgl/util/model/Frame.java | 13 ++- src/java/org/lwjgl/util/model/Model.java | 44 ++++++++--- .../lwjgl/util/model/{Mesh.java => Skin.java} | 49 ++++-------- src/java/org/lwjgl/util/model/Triangle.java | 43 +++++++++- src/java/org/lwjgl/util/model/Vertex.java | 79 +++++++++++-------- .../lwjgl/util/model/renderer/Renderer.java | 18 ++++- src/java/org/lwjgl/util/vector/Vector2f.java | 16 ++-- src/java/org/lwjgl/util/vector/Vector3f.java | 24 ++++-- src/java/org/lwjgl/util/vector/Vector4f.java | 34 ++++++-- .../lwjgl/util/vector/WritableVector2f.java | 61 ++++++++++++++ .../lwjgl/util/vector/WritableVector3f.java | 55 +++++++++++++ .../lwjgl/util/vector/WritableVector4f.java | 55 +++++++++++++ 12 files changed, 385 insertions(+), 106 deletions(-) rename src/java/org/lwjgl/util/model/{Mesh.java => Skin.java} (69%) create mode 100644 src/java/org/lwjgl/util/vector/WritableVector2f.java create mode 100644 src/java/org/lwjgl/util/vector/WritableVector3f.java create mode 100644 src/java/org/lwjgl/util/vector/WritableVector4f.java diff --git a/src/java/org/lwjgl/util/model/Frame.java b/src/java/org/lwjgl/util/model/Frame.java index 99d14ff9..8207b943 100644 --- a/src/java/org/lwjgl/util/model/Frame.java +++ b/src/java/org/lwjgl/util/model/Frame.java @@ -45,11 +45,15 @@ public class Frame implements Serializable { /** The new transformations for each Bone in the Skeleton */ private final Matrix4f[] bone; + /** Frame time */ + private final float time; + /** * C'tor * @param bone[] */ - public Frame(Matrix4f[] bone) { + public Frame(float time, Matrix4f[] bone) { + this.time = time; this.bone = bone; } @@ -59,4 +63,11 @@ public class Frame implements Serializable { public Matrix4f[] getBone() { return bone; } + + /** + * @return the frame time + */ + public float getTime() { + return time; + } } diff --git a/src/java/org/lwjgl/util/model/Model.java b/src/java/org/lwjgl/util/model/Model.java index c74ae1f7..37cf64d0 100644 --- a/src/java/org/lwjgl/util/model/Model.java +++ b/src/java/org/lwjgl/util/model/Model.java @@ -51,23 +51,34 @@ public class Model implements Serializable { public static final long serialVersionUID = 1L; - /** The Mesh */ - private final Mesh mesh; + /** Material */ + private final String material; + + /** Vertices */ + private final Vertex[] vertex; + + /** Triangles */ + private final Triangle[] triangle; /** The animations: a Map of string names to Frame[] arrays */ private final Map animation; /** * C'tor - * @param mesh - * @param frame + * @param material + * @param vertex + * @param triangle + * @param animation */ - public Model(Mesh mesh, Map animation) { - this.mesh = mesh; + public Model(String material, Vertex[] vertex, Triangle[] triangle, Map animation) { + this.material = material; + this.vertex = vertex; + this.triangle = triangle; this.animation = animation; } /** + * Get a named animation from the Model * @param name The name of the animation * @return the Frames of an animation (or null, if no such animation exists) */ @@ -76,10 +87,25 @@ public class Model implements Serializable { } /** - * @return the Mesh + * @return Returns the material. */ - public Mesh getMesh() { - return mesh; + public String getMaterial() { + return material; } + /** + * @return Returns the triangles. + */ + public Triangle[] getTriangle() { + return triangle; + } + + /** + * @return Returns the vertices + */ + public Vertex[] getVertex() { + return vertex; + } + + } diff --git a/src/java/org/lwjgl/util/model/Mesh.java b/src/java/org/lwjgl/util/model/Skin.java similarity index 69% rename from src/java/org/lwjgl/util/model/Mesh.java rename to src/java/org/lwjgl/util/model/Skin.java index fa419b89..0864897b 100644 --- a/src/java/org/lwjgl/util/model/Mesh.java +++ b/src/java/org/lwjgl/util/model/Skin.java @@ -35,58 +35,39 @@ import java.io.Serializable; /** * $Id$ - * - * A Mesh is a collection of Triangles that all share the same material (ie. rendering - * state). - * + * Describes how a bone influences a vertex. * @author $Author$ * @version $Revision$ */ -public class Mesh implements Serializable { +public class Skin implements Serializable { public static final long serialVersionUID = 1L; - /** Material */ - private final String material; - - /** Vertices */ - private final Vertex[] vertex; - - /** Triangles */ - private final Triangle[] triangle; + /** Bone index */ + private final int bone; + /** Weight */ + private final float weight; /** * C'tor - * @param material - * @param vertex - * @param triangle */ - public Mesh(String material, Vertex[] vertex, Triangle[] triangle) { - this.material = material; - this.vertex = vertex; - this.triangle = triangle; + public Skin(int bone, float weight) { + this.bone = bone; + this.weight = weight; } /** - * @return Returns the material. + * @return Returns the bone index. */ - public String getMaterial() { - return material; + public int getBone() { + return bone; } /** - * @return Returns the triangles. + * @return Returns the weight. */ - public Triangle[] getTriangle() { - return triangle; + public float getWeight() { + return weight; } - - /** - * @return Returns the vertices - */ - public Vertex[] getVertex() { - return vertex; - } - } diff --git a/src/java/org/lwjgl/util/model/Triangle.java b/src/java/org/lwjgl/util/model/Triangle.java index 46d1691b..863e1328 100644 --- a/src/java/org/lwjgl/util/model/Triangle.java +++ b/src/java/org/lwjgl/util/model/Triangle.java @@ -31,24 +31,59 @@ */ package org.lwjgl.util.model; +import java.io.Serializable; + /** * $Id$ * @author $Author$ * @version $Revision$ */ -public class Triangle { +public class Triangle implements Serializable { public static final long serialVersionUID = 1L; /** Vertex indices: these look up into the parent Mesh's vertex array */ - private int a, b, c; + private final int a, b, c; /** Adjacency, for stripification */ - private int adjacency; + private final int adjacency; /** * C'tor + * @param a + * @param b + * @param c + * @param adjacency */ - public Triangle() { + public Triangle(int a, int b, int c, int adjacency) { + this.a = a; + this.b = b; + this.c = c; + this.adjacency = adjacency; + } + + /** + * @return Returns the 'a' vertex index + */ + public int getA() { + return a; + } + /** + * @return Returns the 'b' vertex index + */ + public int getB() { + return b; + } + /** + * @return Returns the 'c' vertex index + */ + public int getC() { + return c; + } + /** + * @return Returns the adjacency. + */ + public int getAdjacency() { + return adjacency; } } diff --git a/src/java/org/lwjgl/util/model/Vertex.java b/src/java/org/lwjgl/util/model/Vertex.java index a12d6ba9..bd7e3b78 100644 --- a/src/java/org/lwjgl/util/model/Vertex.java +++ b/src/java/org/lwjgl/util/model/Vertex.java @@ -33,10 +33,13 @@ package org.lwjgl.util.model; import java.io.Serializable; +import org.lwjgl.util.vector.ReadableVector2f; +import org.lwjgl.util.vector.ReadableVector3f; + /** * $Id$ * - * A single vertex in a Triangle + * A single vertex in a mesh. * * @author $Author$ * @version $Revision$ @@ -46,44 +49,56 @@ public class Vertex implements Serializable { public static final long serialVersionUID = 1L; /** Coordinates */ - private final float x, y, z; + private final ReadableVector3f coords; /** Normal */ - private final float nx, ny, nz; + private final ReadableVector3f normal; /** Texture coordinates */ - private final float u, v; - - /** Bone indices: these look up into the current Frame's bone array */ - private final int[] bone; - - /** Bone weights (always sum to 1.0f) */ - private final float[] weight; + private final ReadableVector2f texCoords; + /** Skin */ + private final Skin[] skin; + /** * C'tor - * @param x - * @param y - * @param z - * @param nx - * @param ny - * @param nz - * @param u - * @param v - * @param bone - * @param weight + * @param coords + * @param normal + * @param texCoords + * @param skin */ - public Vertex(float x, float y, float z, float nx, float ny, float nz, - float u, float v, int[] bone, float[] weight) { - this.x = x; - this.y = y; - this.z = z; - this.nx = nx; - this.ny = ny; - this.nz = nz; - this.u = u; - this.v = v; - this.bone = bone; - this.weight = weight; + public Vertex(ReadableVector3f coords, ReadableVector3f normal, ReadableVector2f texCoords, Skin[] skin) { + this.coords = coords; + this.normal = normal; + this.texCoords = texCoords; + this.skin = skin; + } + + /** + * @return Returns the coords. + */ + public ReadableVector3f getCoords() { + return coords; + } + + /** + * @return Returns the normal. + */ + public ReadableVector3f getNormal() { + return normal; + } + + /** + * @return Returns the skin. + */ + public Skin[] getSkin() { + return skin; + } + + /** + * @return Returns the texCoords. + */ + public ReadableVector2f getTexCoords() { + return texCoords; } } diff --git a/src/java/org/lwjgl/util/model/renderer/Renderer.java b/src/java/org/lwjgl/util/model/renderer/Renderer.java index f3cbc1d8..cdfb9395 100644 --- a/src/java/org/lwjgl/util/model/renderer/Renderer.java +++ b/src/java/org/lwjgl/util/model/renderer/Renderer.java @@ -34,6 +34,7 @@ package org.lwjgl.util.model.renderer; import java.util.HashMap; import java.util.Map; +import org.lwjgl.util.model.Frame; import org.lwjgl.util.model.Model; /** @@ -63,11 +64,24 @@ public class Renderer { /** * Render a Model * @param model The model to render + * @param animation The name of the animation + * @param time The time for the animation */ - public void render(Model model) { + public void render(Model model, String animation, float time) { // 1. Set up GL state from the Model's material - Renderable material = (Renderable) materials.get(model.getMesh().getMaterial()); + Renderable material = (Renderable) materials.get(model.getMaterial()); + if (material != null) { + material.render(); + } + + // 2. Get the animation + Frame[] frame = model.getAnimation(animation); + if (frame == null) { + return; + } + + // 3. Work out what the nearest frame is to the specified time } diff --git a/src/java/org/lwjgl/util/vector/Vector2f.java b/src/java/org/lwjgl/util/vector/Vector2f.java index 661b0295..2b7085d9 100644 --- a/src/java/org/lwjgl/util/vector/Vector2f.java +++ b/src/java/org/lwjgl/util/vector/Vector2f.java @@ -43,7 +43,7 @@ import java.nio.FloatBuffer; * @version $Revision$ */ -public class Vector2f extends Vector implements Serializable, ReadableVector2f { +public class Vector2f extends Vector implements Serializable, ReadableVector2f, WritableVector2f { public float x, y; @@ -68,14 +68,12 @@ public class Vector2f extends Vector implements Serializable, ReadableVector2f { set(x, y); } - /** - * Set values - * @return this + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) */ - public Vector2f set(float x, float y) { + public void set(float x, float y) { this.x = x; this.y = y; - return this; } /** @@ -188,7 +186,8 @@ public class Vector2f extends Vector implements Serializable, ReadableVector2f { if (dest == null) return new Vector2f(left.x + right.x, left.y + right.y); else { - return dest.set(left.x + right.x, left.y + right.y); + dest.set(left.x + right.x, left.y + right.y); + return dest; } } @@ -204,7 +203,8 @@ public class Vector2f extends Vector implements Serializable, ReadableVector2f { if (dest == null) return new Vector2f(left.x - right.x, left.y - right.y); else { - return dest.set(left.x - right.x, left.y - right.y); + dest.set(left.x - right.x, left.y - right.y); + return dest; } } diff --git a/src/java/org/lwjgl/util/vector/Vector3f.java b/src/java/org/lwjgl/util/vector/Vector3f.java index 2e62a881..a8261d9a 100644 --- a/src/java/org/lwjgl/util/vector/Vector3f.java +++ b/src/java/org/lwjgl/util/vector/Vector3f.java @@ -43,7 +43,7 @@ import java.nio.FloatBuffer; * @version $Revision$ */ -public class Vector3f extends Vector implements Serializable, ReadableVector3f { +public class Vector3f extends Vector implements Serializable, ReadableVector3f, WritableVector3f { public float x, y, z; @@ -68,15 +68,21 @@ public class Vector3f extends Vector implements Serializable, ReadableVector3f { set(x, y, z); } - /** - * Set values - * @return this + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) */ - public Vector3f set(float x, float y, float z) { + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { this.x = x; this.y = y; this.z = z; - return this; } /** @@ -123,7 +129,8 @@ public class Vector3f extends Vector implements Serializable, ReadableVector3f { if (dest == null) return new Vector3f(left.x + right.x, left.y + right.y, left.z + right.z); else { - return dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + return dest; } } @@ -139,7 +146,8 @@ public class Vector3f extends Vector implements Serializable, ReadableVector3f { if (dest == null) return new Vector3f(left.x - right.x, left.y - right.y, left.z - right.z); else { - return dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + return dest; } } diff --git a/src/java/org/lwjgl/util/vector/Vector4f.java b/src/java/org/lwjgl/util/vector/Vector4f.java index 85086949..0bf11162 100644 --- a/src/java/org/lwjgl/util/vector/Vector4f.java +++ b/src/java/org/lwjgl/util/vector/Vector4f.java @@ -43,7 +43,7 @@ import java.nio.FloatBuffer; * @version $Revision$ */ -public class Vector4f extends Vector implements Serializable, ReadableVector4f { +public class Vector4f extends Vector implements Serializable, ReadableVector4f, WritableVector4f { public float x, y, z, w; @@ -68,16 +68,31 @@ public class Vector4f extends Vector implements Serializable, ReadableVector4f { set(x, y, z, w); } - /** - * Set values - * @return this + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) */ - public Vector4f set(float x, float y, float z, float w) { + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { this.x = x; this.y = y; this.z = z; this.w = w; - return this; } /** @@ -126,7 +141,8 @@ public class Vector4f extends Vector implements Serializable, ReadableVector4f { if (dest == null) return new Vector4f(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); else { - return dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + return dest; } } @@ -142,7 +158,8 @@ public class Vector4f extends Vector implements Serializable, ReadableVector4f { if (dest == null) return new Vector4f(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); else { - return dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + return dest; } } @@ -294,6 +311,7 @@ public class Vector4f extends Vector implements Serializable, ReadableVector4f { this.z = z; } + /* (Overrides) * @see org.lwjgl.vector.ReadableVector3f#getZ() */ diff --git a/src/java/org/lwjgl/util/vector/WritableVector2f.java b/src/java/org/lwjgl/util/vector/WritableVector2f.java new file mode 100644 index 00000000..deee4eb2 --- /dev/null +++ b/src/java/org/lwjgl/util/vector/WritableVector2f.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003 Shaven Puppy Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'Shaven Puppy' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + + +/** + * $Id$ + * Writable interface to Vector2fs + * @author $author$ + * @version $revision$ + */ +public interface WritableVector2f { + + /** + * Set the X value + * @param x + */ + public void setX(float x); + + /** + * Set the Y value + * @param y + */ + public void setY(float y); + + /** + * Set the X,Y values + * @param x, y + */ + public void set(float x, float y); + +} \ No newline at end of file diff --git a/src/java/org/lwjgl/util/vector/WritableVector3f.java b/src/java/org/lwjgl/util/vector/WritableVector3f.java new file mode 100644 index 00000000..a233946a --- /dev/null +++ b/src/java/org/lwjgl/util/vector/WritableVector3f.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2003 Shaven Puppy Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'Shaven Puppy' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + + +/** + * $Id$ + * Writable interface to Vector3fs + * @author $author$ + * @version $revision$ + */ +public interface WritableVector3f extends WritableVector2f { + + /** + * Set the Z value + * @param z + */ + public void setZ(float z); + + /** + * Set the X,Y,Z values + * @param x, y, z + */ + public void set(float x, float y, float z); + +} \ No newline at end of file diff --git a/src/java/org/lwjgl/util/vector/WritableVector4f.java b/src/java/org/lwjgl/util/vector/WritableVector4f.java new file mode 100644 index 00000000..2e954ab8 --- /dev/null +++ b/src/java/org/lwjgl/util/vector/WritableVector4f.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2003 Shaven Puppy Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'Shaven Puppy' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + + +/** + * $Id$ + * Writable interface to Vector4fs + * @author $author$ + * @version $revision$ + */ +public interface WritableVector4f extends WritableVector3f { + + /** + * Set the W value + * @param w + */ + public void setW(float w); + + /** + * Set the X,Y,Z,W values + * @param x, y, z, w + */ + public void set(float x, float y, float z, float w); + +} \ No newline at end of file