From f62ab7b6209218e6063054589bc3811f1a2c8bea Mon Sep 17 00:00:00 2001 From: Caspian Rychlik-Prince Date: Sun, 18 Apr 2004 19:30:32 +0000 Subject: [PATCH] Models! Models! Models! --- src/java/org/lwjgl/util/model/Frame.java | 2 +- src/java/org/lwjgl/util/model/Model.java | 20 +++-- src/java/org/lwjgl/util/model/Vertex.java | 4 +- .../org/lwjgl/util/model/loader/Loader.java | 65 +++++++++++++++ .../lwjgl/util/model/renderer/Renderable.java | 49 ++++++++++++ .../lwjgl/util/model/renderer/Renderer.java | 79 +++++++++++++++++++ 6 files changed, 208 insertions(+), 11 deletions(-) create mode 100644 src/java/org/lwjgl/util/model/loader/Loader.java create mode 100644 src/java/org/lwjgl/util/model/renderer/Renderable.java create mode 100644 src/java/org/lwjgl/util/model/renderer/Renderer.java diff --git a/src/java/org/lwjgl/util/model/Frame.java b/src/java/org/lwjgl/util/model/Frame.java index 818010e7..99d14ff9 100644 --- a/src/java/org/lwjgl/util/model/Frame.java +++ b/src/java/org/lwjgl/util/model/Frame.java @@ -33,7 +33,7 @@ package org.lwjgl.util.model; import java.io.Serializable; -import org.lwjgl.vector.Matrix4f; +import org.lwjgl.util.vector.Matrix4f; /** * A Frame describes a set of new positions for Bones. diff --git a/src/java/org/lwjgl/util/model/Model.java b/src/java/org/lwjgl/util/model/Model.java index 5be548b8..c74ae1f7 100644 --- a/src/java/org/lwjgl/util/model/Model.java +++ b/src/java/org/lwjgl/util/model/Model.java @@ -33,13 +33,16 @@ package org.lwjgl.util.model; import java.io.Serializable; +import java.util.Map; /** * $Id$ * * A simple animated, skinned, boned 3D model, consisting of a single mesh - * with a single material. + * with a single material. The model's internal format is optimised for RAM storage; + * no metadata is held in memory - in other words this is not a good class to use + * for, say, a 3d modelling application. * * @author $Author$ * @version $Revision$ @@ -51,24 +54,25 @@ public class Model implements Serializable { /** The Mesh */ private final Mesh mesh; - /** The animations */ - private final Frame[] frame; + /** The animations: a Map of string names to Frame[] arrays */ + private final Map animation; /** * C'tor * @param mesh * @param frame */ - public Model(Mesh mesh, Frame[] frame) { + public Model(Mesh mesh, Map animation) { this.mesh = mesh; - this.frame = frame; + this.animation = animation; } /** - * @return the Frames + * @param name The name of the animation + * @return the Frames of an animation (or null, if no such animation exists) */ - public Frame[] getFrame() { - return frame; + public Frame[] getAnimation(String name) { + return (Frame[]) animation.get(name); } /** diff --git a/src/java/org/lwjgl/util/model/Vertex.java b/src/java/org/lwjgl/util/model/Vertex.java index 8cd3d53c..a12d6ba9 100644 --- a/src/java/org/lwjgl/util/model/Vertex.java +++ b/src/java/org/lwjgl/util/model/Vertex.java @@ -54,10 +54,10 @@ public class Vertex implements Serializable { /** Texture coordinates */ private final float u, v; - /** Bone indices */ + /** Bone indices: these look up into the current Frame's bone array */ private final int[] bone; - /** Bone weights */ + /** Bone weights (always sum to 1.0f) */ private final float[] weight; /** diff --git a/src/java/org/lwjgl/util/model/loader/Loader.java b/src/java/org/lwjgl/util/model/loader/Loader.java new file mode 100644 index 00000000..d15e5f70 --- /dev/null +++ b/src/java/org/lwjgl/util/model/loader/Loader.java @@ -0,0 +1,65 @@ +/* + * 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.model.loader; + +import org.lwjgl.util.model.Model; +import org.w3c.dom.Document; + +/** + * $Id$ + * + * Loads a Model from an XML document. + * + * @author $Author$ + * @version $Revision$ + */ +public class Loader { + + /** The source document */ + private final Document src; + + /** + * C'tor + */ + public Loader(Document src) { + this.src = src; + } + + /** + * Load the model from the XML document and return it. + * @return Model + * @throws Exception + */ + public Model load() throws Exception { + } + +} diff --git a/src/java/org/lwjgl/util/model/renderer/Renderable.java b/src/java/org/lwjgl/util/model/renderer/Renderable.java new file mode 100644 index 00000000..d94ec18e --- /dev/null +++ b/src/java/org/lwjgl/util/model/renderer/Renderable.java @@ -0,0 +1,49 @@ +/* + * 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.model.renderer; + +/** + * $Id$ + * + * Simple interface to things that can be Rendered. + * + * @author $Author$ + * @version $Revision$ + */ +public interface Renderable { + + /** + * "Render" this thing. This will involve calls to the GL. + */ + public void render(); + +} diff --git a/src/java/org/lwjgl/util/model/renderer/Renderer.java b/src/java/org/lwjgl/util/model/renderer/Renderer.java new file mode 100644 index 00000000..4bea3b4c --- /dev/null +++ b/src/java/org/lwjgl/util/model/renderer/Renderer.java @@ -0,0 +1,79 @@ +/* + * 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.model.renderer; + +import java.util.HashMap; +import java.util.Map; + +import org.lwjgl.util.model.Model; + +/** + * $Id$ + * + * A simple (and very inefficient) Model renderer. This calculates the model vertices on the fly + * and uses GL immediate mode to render the result. This is of course very slow. + *

+ * Material lookups are performed by mapping the material name to a Renderable thing. You must + * suppy appropriate Renderables - typically something that binds a 2D texture and sets up some + * GL state. + * + * @author $Author$ + * @version $Revision$ + */ +public class Renderer { + + /** Material map: String name->Renderable */ + private final Map materials = new HashMap(); + + /** + * C'tor + */ + public Renderer() { + } + + /** + * Render a Model + * @param model The model to render + */ + public void render(Model model) { + } + + /** + * Add a material + * @param name The material's name + * @param renderable The renderable object + */ + public void putMaterial(String name, Renderable renderable) { + materials.put(name, renderable); + } + +}