From 32e6c6c1441f985c6907cbebdec9a6973c248864 Mon Sep 17 00:00:00 2001 From: eteq Date: Tue, 1 Aug 2006 19:46:07 +0000 Subject: initial import of 3ds packages git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/joglutils/trunk@4 83d24430-9974-4f80-8418-2cc3294053b9 --- src/net/java/joglutils/ThreeDS/Chunk.java | 44 ++ src/net/java/joglutils/ThreeDS/Face.java | 43 ++ src/net/java/joglutils/ThreeDS/Loader3DS.java | 571 ++++++++++++++++++++++++++ src/net/java/joglutils/ThreeDS/Material.java | 49 +++ src/net/java/joglutils/ThreeDS/Model3DS.java | 96 +++++ src/net/java/joglutils/ThreeDS/Obj.java | 52 +++ src/net/java/joglutils/ThreeDS/Vec3.java | 60 +++ src/net/java/joglutils/test3ds/Main.java | 157 +++++++ src/net/java/joglutils/test3ds/MyModel.java | 144 +++++++ 9 files changed, 1216 insertions(+) create mode 100644 src/net/java/joglutils/ThreeDS/Chunk.java create mode 100644 src/net/java/joglutils/ThreeDS/Face.java create mode 100644 src/net/java/joglutils/ThreeDS/Loader3DS.java create mode 100644 src/net/java/joglutils/ThreeDS/Material.java create mode 100644 src/net/java/joglutils/ThreeDS/Model3DS.java create mode 100644 src/net/java/joglutils/ThreeDS/Obj.java create mode 100644 src/net/java/joglutils/ThreeDS/Vec3.java create mode 100644 src/net/java/joglutils/test3ds/Main.java create mode 100644 src/net/java/joglutils/test3ds/MyModel.java (limited to 'src/net') diff --git a/src/net/java/joglutils/ThreeDS/Chunk.java b/src/net/java/joglutils/ThreeDS/Chunk.java new file mode 100644 index 0000000..1df35d8 --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Chunk.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +public class Chunk +{ + public int id = 0; + public int length = 0; + public int bytesRead = 0; +} \ No newline at end of file diff --git a/src/net/java/joglutils/ThreeDS/Face.java b/src/net/java/joglutils/ThreeDS/Face.java new file mode 100644 index 0000000..0f70b5b --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Face.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +public class Face +{ + public int vertIndex[] = new int[3]; + public int coordIndex[] = new int[3]; +} \ No newline at end of file diff --git a/src/net/java/joglutils/ThreeDS/Loader3DS.java b/src/net/java/joglutils/ThreeDS/Loader3DS.java new file mode 100644 index 0000000..c1e34af --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Loader3DS.java @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class Loader3DS +{ +// Primary Chunk, at the beginning of each file + private static final int PRIMARY = 0x4D4D; + +// Main Chunks + private static final int EDITOR = 0x3D3D; + private static final int VERSION = 0x0002; + private static final int EDITKEYFRAME = 0xB000; + +// Sub defines of EDITOR + private static final int MATERIAL = 0xAFFF; + private static final int OBJECT = 0x4000; + +// Sub defines of MATERIAL + private static final int MATNAME = 0xA000; + private static final int MATDIFFUSE = 0xA020; + private static final int MATMAP = 0xA200; + private static final int MATMAPFILE = 0xA300; + + private static final int OBJECT_MESH = 0x4100; + +// Sub defines of OBJECT_MESH + private static final int OBJECT_VERTICES = 0x4110; + private static final int OBJECT_FACES = 0x4120; + private static final int OBJECT_MATERIAL = 0x4130; + private static final int OBJECT_UV = 0x4140; + +// File reader + private File file; + private boolean loaded = false; + private FileInputStream fileInputStream; + private DataInputStream dataInputStream; + +// Global chunks + private Chunk currentChunk, tempChunk; + + // Constructor + public Loader3DS() + { + currentChunk = new Chunk(); + tempChunk = new Chunk(); + } + + // Verified + public boolean load(Model3DS model, String fileName) + { + String strMessage; + + file = new File(fileName); + try { + fileInputStream = new FileInputStream(file); + dataInputStream = new DataInputStream(fileInputStream); + } catch (IOException e) { + System.err.println("Error: File IO error in: Import 3DS"); + return false; + } + + readChunkHeader(currentChunk); + + if (currentChunk.id != PRIMARY) { + System.err.println("Unable to load PRIMARY chuck from file!"); + return false; + } + + processNextChunk(model, currentChunk); + + computeNormals(model); + + try { + dataInputStream.close(); + fileInputStream.close(); + } catch (IOException e) { + System.err.println("Error: File IO error in: Closing File"); + return false; + } + + loaded = true; + + return loaded; + } + + // Verified + void processNextChunk(Model3DS model, Chunk previousChunk) + { + int version = 0; + byte buffer[] = null; + + currentChunk = new Chunk(); + + try { + while (previousChunk.bytesRead < previousChunk.length) { + readChunkHeader(currentChunk); + + switch (currentChunk.id) { + case VERSION: + version = swap(dataInputStream.readInt()); + currentChunk.bytesRead += 4; + + if (version > 0x03) + System.err.println("This 3DS file is over version 3 so it may load incorrectly"); + break; + + case EDITOR: + readChunkHeader(tempChunk); + buffer = new byte[tempChunk.length - tempChunk.bytesRead]; + tempChunk.bytesRead += dataInputStream.read(buffer, 0, tempChunk.length - tempChunk.bytesRead); + currentChunk.bytesRead += tempChunk.bytesRead; + processNextChunk(model, currentChunk); + break; + + case MATERIAL: + Material mat = new Material(); + model.addMaterial(mat); + processNextMaterialChunk(model, mat, currentChunk); + break; + + case OBJECT: + Obj obj = new Obj(); + obj.strName = getString(currentChunk); + model.addObject(obj); + processNextObjectChunk(model, obj, currentChunk); + break; + +// case EDITKEYFRAME: +// break; + + default: + buffer = new byte[currentChunk.length - currentChunk.bytesRead]; + currentChunk.bytesRead += dataInputStream.read(buffer, 0, currentChunk.length - currentChunk.bytesRead); + break; + } + previousChunk.bytesRead += currentChunk.bytesRead; + } + } + catch (IOException e) { + System.err.println("Error: File IO error in: Process Next Chunk"); + return; + } + currentChunk = previousChunk; + } + + // Verified + private void readChunkHeader(Chunk chunk) + { + byte buffer[] = new byte[2]; + + try { + chunk.id = swap(dataInputStream.readShort()); + chunk.id &= 0x0000FFFF; + chunk.bytesRead = 2; + chunk.length = swap(dataInputStream.readInt()); + chunk.bytesRead += 4; + + } catch (IOException e) { + System.err.println("Error: File IO error in: Read Chunk Header"); + return; + } + } + + // Verified + private void processNextObjectChunk(Model3DS model, Obj object, Chunk previousChunk) + { + byte buffer[] = null; + + currentChunk = new Chunk(); + + try { + while (previousChunk.bytesRead < previousChunk.length) { + readChunkHeader(currentChunk); + + switch (currentChunk.id) { + case OBJECT_MESH: + processNextObjectChunk(model, object, currentChunk); + break; + + case OBJECT_VERTICES: + readVertices(object, currentChunk); + break; + + case OBJECT_FACES: + readFaceList(object, currentChunk); + break; + + case OBJECT_MATERIAL: + readObjectMaterial(model, object, currentChunk); + break; + + case OBJECT_UV: + readUVCoordinates(object, currentChunk); + break; + + default: + buffer = new byte[currentChunk.length - currentChunk.bytesRead]; + currentChunk.bytesRead += dataInputStream.read(buffer, 0, currentChunk.length - currentChunk.bytesRead); + break; + } + previousChunk.bytesRead += currentChunk.bytesRead; + } + } + catch (IOException e) { + System.err.println("Error: File IO error in: Process Next Object Chunk"); + return; + } + + currentChunk = previousChunk; + } + + // Verified + private void processNextMaterialChunk(Model3DS model, Material material, Chunk previousChunk) + { + byte buffer[] = null; + + currentChunk = new Chunk(); + + try { + while (previousChunk.bytesRead < previousChunk.length) { + readChunkHeader(currentChunk); + + switch (currentChunk.id) + { + case MATNAME: + material.strName = getString(currentChunk); + buffer = new byte[currentChunk.length - currentChunk.bytesRead]; + currentChunk.bytesRead += dataInputStream.read(buffer, 0, currentChunk.length - currentChunk.bytesRead); + break; + + case MATDIFFUSE: + readColorChunk(material, currentChunk); + break; + + case MATMAP: + processNextMaterialChunk(model, material, currentChunk); + break; + + case MATMAPFILE: + material.strFile = getString(currentChunk); + buffer = new byte[currentChunk.length - currentChunk.bytesRead]; + currentChunk.bytesRead += dataInputStream.read(buffer, 0, currentChunk.length - currentChunk.bytesRead); + break; + + default: + buffer = new byte[currentChunk.length - currentChunk.bytesRead]; + currentChunk.bytesRead += dataInputStream.read(buffer, 0, currentChunk.length - currentChunk.bytesRead); + break; + } + + previousChunk.bytesRead += currentChunk.bytesRead; + } + } catch (IOException e) { + System.err.println("Error: File IO error in: Process Next Material Chunk"); + return; + } + currentChunk = previousChunk; + } + + // Verified + private void readObjectMaterial(Model3DS model, Obj object, Chunk previousChunk) + { + String strMaterial = new String(); + byte buffer[] = null; + + strMaterial = getString(previousChunk); + + for (int i=0; i 0) + object.hasTexture = true; + break; + } + } + + try { + buffer = new byte[previousChunk.length - previousChunk.bytesRead]; + previousChunk.bytesRead += dataInputStream.read(buffer, 0, previousChunk.length - previousChunk.bytesRead); + } + catch (IOException e) { + System.err.println("Error: File IO error in: Read Object Material"); + return; + } + } + + // Verified + private void readUVCoordinates(Obj object, Chunk previousChunk) + { + try { + object.numTexVertex = swap(dataInputStream.readShort()); + previousChunk.bytesRead += 2; + + object.texVerts = new Vec3[object.numTexVertex]; + for (int i=0; i> 8) & 0xff; + + return (short) (b1 << 8 | b2 << 0); + } + + private static int swap(int value) + { + int b1 = (value >> 0) & 0xff; + int b2 = (value >> 8) & 0xff; + int b3 = (value >> 16) & 0xff; + int b4 = (value >> 24) & 0xff; + + return b1 << 24 | b2 << 16 | b3 << 8 | b4 << 0; + } + + private static long swap(long value) + { + long b1 = (value >> 0) & 0xff; + long b2 = (value >> 8) & 0xff; + long b3 = (value >> 16) & 0xff; + long b4 = (value >> 24) & 0xff; + long b5 = (value >> 32) & 0xff; + long b6 = (value >> 40) & 0xff; + long b7 = (value >> 48) & 0xff; + long b8 = (value >> 56) & 0xff; + + return b1 << 56 | b2 << 48 | b3 << 40 | b4 << 32 | + b5 << 24 | b6 << 16 | b7 << 8 | b8 << 0; + } + + private static float swap(float value) + { + int intValue = Float.floatToIntBits(value); + intValue = swap(intValue); + return Float.intBitsToFloat(intValue); + } + + private static double swap(double value) + { + long longValue = Double.doubleToLongBits(value); + longValue = swap(longValue); + return Double.longBitsToDouble(longValue); + } +} + diff --git a/src/net/java/joglutils/ThreeDS/Material.java b/src/net/java/joglutils/ThreeDS/Material.java new file mode 100644 index 0000000..8c817b9 --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Material.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +public class Material +{ + public String strName = new String(); + public String strFile = new String(); + public byte color[] = new byte[3]; + public int texureId; + public float uTile; + public float vTile; + public float uOffset; + public float vOffset; +} \ No newline at end of file diff --git a/src/net/java/joglutils/ThreeDS/Model3DS.java b/src/net/java/joglutils/ThreeDS/Model3DS.java new file mode 100644 index 0000000..c322e15 --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Model3DS.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +import java.util.Vector; + +public class Model3DS +{ + protected Loader3DS loader = new Loader3DS(); + protected Vector materials = new Vector(); + protected Vector objects = new Vector(); + + // Constructor + public Model3DS() + { + } + + // Load the model + public boolean load(String file) + { + if (!loader.load(this, file)) + return false; + + return true; + } + + // Add material + public void addMaterial(Material mat) + { + materials.add(mat); + } + + // Add an object + public void addObject(Obj obj) + { + objects.add(obj); + } + + // Get material + public Material getMaterial(int index) + { + return materials.get(index); + } + + // Get an object + public Obj getObject(int index) + { + return objects.get(index); + } + + // Get the number of objects + public int getNumberOfObjects() + { + return objects.size(); + } + + // Get the number of materials + public int getNumberOfMaterials() + { + return materials.size(); + } +} diff --git a/src/net/java/joglutils/ThreeDS/Obj.java b/src/net/java/joglutils/ThreeDS/Obj.java new file mode 100644 index 0000000..58f1dfa --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Obj.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +public class Obj +{ + public int numOfVerts = 0; + public int numOfFaces = 0; + public int numTexVertex = 0; + public int materialID = 0; + public boolean hasTexture = false; + public String strName = null; + public int indices = 0; + public Vec3 verts[] = null; + public Vec3 normals[] = null; + public Vec3 texVerts[] = null; + public Face faces[] = null; +} \ No newline at end of file diff --git a/src/net/java/joglutils/ThreeDS/Vec3.java b/src/net/java/joglutils/ThreeDS/Vec3.java new file mode 100644 index 0000000..3f390ac --- /dev/null +++ b/src/net/java/joglutils/ThreeDS/Vec3.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.ThreeDS; + +public class Vec3 +{ + public float x,y,z; + + public Vec3() + { + } + + public Vec3(float _x, float _y, float _z) + { + x = _x; + y = _y; + z = _z; + } + + public Vec3(Vec3 v) + { + x = v.x; + y = v.y; + z = v.z; + } +} \ No newline at end of file diff --git a/src/net/java/joglutils/test3ds/Main.java b/src/net/java/joglutils/test3ds/Main.java new file mode 100644 index 0000000..a36f98b --- /dev/null +++ b/src/net/java/joglutils/test3ds/Main.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.test3ds; + +import com.sun.opengl.util.Animator; +import java.awt.Frame; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.media.opengl.GL; +import javax.media.opengl.GLAutoDrawable; +import javax.media.opengl.GLCanvas; +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLDrawableFactory; +import javax.media.opengl.GLEventListener; +import javax.media.opengl.glu.GLU; + +public class Main { + /** Creates a new instance of Main */ + public Main() { + } + + public static void main(String[] args) + { + Frame frame = new Frame(); + GLCanvas canvas = new GLCanvas(); + canvas.addGLEventListener(new Renderer()); + frame.add(canvas); + frame.add(canvas); + frame.setSize(600, 600); + final Animator animator = new Animator(canvas); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + // Run this on another thread than the AWT event queue to + // make sure the call to Animator.stop() completes before + // exiting + new Thread(new Runnable() { + public void run() { + animator.stop(); + System.exit(0); + } + }).start(); + } + }); + frame.show(); + animator.start(); + } + + static class Renderer implements GLEventListener + { + private MyModel model = new MyModel(); + + public void display(GLAutoDrawable gLDrawable) + { + final GL gl = gLDrawable.getGL(); + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + gl.glLoadIdentity(); + + gl.glPushMatrix(); + gl.glScalef(0.000004f, 0.000004f, 0.000004f); + model.render(gLDrawable); + gl.glPopMatrix(); + + gl.glFlush(); + } + + + /** Called when the display mode has been changed. !! CURRENTLY UNIMPLEMENTED IN JOGL !! + * @param gLDrawable The GLDrawable object. + * @param modeChanged Indicates if the video mode has changed. + * @param deviceChanged Indicates if the video device has changed. + */ + public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {} + + /** Called by the drawable immediately after the OpenGL context is + * initialized for the first time. Can be used to perform one-time OpenGL + * initialization such as setup of lights and display lists. + * @param gLDrawable The GLDrawable object. + */ + public void init(GLAutoDrawable gLDrawable) + { + final GL gl = gLDrawable.getGL(); + + gl.glClearColor(0.0f, 0.0f, 0.0f, 0.3f); + gl.glClearDepth(1.0f); + gl.glEnable(GL.GL_DEPTH_TEST); + gl.glDepthFunc(GL.GL_LEQUAL); + gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); + + if (!model.isLoaded()) + model.load(gLDrawable, "globe.3ds"); + } + + + /** Called by the drawable during the first repaint after the component has + * been resized. The client can update the viewport and view volume of the + * window appropriately, for example by a call to + * GL.glViewport(int, int, int, int); note that for convenience the component + * has already called GL.glViewport(int, int, int, int)(x, y, width, height) + * when this method is called, so the client may not have to do anything in + * this method. + * @param gLDrawable The GLDrawable object. + * @param x The X Coordinate of the viewport rectangle. + * @param y The Y coordinate of the viewport rectanble. + * @param width The new width of the window. + * @param height The new height of the window. + */ + public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) + { + final GL gl = gLDrawable.getGL(); + final GLU glu = new GLU(); + + if (height <= 0) // avoid a divide by zero error! + height = 1; + final float h = (float)width / (float)height; + gl.glViewport(0, 0, width, height); + gl.glMatrixMode(GL.GL_PROJECTION); + gl.glLoadIdentity(); + gl.glOrtho(-1000, 1000, -1000, 1000, -10000, 10000); + gl.glMatrixMode(GL.GL_MODELVIEW); + gl.glLoadIdentity(); + } + } +} diff --git a/src/net/java/joglutils/test3ds/MyModel.java b/src/net/java/joglutils/test3ds/MyModel.java new file mode 100644 index 0000000..0fbd2f0 --- /dev/null +++ b/src/net/java/joglutils/test3ds/MyModel.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2006 Greg Rodgers All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * The names of Greg Rodgers, Sun Microsystems, Inc. or the names of + * contributors may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ERIK TOLLERUD, + * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN + * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT + * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN + * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + */ + +package net.java.joglutils.test3ds; + +import net.java.joglutils.ThreeDS.*; +import com.sun.opengl.util.texture.Texture; +import com.sun.opengl.util.texture.TextureCoords; +import com.sun.opengl.util.texture.TextureIO; +import java.io.File; +import java.io.IOException; +import javax.media.opengl.GL; +import javax.media.opengl.GLAutoDrawable; + +public class MyModel extends Model3DS +{ + private Texture[] texture; + private TextureCoords[] textureCoords; + private int compiledList; + private boolean loaded = false; + + // Constructor + public MyModel() + { + } + + public boolean isLoaded() + { + return loaded; + } + + public boolean load(GLAutoDrawable gLDrawable, String file) + { + if (!super.load(file)) + return false; + + GL gl = gLDrawable.getGL(); + int numMaterials = materials.size(); + + texture = new Texture[numMaterials]; + for (int i=0; i