You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(134) |
Sep
(52) |
Oct
(13) |
Nov
(342) |
Dec
(163) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(44) |
Feb
(62) |
Mar
(158) |
Apr
(38) |
May
(70) |
Jun
(58) |
Jul
(104) |
Aug
(207) |
Sep
(83) |
Oct
(122) |
Nov
(23) |
Dec
(49) |
| 2004 |
Jan
(119) |
Feb
(132) |
Mar
(192) |
Apr
(140) |
May
(77) |
Jun
(74) |
Jul
(201) |
Aug
(63) |
Sep
(102) |
Oct
(70) |
Nov
(173) |
Dec
(78) |
| 2005 |
Jan
(174) |
Feb
(197) |
Mar
(105) |
Apr
(59) |
May
(77) |
Jun
(43) |
Jul
(21) |
Aug
(18) |
Sep
(47) |
Oct
(37) |
Nov
(74) |
Dec
(50) |
| 2006 |
Jan
(44) |
Feb
(19) |
Mar
(32) |
Apr
(24) |
May
(31) |
Jun
(55) |
Jul
(138) |
Aug
(28) |
Sep
(12) |
Oct
(41) |
Nov
(58) |
Dec
(24) |
| 2007 |
Jan
(28) |
Feb
(14) |
Mar
(10) |
Apr
(68) |
May
(30) |
Jun
(26) |
Jul
(18) |
Aug
(63) |
Sep
(19) |
Oct
(29) |
Nov
(20) |
Dec
(10) |
| 2008 |
Jan
(38) |
Feb
(7) |
Mar
(37) |
Apr
(120) |
May
(41) |
Jun
(36) |
Jul
(39) |
Aug
(24) |
Sep
(28) |
Oct
(30) |
Nov
(36) |
Dec
(75) |
| 2009 |
Jan
(46) |
Feb
(22) |
Mar
(50) |
Apr
(70) |
May
(134) |
Jun
(105) |
Jul
(75) |
Aug
(34) |
Sep
(38) |
Oct
(34) |
Nov
(19) |
Dec
(20) |
| 2010 |
Jan
(11) |
Feb
(20) |
Mar
(65) |
Apr
(83) |
May
(104) |
Jun
(73) |
Jul
(78) |
Aug
(57) |
Sep
(43) |
Oct
(35) |
Nov
(9) |
Dec
(4) |
| 2011 |
Jan
(21) |
Feb
(11) |
Mar
(18) |
Apr
(10) |
May
(18) |
Jun
(15) |
Jul
(48) |
Aug
(25) |
Sep
(17) |
Oct
(45) |
Nov
(15) |
Dec
(12) |
| 2012 |
Jan
(21) |
Feb
(9) |
Mar
(12) |
Apr
(9) |
May
(9) |
Jun
(5) |
Jul
(1) |
Aug
(10) |
Sep
(12) |
Oct
(1) |
Nov
(28) |
Dec
(5) |
| 2013 |
Jan
(4) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2014 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
| 2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
| 2016 |
Jan
(2) |
Feb
(1) |
Mar
(1) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
| 2017 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
1
|
2
|
3
(9) |
|
4
(28) |
5
(1) |
6
(9) |
7
(9) |
8
|
9
(7) |
10
|
|
11
(1) |
12
(18) |
13
(8) |
14
|
15
|
16
(2) |
17
(2) |
|
18
(17) |
19
(5) |
20
(5) |
21
(12) |
22
(1) |
23
|
24
|
|
25
|
26
(1) |
27
|
28
|
29
(3) |
30
(2) |
|
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-30 08:17:34
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13699/src/java/org/lwjgl/util Modified Files: Color.java Log Message: Index: Color.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/Color.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Color.java 26 Apr 2004 10:15:56 -0000 1.2 +++ Color.java 30 Apr 2004 08:17:25 -0000 1.3 @@ -395,9 +395,9 @@ /** * HSB to RGB conversion, pinched from java.awt.Color. - * @param hue (0..360) - * @param saturation (0..100) - * @param brightness (0..100) + * @param hue (0..1.0f) + * @param saturation (0..1.0f) + * @param brightness (0..1.0f) */ public void fromHSB(float hue, float saturation, float brightness) { if (saturation == 0.0F) { @@ -446,7 +446,7 @@ /** * RGB to HSB conversion, pinched from java.awt.Color. * The HSB value is returned in dest[] if dest[] is supplied. - * Hue is 0..360, saturation and brightness are 0..100. + * Values range from 0..1 * @param dest[] Destination floats, or null * @return dest[], or a new float[] */ |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-30 08:17:33
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13699/src/java/org/lwjgl/util/model/loaders Modified Files: XMLUtil.java Log Message: Index: XMLUtil.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders/XMLUtil.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- XMLUtil.java 22 Apr 2004 13:57:48 -0000 1.2 +++ XMLUtil.java 30 Apr 2004 08:17:25 -0000 1.3 @@ -50,7 +50,7 @@ * @return the single child element, or null * @throws Exception if the child is present multiple times */ - public static Element getChild(Element element, String child) throws Exception { + static Element getChild(Element element, String child) throws Exception { NodeList nodes = element.getChildNodes(); Element ret = null; for (int i = 0; i < nodes.getLength(); i ++) { |
|
From: Brian M. <ma...@us...> - 2004-04-29 20:52:36
|
Update of /cvsroot/java-game-lib/LWJGL/www In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21485 Modified Files: index.php Log Message: irc Index: index.php =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/www/index.php,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- index.php 30 Mar 2004 17:18:35 -0000 1.1 +++ index.php 29 Apr 2004 20:52:24 -0000 1.2 @@ -29,6 +29,9 @@ LWJGL is available under a BSD license, which means it's open source and freely available at no charge. However, we won't mind a <a href="http://sourceforge.net/donate/index.php?group_id=58488">donation</a>. </p> + <p> + Please visit us on the Freenode IRC Network: <a href="irc://irc.freenode.net/lwjgl">#LWJGL</a>. Do idle if there is no one to answer any of your questions, we are on different timezones. + </p> </div> <?php |
|
From: Brian M. <ma...@us...> - 2004-04-29 20:52:16
|
Update of /cvsroot/java-game-lib/LWJGL/www/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21392 Modified Files: news.php default.php Log Message: wiki Index: default.php =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/www/include/default.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- default.php 17 Apr 2004 01:17:33 -0000 1.2 +++ default.php 29 Apr 2004 20:52:06 -0000 1.3 @@ -7,6 +7,7 @@ "download", "download.php", "_top", "installation", "installation.php", "_top", "documentation", "documentation.php", "_top", + "wiki", "http://wiki.lwjgl.org/", "_blank", "forum", "http://forum.lwjgl.org/", "_blank", "faq", "faq.php", "_top", "projects", "projects.php", "_top", Index: news.php =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/www/include/news.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- news.php 13 Apr 2004 20:07:07 -0000 1.2 +++ news.php 29 Apr 2004 20:52:06 -0000 1.3 @@ -2,11 +2,16 @@ // News // ======================================================= $news[0] = array( + "LWJGL Wiki", + "One of LWJGL's shortcommings has always been the lack of good tutorials and examples. Well all this ends now! We have setup a wiki, and all registered users may add new articles, FAQ entries and more. So please start filling the wiki with content:<br><a href=\"http://wiki.lwjgl.org\" target=\"_blank\">LWJGL Wiki</a>", + "Thursday, April 29th, 2004"); + + $news[1] = array( "LWJGL 0.9a released", "LWJGL 0.9 alpha has been released! Download <a href=\"http://www.lwjgl.org/download.php\">here</a>.<br>consider <a href=\"http://sourceforge.net/donate/index.php?group_id=58488\">donating</a> if you find LWJGL usefull.", "Tuesday, April 13th, 2004"); - $news[1] = array( + $news[2] = array( "New site!", "Welcome to the grand opening of our new site! Please browse around. Should you find any errors or have trouble finding exactly what your looking for, please email <a href=\"mailto:in...@lw...\">in...@lw...</a>", "Sunday, March 28th, 2004"); |
|
From: Brian M. <ma...@us...> - 2004-04-29 16:21:46
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/input In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27621 Modified Files: Controller.java Log Message: support for n buttons Index: Controller.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/input/Controller.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- Controller.java 7 Apr 2004 07:55:37 -0000 1.17 +++ Controller.java 29 Apr 2004 16:21:37 -0000 1.18 @@ -152,13 +152,6 @@ Sys.initialize(); initIDs(); - // Assign names to all the buttons - buttonName = new String[8]; - for (int i = 0; i < 8; i ++) { - buttonName[i] = "BUTTON" + i; - buttonMap.put(buttonName[i], new Integer(i)); - } - initialized = true; } @@ -176,6 +169,13 @@ } nCreate(); + + // Assign names to all the buttons + buttonName = new String[buttons.length]; + for (int i = 0; i < buttons.length; i ++) { + buttonName[i] = "BUTTON" + i; + buttonMap.put(buttonName[i], new Integer(i)); + } created = true; } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-26 10:16:12
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4789/src/java/org/lwjgl/util Modified Files: Color.java Log Message: Added conversions to and from HSB Index: Color.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/Color.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Color.java 21 Apr 2004 18:10:59 -0000 1.1 +++ Color.java 26 Apr 2004 10:15:56 -0000 1.2 @@ -392,4 +392,103 @@ blue = src.getBlueByte(); alpha = src.getAlphaByte(); } + + /** + * HSB to RGB conversion, pinched from java.awt.Color. + * @param hue (0..360) + * @param saturation (0..100) + * @param brightness (0..100) + */ + public void fromHSB(float hue, float saturation, float brightness) { + if (saturation == 0.0F) { + red = green = blue = (byte) (brightness * 255F + 0.5F); + } else { + float f3 = (hue - (float) Math.floor(hue)) * 6F; + float f4 = f3 - (float) Math.floor(f3); + float f5 = brightness * (1.0F - saturation); + float f6 = brightness * (1.0F - saturation * f4); + float f7 = brightness * (1.0F - saturation * (1.0F - f4)); + switch ((int) f3) { + case 0 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f7 * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 1 : + red = (byte) (f6 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 2 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f7 * 255F + 0.5F); + break; + case 3 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (f6 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 4 : + red = (byte) (f7 * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 5 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (f6 * 255F + 0.5F); + break; + } + } + } + + /** + * RGB to HSB conversion, pinched from java.awt.Color. + * The HSB value is returned in dest[] if dest[] is supplied. + * Hue is 0..360, saturation and brightness are 0..100. + * @param dest[] Destination floats, or null + * @return dest[], or a new float[] + */ + public float[] toHSB(float dest[]) { + int r = getRed(); + int g = getGreen(); + int b = getBlue(); + if (dest == null) + dest = new float[3]; + int l = r <= g ? g : r; + if (b > l) + l = b; + int i1 = r >= g ? g : r; + if (b < i1) + i1 = b; + float brightness = (float) l / 255F; + float saturation; + if (l != 0) + saturation = (float) (l - i1) / (float) l; + else + saturation = 0.0F; + float hue; + if (saturation == 0.0F) { + hue = 0.0F; + } else { + float f3 = (float) (l - r) / (float) (l - i1); + float f4 = (float) (l - g) / (float) (l - i1); + float f5 = (float) (l - b) / (float) (l - i1); + if (r == l) + hue = f5 - f4; + else if (g == l) + hue = (2.0F + f3) - f5; + else + hue = (4F + f4) - f3; + hue /= 6F; + if (hue < 0.0F) + hue++; + } + dest[0] = hue; + dest[1] = saturation; + dest[2] = brightness; + return dest; + } + } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-22 13:57:57
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25670/src/java/org/lwjgl/util/model/loaders Modified Files: XMLLoader.java XMLUtil.java Log Message: Added wrapper tags Index: XMLLoader.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders/XMLLoader.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XMLLoader.java 21 Apr 2004 19:46:02 -0000 1.1 +++ XMLLoader.java 22 Apr 2004 13:57:48 -0000 1.2 @@ -39,13 +39,6 @@ import org.lwjgl.util.Color; import org.lwjgl.util.model.*; -import org.lwjgl.util.model.BoneFrame; -import org.lwjgl.util.model.BonedModel; -import org.lwjgl.util.model.BonedVertex; -import org.lwjgl.util.model.MeshedModel; -import org.lwjgl.util.model.Triangle; -import org.lwjgl.util.model.Vertex; -import org.lwjgl.util.model.Weight; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; @@ -121,7 +114,11 @@ * @throws Exception */ private BonedVertex[] loadBonedVertices() throws Exception { - List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex"); + Element verticesElement = XMLUtil.getChild(src.getDocumentElement(), "vertices"); + if (verticesElement == null) { + return null; + } + List vertexElements = XMLUtil.getChildren(verticesElement, "vertex"); if (vertexElements.size() != numVertices) { throw new Exception("Vertex count incorrect, got "+vertexElements.size()+", expected "+numVertices); } @@ -140,7 +137,11 @@ * @throws Exception */ private Vector2f[] loadSkin() throws Exception { - List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin"); + Element skinElement = XMLUtil.getChild(src.getDocumentElement(), "skin"); + if (skinElement == null) { + return null; + } + List skinElements = XMLUtil.getChildren(skinElement, "texcoord"); if (skinElements.size() == 0) { return null; } @@ -150,8 +151,8 @@ Vector2f[] skins = new Vector2f[skinElements.size()]; int skinCount = 0; for (Iterator i = skinElements.iterator(); i.hasNext(); ) { - Element skinElement = (Element) i.next(); - skins[skinCount++] = loadTexCoord(skinElement); + Element texCoordElement = (Element) i.next(); + skins[skinCount++] = loadTexCoord(texCoordElement); } return skins; } @@ -162,7 +163,12 @@ * @throws Exception */ private Color[] loadColor() throws Exception { - List colorElements = XMLUtil.getChildren(src.getDocumentElement(), "color"); + Element colorsElement = XMLUtil.getChild(src.getDocumentElement(), "colors"); + if (colorsElement == null) { + return null; + } + + List colorElements = XMLUtil.getChildren(colorsElement, "color"); if (colorElements.size() == 0) { return null; } @@ -184,7 +190,11 @@ * @throws Exception */ private Triangle[] loadTriangles() throws Exception { - List triangleElements = XMLUtil.getChildren(src.getDocumentElement(), "triangle"); + Element meshElement = XMLUtil.getChild(src.getDocumentElement(), "mesh"); + if (meshElement == null) { + return null; + } + List triangleElements = XMLUtil.getChildren(meshElement, "triangle"); Triangle[] triangles = new Triangle[triangleElements.size()]; int triangleCount = 0; for (Iterator i = triangleElements.iterator(); i.hasNext(); ) { @@ -200,11 +210,15 @@ * @throws Exception */ private Map loadBoneAnimations() throws Exception { - List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); - Map animations = new HashMap(animationElements.size()); - for (Iterator i = animationElements.iterator(); i.hasNext(); ) { - Element animationElement = (Element) i.next(); - animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement)); + Element animationElement = XMLUtil.getChild(src.getDocumentElement(), "animation"); + if (animationElement == null) { + return null; + } + List sequenceElements = XMLUtil.getChildren(src.getDocumentElement(), "sequence"); + Map animations = new HashMap(sequenceElements.size()); + for (Iterator i = sequenceElements.iterator(); i.hasNext(); ) { + Element sequenceElement = (Element) i.next(); + animations.put(XMLUtil.getString(sequenceElement, "name"), loadBonedAnimation(sequenceElement)); } return animations; } @@ -215,11 +229,15 @@ * @throws Exception */ private Map loadMeshAnimations() throws Exception { - List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); - Map animations = new HashMap(animationElements.size()); - for (Iterator i = animationElements.iterator(); i.hasNext(); ) { - Element animationElement = (Element) i.next(); - animations.put(XMLUtil.getString(animationElement, "name"), loadMeshAnimation(animationElement)); + Element animationElement = XMLUtil.getChild(src.getDocumentElement(), "animation"); + if (animationElement == null) { + return null; + } + List sequenceElements = XMLUtil.getChildren(src.getDocumentElement(), "sequence"); + Map animations = new HashMap(sequenceElements.size()); + for (Iterator i = sequenceElements.iterator(); i.hasNext(); ) { + Element sequenceElement = (Element) i.next(); + animations.put(XMLUtil.getString(sequenceElement, "name"), loadMeshAnimation(sequenceElement)); } return animations; } Index: XMLUtil.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders/XMLUtil.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XMLUtil.java 21 Apr 2004 19:46:02 -0000 1.1 +++ XMLUtil.java 22 Apr 2004 13:57:48 -0000 1.2 @@ -45,6 +45,28 @@ final class XMLUtil { /** + * Get a single child element + * @param child + * @return the single child element, or null + * @throws Exception if the child is present multiple times + */ + public static Element getChild(Element element, String child) throws Exception { + NodeList nodes = element.getChildNodes(); + Element ret = null; + for (int i = 0; i < nodes.getLength(); i ++) { + Node childNode = (Node) nodes.item(i); + if (childNode.getNodeName().equals(child) && childNode.getNodeType() == Node.ELEMENT_NODE) { + if (ret != null) { + throw new Exception("Child element '"+child+"' present multiple times"); + } else { + ret = (Element) childNode; + } + } + } + return ret; + } + + /** * @param name The name of the child elements you want * @return a List of child Elements */ |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 20:47:25
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/renderer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11671/src/java/org/lwjgl/util/model/renderer Added Files: FrameProcessor.java Sprite3D.java ModelRenderer.java AnimationEventListener.java Removed Files: Renderer.java Log Message: Rendery stuff --- NEW FILE: FrameProcessor.java --- /* * 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 org.lwjgl.util.Renderable; import org.lwjgl.util.model.Frame; import org.lwjgl.util.model.Model; /** * $Id: FrameProcessor.java,v 1.1 2004/04/21 20:47:06 cix_foo Exp $ * The interface for processing individual frames of rendered models. * Typically the processor will process the frame of animation, and store * the processed results in some data structure that make it easy to render. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface FrameProcessor extends Renderable { /** * Process a frame. * @param model The model * @param frame The frame to process */ public void process(Model model, Frame frame); } --- NEW FILE: ModelRenderer.java --- /* * 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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.lwjgl.util.Renderable; import org.lwjgl.util.Timer; import org.lwjgl.util.model.Frame; import org.lwjgl.util.model.Model; /** * $Id: ModelRenderer.java,v 1.1 2004/04/21 20:47:08 cix_foo Exp $ * * Pluggable model renderer * <p> * 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. * <p> * To animate things, you will need to call Timer.tick() every frame to update the timers in your * Renderables. Then they'll just animate themselves. Hurrah! * * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class ModelRenderer implements Renderable { /** Material map: String name->Renderable */ private static final Map materials = new HashMap(); /** The model we're rendering */ private Model model; /** The frame processor */ private FrameProcessor processor; /** Animation event listeners */ private List listeners; /** The current material */ private Renderable material; /** The animation currently being animated */ private Frame[] frame; /** The current time */ private final Timer timer = new Timer(); /** Last frame rendered */ private Frame currentFrame; /** Visibility */ private boolean visible = true; /** * C'tor */ public ModelRenderer() { } /** * @param model The model to set. */ public void setModel(Model model) { if (this.model == model) { return; } this.model = model; material = (Renderable) materials.get(model.getMaterial()); frame = null; } /** * @return the Model we're rendering with this Renderer */ public Model getModel() { return model; } /** * Set the animation * @param animation */ public void setAnimation(String animation) { if (model == null) { return; } frame = model.getAnimation(animation); timer.reset(); } /** * Update the model */ public void update() { // Don't do anything if there's no model or no animation or no processor if (model == null || frame == null || processor == null) { return; } // Work out what frame to show Frame frame = findFrame(); if (frame != currentFrame) { currentFrame = frame; processFrame(); if (currentFrame.getAction() != null) { fireAnimationEvent(currentFrame.getAction()); } } } /** * Render things */ public void render() { // Don't do anything if there's no model or no animation or no processor if (model == null || frame == null || processor == null || !visible) { return; } // Set up GL state from the Model's material if (material != null) { material.render(); } // Render the current frame renderFrame(); } /** * Find the nearest frame to the current time * @return the Frame nearest the current time */ private Frame findFrame() { float time = timer.getTime(); // Use a binary search to find the frame int i = 0; for (int j = frame.length - 1; i <= j;) { int k = i + j >> 1; Frame f = frame[k]; if (f.getTime() == time) { return f; } else if (f.getTime() < time) { i = k + 1; } else { j = k - 1; } } return frame[i + 1]; } /** * Process the current frame of animation */ protected void processFrame() { processor.process(model, currentFrame); } /** * Render the current frame */ protected void renderFrame() { processor.render(); } /** * Add a material * * @param name * The material's name * @param renderable * The renderable object */ public static void putMaterial(String name, Renderable renderable) { materials.put(name, renderable); } /** * Remove a material * @param name The material's name * @return a Renderable */ public static Renderable removeMaterial(String name) { return (Renderable) materials.remove(name); } /** * Determine if this Renderer is visible * @return boolean */ public boolean isVisible() { return visible; } /** * Sets the visibility of this Renderer * @param visible */ public void setVisible(boolean visible) { this.visible = visible; } /** * Determines if the animation is paused * @return boolean */ public boolean isPaused() { return timer.isPaused(); } /** * Pause the animation */ public void pause() { timer.pause(); } /** * Rewind the animation */ public void rewind() { timer.reset(); } /** * Resume a paused animation */ public void resume() { timer.resume(); } /** * @return Returns the processor. */ public FrameProcessor getProcessor() { return processor; } /** * Sets the processor. The processor is the clever bit that actually does the * vertex twiddling and rendering. * @param processor The processor to set. */ public void setProcessor(FrameProcessor processor) { this.processor = processor; } /** * Add an animation listener * @param listener */ public void addAnimationEventListener(AnimationEventListener listener) { if (listeners == null) { listeners = new ArrayList(1); } listeners.remove(listener); listeners.add(listener); } /** * Remove an animation listener * @param listener */ public void removeAnimationEventListener(AnimationEventListener listener) { if (listeners == null) { return; } listeners.remove(listener); if (listeners.size() == 0) { listeners = null; } } /** * Fire an animation event * @param action */ protected void fireAnimationEvent(String action) { if (listeners == null) { return; } int n = listeners.size(); for (int i = 0; i < n; i ++) { AnimationEventListener listener = (AnimationEventListener) listeners.get(i); listener.receiveAnimationEvent(this, action); } } } --- NEW FILE: AnimationEventListener.java --- /* * 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: AnimationEventListener.java,v 1.1 2004/04/21 20:47:08 cix_foo Exp $ * Listens out for events that occur in animations and takes appropriate actions * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface AnimationEventListener { /** * Fired when a frame with an action associated with it is rendered * @param src The source Renderer * @param action The action */ public void receiveAnimationEvent(ModelRenderer src, String action); } --- Renderer.java DELETED --- --- NEW FILE: Sprite3D.java --- /* * 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 org.lwjgl.opengl.GL11; import org.lwjgl.util.vector.Vector3f; /** * $Id: Sprite3D.java,v 1.1 2004/04/21 20:47:08 cix_foo Exp $ * A 3D sprite! * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class Sprite3D extends ModelRenderer { /** Current position */ private final Vector3f position = new Vector3f(); /** Current orientation (axis/angle) */ private final Vector3f axis = new Vector3f(); private float angle; /* * Recognised animation actions */ private static final String ANIM_HIDE = "hide"; private static final String ANIM_REWIND = "rewind"; private static final String ANIM_GOTO = "goto "; /** * C'tor */ public Sprite3D() { addAnimationEventListener(new AnimationEventListener() { public void receiveAnimationEvent(ModelRenderer src, String action) { if (action.equals(ANIM_HIDE)) { setVisible(false); } else if (action.equals(ANIM_REWIND)) { rewind(); } else if (action.startsWith(ANIM_GOTO)) { setAnimation(action.substring(ANIM_GOTO.length())); } } }); } /* (non-Javadoc) * @see org.lwjgl.util.model.renderer.ModelRenderer#renderFrame() */ protected void renderFrame() { // TODO: rotation GL11.glPushMatrix(); GL11.glTranslatef(position.getX(), position.getY(), position.getY()); super.renderFrame(); GL11.glPopMatrix(); } /** * @return Returns the position. */ public Vector3f getPosition() { return position; } } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:46:44
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31757/src/java/org/lwjgl/util/model Modified Files: MeshedModel.java Frame.java MeshFrame.java BoneFrame.java BonedModel.java Model.java Log Message: more utils Index: Frame.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Frame.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Frame.java 20 Apr 2004 20:39:50 -0000 1.4 +++ Frame.java 21 Apr 2004 19:45:42 -0000 1.5 @@ -39,19 +39,24 @@ * @author $Author$ * @version $Revision$ */ -public abstract class Frame implements Serializable { +public abstract class Frame implements Serializable, Comparable { public static final long serialVersionUID = 1L; /** Frame time */ private final float time; + /** User-defined action to occur after this frame has been used. May be null */ + private final String action; + /** * C'tor * @param time + * @param action */ - public Frame(float time) { + public Frame(float time, String action) { this.time = time; + this.action = action; } /** @@ -60,4 +65,35 @@ public final float getTime() { return time; } + + /* (non-Javadoc) + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + public int compareTo(Object o) { + if (o == null) { + return 0; + } + if (! (o instanceof Frame)) { + return 0; + } + Frame f = (Frame) o; + if (f.time == time) { + return 0; + } else if (f.time > time) { + return 1; + } else { + return -1; + } + } + + /** + * Gets the user-defined animation action. This can be processed by whatever + * is animating the model to perform some special action after the frame is + * used. For example, you could use "stop" to stop the animation, or "rewind" + * to repeat the animation ad infinitum. + * @return String, or null, for no action + */ + public final String getAction() { + return action; + } } Index: MeshedModel.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/MeshedModel.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- MeshedModel.java 21 Apr 2004 18:11:00 -0000 1.2 +++ MeshedModel.java 21 Apr 2004 19:45:39 -0000 1.3 @@ -61,8 +61,8 @@ * @param color[] * @param animation */ - public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { - super(material, triangle, skin, color, animation); + public MeshedModel(String name, String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { + super(name, material, triangle, skin, color, animation); } } Index: MeshFrame.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/MeshFrame.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- MeshFrame.java 20 Apr 2004 20:39:49 -0000 1.1 +++ MeshFrame.java 21 Apr 2004 19:45:43 -0000 1.2 @@ -48,10 +48,11 @@ /** * C'tor * @param time + * @param action * @param bone[] */ - public MeshFrame(float time, Vertex[] vertex) { - super(time); + public MeshFrame(float time, String action, Vertex[] vertex) { + super(time, action); this.vertex = vertex; } Index: Model.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Model.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Model.java 21 Apr 2004 18:11:00 -0000 1.5 +++ Model.java 21 Apr 2004 19:45:49 -0000 1.6 @@ -52,6 +52,9 @@ public static final long serialVersionUID = 1L; + /** Model name */ + private final String name; + /** Material */ private final String material; @@ -69,13 +72,15 @@ /** * C'tor + * @param name * @param material * @param triangle * @param skin[] * @param color[] * @param animation */ - public Model(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { + public Model(String name, String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { + this.name = name; this.material = material; this.triangle = triangle; this.skin = skin; @@ -88,8 +93,8 @@ * @param name The name of the animation * @return the Frames of an animation (or null, if no such animation exists) */ - public final BoneFrame[] getAnimation(String name) { - return (BoneFrame[]) animation.get(name); + public final Frame[] getAnimation(String name) { + return (Frame[]) animation.get(name); } /** @@ -120,5 +125,17 @@ return color; } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString() { + return "Model["+name+"]"; + } + /** + * @return Returns the name. + */ + public final String getName() { + return name; + } } Index: BonedModel.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/BonedModel.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- BonedModel.java 21 Apr 2004 18:11:00 -0000 1.2 +++ BonedModel.java 21 Apr 2004 19:45:48 -0000 1.3 @@ -65,8 +65,8 @@ * @param animation * @param vertex */ - public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation, BonedVertex[] vertex) { - super(material, triangle, skin, color, animation); + public BonedModel(String name, String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation, BonedVertex[] vertex) { + super(name, material, triangle, skin, color, animation); this.vertex = vertex; } Index: BoneFrame.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/BoneFrame.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- BoneFrame.java 20 Apr 2004 20:39:50 -0000 1.1 +++ BoneFrame.java 21 Apr 2004 19:45:48 -0000 1.2 @@ -49,10 +49,11 @@ /** * C'tor * @param time + * @param action * @param bone[] */ - public BoneFrame(float time, Matrix4f[] bone) { - super(time); + public BoneFrame(float time, String action, Matrix4f[] bone) { + super(time, action); this.bone = bone; } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:46:44
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/renderer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31757/src/java/org/lwjgl/util/model/renderer Modified Files: Renderer.java Removed Files: Renderable.java Log Message: more utils --- Renderable.java DELETED --- Index: Renderer.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/renderer/Renderer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Renderer.java 20 Apr 2004 20:39:52 -0000 1.4 +++ Renderer.java 21 Apr 2004 19:45:25 -0000 1.5 @@ -31,11 +31,15 @@ */ package org.lwjgl.util.model.renderer; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.lwjgl.util.model.BoneFrame; -import org.lwjgl.util.model.BonedModel; +import org.lwjgl.util.Renderable; +import org.lwjgl.util.Timer; +import org.lwjgl.util.model.Frame; +import org.lwjgl.util.model.Model; /** * $Id$ @@ -46,14 +50,35 @@ * 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. + * <p> + * To animate things, you will need to call Timer.tick() every frame to update the timers in your + * Renderables. Then they'll just animate themselves. Hurrah! * * @author $Author$ * @version $Revision$ */ -public class Renderer { +public class Renderer implements Renderable { /** Material map: String name->Renderable */ - private final Map materials = new HashMap(); + private static final Map materials = new HashMap(); + + /** The model we're rendering */ + private Model model; + + /** The current material */ + private Renderable material; + + /** The animation currently being animated */ + private Frame[] frame; + + /** The current time */ + private final Timer timer = new Timer(); + + /** Last frame rendered */ + private Frame lastFrame; + + /** Visibility */ + private boolean visible; /** * C'tor @@ -62,36 +87,135 @@ } /** + * @param model The model to set. + */ + public void setModel(Model model) { + if (this.model == model) { + return; + } + this.model = model; + material = (Renderable) materials.get(model.getMaterial()); + frame = null; + } + + /** + * @return the Model we're rendering with this Renderer + */ + public Model getModel() { + return model; + } + + /** + * Set the animation + * @param animation + */ + public void setAnimation(String animation) { + if (model == null) { + return; + } + frame = model.getAnimation(animation); + timer.reset(); + lastFrame = null; + } + + /** * 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(BonedModel model, String animation, float time) { + public void render() { + + // Don't do anything if there's no model or no animation + if (model == null || frame == null) { + return; + } // 1. Set up GL state from the Model's material - Renderable material = (Renderable) materials.get(model.getMaterial()); if (material != null) { material.render(); } - // 2. Get the animation - BoneFrame[] frame = model.getAnimation(animation); - if (frame == null) { - return; + // 2. Work out what frame to show + Frame frame = findFrame(); + if (frame != lastFrame) { + lastFrame = frame; + processFrame(); } - // 3. Work out what the nearest frame is to the specified time + // 3. Render the processed frame } /** + * Find the nearest frame to the current time + * @return the Frame nearest the current time + */ + private Frame findFrame() { + float time = timer.getTime(); + + // Use a binary search to find the frame + int a = 0, b = + } + + /** * Add a material * @param name The material's name * @param renderable The renderable object */ - public void putMaterial(String name, Renderable renderable) { + public static void putMaterial(String name, Renderable renderable) { materials.put(name, renderable); } + /** + * Remove a material + * @param name The material's name + * @return a Renderable + */ + public static Renderable removeMaterial(String name) { + return (Renderable) materials.remove(name); + } + + /** + * Determine if this Renderer is visible + * @return boolean + */ + public boolean isVisible() { + return visible; + } + + /** + * Sets the visibility of this Renderer + * @param visible + */ + public void setVisible(boolean visible) { + this.visible = visible; + } + + /** + * Determines if the animation is paused + * @return boolean + */ + public boolean isPaused() { + return timer.isPaused(); + } + + /** + * Pause the animation + */ + public void pause() { + timer.pause(); + } + + /** + * Rewind the animation + */ + public void rewind() { + timer.reset(); + } + + /** + * Resume a paused animation + */ + public void resume() { + timer.resume(); + } + } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:46:14
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31757/src/java/org/lwjgl/util Added Files: Renderable.java Timer.java Log Message: more utils --- NEW FILE: Renderable.java --- /* * 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; /** * $Id: Renderable.java,v 1.1 2004/04/21 19:46:03 cix_foo Exp $ * * Simple interface to things that can be Rendered. * * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface Renderable { /** * "Render" this thing. This will involve calls to the GL. */ public void render(); } --- NEW FILE: Timer.java --- /* * Copyright (c) 2002 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; import org.lwjgl.Sys; /** * $Id: Timer.java,v 1.1 2004/04/21 19:46:04 cix_foo Exp $ * * A hires timer. This measures time in seconds as floating point values. * All Timers created are updated simultaneously by calling the static method * tick(). This ensures that within a single iteration of a game loop that * all timers are updated consistently with each other. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ public class Timer { // Record the timer resolution on classload private static final long resolution = Sys.getTimerResolution(); // Globally keeps track of time for all instances of Timer private static long currentTime; // When the timer was started private long startTime; // The last time recorded by getTime() private long lastTime; // Whether the timer is paused private boolean paused; /** * Constructs a timer. The timer will be reset to 0.0 and resumed immediately. */ public Timer() { reset(); resume(); } /** * @return the time in seconds, as a float */ public float getTime() { if (!paused) lastTime = currentTime - startTime; return (float) ((double) lastTime / (double) resolution); } /** * @return whether this timer is paused */ public boolean isPaused() { return paused; } /** * Pause the timer. Whilst paused the time will not change for this timer * when tick() is called. * * @see #resume() */ public void pause() { paused = true; } /** * Reset the timer. Equivalent to set(0.0f); * @see #set() */ public void reset() { set(0.0f); } /** * Resume the timer. * @see #pause() */ public void resume() { paused = false; startTime = currentTime - lastTime; } /** * Set the time of this timer * @param newTime the new time, in seconds */ public void set(float newTime) { long newTimeInTicks = (long) ((double) newTime * (double) resolution); startTime = currentTime - newTimeInTicks; lastTime = newTimeInTicks; } /** * Get the next time update from the system's hires timer. This method should * be called once per main loop iteration; all timers are updated simultaneously * from it. */ public static void tick() { currentTime = Sys.getTime(); } /** * Debug output. */ public String toString() { return "Timer[Time=" + getTime() + ", Paused=" + paused + "]"; } } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:46:12
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31757/src/java/org/lwjgl/util/model/loaders Added Files: XMLLoader.java XMLUtil.java Log Message: more utils --- NEW FILE: XMLLoader.java --- /* * 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.loaders; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.lwjgl.util.Color; import org.lwjgl.util.model.*; import org.lwjgl.util.model.BoneFrame; import org.lwjgl.util.model.BonedModel; import org.lwjgl.util.model.BonedVertex; import org.lwjgl.util.model.MeshedModel; import org.lwjgl.util.model.Triangle; import org.lwjgl.util.model.Vertex; import org.lwjgl.util.model.Weight; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * $Id: XMLLoader.java,v 1.1 2004/04/21 19:46:02 cix_foo Exp $ * * Loads a Model from an XML document. Construct with an XML Document as the argument, * and then retrieve the Model by calling load(). * * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class XMLLoader { /** The source document */ private final Document src; /** Expected number of vertices */ private int numVertices; /** Expected number of bones */ private int numBones; /** * C'tor */ public XMLLoader(Document src) { this.src = src; } /** * Load the model from the XML document and return it. * @return Model * @throws Exception */ public Model load() throws Exception { String name = XMLUtil.getString(src.getDocumentElement(), "name"); String material = XMLUtil.getString(src.getDocumentElement(), "material"); numVertices = XMLUtil.getInt(src.getDocumentElement(), "vertices"); if (XMLUtil.getString(src.getDocumentElement(), "type").equals("boned")) { // It's a boned model numBones = XMLUtil.getInt(src.getDocumentElement(), "bones", 0); return new BonedModel( name, material, loadTriangles(), loadSkin(), loadColor(), loadBoneAnimations(), loadBonedVertices() ); } else if (XMLUtil.getString(src.getDocumentElement(), "type").equals("meshed")) { // It's a mesh keyframe model return new MeshedModel( name, material, loadTriangles(), loadSkin(), loadColor(), loadMeshAnimations() ); } else { throw new Exception("Unsupported model type."); } } /** * Load all the BonedVertices * @return Vertex[] * @throws Exception */ private BonedVertex[] loadBonedVertices() throws Exception { List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex"); if (vertexElements.size() != numVertices) { throw new Exception("Vertex count incorrect, got "+vertexElements.size()+", expected "+numVertices); } BonedVertex[] vertices = new BonedVertex[vertexElements.size()]; int vertexCount = 0; for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { Element vertexElement = (Element) i.next(); vertices[vertexCount++] = loadBonedVertex(vertexElement); } return vertices; } /** * Load the skin * @return Vector2f[] * @throws Exception */ private Vector2f[] loadSkin() throws Exception { List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin"); if (skinElements.size() == 0) { return null; } if (skinElements.size() != numVertices) { throw new Exception("Skin count incorrect, got "+skinElements.size()+", expected "+numVertices); } Vector2f[] skins = new Vector2f[skinElements.size()]; int skinCount = 0; for (Iterator i = skinElements.iterator(); i.hasNext(); ) { Element skinElement = (Element) i.next(); skins[skinCount++] = loadTexCoord(skinElement); } return skins; } /** * Load the colour * @return Color[] * @throws Exception */ private Color[] loadColor() throws Exception { List colorElements = XMLUtil.getChildren(src.getDocumentElement(), "color"); if (colorElements.size() == 0) { return null; } if (colorElements.size() != numVertices) { throw new Exception("Color count incorrect, got "+colorElements.size()+", expected "+numVertices); } Color[] colors = new Color[colorElements.size()]; int colorCount = 0; for (Iterator i = colorElements.iterator(); i.hasNext(); ) { Element colorElement = (Element) i.next(); colors[colorCount++] = loadColor(colorElement); } return colors; } /** * Load all the Triangles * @return Triangle[] * @throws Exception */ private Triangle[] loadTriangles() throws Exception { List triangleElements = XMLUtil.getChildren(src.getDocumentElement(), "triangle"); Triangle[] triangles = new Triangle[triangleElements.size()]; int triangleCount = 0; for (Iterator i = triangleElements.iterator(); i.hasNext(); ) { Element triangleElement = (Element) i.next(); triangles[triangleCount++] = loadTriangle(triangleElement); } return triangles; } /** * Load all the bone animations * @return Map of animation names to BoneFrame[] animations * @throws Exception */ private Map loadBoneAnimations() throws Exception { List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); Map animations = new HashMap(animationElements.size()); for (Iterator i = animationElements.iterator(); i.hasNext(); ) { Element animationElement = (Element) i.next(); animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement)); } return animations; } /** * Load all the mesh keyframe animations * @return Map of animation names to MeshFrame[] animations * @throws Exception */ private Map loadMeshAnimations() throws Exception { List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); Map animations = new HashMap(animationElements.size()); for (Iterator i = animationElements.iterator(); i.hasNext(); ) { Element animationElement = (Element) i.next(); animations.put(XMLUtil.getString(animationElement, "name"), loadMeshAnimation(animationElement)); } return animations; } /** * Load a Vertex from XML * @param vertexElement * @return a Vertex * @throws Exception */ private BonedVertex loadBonedVertex(Element vertexElement) throws Exception { List weightElements = XMLUtil.getChildren(vertexElement, "weight"); Weight[] weights; if (weightElements.size() == 0) { weights = null; } else { weights = new Weight[weightElements.size()]; int weightCount = 0; for (Iterator i = weightElements.iterator(); i.hasNext(); ) { Element weightElement = (Element) i.next(); weights[weightCount++] = loadWeight(weightElement); } } return new BonedVertex( new Vector3f( XMLUtil.getFloat(vertexElement, "x"), XMLUtil.getFloat(vertexElement, "y"), XMLUtil.getFloat(vertexElement, "z") ), XMLUtil.hasAttribute(vertexElement, "nx") ? new Vector3f( XMLUtil.getFloat(vertexElement, "nx"), XMLUtil.getFloat(vertexElement, "ny"), XMLUtil.getFloat(vertexElement, "nz") ) : null, weights ); } /** * Load a Vertex from XML * @param vertexElement * @return a Vertex * @throws Exception */ private Vertex loadMeshVertex(Element vertexElement) throws Exception { return new Vertex( new Vector3f( XMLUtil.getFloat(vertexElement, "x"), XMLUtil.getFloat(vertexElement, "y"), XMLUtil.getFloat(vertexElement, "z") ), XMLUtil.hasAttribute(vertexElement, "nx") ? new Vector3f( XMLUtil.getFloat(vertexElement, "nx"), XMLUtil.getFloat(vertexElement, "ny"), XMLUtil.getFloat(vertexElement, "nz") ) : null ); } /** * Load a Weight from XML * @param element * @return a Skin * @throws Exception */ private Weight loadWeight(Element element) throws Exception { int bone = XMLUtil.getInt(element, "bone"); if (bone < 0 || bone >= numBones) { throw new Exception("Bone index out of range"); } return new Weight( bone, XMLUtil.getFloat(element, "weight") ); } /** * Load a Triangle from XML * @param element * @param numVertices * @return a Triangle * @throws Exception */ private Triangle loadTriangle(Element element) throws Exception { // Perform sanity checks int a = XMLUtil.getInt(element, "a"); if (a < 0 || a >= numVertices) { throw new Exception("'a' is out of range"); } int b = XMLUtil.getInt(element, "b"); if (b < 0 || b >= numVertices) { throw new Exception("'b' is out of range"); } int c = XMLUtil.getInt(element, "c"); if (c < 0 || c >= numVertices) { throw new Exception("'c' is out of range"); } if (a == b || a == c || b == c) { throw new Exception("Degenerate triangle"); } return new Triangle( a, b, c, XMLUtil.getInt(element, "adjacency", 0) ); } /** * Load a texture coordinate from XML * @param element * @return a Vector2f * @throws Exception */ private Vector2f loadTexCoord(Element element) throws Exception { return new Vector2f( XMLUtil.getFloat(element, "u"), XMLUtil.getFloat(element, "v") ); } /** * Load a colour from XML * @param element * @return a Color * @throws Exception */ private Color loadColor(Element element) throws Exception { return new Color( XMLUtil.getInt(element, "r"), XMLUtil.getInt(element, "g"), XMLUtil.getInt(element, "b"), XMLUtil.getInt(element, "a", 255) ); } /** * Load a boned Animation from XML * @param element * @return BoneFrame[] * @throws Exception */ private BoneFrame[] loadBonedAnimation(Element element) throws Exception { List frameElements = XMLUtil.getChildren(element, "frame"); BoneFrame[] frames = new BoneFrame[frameElements.size()]; int frameCount = 0; for (Iterator i = frameElements.iterator(); i.hasNext(); ) { Element frameElement = (Element) i.next(); frames[frameCount++] = loadBoneFrame(frameElement); } Arrays.sort(frames); return frames; } /** * Load a mesh Animation from XML * @param element * @return MeshFrame[] * @throws Exception */ private MeshFrame[] loadMeshAnimation(Element element) throws Exception { List frameElements = XMLUtil.getChildren(element, "frame"); MeshFrame[] frames = new MeshFrame[frameElements.size()]; int frameCount = 0; for (Iterator i = frameElements.iterator(); i.hasNext(); ) { Element frameElement = (Element) i.next(); frames[frameCount++] = loadMeshFrame(frameElement); } Arrays.sort(frames); return frames; } /** * Load a Frame from XML * @param element * @return BoneFrame * @throws Exception */ private BoneFrame loadBoneFrame(Element element) throws Exception { List boneElements = XMLUtil.getChildren(element, "bone"); if (boneElements.size() != numBones) { throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size()); } Matrix4f[] bones = new Matrix4f[boneElements.size()]; int boneCount = 0; for (Iterator i = boneElements.iterator(); i.hasNext(); ) { Element boneElement = (Element) i.next(); bones[boneCount++] = loadBone(boneElement); } return new BoneFrame( XMLUtil.getFloat(element, "time"), XMLUtil.getString(element, "action", null), bones ); } /** * Load a Frame from XML * @param element * @return MeshFrame * @throws Exception */ private MeshFrame loadMeshFrame(Element element) throws Exception { List vertexElements = XMLUtil.getChildren(element, "vertex"); Vertex[] vertices = new Vertex[vertexElements.size()]; if (vertices.length != numVertices) { throw new Exception("Vertex count incorrect"); } int vertexCount = 0; for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { Element vertexElement = (Element) i.next(); vertices[vertexCount++] = loadMeshVertex(vertexElement); } return new MeshFrame( XMLUtil.getFloat(element, "time"), XMLUtil.getString(element, "action", null), vertices ); } /** * Load a Bone from XML * @param element * @return a Matrix4f * @throws Exception */ private Matrix4f loadBone(Element element) throws Exception { Matrix4f ret = new Matrix4f(); ret.m00 = XMLUtil.getFloat(element, "m00"); ret.m01 = XMLUtil.getFloat(element, "m01"); ret.m02 = XMLUtil.getFloat(element, "m02"); ret.m03 = XMLUtil.getFloat(element, "m03"); ret.m10 = XMLUtil.getFloat(element, "m10"); ret.m11 = XMLUtil.getFloat(element, "m11"); ret.m12 = XMLUtil.getFloat(element, "m12"); ret.m13 = XMLUtil.getFloat(element, "m13"); ret.m20 = XMLUtil.getFloat(element, "m20"); ret.m21 = XMLUtil.getFloat(element, "m21"); ret.m22 = XMLUtil.getFloat(element, "m22"); ret.m23 = XMLUtil.getFloat(element, "m23"); ret.m30 = XMLUtil.getFloat(element, "m30", 0.0f); ret.m31 = XMLUtil.getFloat(element, "m31", 0.0f); ret.m32 = XMLUtil.getFloat(element, "m32", 0.0f); ret.m33 = XMLUtil.getFloat(element, "m33", 1.0f); return ret; } } --- NEW FILE: XMLUtil.java --- /* * 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.loaders; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Some simple XML utilities * @author cas */ final class XMLUtil { /** * @param name The name of the child elements you want * @return a List of child Elements */ static List getChildren(Element element, String name) throws Exception { NodeList nodes = element.getChildNodes(); ArrayList ret = new ArrayList(nodes.getLength()); for (int i = 0; i < nodes.getLength(); i ++) { Node childNode = (Node) nodes.item(i); if (childNode.getNodeName().equals(name) && childNode.getNodeType() == Node.ELEMENT_NODE) { ret.add(childNode); } } return ret; } /** * A convenience method for getting float values out of XML elements * @param attribute The name of the attribute * @throws NumberFormatException If the supplied attribute is not a number * @throws Exception if the value is missing * @return the parsed float value */ static float getFloat(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return Float.parseFloat(s); } /** * A convenience method for getting float values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @throws NumberFormatException If the supplied attribute is not a number * @return the parsed float value */ static float getFloat(Element element, String attribute, float defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return Float.parseFloat(s); } /** * A convenience method for getting integer values out of XML elements * @param attribute The name of the attribute * @throws NumberFormatException If the supplied attribute is not a number * @throws Exception if the value is missing * @return the parsed integer value */ static int getInt(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return Integer.parseInt(s); } /** * A convenience method for getting integer values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @throws NumberFormatException If the supplied attribute is not a number * @return the parsed integer value */ static int getInt(Element element, String attribute, int defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return Integer.parseInt(s); } /** * A convenience method for getting string values out of XML elements * @param attribute The name of the attribute * @return the string value, which will not be null * @throws Exception the value is not specified */ static String getString(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return s; } /** * A convenience method for getting string values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @return the string value, which will not be null */ static String getString(Element element, String attribute, String defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return s; } /** * @return true if the specified attribute is present and not empty or null in the element */ static boolean hasAttribute(Element element, String attribute) { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return false; else return true; } } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:45:52
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31757/src/java/org/lwjgl/util/model/loader Removed Files: XMLUtil.java Loader.java Log Message: more utils --- Loader.java DELETED --- --- XMLUtil.java DELETED --- |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 19:44:44
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31693/src/java/org/lwjgl/util/model/loaders Log Message: Directory /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loaders added to the repository |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 18:11:51
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11765/src/java/org/lwjgl/util/model Modified Files: MeshedModel.java BonedModel.java Model.java Log Message: Tons more utils! Index: Model.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Model.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Model.java 20 Apr 2004 20:39:50 -0000 1.4 +++ Model.java 21 Apr 2004 18:11:00 -0000 1.5 @@ -35,6 +35,7 @@ import java.io.Serializable; import java.util.Map; +import org.lwjgl.util.Color; import org.lwjgl.util.vector.Vector2f; @@ -60,6 +61,9 @@ /** Skin */ private final Vector2f[] skin; + /** Colour */ + private final Color[] color; + /** The animations: a Map of string names to Frame[] arrays */ private final Map animation; @@ -68,12 +72,14 @@ * @param material * @param triangle * @param skin[] + * @param color[] * @param animation */ - public Model(String material, Triangle[] triangle, Vector2f[] skin, Map animation) { + public Model(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { this.material = material; this.triangle = triangle; this.skin = skin; + this.color = color; this.animation = animation; } @@ -107,4 +113,12 @@ return skin; } + /** + * @return Returns the color + */ + public final Color[] getColor() { + return color; + } + + } Index: BonedModel.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/BonedModel.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- BonedModel.java 20 Apr 2004 20:39:50 -0000 1.1 +++ BonedModel.java 21 Apr 2004 18:11:00 -0000 1.2 @@ -34,6 +34,7 @@ import java.util.Map; +import org.lwjgl.util.Color; import org.lwjgl.util.vector.Vector2f; @@ -60,11 +61,12 @@ * @param material * @param triangle * @param skin[] + * @param color[] * @param animation * @param vertex */ - public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation, BonedVertex[] vertex) { - super(material, triangle, skin, animation); + public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation, BonedVertex[] vertex) { + super(material, triangle, skin, color, animation); this.vertex = vertex; } Index: MeshedModel.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/MeshedModel.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- MeshedModel.java 20 Apr 2004 20:39:47 -0000 1.1 +++ MeshedModel.java 21 Apr 2004 18:11:00 -0000 1.2 @@ -34,6 +34,7 @@ import java.util.Map; +import org.lwjgl.util.Color; import org.lwjgl.util.vector.Vector2f; @@ -57,10 +58,11 @@ * @param material * @param triangle * @param skin[] + * @param color[] * @param animation */ - public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation) { - super(material, triangle, skin, animation); + public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) { + super(material, triangle, skin, color, animation); } } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 18:11:16
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11765/src/java/org/lwjgl/util Added Files: Point.java ReadableRectangle.java WritablePoint.java Display.java ReadableColor.java ReadablePoint.java WritableDimension.java Color.java ReadableDimension.java Rectangle.java Dimension.java WritableColor.java WritableRectangle.java Log Message: Tons more utils! --- NEW FILE: ReadableRectangle.java --- /* * 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; /** * $Id: ReadableRectangle.java,v 1.1 2004/04/21 18:10:56 cix_foo Exp $ * Readonly interface for Rectangles * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface ReadableRectangle extends ReadableDimension, ReadablePoint { /** * Copy this readable rectangle's bounds into a destination Rectangle * @param dest The destination Rectangle, or null, to create a new Rectangle */ public void getBounds(WritableRectangle dest); } --- NEW FILE: WritableDimension.java --- /* * 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; /** * $Id: WritableDimension.java,v 1.1 2004/04/21 18:10:59 cix_foo Exp $ * Write interface for Dimensions * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface WritableDimension { public void setSize(int w, int h); public void setSize(ReadableDimension d); /** * Sets the height. * @param height The height to set */ public void setHeight(int height); /** * Sets the width. * @param width The width to set */ public void setWidth(int width); } --- NEW FILE: ReadablePoint.java --- /* * 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; /** * $Id: ReadablePoint.java,v 1.1 2004/04/21 18:10:59 cix_foo Exp $ * Readonly interface for Points * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface ReadablePoint { /** * @return int */ public int getX(); /** * @return int */ public int getY(); /** * Copy this ReadablePoint into a destination Point * @param dest The destination Point, or null, to create a new Point */ public void getLocation(WritablePoint dest); } --- NEW FILE: Color.java --- /* * Copyright (c) 2002 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; import java.io.Serializable; import java.nio.ByteBuffer; /** * $Id: Color.java,v 1.1 2004/04/21 18:10:59 cix_foo Exp $ * A mutable Color class * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public final class Color implements ReadableColor, Serializable, WritableColor { static final long serialVersionUID = 1L; /** Color components, publicly accessible */ private byte red, green, blue, alpha; /** * Constructor for Color. */ public Color() { this(0, 0, 0, 255); } /** * Constructor for Color. Alpha defaults to 255. */ public Color(int r, int g, int b) { this(r, g, b, 255); } /** * Constructor for Color. Alpha defaults to 255. */ public Color(byte r, byte g, byte b) { this(r, g, b, (byte) 255); } /** * Constructor for Color. */ public Color(int r, int g, int b, int a) { set(r, g, b, a); } /** * Constructor for Color. */ public Color(byte r, byte g, byte b, byte a) { set(r, g, b, a); } /** * Constructor for Color */ public Color(ReadableColor c) { setColor(c); } /** * Set a color */ public void set(int r, int g, int b, int a) { red = (byte) r; green = (byte) g; blue = (byte) b; alpha = (byte) a; } /** * Set a color */ public void set(byte r, byte g, byte b, byte a) { this.red = r; this.green = g; this.blue = b; this.alpha = a; } /** * Set a color */ public void set(int r, int g, int b) { set(r, g, b, 255); } /** * Set a color */ public void set(byte r, byte g, byte b) { set(r, g, b, (byte) 255); } /** * Accessor */ public int getRed() { return red & 0xFF; } /** * Accessor */ public int getGreen() { return green & 0xFF; } /** * Accessor */ public int getBlue() { return blue & 0xFF; } /** * Accessor */ public int getAlpha() { return alpha & 0xFF; } /** * Set the Red component */ public void setRed(int red) { this.red = (byte) red; } /** * Set the Green component */ public void setGreen(int green) { this.green = (byte) green; } /** * Set the Blue component */ public void setBlue(int blue) { this.blue = (byte) blue; } /** * Set the Alpha component */ public void setAlpha(int alpha) { this.alpha = (byte) alpha; } /** * Set the Red component */ public void setRed(byte red) { this.red = red; } /** * Set the Green component */ public void setGreen(byte green) { this.green = green; } /** * Set the Blue component */ public void setBlue(byte blue) { this.blue = blue; } /** * Set the Alpha component */ public void setAlpha(byte alpha) { this.alpha = alpha; } /** * Stringify */ public String toString() { return "Color [" + getRed() + ", " + getGreen() + ", " + getBlue() + ", " + getAlpha() + "]"; } /** * Equals */ public boolean equals(Object o) { return (o != null) && (o instanceof ReadableColor) && (((ReadableColor) o).getRed() == this.getRed()) && (((ReadableColor) o).getGreen() == this.getGreen()) && (((ReadableColor) o).getBlue() == this.getBlue()) && (((ReadableColor) o).getAlpha() == this.getAlpha()); } /** * Hashcode */ public int hashCode() { return (red << 24) | (green << 16) | (blue << 8) | alpha; } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#getAlphaByte() */ public byte getAlphaByte() { return alpha; } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#getBlueByte() */ public byte getBlueByte() { return blue; } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#getGreenByte() */ public byte getGreenByte() { return green; } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#getRedByte() */ public byte getRedByte() { return red; } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeRGBA(java.nio.ByteBuffer) */ public void writeRGBA(ByteBuffer dest) { dest.put(red); dest.put(green); dest.put(blue); dest.put(alpha); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeRGB(java.nio.ByteBuffer) */ public void writeRGB(ByteBuffer dest) { dest.put(red); dest.put(green); dest.put(blue); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeABGR(java.nio.ByteBuffer) */ public void writeABGR(ByteBuffer dest) { dest.put(alpha); dest.put(blue); dest.put(green); dest.put(red); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeARGB(java.nio.ByteBuffer) */ public void writeARGB(ByteBuffer dest) { dest.put(alpha); dest.put(red); dest.put(green); dest.put(blue); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeBGR(java.nio.ByteBuffer) */ public void writeBGR(ByteBuffer dest) { dest.put(blue); dest.put(green); dest.put(red); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableColor#writeBGRA(java.nio.ByteBuffer) */ public void writeBGRA(ByteBuffer dest) { dest.put(blue); dest.put(green); dest.put(red); dest.put(alpha); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readRGBA(ByteBuffer src) { red = src.get(); green = src.get(); blue = src.get(); alpha = src.get(); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readRGB(ByteBuffer src) { red = src.get(); green = src.get(); blue = src.get(); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readARGB(ByteBuffer src) { alpha = src.get(); red = src.get(); green = src.get(); blue = src.get(); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readBGRA(ByteBuffer src) { blue = src.get(); green = src.get(); red = src.get(); alpha = src.get(); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readBGR(ByteBuffer src) { blue = src.get(); green = src.get(); red = src.get(); } /** * Read a color from a byte buffer * @param src The source buffer */ public void readABGR(ByteBuffer src) { alpha = src.get(); blue = src.get(); green = src.get(); red = src.get(); } /** * Set this color's color by copying another color * @param src The source color */ public void setColor(ReadableColor src) { red = src.getRedByte(); green = src.getGreenByte(); blue = src.getBlueByte(); alpha = src.getAlphaByte(); } } --- NEW FILE: Display.java --- /* * Copyright (c) 2002 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; import java.lang.reflect.Field; import java.util.*; import java.util.ArrayList; import java.util.Comparator; import org.lwjgl.DisplayMode; import org.lwjgl.Sys; /** * $Id: Display.java,v 1.1 2004/04/21 18:10:56 cix_foo Exp $ * Display initialization utility, that can be used to find display modes and pick * one for you based on your criteria. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public final class Display { private static final boolean DEBUG = false; /** * Determine the available display modes that match the specified minimum and maximum criteria. * If any given criterium is specified as -1 then it is ignored. * * @param minWidth the minimum display resolution in pixels * @param minHeight the minimum display resolution in pixels * @param maxWidth the maximum display resolution in pixels * @param maxHeight the maximum display resolution in pixels * @param minBPP the minimum bit depth per pixel * @param maxBPP the maximum bit depth per pixel * @param minFreq the minimum display frequency in Hz * @param maxFreq the maximum display frequency in Hz * @return an array of matching display modes */ public static DisplayMode[] getAvailableDisplayModes(int minWidth, int minHeight, int maxWidth, int maxHeight, int minBPP, int maxBPP, int minFreq, int maxFreq) { // First get the available display modes DisplayMode[] modes = org.lwjgl.Display.getAvailableDisplayModes(); if (Sys.DEBUG || DEBUG) { System.out.println("Available screen modes:"); for (int i = 0; i < modes.length; i ++) { System.out.println(modes[i]); } } ArrayList matches = new ArrayList(modes.length); for (int i = 0; i < modes.length; i ++) { assert modes[i] != null : ""+i+" "+modes.length; if (minWidth != -1 && modes[i].width < minWidth) continue; if (maxWidth != -1 && modes[i].width > maxWidth) continue; if (minHeight != -1 && modes[i].height < minHeight) continue; if (maxHeight != -1 && modes[i].height > maxHeight) continue; if (minBPP != -1 && modes[i].bpp < minBPP) continue; if (maxBPP != -1 && modes[i].bpp > maxBPP) continue; //if (modes[i].bpp == 24) // continue; if (modes[i].freq != 0) { if (minFreq != -1 && modes[i].freq < minFreq) continue; if (maxFreq != -1 && modes[i].freq > maxFreq) continue; } matches.add(modes[i]); } DisplayMode[] ret = new DisplayMode[matches.size()]; matches.toArray(ret); if (Sys.DEBUG && DEBUG) { System.out.println("Filtered screen modes:"); for (int i = 0; i < ret.length; i ++) { System.out.println(ret[i]); } } return ret; } /** * Create the display by choosing from a list of display modes based on an order of preference. * You must supply a list of allowable display modes, probably by calling getAvailableDisplayModes(), * and an array with the order in which you would like them sorted in descending order. * This method attempts to create the topmost display mode; if that fails, it will try the next one, * and so on, until there are no modes left. If no mode is set at the end, an exception is thrown. * @param dm[] a list of display modes to choose from * @param param[] the names of the DisplayMode fields in the order in which you would like them sorted. * @param fullscreen whether to go fullscreen * @param title The app title * @return the chosen display mode * @throws NoSuchFieldException if one of the params is not a field in DisplayMode * @throws Exception if no display mode could be set * @see org.lwjgj.DisplayMode */ public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception { class Sorter implements Comparator { final Field[] field; final int[] order; final boolean[] usePreferred; final int[] preferred; Sorter() throws NoSuchFieldException { field = new Field[param.length]; order = new int[param.length]; preferred = new int[param.length]; usePreferred = new boolean[param.length]; for (int i = 0; i < field.length; i ++) { int idx = param[i].indexOf('='); if (idx > 0) { preferred[i] = Integer.parseInt(param[i].substring(idx + 1, param[i].length())); usePreferred[i] = true; param[i] = param[i].substring(0, idx); field[i] = DisplayMode.class.getField(param[i]); } else if (param[i].charAt(0) == '-') { field[i] = DisplayMode.class.getField(param[i].substring(1)); order[i] = -1; } else { field[i] = DisplayMode.class.getField(param[i]); order[i] = 1; } } } /** * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(Object o1, Object o2) { DisplayMode dm1 = (DisplayMode) o1; DisplayMode dm2 = (DisplayMode) o2; for (int i = 0; i < field.length; i ++) { try { int f1 = field[i].getInt(dm1); int f2 = field[i].getInt(dm2); if (usePreferred[i] && f1 != f2) { if (f1 == preferred[i]) return -1; else if (f2 == preferred[i]) return 1; else { // Score according to the difference between the values int absf1 = Math.abs(f1 - preferred[i]); int absf2 = Math.abs(f2 - preferred[i]); if (absf1 < absf2) return -1; else if (absf1 > absf2) return 1; else continue; } } else if (f1 < f2) return order[i]; else if (f1 == f2) continue; else return -order[i]; } catch (Exception e) { assert false : e.getMessage(); } } return 0; } } // Sort the display modes Arrays.sort(dm, new Sorter()); // Try them out in the appropriate order if (Sys.DEBUG || DEBUG) { System.out.println("Sorted display modes:"); for (int i = 0; i < dm.length; i ++) { System.out.println(dm[i]); } } for (int i = 0; i < dm.length; i ++) { try { if (Sys.DEBUG || DEBUG) System.out.println("Attempting to set displaymode: "+dm[i]); org.lwjgl.Display.setDisplayMode(dm[i]); return dm[i]; } catch (Exception e) { if (Sys.DEBUG || DEBUG) { System.out.println("Failed to set display mode to "+dm[i]); e.printStackTrace(); } } } throw new Exception("Failed to set display mode."); } } --- NEW FILE: Point.java --- /* * Copyright (c) 2002 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; import java.io.Serializable; /** * $Id: Point.java,v 1.1 2004/04/21 18:10:55 cix_foo Exp $ * A 2D integer point class, which looks remarkably like an AWT one. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public final class Point implements ReadablePoint, WritablePoint, Serializable { static final long serialVersionUID = 1L; /** The location */ private int x, y; /** * Constructor for Point. */ public Point() { super(); } /** * Constructor for Point. */ public Point(int x, int y) { setLocation(x, y); } /** * Constructor for Point. */ public Point(ReadablePoint p) { setLocation(p); } public void setLocation(int x, int y) { this.x = x; this.y = y; } public void setLocation(ReadablePoint p) { this.x = p.getX(); this.y = p.getY(); } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } /** * Translate a point. * @param x, y The translation to apply */ public void translate(int dx, int dy) { this.x += dx; this.y += dy; } /** * Translate a point. * @param p The translation to apply */ public void translate(ReadablePoint p) { this.x += p.getX(); this.y += p.getY(); } /** * Un-translate a point. * @param p The translation to apply */ public void untranslate(ReadablePoint p) { this.x -= p.getX(); this.y -= p.getY(); } /** * Determines whether an instance of <code>Point2D</code> is equal * to this point. Two instances of <code>Point2D</code> are equal if * the values of their <code>x</code> and <code>y</code> member * fields, representing their position in the coordinate space, are * the same. * @param obj an object to be compared with this point * @return <code>true</code> if the object to be compared is * an instance of <code>Point</code> and has * the same values; <code>false</code> otherwise */ public boolean equals(Object obj) { if (obj instanceof Point) { Point pt = (Point) obj; return (x == pt.x) && (y == pt.y); } return super.equals(obj); } /** * Returns a string representation of this point and its location * in the (<i>x</i>, <i>y</i>) coordinate space. This method is * intended to be used only for debugging purposes, and the content * and format of the returned string may vary between implementations. * The returned string may be empty but may not be <code>null</code>. * * @return a string representation of this point */ public String toString() { return getClass().getName() + "[x=" + x + ",y=" + y + "]"; } /** * Returns the hash code for this <code>Point</code>. * * @return a hash code for this <code>Point</code> */ public int hashCode() { int sum = x + y; return sum * (sum + 1) / 2 + x; } public int getX() { return x; } public int getY() { return y; } public void getLocation(WritablePoint dest) { dest.setLocation(x, y); } } --- NEW FILE: WritableRectangle.java --- /* * 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; /** * $Id: WritableRectangle.java,v 1.1 2004/04/21 18:11:00 cix_foo Exp $ * Write interface for Rectangles * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface WritableRectangle extends WritablePoint, WritableDimension { /** * Sets the bounds of the rectangle * @param x, y, width, height */ public void setBounds(int x, int y, int width, int height); /** * Sets the bounds of the rectangle * @param location * @param size */ public void setBounds(ReadablePoint location, ReadableDimension size); /** * Sets the bounds of the rectangle * @param src */ public void setBounds(ReadableRectangle src); } --- NEW FILE: Rectangle.java --- /* * Copyright (c) 2002 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; import java.io.Serializable; /** * $Id: Rectangle.java,v 1.1 2004/04/21 18:11:00 cix_foo Exp $ * A 2D integer Rectangle class which looks remarkably like an AWT one. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public final class Rectangle implements ReadableRectangle, WritableRectangle, Serializable { static final long serialVersionUID = 1L; /** Rectangle's bounds */ private int x, y, width, height; /** * Constructor for Rectangle. */ public Rectangle() { super(); } /** * Constructor for Rectangle. */ public Rectangle(int x, int y, int w, int h) { this.x = x; this.y = y; this.width = w; this.height = h; } /** * Constructor for Rectangle. */ public Rectangle(ReadablePoint p, ReadableDimension d) { x = p.getX(); y = p.getY(); width = d.getWidth(); height = d.getHeight(); } /** * Constructor for Rectangle. */ public Rectangle(ReadableRectangle r) { x = r.getX(); y = r.getY(); width = r.getWidth(); height = r.getHeight(); } public void setLocation(int x, int y) { this.x = x; this.y = y; } public void setLocation(ReadablePoint p) { this.x = p.getX(); this.y = p.getY(); } public void setSize(int w, int h) { this.width = w; this.height = h; } public void setSize(ReadableDimension d) { this.width = d.getWidth(); this.height = d.getHeight(); } public void setBounds(int x, int y, int w, int h) { this.x = x; this.y = y; this.width = w; this.height = h; } public void setBounds(ReadablePoint p, ReadableDimension d) { x = p.getX(); y = p.getY(); width = d.getWidth(); height = d.getHeight(); } public void setBounds(ReadableRectangle r) { x = r.getX(); y = r.getY(); width = r.getWidth(); height = r.getHeight(); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableRectangle#getBounds(com.shavenpuppy.jglib.Rectangle) */ public void getBounds(WritableRectangle dest) { dest.setBounds(x, y, width, height); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadablePoint#getLocation(com.shavenpuppy.jglib.Point) */ public void getLocation(WritablePoint dest) { dest.setLocation(x, y); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) */ public void getSize(WritableDimension dest) { dest.setSize(width, height); } /** * Translate the rectangle by an amount. * @param x, y The translation amount */ public void translate(int x, int y) { this.x += x; this.y += y; } /** * Translate the rectangle by an amount. * @param point The translation amount */ public void translate(ReadablePoint point) { this.x += point.getX(); this.y += point.getY(); } /** * Un-translate the rectangle by an amount. * @param point The translation amount */ public void untranslate(ReadablePoint point) { this.x -= point.getX(); this.y -= point.getY(); } /** * Checks whether or not this <code>Rectangle</code> contains the * specified <code>Point</code>. * @param p the <code>Point</code> to test * @return <code>true</code> if the <code>Point</code> * (<i>x</i>, <i>y</i>) is inside this * <code>Rectangle</code>; * <code>false</code> otherwise. */ public boolean contains(ReadablePoint p) { return contains(p.getX(), p.getY()); } /** * Checks whether or not this <code>Rectangle</code> contains the * point at the specified location * (<i>x</i>, <i>y</i>). * @param X, Y the specified coordinates * @return <code>true</code> if the point * (<i>x</i>, <i>y</i>) is inside this * <code>Rectangle</code>; * <code>false</code> otherwise. */ public boolean contains(int X, int Y) { int w = this.width; int h = this.height; if ((w | h) < 0) { // At least one of the dimensions is negative... return false; } // Note: if either dimension is zero, tests below must return false... int x = this.x; int y = this.y; if (X < x || Y < y) { return false; } w += x; h += y; // overflow || intersect return ((w < x || w > X) && (h < y || h > Y)); } /** * Checks whether or not this <code>Rectangle</code> entirely contains * the specified <code>Rectangle</code>. * @param r the specified <code>Rectangle</code> * @return <code>true</code> if the <code>Rectangle</code> * is contained entirely inside this <code>Rectangle</code>; * <code>false</code> otherwise. */ public boolean contains(ReadableRectangle r) { return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } /** * Checks whether this <code>Rectangle</code> entirely contains * the <code>Rectangle</code> * at the specified location (<i>X</i>, <i>Y</i>) with the * specified dimensions (<i>W</i>, <i>H</i>). * @param X, Y the specified coordinates * @param W the width of the <code>Rectangle</code> * @param H the height of the <code>Rectangle</code> * @return <code>true</code> if the <code>Rectangle</code> specified by * (<i>X</i>, <i>Y</i>, <i>W</i>, <i>H</i>) * is entirely enclosed inside this <code>Rectangle</code>; * <code>false</code> otherwise. */ public boolean contains(int X, int Y, int W, int H) { int w = this.width; int h = this.height; if ((w | h | W | H) < 0) { // At least one of the dimensions is negative... return false; } // Note: if any dimension is zero, tests below must return false... int x = this.x; int y = this.y; if (X < x || Y < y) { return false; } w += x; W += X; if (W <= X) { // X+W overflowed or W was zero, return false if... // either original w or W was zero or // x+w did not overflow or // the overflowed x+w is smaller than the overflowed X+W if (w >= x || W > w) return false; } else { // X+W did not overflow and W was not zero, return false if... // original w was zero or // x+w did not overflow and x+w is smaller than X+W if (w >= x && W > w) return false; } h += y; H += Y; if (H <= Y) { if (h >= y || H > h) return false; } else { if (h >= y && H > h) return false; } return true; } /** * Determines whether or not this <code>Rectangle</code> and the specified * <code>Rectangle</code> intersect. Two rectangles intersect if * their intersection is nonempty. * * @param r the specified <code>Rectangle</code> * @return <code>true</code> if the specified <code>Rectangle</code> * and this <code>Rectangle</code> intersect; * <code>false</code> otherwise. */ public boolean intersects(ReadableRectangle r) { int tw = this.width; int th = this.height; int rw = r.getWidth(); int rh = r.getHeight(); if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) { return false; } int tx = this.x; int ty = this.y; int rx = r.getX(); int ry = r.getY(); rw += rx; rh += ry; tw += tx; th += ty; // overflow || intersect return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry)); } /** * Computes the intersection of this <code>Rectangle</code> with the * specified <code>Rectangle</code>. Returns a new <code>Rectangle</code> * that represents the intersection of the two rectangles. * If the two rectangles do not intersect, the result will be * an empty rectangle. * * @param r the specified <code>Rectangle</code> * @return the largest <code>Rectangle</code> contained in both the * specified <code>Rectangle</code> and in * this <code>Rectangle</code>; or if the rectangles * do not intersect, an empty rectangle. */ public Rectangle intersection(ReadableRectangle r, Rectangle dest) { int tx1 = this.x; int ty1 = this.y; int rx1 = r.getX(); int ry1 = r.getY(); long tx2 = tx1; tx2 += this.width; long ty2 = ty1; ty2 += this.height; long rx2 = rx1; rx2 += r.getWidth(); long ry2 = ry1; ry2 += r.getHeight(); if (tx1 < rx1) tx1 = rx1; if (ty1 < ry1) ty1 = ry1; if (tx2 > rx2) tx2 = rx2; if (ty2 > ry2) ty2 = ry2; tx2 -= tx1; ty2 -= ty1; // tx2,ty2 will never overflow (they will never be // larger than the smallest of the two source w,h) // they might underflow, though... if (tx2 < Integer.MIN_VALUE) tx2 = Integer.MIN_VALUE; if (ty2 < Integer.MIN_VALUE) ty2 = Integer.MIN_VALUE; if (dest == null) dest = new Rectangle(tx1, ty1, (int) tx2, (int) ty2); else dest.setBounds(tx1, ty1, (int) tx2, (int) ty2); return dest; } /** * Computes the union of this <code>Rectangle</code> with the * specified <code>Rectangle</code>. Returns a new * <code>Rectangle</code> that * represents the union of the two rectangles * @param r the specified <code>Rectangle</code> * @return the smallest <code>Rectangle</code> containing both * the specified <code>Rectangle</code> and this * <code>Rectangle</code>. */ public WritableRectangle union(ReadableRectangle r, WritableRectangle dest) { int x1 = Math.min(x, r.getX()); int x2 = Math.max(x + width, r.getX() + r.getWidth()); int y1 = Math.min(y, r.getY()); int y2 = Math.max(y + height, r.getY() + r.getHeight()); dest.setBounds(x1, y1, x2 - x1, y2 - y1); return dest; } /** * Adds a point, specified by the integer arguments <code>newx</code> * and <code>newy</code>, to this <code>Rectangle</code>. The * resulting <code>Rectangle</code> is * the smallest <code>Rectangle</code> that contains both the * original <code>Rectangle</code> and the specified point. * <p> * After adding a point, a call to <code>contains</code> with the * added point as an argument does not necessarily return * <code>true</code>. The <code>contains</code> method does not * return <code>true</code> for points on the right or bottom * edges of a <code>Rectangle</code>. Therefore, if the added point * falls on the right or bottom edge of the enlarged * <code>Rectangle</code>, <code>contains</code> returns * <code>false</code> for that point. * @param newx, newy the coordinates of the new point */ public void add(int newx, int newy) { int x1 = Math.min(x, newx); int x2 = Math.max(x + width, newx); int y1 = Math.min(y, newy); int y2 = Math.max(y + height, newy); x = x1; y = y1; width = x2 - x1; height = y2 - y1; } /** * Adds the specified <code>Point</code> to this * <code>Rectangle</code>. The resulting <code>Rectangle</code> * is the smallest <code>Rectangle</code> that contains both the * original <code>Rectangle</code> and the specified * <code>Point</code>. * <p> * After adding a <code>Point</code>, a call to <code>contains</code> * with the added <code>Point</code> as an argument does not * necessarily return <code>true</code>. The <code>contains</code> * method does not return <code>true</code> for points on the right * or bottom edges of a <code>Rectangle</code>. Therefore if the added * <code>Point</code> falls on the right or bottom edge of the * enlarged <code>Rectangle</code>, <code>contains</code> returns * <code>false</code> for that <code>Point</code>. * @param pt the new <code>Point</code> to add to this * <code>Rectangle</code> */ public void add(ReadablePoint pt) { add(pt.getX(), pt.getY()); } /** * Adds a <code>Rectangle</code> to this <code>Rectangle</code>. * The resulting <code>Rectangle</code> is the union of the two * rectangles. * @param r the specified <code>Rectangle</code> */ public void add(ReadableRectangle r) { int x1 = Math.min(x, r.getX()); int x2 = Math.max(x + width, r.getX() + r.getWidth()); int y1 = Math.min(y, r.getY()); int y2 = Math.max(y + height, r.getY() + r.getHeight()); x = x1; y = y1; width = x2 - x1; height = y2 - y1; } /** * Resizes the <code>Rectangle</code> both horizontally and vertically. * <p> * This method modifies the <code>Rectangle</code> so that it is * <code>h</code> units larger on both the left and right side, * and <code>v</code> units larger at both the top and bottom. * <p> * The new <code>Rectangle</code> has (<code>x - h</code>, * <code>y - v</code>) as its top-left corner, a * width of * <code>width</code> <code>+</code> <code>2h</code>, * and a height of * <code>height</code> <code>+</code> <code>2v</code>. * <p> * If negative values are supplied for <code>h</code> and * <code>v</code>, the size of the <code>Rectangle</code> * decreases accordingly. * The <code>grow</code> method does not check whether the resulting * values of <code>width</code> and <code>height</code> are * non-negative. * @param h the horizontal expansion * @param v the vertical expansion */ public void grow(int h, int v) { x -= h; y -= v; width += h * 2; height += v * 2; } /** * Determines whether or not this <code>Rectangle</code> is empty. A * <code>Rectangle</code> is empty if its width or its height is less * than or equal to zero. * @return <code>true</code> if this <code>Rectangle</code> is empty; * <code>false</code> otherwise. */ public boolean isEmpty() { return (width <= 0) || (height <= 0); } /** * Checks whether two rectangles are equal. * <p> * The result is <code>true</code> if and only if the argument is not * <code>null</code> and is a <code>Rectangle</code> object that has the * same top-left corner, width, and height as this <code>Rectangle</code>. * @param obj the <code>Object</code> to compare with * this <code>Rectangle</code> * @return <code>true</code> if the objects are equal; * <code>false</code> otherwise. */ public boolean equals(Object obj) { if (obj instanceof Rectangle) { Rectangle r = (Rectangle) obj; return ((x == r.x) && (y == r.y) && (width == r.width) && (height == r.height)); } return super.equals(obj); } /** * Debugging * @return a String */ public String toString() { return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; } /** * Gets the height. * @return Returns a int */ public int getHeight() { return height; } /** * Sets the height. * @param height The height to set */ public void setHeight(int height) { this.height = height; } /** * Gets the width. * @return Returns a int */ public int getWidth() { return width; } /** * Sets the width. * @param width The width to set */ public void setWidth(int width) { this.width = width; } /** * Gets the x. * @return Returns a int */ public int getX() { return x; } /** * Sets the x. * @param x The x to set */ public void setX(int x) { this.x = x; } /** * Gets the y. * @return Returns a int */ public int getY() { return y; } /** * Sets the y. * @param y The y to set */ public void setY(int y) { this.y = y; } } --- NEW FILE: WritablePoint.java --- /* * 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; /** * $Id: WritablePoint.java,v 1.1 2004/04/21 18:10:56 cix_foo Exp $ * Write interface for Points * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface WritablePoint { public void setLocation(int x, int y); public void setLocation(ReadablePoint p); public void setX(int x); public void setY(int y); } --- NEW FILE: Dimension.java --- /* * Copyright (c) 2002 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; import java.io.Serializable; /** * $Id: Dimension.java,v 1.1 2004/04/21 18:11:00 cix_foo Exp $ * A 2D integer Dimension class, which looks remarkably like an AWT one. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public final class Dimension implements Serializable, ReadableDimension, WritableDimension { static final long serialVersionUID = 1L; /** The dimensions! */ private int width, height; /** * Constructor for Dimension. */ public Dimension() { super(); } /** * Constructor for Dimension. */ public Dimension(int w, int h) { this.width = w; this.height = h; } /** * Constructor for Dimension. */ public Dimension(ReadableDimension d) { setSize(d); } public void setSize(int w, int h) { this.width = w; this.height = h; } public void setSize(ReadableDimension d) { this.width = d.getWidth(); this.height = d.getHeight(); } /* (Overrides) * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) */ public void getSize(WritableDimension dest) { dest.setSize(this); } /** * Checks whether two dimension objects have equal values. */ public boolean equals(Object obj) { if (obj instanceof ReadableDimension) { ReadableDimension d = (ReadableDimension) obj; return (width == d.getWidth()) && (height == d.getHeight()); } return false; } /** * Returns the hash code for this <code>Dimension</code>. * * @return a hash code for this <code>Dimension</code> */ public int hashCode() { int sum = width + height; return sum * (sum + 1) / 2 + width; } /** * Returns a string representation of the values of this * <code>Dimension</code> object's <code>height</code> and * <code>width</code> fields. This method is intended to be used only * for debugging purposes, and the content and format of the returned * string may vary between implementations. The returned string may be * empty but may not be <code>null</code>. * * @return a string representation of this <code>Dimension</code> * object */ public String toString() { return getClass().getName() + "[width=" + width + ",height=" + height + "]"; } /** * Gets the height. * @return Returns a int */ public int getHeight() { return height; } /** * Sets the height. * @param height The height to set */ public void setHeight(int height) { this.height = height; } /** * Gets the width. * @return Returns a int */ public int getWidth() { return width; } /** * Sets the width. * @param width The width to set */ public void setWidth(int width) { this.width = width; } } --- NEW FILE: ReadableDimension.java --- /* * 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; /** * $Id: ReadableDimension.java,v 1.1 2004/04/21 18:11:00 cix_foo Exp $ * Readonly interface for Dimensions * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface ReadableDimension { /** * Get the width * @return int */ public int getWidth(); /** * Get the height * @return int */ public int getHeight(); /** * Copy this ReadableDimension into a destination Dimension * @param dest The destination */ public void getSize(WritableDimension dest); } --- NEW FILE: WritableColor.java --- /* * 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; import java.nio.ByteBuffer; /** * $Id: WritableColor.java,v 1.1 2004/04/21 18:11:00 cix_foo Exp $ * Write interface for Colors * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface WritableColor { /** * Set a color */ public void set(int r, int g, int b, int a); /** * Set a color */ public void set(byte r, byte g, byte b, byte a); /** * Set a color */ public void set(int r, int g, int b); /** * Set a color */ public void set(byte r, byte g, byte b); /** * Set the Red component */ public void setRed(int red); /** * Set the Green component */ public void setGreen(int green); /** * Set the Blue component */ public void setBlue(int blue); /** * Set the Alpha component */ public void setAlpha(int alpha); /** * Set the Red component */ public void setRed(byte red); /** * Set the Green component */ public void setGreen(byte green); /** * Set the Blue component */ public void setBlue(byte blue); /** * Set the Alpha component */ public void setAlpha(byte alpha); /** * Read a color from a byte buffer * @param src The source buffer */ public void readRGBA(ByteBuffer src); /** * Read a color from a byte buffer * @param src The source buffer */ public void readRGB(ByteBuffer src); /** * Read a color from a byte buffer * @param src The source buffer */ public void readARGB(ByteBuffer src); /** * Read a color from a byte buffer * @param src The source buffer */ public void readBGRA(ByteBuffer src); /** * Read a color from a byte buffer * @param src The source buffer */ public void readBGR(ByteBuffer src); /** * Read a color from a byte buffer * @param src The source buffer */ public void readABGR(ByteBuffer src); /** * Set this color's color by copying another color * @param src The source color */ public void setColor(ReadableColor src); } --- NEW FILE: ReadableColor.java --- /* * 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; import java.nio.ByteBuffer; /** * $Id: ReadableColor.java,v 1.1 2004/04/21 18:10:59 cix_foo Exp $ * Readonly interface for Colors * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public interface ReadableColor { /** * Return the red component (0..255) * @return int */ public int getRed(); ... [truncated message content] |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-21 18:11:16
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11765/src/java/org/lwjgl/util/model/loader Modified Files: Loader.java Log Message: Tons more utils! Index: Loader.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader/Loader.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Loader.java 20 Apr 2004 21:02:40 -0000 1.4 +++ Loader.java 21 Apr 2004 18:11:00 -0000 1.5 @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; +import org.lwjgl.util.Color; import org.lwjgl.util.model.*; import org.lwjgl.util.model.BoneFrame; import org.lwjgl.util.model.BonedModel; @@ -92,6 +93,7 @@ material, loadTriangles(), loadSkin(), + loadColor(), loadBoneAnimations(), loadBonedVertices() ); @@ -101,6 +103,7 @@ material, loadTriangles(), loadSkin(), + loadColor(), loadMeshAnimations() ); } else { @@ -150,6 +153,28 @@ } /** + * Load the colour + * @return Color[] + * @throws Exception + */ + private Color[] loadColor() throws Exception { + List colorElements = XMLUtil.getChildren(src.getDocumentElement(), "color"); + if (colorElements.size() == 0) { + return null; + } + if (colorElements.size() != numVertices) { + throw new Exception("Color count incorrect, got "+colorElements.size()+", expected "+numVertices); + } + Color[] colors = new Color[colorElements.size()]; + int colorCount = 0; + for (Iterator i = colorElements.iterator(); i.hasNext(); ) { + Element colorElement = (Element) i.next(); + colors[colorCount++] = loadColor(colorElement); + } + return colors; + } + + /** * Load all the Triangles * @return Triangle[] * @throws Exception @@ -318,6 +343,21 @@ } /** + * Load a colour from XML + * @param element + * @return a Color + * @throws Exception + */ + private Color loadColor(Element element) throws Exception { + return new Color( + XMLUtil.getInt(element, "r"), + XMLUtil.getInt(element, "g"), + XMLUtil.getInt(element, "b"), + XMLUtil.getInt(element, "a", 255) + ); + } + + /** * Load a boned Animation from XML * @param element * @return BoneFrame[] |
|
From: Elias N. <eli...@us...> - 2004-04-21 08:32:45
|
Update of /cvsroot/java-game-lib/LWJGL In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9458 Modified Files: build.xml Log Message: Removed lwjgl_util.jar again, it is included in lwjgl.jar Index: build.xml =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/build.xml,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- build.xml 21 Apr 2004 08:02:41 -0000 1.19 +++ build.xml 21 Apr 2004 08:32:19 -0000 1.20 @@ -31,12 +31,6 @@ <include name="org/lwjgl/test/**"/> </fileset> - <!-- Files to include in the lwjgl_util.jar file --> - <fileset id="lwjgl_util.fileset" dir="${lwjgl.bin}"> - <exclude name="**.*"/> - <include name="org/lwjgl/util/**"/> - </fileset> - <!-- Files to make Javadoc from --> <fileset id="lwjgl.javadoc.fileset" dir="${lwjgl.src}/java"> <include name="**/*.java" /> @@ -216,11 +210,6 @@ <jar destfile="${lwjgl.lib}/lwjgl_test.jar" taskname="lwjgl_test.jar"> <fileset refid="lwjgl_test.fileset"/> </jar> - - <!-- Create lwjgl_util.jar --> - <jar destfile="${lwjgl.lib}/lwjgl_util.jar" taskname="lwjgl_util.jar"> - <fileset refid="lwjgl_util.fileset"/> - </jar> </target> <!-- Creates the Javadoc --> |
|
From: Elias N. <eli...@us...> - 2004-04-21 08:03:08
|
Update of /cvsroot/java-game-lib/LWJGL In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4983 Modified Files: build.xml Log Message: Added lwjgl_util.jar to build.xml Index: build.xml =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/build.xml,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- build.xml 13 Apr 2004 20:08:05 -0000 1.18 +++ build.xml 21 Apr 2004 08:02:41 -0000 1.19 @@ -31,6 +31,12 @@ <include name="org/lwjgl/test/**"/> </fileset> + <!-- Files to include in the lwjgl_util.jar file --> + <fileset id="lwjgl_util.fileset" dir="${lwjgl.bin}"> + <exclude name="**.*"/> + <include name="org/lwjgl/util/**"/> + </fileset> + <!-- Files to make Javadoc from --> <fileset id="lwjgl.javadoc.fileset" dir="${lwjgl.src}/java"> <include name="**/*.java" /> @@ -149,6 +155,7 @@ <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/opengl/**" source="1.4" taskname="opengl"/> <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/vector/**" source="1.4" taskname="vector"/> <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/test/**" source="1.4" taskname="test"/> + <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/util/**" source="1.4" taskname="util"/> </target> <!-- Compiles the native files --> @@ -209,6 +216,11 @@ <jar destfile="${lwjgl.lib}/lwjgl_test.jar" taskname="lwjgl_test.jar"> <fileset refid="lwjgl_test.fileset"/> </jar> + + <!-- Create lwjgl_util.jar --> + <jar destfile="${lwjgl.lib}/lwjgl_util.jar" taskname="lwjgl_util.jar"> + <fileset refid="lwjgl_util.fileset"/> + </jar> </target> <!-- Creates the Javadoc --> |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-20 21:03:16
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22844/src/java/org/lwjgl/util/model/loader Modified Files: Loader.java XMLUtil.java Log Message: Index: Loader.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader/Loader.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Loader.java 20 Apr 2004 20:39:51 -0000 1.3 +++ Loader.java 20 Apr 2004 21:02:40 -0000 1.4 @@ -64,6 +64,12 @@ /** The source document */ private final Document src; + /** Expected number of vertices */ + private int numVertices; + + /** Expected number of bones */ + private int numBones; + /** * C'tor */ @@ -78,13 +84,15 @@ */ public Model load() throws Exception { String material = XMLUtil.getString(src.getDocumentElement(), "material"); + numVertices = XMLUtil.getInt(src.getDocumentElement(), "vertices"); if (XMLUtil.getString(src.getDocumentElement(), "type").equals("boned")) { // It's a boned model + numBones = XMLUtil.getInt(src.getDocumentElement(), "bones", 0); return new BonedModel( material, loadTriangles(), loadSkin(), - loadBoneAnimations(XMLUtil.getInt(src.getDocumentElement(), "bones", 0)), + loadBoneAnimations(), loadBonedVertices() ); } else if (XMLUtil.getString(src.getDocumentElement(), "type").equals("meshed")) { @@ -107,6 +115,9 @@ */ private BonedVertex[] loadBonedVertices() throws Exception { List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex"); + if (vertexElements.size() != numVertices) { + throw new Exception("Vertex count incorrect, got "+vertexElements.size()+", expected "+numVertices); + } BonedVertex[] vertices = new BonedVertex[vertexElements.size()]; int vertexCount = 0; for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { @@ -123,6 +134,12 @@ */ private Vector2f[] loadSkin() throws Exception { List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin"); + if (skinElements.size() == 0) { + return null; + } + if (skinElements.size() != numVertices) { + throw new Exception("Skin count incorrect, got "+skinElements.size()+", expected "+numVertices); + } Vector2f[] skins = new Vector2f[skinElements.size()]; int skinCount = 0; for (Iterator i = skinElements.iterator(); i.hasNext(); ) { @@ -150,16 +167,15 @@ /** * Load all the bone animations - * @param numBones The number of bones in the animations * @return Map of animation names to BoneFrame[] animations * @throws Exception */ - private Map loadBoneAnimations(int numBones) throws Exception { + private Map loadBoneAnimations() throws Exception { List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); Map animations = new HashMap(animationElements.size()); for (Iterator i = animationElements.iterator(); i.hasNext(); ) { Element animationElement = (Element) i.next(); - animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement, numBones)); + animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement)); } return animations; } @@ -187,11 +203,16 @@ */ private BonedVertex loadBonedVertex(Element vertexElement) throws Exception { List weightElements = XMLUtil.getChildren(vertexElement, "weight"); - Weight[] weights = new Weight[weightElements.size()]; - int weightCount = 0; - for (Iterator i = weightElements.iterator(); i.hasNext(); ) { - Element weightElement = (Element) i.next(); - weights[weightCount++] = loadWeight(weightElement); + Weight[] weights; + if (weightElements.size() == 0) { + weights = null; + } else { + weights = new Weight[weightElements.size()]; + int weightCount = 0; + for (Iterator i = weightElements.iterator(); i.hasNext(); ) { + Element weightElement = (Element) i.next(); + weights[weightCount++] = loadWeight(weightElement); + } } return new BonedVertex( @@ -200,11 +221,13 @@ XMLUtil.getFloat(vertexElement, "y"), XMLUtil.getFloat(vertexElement, "z") ), - new Vector3f( - XMLUtil.getFloat(vertexElement, "nx"), - XMLUtil.getFloat(vertexElement, "ny"), - XMLUtil.getFloat(vertexElement, "nz") - ), + XMLUtil.hasAttribute(vertexElement, "nx") ? + new Vector3f( + XMLUtil.getFloat(vertexElement, "nx"), + XMLUtil.getFloat(vertexElement, "ny"), + XMLUtil.getFloat(vertexElement, "nz") + ) + : null, weights ); } @@ -222,11 +245,13 @@ XMLUtil.getFloat(vertexElement, "y"), XMLUtil.getFloat(vertexElement, "z") ), - new Vector3f( - XMLUtil.getFloat(vertexElement, "nx"), - XMLUtil.getFloat(vertexElement, "ny"), - XMLUtil.getFloat(vertexElement, "nz") - ) + XMLUtil.hasAttribute(vertexElement, "nx") ? + new Vector3f( + XMLUtil.getFloat(vertexElement, "nx"), + XMLUtil.getFloat(vertexElement, "ny"), + XMLUtil.getFloat(vertexElement, "nz") + ) + : null ); } @@ -237,8 +262,12 @@ * @throws Exception */ private Weight loadWeight(Element element) throws Exception { + int bone = XMLUtil.getInt(element, "bone"); + if (bone < 0 || bone >= numBones) { + throw new Exception("Bone index out of range"); + } return new Weight( - XMLUtil.getInt(element, "bone"), + bone, XMLUtil.getFloat(element, "weight") ); } @@ -246,14 +275,31 @@ /** * Load a Triangle from XML * @param element + * @param numVertices * @return a Triangle * @throws Exception */ private Triangle loadTriangle(Element element) throws Exception { + // Perform sanity checks + int a = XMLUtil.getInt(element, "a"); + if (a < 0 || a >= numVertices) { + throw new Exception("'a' is out of range"); + } + int b = XMLUtil.getInt(element, "b"); + if (b < 0 || b >= numVertices) { + throw new Exception("'b' is out of range"); + } + int c = XMLUtil.getInt(element, "c"); + if (c < 0 || c >= numVertices) { + throw new Exception("'c' is out of range"); + } + if (a == b || a == c || b == c) { + throw new Exception("Degenerate triangle"); + } return new Triangle( - XMLUtil.getInt(element, "a"), - XMLUtil.getInt(element, "b"), - XMLUtil.getInt(element, "c"), + a, + b, + c, XMLUtil.getInt(element, "adjacency", 0) ); } @@ -274,17 +320,16 @@ /** * Load a boned Animation from XML * @param element - * @param numBones * @return BoneFrame[] * @throws Exception */ - private BoneFrame[] loadBonedAnimation(Element element, int numBones) throws Exception { + private BoneFrame[] loadBonedAnimation(Element element) throws Exception { List frameElements = XMLUtil.getChildren(element, "frame"); BoneFrame[] frames = new BoneFrame[frameElements.size()]; int frameCount = 0; for (Iterator i = frameElements.iterator(); i.hasNext(); ) { Element frameElement = (Element) i.next(); - frames[frameCount++] = loadBoneFrame(frameElement, numBones); + frames[frameCount++] = loadBoneFrame(frameElement); } return frames; } @@ -309,11 +354,10 @@ /** * Load a Frame from XML * @param element - * @param numBones * @return BoneFrame * @throws Exception */ - private BoneFrame loadBoneFrame(Element element, int numBones) throws Exception { + private BoneFrame loadBoneFrame(Element element) throws Exception { List boneElements = XMLUtil.getChildren(element, "bone"); if (boneElements.size() != numBones) { throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size()); @@ -339,6 +383,9 @@ private MeshFrame loadMeshFrame(Element element) throws Exception { List vertexElements = XMLUtil.getChildren(element, "vertex"); Vertex[] vertices = new Vertex[vertexElements.size()]; + if (vertices.length != numVertices) { + throw new Exception("Vertex count incorrect"); + } int vertexCount = 0; for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { Element vertexElement = (Element) i.next(); Index: XMLUtil.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader/XMLUtil.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XMLUtil.java 20 Apr 2004 19:40:54 -0000 1.1 +++ XMLUtil.java 20 Apr 2004 21:02:40 -0000 1.2 @@ -153,6 +153,17 @@ return s; } + /** + * @return true if the specified attribute is present and not empty or null in the element + */ + static boolean hasAttribute(Element element, String attribute) { + String s = element.getAttribute(attribute); + if (s == null || "".equals(s)) + return false; + else + return true; + } + } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-20 20:41:08
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18455/src/java/org/lwjgl/util/model Modified Files: Frame.java Vertex.java Model.java Added Files: MeshedModel.java MeshFrame.java BoneFrame.java BonedModel.java BonedVertex.java Weight.java Removed Files: Skin.java Log Message: Now does meshed models as well as boned ones Index: Frame.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Frame.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Frame.java 19 Apr 2004 21:54:57 -0000 1.3 +++ Frame.java 20 Apr 2004 20:39:50 -0000 1.4 @@ -33,41 +33,31 @@ import java.io.Serializable; -import org.lwjgl.util.vector.Matrix4f; - /** - * A Frame describes a set of new positions for Bones. + * $Id$ + * The base class for animation frames. + * @author $Author$ + * @version $Revision$ */ -public class Frame implements Serializable { +public abstract class Frame implements Serializable { public static final long serialVersionUID = 1L; - /** The new transformations for each Bone in the Skeleton */ - private final Matrix4f[] bone; - /** Frame time */ private final float time; /** * C'tor - * @param bone[] + * @param time */ - public Frame(float time, Matrix4f[] bone) { + public Frame(float time) { this.time = time; - this.bone = bone; - } - - /** - * @return the Bones - */ - public Matrix4f[] getBone() { - return bone; } /** * @return the frame time */ - public float getTime() { + public final float getTime() { return time; } } Index: Model.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Model.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Model.java 19 Apr 2004 21:54:57 -0000 1.3 +++ Model.java 20 Apr 2004 20:39:50 -0000 1.4 @@ -35,45 +35,45 @@ import java.io.Serializable; import java.util.Map; +import org.lwjgl.util.vector.Vector2f; + /** * $Id$ * - * A simple animated, skinned, boned 3D model, consisting of a single mesh - * 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. + * Base class for the two kinds of model supported. A Model has a single "material" + * and a single triangular mesh with a single skin, and any number of animations. * * @author $Author$ * @version $Revision$ */ -public class Model implements Serializable { +public abstract class Model implements Serializable { public static final long serialVersionUID = 1L; /** Material */ private final String material; - /** Vertices */ - private final Vertex[] vertex; - /** Triangles */ private final Triangle[] triangle; + /** Skin */ + private final Vector2f[] skin; + /** The animations: a Map of string names to Frame[] arrays */ private final Map animation; /** * C'tor * @param material - * @param vertex * @param triangle + * @param skin[] * @param animation */ - public Model(String material, Vertex[] vertex, Triangle[] triangle, Map animation) { + public Model(String material, Triangle[] triangle, Vector2f[] skin, Map animation) { this.material = material; - this.vertex = vertex; this.triangle = triangle; + this.skin = skin; this.animation = animation; } @@ -82,30 +82,29 @@ * @param name The name of the animation * @return the Frames of an animation (or null, if no such animation exists) */ - public Frame[] getAnimation(String name) { - return (Frame[]) animation.get(name); + public final BoneFrame[] getAnimation(String name) { + return (BoneFrame[]) animation.get(name); } /** * @return Returns the material. */ - public String getMaterial() { + public final String getMaterial() { return material; } /** * @return Returns the triangles. */ - public Triangle[] getTriangle() { + public final Triangle[] getTriangle() { return triangle; } /** - * @return Returns the vertices + * @return Returns the skin. */ - public Vertex[] getVertex() { - return vertex; + public final Vector2f[] getSkin() { + return skin; } - } --- NEW FILE: BoneFrame.java --- /* * 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; import org.lwjgl.util.vector.Matrix4f; /** * $Id: BoneFrame.java,v 1.1 2004/04/20 20:39:50 cix_foo Exp $ * A BoneFrame describes a set of new positions for Bones in an animation. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class BoneFrame extends Frame { public static final long serialVersionUID = 1L; /** The new transformations for each Bone in the Skeleton */ private final Matrix4f[] bone; /** * C'tor * @param time * @param bone[] */ public BoneFrame(float time, Matrix4f[] bone) { super(time); this.bone = bone; } /** * @return the Bones */ public Matrix4f[] getBone() { return bone; } } --- NEW FILE: Weight.java --- /* * 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; import java.io.Serializable; /** * $Id: Weight.java,v 1.1 2004/04/20 20:39:50 cix_foo Exp $ * Describes how a bone influences a vertex. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class Weight implements Serializable { public static final long serialVersionUID = 1L; /** Bone index */ private final int bone; /** Weight */ private final float weight; /** * C'tor */ public Weight(int bone, float weight) { this.bone = bone; this.weight = weight; } /** * @return Returns the bone index. */ public int getBone() { return bone; } /** * @return Returns the weight. */ public float getWeight() { return weight; } } --- NEW FILE: MeshFrame.java --- /* * 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; /** * $Id: MeshFrame.java,v 1.1 2004/04/20 20:39:49 cix_foo Exp $ * A MeshFrame describes a set of new positions for Vertices in an animation. * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class MeshFrame extends Frame { public static final long serialVersionUID = 1L; /** The vertices */ private final Vertex[] vertex; /** * C'tor * @param time * @param bone[] */ public MeshFrame(float time, Vertex[] vertex) { super(time); this.vertex = vertex; } /** * @return the Vertices */ public Vertex[] getVertex() { return vertex; } } --- NEW FILE: MeshedModel.java --- /* * Copyright (c) 2002 Light Weight Java Game Library Project * 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 'Light Weight Java Game Library' 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; import java.util.Map; import org.lwjgl.util.vector.Vector2f; /** * $Id: MeshedModel.java,v 1.1 2004/04/20 20:39:47 cix_foo Exp $ * * A simple animated 3d mesh, consisting of multiple vertex positions. * 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: cix_foo $ * @version $Revision: 1.1 $ */ public class MeshedModel extends Model { public static final long serialVersionUID = 1L; /** * C'tor * @param material * @param triangle * @param skin[] * @param animation */ public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation) { super(material, triangle, skin, animation); } } --- NEW FILE: BonedVertex.java --- /* * 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; import org.lwjgl.util.vector.ReadableVector3f; /** * $Id: BonedVertex.java,v 1.1 2004/04/20 20:39:50 cix_foo Exp $ * * A BonedVerex is a Vertex influenced by bone Weights * * @author $Author: cix_foo $ * @version $Revision: 1.1 $ */ public class BonedVertex extends Vertex { public static final long serialVersionUID = 1L; /** Bone weights */ private final Weight[] weight; /** * C'tor * @param coords * @param normal * @param skin */ public BonedVertex(ReadableVector3f coords, ReadableVector3f normal, Weight[] skin) { super(coords, normal); this.weight = skin; } /** * @return Returns the skin. */ public Weight[] getWeight() { return weight; } } Index: Vertex.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/Vertex.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Vertex.java 19 Apr 2004 21:54:57 -0000 1.3 +++ Vertex.java 20 Apr 2004 20:39:50 -0000 1.4 @@ -33,7 +33,6 @@ import java.io.Serializable; -import org.lwjgl.util.vector.ReadableVector2f; import org.lwjgl.util.vector.ReadableVector3f; /** @@ -54,24 +53,14 @@ /** Normal */ private final ReadableVector3f normal; - /** Texture coordinates */ - private final ReadableVector2f texCoords; - - /** Skin */ - private final Skin[] skin; - /** * C'tor * @param coords * @param normal - * @param texCoords - * @param skin */ - public Vertex(ReadableVector3f coords, ReadableVector3f normal, ReadableVector2f texCoords, Skin[] skin) { + public Vertex(ReadableVector3f coords, ReadableVector3f normal) { this.coords = coords; this.normal = normal; - this.texCoords = texCoords; - this.skin = skin; } /** @@ -87,18 +76,4 @@ public ReadableVector3f getNormal() { return normal; } - - /** - * @return Returns the skin. - */ - public Skin[] getSkin() { - return skin; - } - - /** - * @return Returns the texCoords. - */ - public ReadableVector2f getTexCoords() { - return texCoords; - } } --- NEW FILE: BonedModel.java --- /* * Copyright (c) 2002 Light Weight Java Game Library Project * 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 'Light Weight Java Game Library' 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; import java.util.Map; import org.lwjgl.util.vector.Vector2f; /** * $Id: BonedModel.java,v 1.1 2004/04/20 20:39:50 cix_foo Exp $ * * A simple animated, skinned, boned 3D model, consisting of a single mesh * 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: cix_foo $ * @version $Revision: 1.1 $ */ public class BonedModel extends Model { public static final long serialVersionUID = 1L; /** Vertices */ private final BonedVertex[] vertex; /** * C'tor * @param material * @param triangle * @param skin[] * @param animation * @param vertex */ public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation, BonedVertex[] vertex) { super(material, triangle, skin, animation); this.vertex = vertex; } /** * @return Returns the vertices */ public BonedVertex[] getVertex() { return vertex; } } --- Skin.java DELETED --- |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-20 20:40:37
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/renderer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18455/src/java/org/lwjgl/util/model/renderer Modified Files: Renderer.java Log Message: Now does meshed models as well as boned ones Index: Renderer.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/renderer/Renderer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Renderer.java 19 Apr 2004 21:54:58 -0000 1.3 +++ Renderer.java 20 Apr 2004 20:39:52 -0000 1.4 @@ -34,8 +34,8 @@ import java.util.HashMap; import java.util.Map; -import org.lwjgl.util.model.Frame; -import org.lwjgl.util.model.Model; +import org.lwjgl.util.model.BoneFrame; +import org.lwjgl.util.model.BonedModel; /** * $Id$ @@ -67,7 +67,7 @@ * @param animation The name of the animation * @param time The time for the animation */ - public void render(Model model, String animation, float time) { + public void render(BonedModel model, String animation, float time) { // 1. Set up GL state from the Model's material Renderable material = (Renderable) materials.get(model.getMaterial()); @@ -76,7 +76,7 @@ } // 2. Get the animation - Frame[] frame = model.getAnimation(animation); + BoneFrame[] frame = model.getAnimation(animation); if (frame == null) { return; } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-20 20:40:36
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18455/src/java/org/lwjgl/util/model/loader Modified Files: Loader.java Log Message: Now does meshed models as well as boned ones Index: Loader.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader/Loader.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Loader.java 20 Apr 2004 19:40:54 -0000 1.2 +++ Loader.java 20 Apr 2004 20:39:51 -0000 1.3 @@ -36,11 +36,14 @@ import java.util.List; import java.util.Map; -import org.lwjgl.util.model.Frame; -import org.lwjgl.util.model.Model; -import org.lwjgl.util.model.Skin; +import org.lwjgl.util.model.*; +import org.lwjgl.util.model.BoneFrame; +import org.lwjgl.util.model.BonedModel; +import org.lwjgl.util.model.BonedVertex; +import org.lwjgl.util.model.MeshedModel; import org.lwjgl.util.model.Triangle; import org.lwjgl.util.model.Vertex; +import org.lwjgl.util.model.Weight; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; @@ -74,31 +77,62 @@ * @throws Exception */ public Model load() throws Exception { - return new Model( - XMLUtil.getString(src.getDocumentElement(), "material"), - loadVertices(), - loadTriangles(), - loadAnimations(XMLUtil.getInt(src.getDocumentElement(), "bones")) - ); + String material = XMLUtil.getString(src.getDocumentElement(), "material"); + if (XMLUtil.getString(src.getDocumentElement(), "type").equals("boned")) { + // It's a boned model + return new BonedModel( + material, + loadTriangles(), + loadSkin(), + loadBoneAnimations(XMLUtil.getInt(src.getDocumentElement(), "bones", 0)), + loadBonedVertices() + ); + } else if (XMLUtil.getString(src.getDocumentElement(), "type").equals("meshed")) { + // It's a mesh keyframe model + return new MeshedModel( + material, + loadTriangles(), + loadSkin(), + loadMeshAnimations() + ); + } else { + throw new Exception("Unsupported model type."); + } } /** - * Load all the Vertices + * Load all the BonedVertices * @return Vertex[] * @throws Exception */ - private Vertex[] loadVertices() throws Exception { + private BonedVertex[] loadBonedVertices() throws Exception { List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex"); - Vertex[] vertices = new Vertex[vertexElements.size()]; + BonedVertex[] vertices = new BonedVertex[vertexElements.size()]; int vertexCount = 0; for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { Element vertexElement = (Element) i.next(); - vertices[vertexCount++] = loadVertex(vertexElement); + vertices[vertexCount++] = loadBonedVertex(vertexElement); } return vertices; } /** + * Load the skin + * @return Vector2f[] + * @throws Exception + */ + private Vector2f[] loadSkin() throws Exception { + List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin"); + Vector2f[] skins = new Vector2f[skinElements.size()]; + int skinCount = 0; + for (Iterator i = skinElements.iterator(); i.hasNext(); ) { + Element skinElement = (Element) i.next(); + skins[skinCount++] = loadTexCoord(skinElement); + } + return skins; + } + + /** * Load all the Triangles * @return Triangle[] * @throws Exception @@ -115,17 +149,32 @@ } /** - * Load all the animations + * Load all the bone animations * @param numBones The number of bones in the animations - * @return Map of animation names to Frame[] animations + * @return Map of animation names to BoneFrame[] animations * @throws Exception */ - private Map loadAnimations(int numBones) throws Exception { + private Map loadBoneAnimations(int numBones) throws Exception { List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); Map animations = new HashMap(animationElements.size()); for (Iterator i = animationElements.iterator(); i.hasNext(); ) { Element animationElement = (Element) i.next(); - animations.put(XMLUtil.getString(animationElement, "name"), loadAnimation(animationElement, numBones)); + animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement, numBones)); + } + return animations; + } + + /** + * Load all the mesh keyframe animations + * @return Map of animation names to MeshFrame[] animations + * @throws Exception + */ + private Map loadMeshAnimations() throws Exception { + List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); + Map animations = new HashMap(animationElements.size()); + for (Iterator i = animationElements.iterator(); i.hasNext(); ) { + Element animationElement = (Element) i.next(); + animations.put(XMLUtil.getString(animationElement, "name"), loadMeshAnimation(animationElement)); } return animations; } @@ -136,16 +185,16 @@ * @return a Vertex * @throws Exception */ - private Vertex loadVertex(Element vertexElement) throws Exception { - List skinElements = XMLUtil.getChildren(vertexElement, "skin"); - Skin[] skins = new Skin[skinElements.size()]; - int skinCount = 0; - for (Iterator i = skinElements.iterator(); i.hasNext(); ) { - Element skinElement = (Element) i.next(); - skins[skinCount++] = loadSkin(skinElement); + private BonedVertex loadBonedVertex(Element vertexElement) throws Exception { + List weightElements = XMLUtil.getChildren(vertexElement, "weight"); + Weight[] weights = new Weight[weightElements.size()]; + int weightCount = 0; + for (Iterator i = weightElements.iterator(); i.hasNext(); ) { + Element weightElement = (Element) i.next(); + weights[weightCount++] = loadWeight(weightElement); } - return new Vertex( + return new BonedVertex( new Vector3f( XMLUtil.getFloat(vertexElement, "x"), XMLUtil.getFloat(vertexElement, "y"), @@ -156,22 +205,39 @@ XMLUtil.getFloat(vertexElement, "ny"), XMLUtil.getFloat(vertexElement, "nz") ), - new Vector2f( - XMLUtil.getFloat(vertexElement, "u"), - XMLUtil.getFloat(vertexElement, "v") - ), - skins + weights ); } /** - * Load a Skin from XML + * Load a Vertex from XML + * @param vertexElement + * @return a Vertex + * @throws Exception + */ + private Vertex loadMeshVertex(Element vertexElement) throws Exception { + return new Vertex( + new Vector3f( + XMLUtil.getFloat(vertexElement, "x"), + XMLUtil.getFloat(vertexElement, "y"), + XMLUtil.getFloat(vertexElement, "z") + ), + new Vector3f( + XMLUtil.getFloat(vertexElement, "nx"), + XMLUtil.getFloat(vertexElement, "ny"), + XMLUtil.getFloat(vertexElement, "nz") + ) + ); + } + + /** + * Load a Weight from XML * @param element * @return a Skin * @throws Exception */ - private Skin loadSkin(Element element) throws Exception { - return new Skin( + private Weight loadWeight(Element element) throws Exception { + return new Weight( XMLUtil.getInt(element, "bone"), XMLUtil.getFloat(element, "weight") ); @@ -193,19 +259,49 @@ } /** - * Load an Animation from XML + * Load a texture coordinate from XML + * @param element + * @return a Vector2f + * @throws Exception + */ + private Vector2f loadTexCoord(Element element) throws Exception { + return new Vector2f( + XMLUtil.getFloat(element, "u"), + XMLUtil.getFloat(element, "v") + ); + } + + /** + * Load a boned Animation from XML * @param element * @param numBones - * @return Frame[] + * @return BoneFrame[] * @throws Exception */ - private Frame[] loadAnimation(Element element, int numBones) throws Exception { + private BoneFrame[] loadBonedAnimation(Element element, int numBones) throws Exception { List frameElements = XMLUtil.getChildren(element, "frame"); - Frame[] frames = new Frame[frameElements.size()]; + BoneFrame[] frames = new BoneFrame[frameElements.size()]; int frameCount = 0; for (Iterator i = frameElements.iterator(); i.hasNext(); ) { Element frameElement = (Element) i.next(); - frames[frameCount++] = loadFrame(frameElement, numBones); + frames[frameCount++] = loadBoneFrame(frameElement, numBones); + } + return frames; + } + + /** + * Load a mesh Animation from XML + * @param element + * @return MeshFrame[] + * @throws Exception + */ + private MeshFrame[] loadMeshAnimation(Element element) throws Exception { + List frameElements = XMLUtil.getChildren(element, "frame"); + MeshFrame[] frames = new MeshFrame[frameElements.size()]; + int frameCount = 0; + for (Iterator i = frameElements.iterator(); i.hasNext(); ) { + Element frameElement = (Element) i.next(); + frames[frameCount++] = loadMeshFrame(frameElement); } return frames; } @@ -214,10 +310,10 @@ * Load a Frame from XML * @param element * @param numBones - * @return Frame + * @return BoneFrame * @throws Exception */ - private Frame loadFrame(Element element, int numBones) throws Exception { + private BoneFrame loadBoneFrame(Element element, int numBones) throws Exception { List boneElements = XMLUtil.getChildren(element, "bone"); if (boneElements.size() != numBones) { throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size()); @@ -228,13 +324,33 @@ Element boneElement = (Element) i.next(); bones[boneCount++] = loadBone(boneElement); } - return new Frame( + return new BoneFrame( XMLUtil.getFloat(element, "time", 0.0f), bones ); } /** + * Load a Frame from XML + * @param element + * @return MeshFrame + * @throws Exception + */ + private MeshFrame loadMeshFrame(Element element) throws Exception { + List vertexElements = XMLUtil.getChildren(element, "vertex"); + Vertex[] vertices = new Vertex[vertexElements.size()]; + int vertexCount = 0; + for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { + Element vertexElement = (Element) i.next(); + vertices[vertexCount++] = loadMeshVertex(vertexElement); + } + return new MeshFrame( + XMLUtil.getFloat(element, "time", 0.0f), + vertices + ); + } + + /** * Load a Bone from XML * @param element * @return a Matrix4f |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-20 19:41:34
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6212/src/java/org/lwjgl/util/model/loader Modified Files: Loader.java Added Files: XMLUtil.java Log Message: XML Loader's done Index: Loader.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util/model/loader/Loader.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Loader.java 18 Apr 2004 19:30:32 -0000 1.1 +++ Loader.java 20 Apr 2004 19:40:54 -0000 1.2 @@ -31,13 +31,27 @@ */ package org.lwjgl.util.model.loader; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.lwjgl.util.model.Frame; import org.lwjgl.util.model.Model; +import org.lwjgl.util.model.Skin; +import org.lwjgl.util.model.Triangle; +import org.lwjgl.util.model.Vertex; +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector2f; +import org.lwjgl.util.vector.Vector3f; import org.w3c.dom.Document; +import org.w3c.dom.Element; /** * $Id$ * - * Loads a Model from an XML document. + * Loads a Model from an XML document. Construct with an XML Document as the argument, + * and then retrieve the Model by calling load(). * * @author $Author$ * @version $Revision$ @@ -60,6 +74,191 @@ * @throws Exception */ public Model load() throws Exception { + return new Model( + XMLUtil.getString(src.getDocumentElement(), "material"), + loadVertices(), + loadTriangles(), + loadAnimations(XMLUtil.getInt(src.getDocumentElement(), "bones")) + ); } + /** + * Load all the Vertices + * @return Vertex[] + * @throws Exception + */ + private Vertex[] loadVertices() throws Exception { + List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex"); + Vertex[] vertices = new Vertex[vertexElements.size()]; + int vertexCount = 0; + for (Iterator i = vertexElements.iterator(); i.hasNext(); ) { + Element vertexElement = (Element) i.next(); + vertices[vertexCount++] = loadVertex(vertexElement); + } + return vertices; + } + + /** + * Load all the Triangles + * @return Triangle[] + * @throws Exception + */ + private Triangle[] loadTriangles() throws Exception { + List triangleElements = XMLUtil.getChildren(src.getDocumentElement(), "triangle"); + Triangle[] triangles = new Triangle[triangleElements.size()]; + int triangleCount = 0; + for (Iterator i = triangleElements.iterator(); i.hasNext(); ) { + Element triangleElement = (Element) i.next(); + triangles[triangleCount++] = loadTriangle(triangleElement); + } + return triangles; + } + + /** + * Load all the animations + * @param numBones The number of bones in the animations + * @return Map of animation names to Frame[] animations + * @throws Exception + */ + private Map loadAnimations(int numBones) throws Exception { + List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation"); + Map animations = new HashMap(animationElements.size()); + for (Iterator i = animationElements.iterator(); i.hasNext(); ) { + Element animationElement = (Element) i.next(); + animations.put(XMLUtil.getString(animationElement, "name"), loadAnimation(animationElement, numBones)); + } + return animations; + } + + /** + * Load a Vertex from XML + * @param vertexElement + * @return a Vertex + * @throws Exception + */ + private Vertex loadVertex(Element vertexElement) throws Exception { + List skinElements = XMLUtil.getChildren(vertexElement, "skin"); + Skin[] skins = new Skin[skinElements.size()]; + int skinCount = 0; + for (Iterator i = skinElements.iterator(); i.hasNext(); ) { + Element skinElement = (Element) i.next(); + skins[skinCount++] = loadSkin(skinElement); + } + + return new Vertex( + new Vector3f( + XMLUtil.getFloat(vertexElement, "x"), + XMLUtil.getFloat(vertexElement, "y"), + XMLUtil.getFloat(vertexElement, "z") + ), + new Vector3f( + XMLUtil.getFloat(vertexElement, "nx"), + XMLUtil.getFloat(vertexElement, "ny"), + XMLUtil.getFloat(vertexElement, "nz") + ), + new Vector2f( + XMLUtil.getFloat(vertexElement, "u"), + XMLUtil.getFloat(vertexElement, "v") + ), + skins + ); + } + + /** + * Load a Skin from XML + * @param element + * @return a Skin + * @throws Exception + */ + private Skin loadSkin(Element element) throws Exception { + return new Skin( + XMLUtil.getInt(element, "bone"), + XMLUtil.getFloat(element, "weight") + ); + } + + /** + * Load a Triangle from XML + * @param element + * @return a Triangle + * @throws Exception + */ + private Triangle loadTriangle(Element element) throws Exception { + return new Triangle( + XMLUtil.getInt(element, "a"), + XMLUtil.getInt(element, "b"), + XMLUtil.getInt(element, "c"), + XMLUtil.getInt(element, "adjacency", 0) + ); + } + + /** + * Load an Animation from XML + * @param element + * @param numBones + * @return Frame[] + * @throws Exception + */ + private Frame[] loadAnimation(Element element, int numBones) throws Exception { + List frameElements = XMLUtil.getChildren(element, "frame"); + Frame[] frames = new Frame[frameElements.size()]; + int frameCount = 0; + for (Iterator i = frameElements.iterator(); i.hasNext(); ) { + Element frameElement = (Element) i.next(); + frames[frameCount++] = loadFrame(frameElement, numBones); + } + return frames; + } + + /** + * Load a Frame from XML + * @param element + * @param numBones + * @return Frame + * @throws Exception + */ + private Frame loadFrame(Element element, int numBones) throws Exception { + List boneElements = XMLUtil.getChildren(element, "bone"); + if (boneElements.size() != numBones) { + throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size()); + } + Matrix4f[] bones = new Matrix4f[boneElements.size()]; + int boneCount = 0; + for (Iterator i = boneElements.iterator(); i.hasNext(); ) { + Element boneElement = (Element) i.next(); + bones[boneCount++] = loadBone(boneElement); + } + return new Frame( + XMLUtil.getFloat(element, "time", 0.0f), + bones + ); + } + + /** + * Load a Bone from XML + * @param element + * @return a Matrix4f + * @throws Exception + */ + private Matrix4f loadBone(Element element) throws Exception { + Matrix4f ret = new Matrix4f(); + ret.m00 = XMLUtil.getFloat(element, "m00"); + ret.m01 = XMLUtil.getFloat(element, "m01"); + ret.m02 = XMLUtil.getFloat(element, "m02"); + ret.m03 = XMLUtil.getFloat(element, "m03"); + ret.m10 = XMLUtil.getFloat(element, "m10"); + ret.m11 = XMLUtil.getFloat(element, "m11"); + ret.m12 = XMLUtil.getFloat(element, "m12"); + ret.m13 = XMLUtil.getFloat(element, "m13"); + ret.m20 = XMLUtil.getFloat(element, "m20"); + ret.m21 = XMLUtil.getFloat(element, "m21"); + ret.m22 = XMLUtil.getFloat(element, "m22"); + ret.m23 = XMLUtil.getFloat(element, "m23"); + ret.m30 = XMLUtil.getFloat(element, "m30", 0.0f); + ret.m31 = XMLUtil.getFloat(element, "m31", 0.0f); + ret.m32 = XMLUtil.getFloat(element, "m32", 0.0f); + ret.m33 = XMLUtil.getFloat(element, "m33", 1.0f); + return ret; + } + } --- NEW FILE: XMLUtil.java --- /* * 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 java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Some simple XML utilities * @author cas */ final class XMLUtil { /** * @param name The name of the child elements you want * @return a List of child Elements */ static List getChildren(Element element, String name) throws Exception { NodeList nodes = element.getChildNodes(); ArrayList ret = new ArrayList(nodes.getLength()); for (int i = 0; i < nodes.getLength(); i ++) { Node childNode = (Node) nodes.item(i); if (childNode.getNodeName().equals(name) && childNode.getNodeType() == Node.ELEMENT_NODE) { ret.add(childNode); } } return ret; } /** * A convenience method for getting float values out of XML elements * @param attribute The name of the attribute * @throws NumberFormatException If the supplied attribute is not a number * @throws Exception if the value is missing * @return the parsed float value */ static float getFloat(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return Float.parseFloat(s); } /** * A convenience method for getting float values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @throws NumberFormatException If the supplied attribute is not a number * @return the parsed float value */ static float getFloat(Element element, String attribute, float defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return Float.parseFloat(s); } /** * A convenience method for getting integer values out of XML elements * @param attribute The name of the attribute * @throws NumberFormatException If the supplied attribute is not a number * @throws Exception if the value is missing * @return the parsed integer value */ static int getInt(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return Integer.parseInt(s); } /** * A convenience method for getting integer values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @throws NumberFormatException If the supplied attribute is not a number * @return the parsed integer value */ static int getInt(Element element, String attribute, int defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return Integer.parseInt(s); } /** * A convenience method for getting string values out of XML elements * @param attribute The name of the attribute * @return the string value, which will not be null * @throws Exception the value is not specified */ static String getString(Element element, String attribute) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) throw new Exception("Attribute '"+attribute+"' has not been specified for "+element.getNodeName()); else return s; } /** * A convenience method for getting string values out of XML elements * @param attribute The name of the attribute * @param defaultValue The default value to return if no default is specified * @return the string value, which will not be null */ static String getString(Element element, String attribute, String defaultValue) throws Exception { String s = element.getAttribute(attribute); if (s == null || "".equals(s)) return defaultValue; else return s; } } |
|
From: Caspian Rychlik-P. <ci...@us...> - 2004-04-19 23:01:43
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3912/src/java/org/lwjgl/util Added Files: GLImpl.java IGL.java Log Message: New Object Oriented Wank! --- NEW FILE: GLImpl.java --- /* * Copyright (c) 2002 Light Weight Java Game Library Project * 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 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * [...5815 lines suppressed...] * @param x * @param y * @param z */ public void glWindowPos3sARB(short x, short y, short z) { GL.glWindowPos3sARB(x, y, z); } /** * @param res * @param in * @param outX * @param outY * @param outZ * @param outW */ public void glWriteMaskEXT(int res, int in, int outX, int outY, int outZ, int outW) { GL.glWriteMaskEXT(res, in, outX, outY, outZ, outW); } } --- NEW FILE: IGL.java --- /* * 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. * [...5199 lines suppressed...] * @param size * @param stride * @param pPointer */ public void glVertexWeightPointerEXT(int size, int stride, FloatBuffer pPointer); /** * @param size * @param type * @param stride * @param buffer_offset */ public void glVertexWeightPointerEXT(int size, int type, int stride, int buffer_offset); } |