diff options
Diffstat (limited to 'src/classes/share/com/sun/j3d/loaders')
44 files changed, 0 insertions, 11453 deletions
diff --git a/src/classes/share/com/sun/j3d/loaders/IncorrectFormatException.java b/src/classes/share/com/sun/j3d/loaders/IncorrectFormatException.java deleted file mode 100644 index 6926e86..0000000 --- a/src/classes/share/com/sun/j3d/loaders/IncorrectFormatException.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - - -/** - * Exception used to indicate that a file of the incorrect - * type was passed to a loader. - */ -public class IncorrectFormatException extends RuntimeException { - - public IncorrectFormatException() { - super(); - } - - public IncorrectFormatException(String s) { - super(s); - } -} - diff --git a/src/classes/share/com/sun/j3d/loaders/Loader.java b/src/classes/share/com/sun/j3d/loaders/Loader.java deleted file mode 100644 index a2634c7..0000000 --- a/src/classes/share/com/sun/j3d/loaders/Loader.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - -import java.io.FileNotFoundException; -import java.io.Reader; -import java.net.URL; - -/** - * The Loader interface is used to specify the location - * and elements of a file format to load. - * The interface is used to give loaders of various - * file formats a common public interface. Ideally - * the Scene interface will be implemented to give - * the user a consistent interface to extract the - * data. - * - * @see com.sun.j3d.loaders.Scene - */ -public interface Loader { - - // These are the values to be used in constructing the - // load flags for the loader. Users should OR the selected - // values together to construct an aggregate flag integer - // (see the setFlags() method). Users wishing to load all - // data in a file should use the LOAD_ALL specifier. - - /** This flag enables the loading of light objects into the scene.*/ - public static final int LOAD_LIGHT_NODES = 1; - - /** This flag enables the loading of fog objects into the scene.*/ - public static final int LOAD_FOG_NODES = 2; - - /** This flag enables the loading of background objects into the scene.*/ - public static final int LOAD_BACKGROUND_NODES = 4; - - /** This flag enables the loading of behaviors into the scene.*/ - public static final int LOAD_BEHAVIOR_NODES = 8; - - /** This flag enables the loading of view (camera) objects into - * the scene.*/ - public static final int LOAD_VIEW_GROUPS = 16; - - /** This flag enables the loading of sound objects into the scene.*/ - public static final int LOAD_SOUND_NODES = 32; - - /** This flag enables the loading of all objects into the scene.*/ - public static final int LOAD_ALL = 0xffffffff; - - - // Loading methods - - /** - * This method loads the named file and returns the Scene - * containing the scene. Any data files referenced by this - * file should be located in the same place as the named file; - * otherwise users should specify an alternate base path with - * the setBasePath(String) method. - */ - public Scene load(String fileName) throws FileNotFoundException, - IncorrectFormatException, ParsingErrorException; - - /** - * This method loads the named file and returns the Scene - * containing the scene. Any data files referenced by the Reader - * should be located in the same place as the named file; otherwise, - * users should specify an alternate base path with the setBaseUrl(URL) - * method. - */ - public Scene load(URL url) throws FileNotFoundException, - IncorrectFormatException, ParsingErrorException; - - /** - * This method loads the Reader and returns the Scene - * containing the scene. Any data files referenced by the Reader should - * be located in the user's current working directory. - */ - public Scene load(Reader reader) - throws FileNotFoundException, IncorrectFormatException, - ParsingErrorException; - - - // Variable get/set methods - - /** - * This method sets the base URL name for data files associated with - * the file passed into the load(URL) method. - * The basePath should be null by default, which is an indicator - * to the loader that it should look for any associated files starting - * from the same directory as the file passed into the load(URL) method. - */ - public void setBaseUrl(URL url); - - /** - * This method sets the base path name for data files associated with - * the file passed into the load(String) method. - * The basePath should be null by default, which is an indicator - * to the loader that it should look for any associated files starting - * from the same directory as the file passed into the load(String) - * method. - */ - public void setBasePath(String pathName); - - /** - * Returns the current base URL setting. By default this is null, - * implying the loader should look for associated files starting - * from the same directory as the file passed into the load(URL) method. - */ - public URL getBaseUrl(); - - /** - * Returns the current base path setting. By default this is null, - * implying the loader should look for associated files starting - * from the same directory as the file passed into the load(String) - * method. - */ - public String getBasePath(); - - /** - * This method sets the load flags for the file. The flags should - * equal 0 by default (which tells the loader to only load geometry). - * To enable the loading of any particular scene elements, pass - * in a logical OR of the LOAD values specified above. - */ - public void setFlags(int flags); - - /** - * Returns the current loading flags setting. - */ - public int getFlags(); -} - - - diff --git a/src/classes/share/com/sun/j3d/loaders/LoaderBase.java b/src/classes/share/com/sun/j3d/loaders/LoaderBase.java deleted file mode 100644 index ec12cb4..0000000 --- a/src/classes/share/com/sun/j3d/loaders/LoaderBase.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - -import java.net.URL; - -/** - * This class implements the Loader interface. To use - * a file loader would extend this class. - */ -public abstract class LoaderBase implements Loader { - - /** Stores the types of objects that the user wishes to load.*/ - protected int loadFlags = 0; - - /** Stores the baseUrl for data files associated with the URL - * passed into load(URL).*/ - protected URL baseUrl = null; - - /** Stores the basePath for data files associated with the file - * passed into load(String).*/ - protected String basePath = null; - - // Constructors - - /** - * Constructs a Loader with default values for all variables. - */ - public LoaderBase() { - } - - /** - * Constructs a Loader with the specified flags word. - */ - public LoaderBase(int flags) { - loadFlags = flags; - } - - - // Variable get/set methods - - /** - * This method sets the base URL name for data files associated with - * the file. The baseUrl should be null by default, which is an indicator - * to the loader that it should look for any associated files starting - * from the same place as the URL passed into the load(URL) method. - * Note: Users of setBaseUrl() would then use load(URL) - * as opposed to load(String). - */ - @Override - public void setBaseUrl(URL url) { - baseUrl = url; - } - - /** - * This method sets the base path name for data files associated with - * the file. The basePath should be null by default, which is an indicator - * to the loader that it should look for any associated files starting - * from the same directory as the file passed into the load(String) - * method. - * Note: Users of setBasePath() would then use load(String) - * as opposed to load(URL). - */ - @Override - public void setBasePath(String pathName) { - basePath = pathName; - } - - /** - * Returns the current base URL setting. - */ - @Override - public URL getBaseUrl() { - return baseUrl; - } - - /** - * Returns the current base path setting. - */ - @Override - public String getBasePath() { - return basePath; - } - - /** - * This method sets the load flags for the file. The flags should - * equal 0 by default (which tells the loader to only load geometry). - */ - @Override - public void setFlags(int flags) { - loadFlags = flags; - } - - /** - * Returns the current loading flags setting. - */ - @Override - public int getFlags() { - return loadFlags; - } - -} - - - - - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/ParsingErrorException.java b/src/classes/share/com/sun/j3d/loaders/ParsingErrorException.java deleted file mode 100644 index f046b58..0000000 --- a/src/classes/share/com/sun/j3d/loaders/ParsingErrorException.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - - -/** - * Exception used to indicate that the loader encountered - * a problem parsing the specified file. - */ -public class ParsingErrorException extends RuntimeException { - - public ParsingErrorException() { - super(); - } - - public ParsingErrorException(String s) { - super(s); - } -} - diff --git a/src/classes/share/com/sun/j3d/loaders/Scene.java b/src/classes/share/com/sun/j3d/loaders/Scene.java deleted file mode 100644 index 901a9ca..0000000 --- a/src/classes/share/com/sun/j3d/loaders/Scene.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - -import java.util.Hashtable; - -import javax.media.j3d.Background; -import javax.media.j3d.Behavior; -import javax.media.j3d.BranchGroup; -import javax.media.j3d.Fog; -import javax.media.j3d.Light; -import javax.media.j3d.Sound; -import javax.media.j3d.TransformGroup; - - -/** - * The Scene interface is a set of methods used to extract - * Java 3D scene graph information from a file loader utility. - * The interface is used to give loaders of various - * file formats a common public interface. - */ -public interface Scene { - - - /** - * This method returns the BranchGroup containing the overall - * scene loaded by the loader. All enabled items will be loaded - * into this scene except for Behaviors (the Behavior group must be - * retrieved separately so that users can choose whether and when - * to activate behaviors). - */ - public BranchGroup getSceneGroup(); - - /** - * This method returns an array of all View Groups defined in the file. - * Each View Group is a TransformGroup that is already placed within - * the scene that is returned in the getSceneGroup() call. This - * TransformGroup holds the position/orientation of the view - * as defined by the file. A user might request these references to - * the groups in order to look at the data stored there or - * to place ViewPlatforms within these groups and allow the - * View to activate these ViewPlatforms so that the user would - * see the scene from the viewpoints defined in the file. - */ - public TransformGroup[] getViewGroups(); - - /** - * This method returns an array of floats with the horizontal field - * of view. The entries in the array will correspond to those in the - * array returned by the method getViewGroups. The entries from these - * two arrays together provide all the information needed to recreate - * the viewing parameters associated with a scene graph. - */ - public float[] getHorizontalFOVs(); - - /** - * This method returns an array of all Lights defined in the file. - * If no lights are defined, null is returned. - */ - public Light[] getLightNodes(); - - /** - * This method returns a Hashtable which contains a list of all named - * objects in the file and their associated scene graph objects. The - * naming scheme for file objects is file-type dependent, but may include - * such names as the DEF names of Vrml or filenames of objects (as - * in Lightwave 3D). If no named objects are defined, null is returned. - */ - public Hashtable getNamedObjects(); - - /** - * This method returns an array of all Background nodes defined in the - * file. IF no Background nodes are defined, null is returned. - */ - public Background[] getBackgroundNodes(); - - /** - * This method returns an array of all Fog nodes defined in the - * file. If no fog nodes are defined, null is returned. - */ - public Fog[] getFogNodes(); - - /** - * This method returns an array of all the behavior nodes - * in the scene. If no Behavior nodes are defined, null is returned. - */ - public Behavior[] getBehaviorNodes(); - - /** - * This method returns an array of all of the Sound nodes defined - * in the file. If no Sound nodes are defined, null is returned. - */ - public Sound[] getSoundNodes(); - - /** - * This method returns the text description of the file. If no - * such description exists, this method should return null. - */ - public String getDescription(); - -} - - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/SceneBase.java b/src/classes/share/com/sun/j3d/loaders/SceneBase.java deleted file mode 100644 index bb3794d..0000000 --- a/src/classes/share/com/sun/j3d/loaders/SceneBase.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders; - -import java.util.Hashtable; -import java.util.Vector; - -import javax.media.j3d.Background; -import javax.media.j3d.Behavior; -import javax.media.j3d.BranchGroup; -import javax.media.j3d.Fog; -import javax.media.j3d.Light; -import javax.media.j3d.Sound; -import javax.media.j3d.TransformGroup; - - -/** - * This class implements the Scene interface and extends it to incorporate - * utilities that could be used by loaders. There should be little need - * for future loaders to subclass this, or to implement Scene directly, - * as the functionality of a SceneBase is fairly straightforward. This - * class is responsible for both the storage and retrieval of data from - * the Scene. The storage methods (used only by Loader writers) are all - * of the add* routines. The retrieval methods (used primarily by Loader - * users) are all of the get* routines. - */ -public class SceneBase implements Scene { - - BranchGroup sceneGroup = null; - BranchGroup behaviorGroup = null; - Hashtable namedObjects = new Hashtable(); - String description = null; - - Vector viewVector = new Vector(); - Vector hfovVector = new Vector(); - Vector behaviorVector = new Vector(); - Vector lightVector = new Vector(); - Vector fogVector = new Vector(); - Vector backgroundVector = new Vector(); - Vector soundVector = new Vector(); - - // Add methods - - /** - * Sets the sceneGroup to be the group that is passed in. - */ - public void setSceneGroup(BranchGroup scene) { - sceneGroup = scene; - } - - /** - * Adds the given group to the list of view groups. - */ - public void addViewGroup(TransformGroup tg) { - viewVector.addElement(tg); - } - - /** - * Adds the given field of view value to the list of field of view values. - */ - public void addHorizontalFOV(float hfov) { - hfovVector.addElement(new Float(hfov)); - } - - /** - * Adds the given behavior to a list of behaviors - */ - public void addBehaviorNode(Behavior b) { - behaviorVector.addElement(b); - } - - /** - * Adds the given Light node to the list of lights. - */ - public void addLightNode(Light light) { - lightVector.addElement(light); - } - - /** - * Adds the given Background node to the list of backgrounds. - */ - public void addBackgroundNode(Background background) { - backgroundVector.addElement(background); - } - - /** - * Adds the given Sound node to the list of sounds. - */ - public void addSoundNode(Sound sound) { - soundVector.addElement(sound); - } - - /** - * Adds the given Fog node to the list of fog nodes. - */ - public void addFogNode(Fog fog) { - fogVector.addElement(fog); - } - - /** - * Sets the text description of the scene to the passed in String. - */ - public void addDescription(String descriptionString) { - description = descriptionString; - } - - /** - * Adds the given String/Object pair to the table of named objects. - */ - public void addNamedObject(String name, Object object) { - if (namedObjects.get(name) == null) - namedObjects.put(name, object); - else { - // key already exists - append a unique integer to end of name - int nameIndex = 1; - boolean done = false; - while (!done) { - // Iterate starting from "[1]" until we find a unique key - String tempName = name + "[" + nameIndex + "]"; - if (namedObjects.get(tempName) == null) { - namedObjects.put(tempName, object); - done = true; - } - nameIndex++; - } - } - } - - /** - * This method returns the BranchGroup containing the overall - * scene loaded by the loader. - */ - @Override - public BranchGroup getSceneGroup() { - return sceneGroup; - } - - - /** - * This method returns an array of all View Groups defined in the file. - * A View Group is defined as a TransformGroup which contains a - * ViewPlatform. The TransformGroup holds the position/orientation - * information for the given ViewPlatform and the ViewPlatform - * holds an view-specific information, such as Field of View. - */ - @Override - public TransformGroup[] getViewGroups() { - if (viewVector.isEmpty()) - return null; - TransformGroup[] viewGroups = new TransformGroup[viewVector.size()]; - viewVector.copyInto(viewGroups); - return viewGroups; - } - - /** - * This method returns an array of floats that contains the horizontal - * field of view values for each corresponding entry in the array of - * view groups returned by the method getViewGroups. - */ - @Override - public float[] getHorizontalFOVs() { - if (hfovVector.isEmpty()) - return null; - - int arraySize = hfovVector.size(); - float[] hfovs = new float[arraySize]; - Float[] tmpFovs = new Float[hfovVector.size()]; - hfovVector.copyInto(tmpFovs); - - // copy to array of floats and delete Floats - for (int i=0; i<arraySize; i++) { - hfovs[i] = tmpFovs[i].floatValue(); - tmpFovs[i] = null; - } - return hfovs; - } - - - /** - * This method returns an array of all Lights defined in the file. - */ - @Override - public Light[] getLightNodes() { - if (lightVector.isEmpty()) - return null; - Light[] lightNodes = new Light[lightVector.size()]; - lightVector.copyInto(lightNodes); - return lightNodes; - } - - - /** - * This method returns a Hashtable which contains a list of all named - * objects in the file and their associated scene graph objects. The - * naming scheme for file objects is file-type dependent, but may include - * such names as the DEF names of Vrml or filenames of subjects (as - * in Lightwave 3D). - */ - @Override - public Hashtable getNamedObjects() { - return namedObjects; - } - - - /** - * This method returns an array of all Background nodes defined in the - * file. - */ - @Override - public Background[] getBackgroundNodes() { - if (backgroundVector.isEmpty()) - return null; - Background[] backgroundNodes = new Background[backgroundVector.size()]; - backgroundVector.copyInto(backgroundNodes); - return backgroundNodes; - } - - - /** - * This method returns an array of all Fog nodes defined in the - * file. - */ - @Override - public Fog[] getFogNodes() { - if (fogVector.isEmpty()) - return null; - Fog[] fogNodes = new Fog[fogVector.size()]; - fogVector.copyInto(fogNodes); - return fogNodes; - } - - - /** - * This method returns a group containing all of the Behavior nodes - * in the scene. - */ - @Override - public Behavior[] getBehaviorNodes() { - if (behaviorVector.isEmpty()) - return null; - Behavior[] behaviorNodes = new Behavior[behaviorVector.size()]; - behaviorVector.copyInto(behaviorNodes); - - return behaviorNodes; - } - - - /** - * This method returns an array of all of the Sound nodes defined - * in the file. - */ - @Override - public Sound[] getSoundNodes() { - if (soundVector.isEmpty()) - return null; - Sound[] soundNodes = new Sound[soundVector.size()]; - soundVector.copyInto(soundNodes); - return soundNodes; - } - - - /** - * This method returns the text description of the file. If no - * such description exists, this method should return null. - */ - @Override - public String getDescription() { - return description; - } - -} - - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/DebugOutput.java b/src/classes/share/com/sun/j3d/loaders/lw3d/DebugOutput.java deleted file mode 100644 index e78540d..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/DebugOutput.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - -/** - * This class has utility functions for printing out debugging information. - */ - -class DebugOutput { - - int validOutput = 0; - final static int TRACE = 1, VALUES = 2, MISC = 4, LINE_TRACE = 8; - final static int NONE = 0, EXCEPTION = 16, TIME = 32, WARNING = 64; - - DebugOutput(int outputTypes) { - validOutput = outputTypes; - } - - void setValidOutput(int outputTypes) { - validOutput = outputTypes; - } - - int getValidOutput() { - return validOutput; - } - - void print(int outputType, String theOutput) { - if ((outputType & validOutput) > 0) { - System.out.print(theOutput); - } - } - - void println(int outputType, String theOutput) { - if ((outputType & validOutput) > 0) - System.out.println(theOutput); - } - -} - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/EnvelopeHandler.java b/src/classes/share/com/sun/j3d/loaders/lw3d/EnvelopeHandler.java deleted file mode 100644 index c5a3daf..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/EnvelopeHandler.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.StreamTokenizer; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import com.sun.j3d.loaders.ParsingErrorException; - - -/** - * This class is used in implementing Envelope objects (of which there - * is currently only one - LightIntensity). - * The class is called whenever the parser has encountered - * a token which could have an envelope description. If the - * token simply has a numeric value, this value is stored. - * If, instead, there is an envelope, then the class creates - * the envelope class and parses that information. - */ - -class EnvelopeHandler extends TextfileParser { - - float theValue = 0; - boolean hasValue = false; - boolean hasEnvelope = true; - LwsEnvelope theEnvelope = null; - - /** - * Constructor: This constructor is used if there is no existing - * implementation for this type of envelope. The real constructor - * is called with the generic LwsEnvelope class name, which will - * allow s to parse and ignore the envelope data - */ - EnvelopeHandler(StreamTokenizer st, - int totalFrames, float totalTime) { - this(st, totalFrames, totalTime, - "com.sun.j3d.utils.loaders.lw3d.LwsEnvelope"); - } - - /** - * Constructor: This constructor is called with the name of a class - * that can handle the encountered envelope. This is done so that this - * EnvelopeHandler class can generically call the given class to handle - * the envelope, whether it results in parsing/ignoring the data or - * in actually using the data - */ - EnvelopeHandler(StreamTokenizer st, - int totalFrames, - float totalTime, - String envClassName) throws ParsingErrorException { - try { - theValue = (float)getNumber(st); - hasValue = true; - } - catch (NumberFormatException e) { - if (st.ttype == '(') { - st.pushBack(); - // This code creates a new instance for the given class name - try { - Class envClass = Class.forName(envClassName); - Constructor constructors[] = envClass.getConstructors(); - Constructor con = constructors[0]; - Object args[] = new Object[3]; - args[0] = (Object)st; - args[1] = (Object)(new Integer(totalFrames)); - args[2] = (Object)(new Float(totalTime)); - try { - theEnvelope = (LwsEnvelope)con.newInstance(args); - hasEnvelope = true; - } - catch (InstantiationException e3) { - // Ignore - } - catch (IllegalAccessException e3) { - // Ignore - } - catch (InvocationTargetException e3) { - // Ignore - } - } - catch (ClassNotFoundException e2) { - // Ignore - } - } - } - } -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/FloatValueInterpolator.java b/src/classes/share/com/sun/j3d/loaders/lw3d/FloatValueInterpolator.java deleted file mode 100644 index 2b52e07..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/FloatValueInterpolator.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import javax.media.j3d.Alpha; -import javax.media.j3d.Interpolator; - -import com.sun.j3d.internal.J3dUtilsI18N; - -/** - * This class acts as an interpolator between values specified in a - * floating point array, based on knot values (keyframes) specified in a - * knots array. - */ -abstract class FloatValueInterpolator extends Interpolator { - - private float knots[]; - private int knotsLength; - protected int currentKnotIndex; - protected float currentInterpolationRatio; - protected float values[]; - protected float currentValue; - - /** - * Constructs a new FloatValueInterpolator object. - * @param alpha the alpha object for this interpolator - * @param knots an array of knot values that specify a spline - */ - FloatValueInterpolator(Alpha alpha, float k[], float v[]) { - - super(alpha); - - // Check that first knot = 0.0f - knotsLength = k.length; - if (k[0] < -0.0001 || k[0] > 0.0001) { - throw new IllegalArgumentException(J3dUtilsI18N.getString("FloatValueInterpolator0")); - } - - // Check that last knot = 1.0f - if ((k[knotsLength-1] - 1.0f) < -0.0001 || - (k[knotsLength-1] - 1.0f) > 0.0001) { - - throw new IllegalArgumentException(J3dUtilsI18N.getString("FloatValueInterpolator1")); - } - - // Check to see that knots are in ascending order and copy them - this.knots = new float[knotsLength]; - for (int i = 0; i < knotsLength; i++) { - if ((i > 0) && (k[i] < k[i-1])) { - throw new IllegalArgumentException(J3dUtilsI18N.getString("FloatValueInterpolator2")); - } - this.knots[i] = k[i]; - } - - // check to see that we have the same number of values as knots - if (knotsLength != v.length) { - throw new IllegalArgumentException(J3dUtilsI18N.getString("FloatValueInterpolator3")); - } - - // copy the values - this.values = new float[knotsLength]; - for(int i = 0; i < knotsLength; i++) { - this.values[i] = v[i]; - } - - } - - /** - * This method sets the value at the specified index for - * this interpolator. - * @param index the index to be changed - * @param position the new value at index - */ - void setValue(int index, float value) { - this.values[index] = value; - } - - /** - * This method retrieves the value at the specified index. - * @param index the index of the value requested - * @return the interpolator's value at the index - */ - float getValue(int index) { - return this.values[index]; - } - - /** - * This method computes the bounding knot indices and interpolation value - * "currentValue" given the current value of alpha, the knots[] array and - * the array of values. - * If the index is 0 and there will be no interpolation, both the - * index variable and the interpolation variable are set to 0. - * Otherwise, currentKnotIndex is set to the lower index of the - * two bounding knot points and the currentInterpolationRatio - * variable is set to the ratio of the alpha value between these - * two bounding knot points. - */ - protected void computePathInterpolation() { - float alphaValue = (this.getAlpha()).value(); - - for (int i = 0; i < knotsLength; i++) { - if ((i == 0 && alphaValue <= knots[i]) || - (i > 0 && alphaValue >= knots[i-1] && alphaValue <= knots[i])) { - - if (i==0) { - currentInterpolationRatio = 0f; - currentKnotIndex = 0; - currentValue = values[0]; - } - else { - currentInterpolationRatio = - (alphaValue - knots[i-1])/(knots[i] - knots[i-1]); - currentKnotIndex = i - 1; - currentValue = values[i-1] + - currentInterpolationRatio * (values[i] - values[i-1]); - } - break; - } - } - } - -} - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/ImageScaler.java b/src/classes/share/com/sun/j3d/loaders/lw3d/ImageScaler.java deleted file mode 100644 index 7a7ff2f..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/ImageScaler.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; - -/** - * This class resizes an image to be the nearest power of 2 wide and high. - * This facility now exists inside of the TextureLoader class, so - * ImageScaler should be eliminated at some point. - */ - -class ImageScaler { - - int origW, origH; - Image origImage; - - ImageScaler(Image image, int w, int h) { - origImage = image; - origW = w; - origH = h; - } - - ImageScaler(BufferedImage image) { - origImage = image; - origW = image.getWidth(); - origH = image.getHeight(); - } - - /** - * Utility method to return closes poser of 2 to the given integer - */ - int getClosestPowerOf2(int value) { - - if (value < 1) - return value; - - int powerValue = 1; - for (int i = 1; i < 20; ++i) { - powerValue *= 2; - if (value < powerValue) { - // Found max bound of power, determine which is closest - int minBound = powerValue/2; - if ((powerValue - value) > - (value - minBound)) - return minBound; - else - return powerValue; - } - } - // shouldn't reach here... - return 1; - } - - /** - * Returns an Image that has been scaled from the original image to - * the closest power of 2 - */ - Image getScaledImage() { - int newWidth = getClosestPowerOf2(origW); - int newHeight = getClosestPowerOf2(origH); - - // If the image is already a power of 2 wide/tall, no need to scale - if (newWidth == origW && - newHeight == origH) - return origImage; - - Image scaledImage = null; - - if (origImage instanceof BufferedImage) { - // If BufferedImage, then we have some work to do - BufferedImage origImageB = (BufferedImage)origImage; - scaledImage = - new BufferedImage(newWidth, - newHeight, - origImageB.getType()); - BufferedImage scaledImageB = (BufferedImage)scaledImage; - float widthScale = (float)origW/(float)newWidth; - float heightScale = (float)origH/(float)newHeight; - int origPixels[] = ((DataBufferInt)origImageB.getRaster().getDataBuffer()).getData(); - int newPixels[] = ((DataBufferInt)scaledImageB.getRaster().getDataBuffer()).getData(); - for (int row = 0; row < newHeight; ++row) { - for (int column = 0; column < newWidth; ++column) { - int oldRow = Math.min(origH-1, - (int)((float)(row)* - heightScale + .5f)); - int oldColumn = - Math.min(origW-1, - (int)((float)column*widthScale + .5f)); - newPixels[row*newWidth + column] = - origPixels[oldRow*origW + oldColumn]; - } - } - } - else { - // If regular Image, then the work is done for us - scaledImage = origImage.getScaledInstance(newWidth, - newHeight, - Image.SCALE_DEFAULT); - } - return scaledImage; - } -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/J3dLwoParser.java b/src/classes/share/com/sun/j3d/loaders/lw3d/J3dLwoParser.java deleted file mode 100644 index ea8e048..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/J3dLwoParser.java +++ /dev/null @@ -1,603 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.FileNotFoundException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Vector; - -import javax.media.j3d.Appearance; -import javax.media.j3d.ColoringAttributes; -import javax.media.j3d.GeometryArray; -import javax.media.j3d.Material; -import javax.media.j3d.PointAttributes; -import javax.media.j3d.Shape3D; -import javax.media.j3d.Texture; -import javax.media.j3d.TextureAttributes; -import javax.media.j3d.TransparencyAttributes; -import javax.vecmath.Color3f; -import javax.vecmath.Vector3f; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.utils.geometry.GeometryInfo; -import com.sun.j3d.utils.geometry.NormalGenerator; -import com.sun.j3d.utils.geometry.Stripifier; - - -/** - * This class is responsible for turning Lightwave geometry data into - * Java3D geometry. It is a subclass of LwoObject and calls that - * superclass when first instantiated to parse the binary file and turn it - * into intermediate data structures. J3dLwoParser then goes through - * those data structures and turns them into Java3D objects. For each - * ShapeHolder object created by the parent class, this class retrieves - * the geometry data and associated surface data, creates the - * appropriate Geometry object (usually IndexedTriangleFanArray, - * unless the object is points or lines), including calculating normals for - * the polygons and sets up the Appearance according to the surface - * parameters (including calculating texture coordinates if necessary). - */ - -class J3dLwoParser extends LwoParser { - - float normalCoordsArray[]; - int normalIndicesArray[]; - Shape3D objectShape; - Color3f color, diffuseColor, specularColor, emissiveColor; - float shininess; - Vector objectShapeList = new Vector(); - - /** - * Constructor: Calls LwoObject to parse file and create data structures - */ - J3dLwoParser(String fileName, - int debugVals) throws FileNotFoundException { - super(fileName, debugVals); - } - - J3dLwoParser(URL url, int debugVals) - throws FileNotFoundException { - super(url, debugVals); - } - - @Override - void getSurf(int length) throws FileNotFoundException { - super.getSurf(length); - } - - - /** - * Turns LwoObject's data structures (created from the binary geometry - * file) into Java3d objects - */ - void createJava3dGeometry() throws IncorrectFormatException { - - GeometryArray object; - LwoTexture texture; - - for (Enumeration e = shapeList.elements(); - e.hasMoreElements() ;) { - int vertexFormat = javax.media.j3d.GeometryArray.COORDINATES; - ShapeHolder shape = (ShapeHolder)e.nextElement(); - debugOutputLn(LINE_TRACE, "about to create Arrays for Shape"); - debugOutputLn(VALUES, "shape = " + shape); - shape.createArrays(true); - int vertexCount = shape.coordsArray.length/3; - int indexCount = 0; - if (shape.facetIndices != null) - indexCount = shape.facetIndices.length; - debugOutputLn(VALUES, "numSurf = " + shape.numSurf); - // Find the right surface. Note: surfaces are indexed by - // name. So take this surf number, look up the name of that - // surface in surfaceNameList, then take that name and - // find the matching LwoSurface - String surfName = - (String)surfNameList.elementAt(shape.numSurf - 1); - LwoSurface surf = null; - for (int surfNum = 0; - surfNum < surfaceList.size(); - ++surfNum) { - LwoSurface tempSurf = - (LwoSurface)surfaceList.elementAt(surfNum); - String tempSurfName = tempSurf.surfName; - if (surfName.equals(tempSurfName)) { - surf = tempSurf; - break; - } - } - if (surf == null) { - throw new IncorrectFormatException( - "bad surf for surfnum/name = " + shape.numSurf + ", " + - surfName); - } - debugOutputLn(VALUES, "surf = " + surf); - - // Get the LwoTexture object (if any) for the surface - texture = surf.getTexture(); - - Appearance appearance = new Appearance(); - if (shape.facetSizes[0] == 1) { - // This case happens if the objects are points - // Note that points are colored, not lit - object = new - javax.media.j3d.PointArray(vertexCount, vertexFormat); - object.setCoordinates(0, shape.coordsArray); - ColoringAttributes colorAtt = - new ColoringAttributes(surf.getColor(), - ColoringAttributes.FASTEST); - PointAttributes pointStyle = new PointAttributes(); - pointStyle.setPointSize(1); - - appearance.setColoringAttributes(colorAtt); - appearance.setPointAttributes(pointStyle); - } - else if (shape.facetSizes[0] == 2) { - // This case happens if the objects are lines - // Note that lines are colored, not lit - debugOutputLn(LINE_TRACE, "Creating IndexedLineArray"); - object = new javax.media.j3d.LineArray(vertexCount, - vertexFormat); - object.setCoordinates(0, shape.coordsArray); - ColoringAttributes colorAtt = - new ColoringAttributes(surf.getColor(), - ColoringAttributes.FASTEST); - appearance.setColoringAttributes(colorAtt); - } - else { - // This is the case for any polygonal objects - debugOutputLn(LINE_TRACE, "Creating IndexedTriFanArray"); - // create triFanArray - vertexFormat |= javax.media.j3d.GeometryArray.NORMALS; - - debugOutputLn(LINE_TRACE, "about to process vertices/indices, facetIndices = " + - shape.facetIndices); - if (shape.facetIndices != null) { - float[] textureCoords = null; - int[] textureIndices = null; - - debugOutputLn(LINE_TRACE, "setting vertexCount, normind = " + shape.normalIndices); - // If these are null we're going direct (non-indexed) - debugOutputLn(LINE_TRACE, "vtxcount, format, indcount = " + - vertexCount + ", " + vertexFormat + - ", " + indexCount); - if (texture != null) { - // There's a texture here - need to create the appropriate arrays - // and calculate texture coordinates for the object - vertexFormat |= GeometryArray.TEXTURE_COORDINATE_2; - textureCoords = new float[vertexCount * 2]; - textureIndices = new int[shape.facetIndices.length]; - calculateTextureCoords(texture, shape.coordsArray, - shape.facetIndices, - textureCoords, textureIndices); - debugOutputLn(LINE_TRACE, "textureCoords:"); - debugOutputLn(LINE_TRACE, "texture Coords, Indices.length = " + textureCoords.length + ", " + textureIndices.length); - } - debugOutputLn(LINE_TRACE, "about to create GeometryInfo"); - - // Use the GeometryInfo utility to calculate smooth normals - GeometryInfo gi = - new GeometryInfo(GeometryInfo.TRIANGLE_FAN_ARRAY); - gi.setCoordinates(shape.coordsArray); - gi.setCoordinateIndices(shape.facetIndices); - gi.setStripCounts(shape.facetSizes); - if (texture != null) { - gi.setTextureCoordinateParams(1, 2); - gi.setTextureCoordinates(0, textureCoords); - gi.setTextureCoordinateIndices(0, textureIndices); - } - gi.recomputeIndices(); - NormalGenerator ng = - new NormalGenerator(surf.getCreaseAngle()); - ng.generateNormals(gi); - Stripifier st = new Stripifier(); - st.stripify(gi); - object = gi.getGeometryArray(true, true, false); - debugOutputLn(LINE_TRACE, "done."); - } - else { - // This case is called if LwoObject did not create facet - // indices. This code is not currently used because facet - // indices are always created for polygonal objects - debugOutputLn(LINE_TRACE, - "about to create trifanarray with " + - "vertexCount, facetSizes.len = " + - vertexCount + ", " + - shape.facetSizes.length); - object = new - javax.media.j3d.TriangleFanArray(vertexCount, - vertexFormat, - shape.facetSizes); - object.setCoordinates(0, shape.coordsArray); - object.setNormals(0, shape.normalCoords); - debugOutputLn(VALUES, "passed in normalCoords, length = " + - shape.normalCoords.length); - } - debugOutputLn(LINE_TRACE, "created fan array"); - - // Setup Appearance given the surface parameters - Material material = new Material(surf.getColor(), - surf.getEmissiveColor(), - surf.getDiffuseColor(), - surf.getSpecularColor(), - surf.getShininess()); - material.setLightingEnable(true); - appearance.setMaterial(material); - if (surf.getTransparency() != 0f) { - TransparencyAttributes ta = new TransparencyAttributes(); - ta.setTransparency(surf.getTransparency()); - ta.setTransparencyMode(ta.BLENDED); - appearance.setTransparencyAttributes(ta); - } - if (texture != null) { - debugOutputLn(LINE_TRACE, "texture != null, enable texturing"); - Texture tex = texture.getTexture(); - tex.setEnable(true); - appearance.setTexture(tex); - TextureAttributes ta = new TextureAttributes(); - if (texture.getType().equals("DTEX")) - ta.setTextureMode(TextureAttributes.MODULATE); - else if (texture.getType().equals("CTEX")) - ta.setTextureMode(TextureAttributes.DECAL); - appearance.setTextureAttributes(ta); - } - else { - debugOutputLn(LINE_TRACE, "texture == null, no texture to use"); - } - } - debugOutputLn(LINE_TRACE, "done creating object"); - - // This does gc - shape.nullify(); - - objectShape = new Shape3D(object); - - // Combine the appearance and geometry - objectShape.setAppearance(appearance); - objectShapeList.addElement(objectShape); - } - } - - /** - * Calculate texture coordinates for the geometry given the texture - * map properties specified in the LwoTexture object - */ - void calculateTextureCoords(LwoTexture texture, - float verts[], int indices[], - float[] textureCoords, int[] textureIndices) { - - /* - the actual math in these coord calculations comes directly from - Newtek - they posted sample code to help compute tex coords based - on the type of mapping: - - Here are some simplified code fragments showing how LightWave - computes UV coordinates from X, Y, and Z. If the resulting - UV coordinates are not in the range from 0 to 1, the - appropriate integer should be added to them to bring them into - that range (the fract function should have accomplished - this by subtracting the floor of each number from itself). - Then they can be multiplied by the width and height (in pixels) - of an image map to determine which pixel to look up. The - texture size, center, and tiling parameters are taken right - off the texture control panel. - - - x -= xTextureCenter; - y -= yTextureCenter; - z -= zTextureCenter; - if (textureType == TT_PLANAR) { - s = (textureAxis == TA_X) ? z / zTextureSize + .5 : - x / xTextureSize + .5; - t = (textureAxis == TA_Y) ? -z / zTextureSize + .5 : - -y / yTextureSize + .5; - u = fract(s); - v = fract(t); - } - else if (type == TT_CYLINDRICAL) { - if (textureAxis == TA_X) { - xyztoh(z,x,-y,&lon); - t = -x / xTextureSize + .5; - } - else if (textureAxis == TA_Y) { - xyztoh(-x,y,z,&lon); - t = -y / yTextureSize + .5; - } - else { - xyztoh(-x,z,-y,&lon); - t = -z / zTextureSize + .5; - } - lon = 1.0 - lon / TWOPI; - if (widthTiling != 1.0) - lon = fract(lon) * widthTiling; - u = fract(lon); - v = fract(t); - } - else if (type == TT_SPHERICAL) { - if (textureAxis == TA_X) - xyztohp(z,x,-y,&lon,&lat); - else if (textureAxis == TA_Y) - xyztohp(-x,y,z,&lon,&lat); - else - xyztohp(-x,z,-y,&lon,&lat); - lon = 1.0 - lon / TWOPI; - lat = .5 - lat / PI; - if (widthTiling != 1.0) - lon = fract(lon) * widthTiling; - if (heightTiling != 1.0) - lat = fract(lat) * heightTiling; - u = fract(lon); - v = fract(lat); - } - - support functions: - - void xyztoh(float x,float y,float z,float *h) - { - if (x == 0.0 && z == 0.0) - *h = 0.0; - else { - if (z == 0.0) - *h = (x < 0.0) ? HALFPI : -HALFPI; - else if (z < 0.0) - *h = -atan(x / z) + PI; - else - *h = -atan(x / z); - } - } - - void xyztohp(float x,float y,float z,float *h,float *p) - { - if (x == 0.0 && z == 0.0) { - *h = 0.0; - if (y != 0.0) - *p = (y < 0.0) ? -HALFPI : HALFPI; - else - *p = 0.0; - } - else { - if (z == 0.0) - *h = (x < 0.0) ? HALFPI : -HALFPI; - else if (z < 0.0) - *h = -atan(x / z) + PI; - else - *h = -atan(x / z); - x = sqrt(x * x + z * z); - if (x == 0.0) - *p = (y < 0.0) ? -HALFPI : HALFPI; - else - *p = atan(y / x); - } - } - */ - - debugOutputLn(TRACE, "calculateTextureCoords()"); - // Compute texture coord stuff - float sx = 0, sz = 0, ty = 0, tz = 0; - double s, t; - int textureAxis = texture.getTextureAxis(); - Vector3f textureSize = texture.getTextureSize(); - Vector3f textureCenter = texture.getTextureCenter(); - - String mappingType = texture.getMappingType(); - if (mappingType.startsWith("Cylindrical")) - calculateCylindricalTextureCoords(textureAxis, textureSize, - textureCenter, textureCoords, - textureIndices, - verts, indices); - else if (mappingType.startsWith("Spherical")) - calculateSphericalTextureCoords(textureAxis, - textureCenter, textureCoords, - textureIndices, - verts, indices); - else if (mappingType.startsWith("Planar")) - calculatePlanarTextureCoords(textureAxis, textureSize, - textureCenter, textureCoords, - textureIndices, - verts, indices); - - } - - /** See the comments in calculateTextureCoordinates*/ - double xyztoh(float x,float y,float z) { - if (x == 0.0 && z == 0.0) - return 0.0; - else { - if (z == 0.0) - return (x < 0.0) ? Math.PI/2.0 : -Math.PI/2.0; - else if (z < 0.0) - return -Math.atan(x / z) + Math.PI; - else - return -Math.atan(x / z); - } - } - - /** See the comments in calculateTextureCoordinates*/ - double xyztop(float x,float y,float z) { - double p; - - if (x == 0.0 && z == 0.0) { - if (y != 0.0) - p = (y < 0.0) ? -Math.PI/2 : Math.PI/2; - else - p = 0.0; - } - else { - x = (float)Math.sqrt(x * x + z * z); - if (x == 0.0) - p = (y < 0.0) ? -Math.PI/2 : Math.PI/2; - else - p = Math.atan(y / x); - } - return p; - } - - - /** See the comments in calculateTextureCoordinates*/ - void calculateSphericalTextureCoords(int textureAxis, - Vector3f textureCenter, - float textureCoords[], - int textureIndices[], - float verts[], int indices[]) { - debugOutputLn(TRACE, "calculateSphericalTextureCoords"); - double s, t; - - - for (int i = 0; i < indices.length; ++i) { - float x = verts[3*indices[i]] - textureCenter.x; - float y = verts[3*indices[i]+1] - textureCenter.y; - float z = -(verts[3*indices[i]+2] + textureCenter.z); - if (textureAxis == 1){ // X Axis - s = xyztoh(z, x, -y); - t = xyztop(z,x,-y); - } - else if (textureAxis == 2) { // Y Axis - s = xyztoh(-x,y,z); - t = xyztop(-x,y,z); - } - else { // Z Axis - s = xyztoh(-x,z,-y); - t = xyztop(-x,z,-y); - } - s = 1.0 - s / (2*Math.PI); - t = -(.5 - t / Math.PI); - textureCoords[indices[i]*2] = (float)s; - textureCoords[indices[i]*2 + 1] = (float)t; - textureIndices[i] = indices[i]; - } - } - - /** See the comments in calculateTextureCoordinates*/ - void calculateCylindricalTextureCoords(int textureAxis, - Vector3f textureSize, - Vector3f textureCenter, - float textureCoords[], - int textureIndices[], - float verts[], int indices[]) { - debugOutputLn(TRACE, "calculateCylindricalTextureCoords"); - debugOutputLn(VALUES, "axis, size, center, tc, ti, v, i = " + - textureAxis + ", " + - textureSize + ", " + - textureCenter + ", " + - textureCoords + ", " + - textureIndices + ", " + - verts + ", " + - indices); - double s, t; - - debugOutputLn(VALUES, "Cyl Texture Coords:"); - for (int i = 0; i < indices.length; ++i) { - float x = verts[3*indices[i]] - textureCenter.x; - float y = verts[3*indices[i]+1] - textureCenter.y; - float z = -(verts[3*indices[i]+2] + textureCenter.z); - // Negate z value because we invert geom z's to swap handedness - if (textureAxis == 1) { // X axis - s = xyztoh(z,x,-y); - t = x / textureSize.x + .5; - } - else if (textureAxis == 2) { // Y Axis - s = xyztoh(-x,y,z); - t = y / textureSize.y + .5; - } - else { - s = xyztoh(-x,z,-y); - t = z / textureSize.z + .5; - } - s = 1.0 - s / (2*Math.PI); - textureCoords[indices[i]*2] = (float)s; - textureCoords[indices[i]*2 + 1] = (float)t; - textureIndices[i] = indices[i]; - debugOutputLn(VALUES, "x, y, z = " + - x + ", " + y + ", " + z + " " + - "s, t = " + s + ", " + t); - } - } - - /** See the comments in calculateTextureCoordinates*/ - void calculatePlanarTextureCoords(int textureAxis, Vector3f textureSize, - Vector3f textureCenter, - float textureCoords[], - int textureIndices[], - float verts[], int indices[]) { - debugOutputLn(TRACE, "calculatePlanarTextureCoords"); - debugOutputLn(VALUES, "size, center, axis = " + - textureSize + textureCenter + ", " + textureAxis); - float sx = 0, sz = 0, ty = 0, tz = 0; - double s, t; - - if (textureAxis == 1) { // X Axis - sz = -1.0f / textureSize.z; // Negate because we negate z in geom - ty = 1.0f / textureSize.y; - } - else if (textureAxis == 2) { // Y Axis - sx = 1.0f / textureSize.x; - tz = -1.0f / textureSize.z; // Negate because we negate z in geom - } - else { // Z Axis - sx = 1.0f / textureSize.x; - ty = 1.0f / textureSize.y; - } - - debugOutputLn(VALUES, "Planar Texture Coords:"); - for (int i = 0; i < indices.length; ++i) { - float x = verts[3*indices[i]] - textureCenter.x; - float y = verts[3*indices[i]+1] - textureCenter.y; - float z = verts[3*indices[i]+2] + textureCenter.z; - s = x*sx + z*sz + .5; - t = y*ty + z*tz + .5; - textureCoords[indices[i]*2] = (float)s; - textureCoords[indices[i]*2 + 1] = (float)t; - textureIndices[i] = indices[i]; - debugOutputLn(VALUES, "x, y, z = " + - x + ", " + y + ", " + z + " " + - "s, t = " + s + ", " + t); - } - } - - - Shape3D getJava3dShape() { - return objectShape; - } - - Vector getJava3dShapeList() { - return objectShapeList; - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LWOBFileReader.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LWOBFileReader.java deleted file mode 100644 index dd3a755..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LWOBFileReader.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - -import com.sun.j3d.loaders.ParsingErrorException; - - -class LWOBFileReader extends BufferedInputStream { - - - - // Debugging constants - final static int TRACE = DebugOutput.TRACE; - final static int VALUES = DebugOutput.VALUES; - final static int MISC = DebugOutput.MISC; - final static int LINE_TRACE = DebugOutput.LINE_TRACE; - final static int NONE = DebugOutput.NONE; - final static int EXCEPTION = DebugOutput.EXCEPTION; - - protected DebugOutput debugPrinter; - - protected String theFilename; - - protected int marker; - - - - protected void debugOutputLn(int outputType, String theOutput) { - if (theOutput.equals("")) - debugPrinter.println(outputType, theOutput); - else - debugPrinter.println(outputType, - getClass().getName() + "::" + theOutput); - } // End of debugOutputLn - - - - // Return a string consisting of the next 4 bytes in the file - public String getToken() throws ParsingErrorException { - byte tokenBuffer[] = new byte[4]; - try { - int readResult = read(tokenBuffer, 0, 4); - if (readResult == -1) { - debugOutputLn(LINE_TRACE, "no token - returning null"); - return null; - } - return new String(tokenBuffer); - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "getToken: " + e); - throw new ParsingErrorException(e.getMessage()); - } - } - - - - /** - * Skip ahead amount bytes in the file - */ - public void skipLength(int amount) throws ParsingErrorException { - try { - skip((long)amount); - marker += amount; - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "skipLength: " + e); - throw new ParsingErrorException(e.getMessage()); - } - } - - - - /** - * Read four bytes from the file and return their integer value - */ - public int getInt() throws ParsingErrorException { - try { - int x = 0; - for (int i = 0 ; i < 4 ; i++) { - int readResult = read(); - if (readResult == -1) - throw new ParsingErrorException("Unexpected EOF"); - x = (x << 8) | readResult; - } - return x; - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "getInt: " + e); - throw new ParsingErrorException(e.getMessage()); - } - } - - - - /** - * Read four bytes from the file and return their float value - */ - public float getFloat() throws ParsingErrorException { - return Float.intBitsToFloat(getInt()); - } // End of getFloat - - - - /** - * Returns the name of the file associated with this stream - */ - public String getFilename() { - return theFilename; - } // End of getFilename - - - - /** - * Returns a string read from the file. The string is assumed to - * end with '0'. - */ - public String getString() throws ParsingErrorException { - byte buf[] = new byte[512]; - try { - byte b; - int len = 0; - do { - b = (byte)read(); - buf[len++] = b; - } while (b != 0); - // Have to read an even number of bytes - if (len % 2 != 0) read(); - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "getString: " + e); - throw new ParsingErrorException(e.getMessage()); - } - return new String(buf); - } // End of getString - - - - /** - * Reads an array of xyz values. - */ - public void getVerts(float ar[], int num) throws ParsingErrorException { - for (int i = 0 ; i < num ; i++) { - ar[i * 3 + 0] = getFloat(); - ar[i * 3 + 1] = getFloat(); - ar[i * 3 + 2] = -getFloat(); - } - } // End of getVerts - - - - /** - * Reads two bytes from the file and returns their integer value. - */ - public int getShortInt() throws ParsingErrorException { - int i = 0; - try { - i = read(); - i = (i << 8) | read(); - // Sign extension - if ((i & 0x8000) != 0) i |= 0xffff0000; - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "getShortInt: " + e); - throw new ParsingErrorException(e.getMessage()); - } - return i; - } // End of getShortInt - - - - /** - * Returns the current position in the file - */ - public int getMarker() { - // protected field inherited from BufferedInputStream - return marker; - } // End of getMarker - - - - @Override - public int read() throws IOException { - marker++; - return super.read(); - } // End of read() - - - - @Override - public int read(byte[] buffer, int offset, int count) throws IOException { - int ret = super.read(buffer, offset, count); - if (ret != -1) marker += ret; - return ret; - } // End of read(byte[], int, int) - - - - /** - * Constructor. - */ - public LWOBFileReader(String filename) throws FileNotFoundException { - super(new FileInputStream(filename)); - - // Add constants on this line to get more debug output - debugPrinter = new DebugOutput(127); - - marker = 0; - } // End of constructor - - public LWOBFileReader(java.net.URL url) throws java.io.IOException { - super(url.openStream()); - - // add constants on this line to get more debug output - debugPrinter = new DebugOutput(127); - - marker = 0; - } - -} // End of file LWOBFileReader diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LightIntensityPathInterpolator.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LightIntensityPathInterpolator.java deleted file mode 100644 index aa5a4ff..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LightIntensityPathInterpolator.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.util.Enumeration; - -import javax.media.j3d.Alpha; - -/** - * This Interpolator object modifies the intensity of a Light object - * according to the keyframes in a light intensity envelope - */ -class LightIntensityPathInterpolator extends FloatValueInterpolator { - - LwLightObject theLight; - - LightIntensityPathInterpolator(Alpha alpha, - float knots[], - float values[], - Object target) { - - super(alpha, knots, values); - theLight = (LwLightObject)target; - } - - /** - * This method is invoked by the behavior scheduler every frame. It maps - * the alpha value that corresponds to the current time into the - * appropriate light intensity for that time as obtained by interpolating - * between the light intensity values for each knot point that were passed - * to this class. - * @param criteria enumeration of criteria that have triggered this wakeup - */ - - @Override - public void processStimulus(Enumeration criteria) { - // Handle stimulus - - if (this.getAlpha() != null) { - - // Let FloatValueInterpolator calculate the correct - // interpolated value - computePathInterpolation(); - - // Set light intensity to the value calculated by - // FloatValueInterpolator - if (theLight != null) - theLight.setIntensity(currentValue); - - if ((this.getAlpha()).finished()) - return; - } - - wakeupOn(defaultWakeupCriterion); - - } - -} - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/Lw3dLoader.java b/src/classes/share/com/sun/j3d/loaders/lw3d/Lw3dLoader.java deleted file mode 100644 index 300e0e2..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/Lw3dLoader.java +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StreamTokenizer; -import java.net.URL; -import java.util.Enumeration; -import java.util.Vector; - -import javax.media.j3d.AmbientLight; -import javax.media.j3d.Background; -import javax.media.j3d.Behavior; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.BranchGroup; -import javax.media.j3d.Fog; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Color3f; -import javax.vecmath.Point3d; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.Loader; -import com.sun.j3d.loaders.ParsingErrorException; -import com.sun.j3d.loaders.Scene; -import com.sun.j3d.loaders.SceneBase; - - -/** - * This class implements the Loader API and allows users to load - * Lightwave 3D scene files. In order to load properly, the object - * files referred to in the scene files and the image files referred - * to by the object files must all be specified with path and filenames - * that are valid with respect to the directory in which the application - * is being executed. - */ - -public class Lw3dLoader extends TextfileParser implements Loader { - - Vector objectList; - Vector lightList; - BranchGroup sceneGroupNode; - Color3f ambientColor; - LwsCamera camera = null; - LwsFog fog = null; - LwsBackground background = null; - int loadFlags = 0; - int loadBehaviors = 0; - Vector sceneBehaviors; - SceneBase scene = null; - String basePath = null; - String internalBasePath = null; - URL baseUrl = null; - String internalBaseUrl = null; // store url base as String - static final int FILE_TYPE_NONE = 0; - static final int FILE_TYPE_URL = 1; - static final int FILE_TYPE_FILENAME = 2; - static final int FILE_TYPE_READER = 4; - int fileType = FILE_TYPE_NONE; - - /** - * Default constructor. Sets up default values for some variables. - */ - public Lw3dLoader() { - - ambientColor = new Color3f(0f, 0f, 0f); - objectList = new Vector(); - lightList = new Vector(); - debugPrinter.setValidOutput(0x0); - - } - - /** - * This constructor takes a flags word that specifies which types of - * scenefile items should be loaded into the scene. The possible - * values are specified in the com.sun.j3d.loaders.Loader class. - */ - public Lw3dLoader(int flags) { - - this(); - loadFlags = flags; - loadBehaviors = (loadFlags & Loader.LOAD_BEHAVIOR_NODES); - - } - - /** - * This method loads the named file and returns the Scene - * containing the scene. Any data files referenced by the Reader - * should be located in the same place as the named file; otherwise, - * users should specify an alternate base path with the setBaseUrl(URL) - * method. - */ - @Override - public Scene load(URL url) throws FileNotFoundException, - IncorrectFormatException, ParsingErrorException { - - fileType = FILE_TYPE_URL; - setInternalBaseUrl(url); - InputStreamReader reader; - try { - reader = new InputStreamReader( - new BufferedInputStream(url.openStream())); - } - catch (IOException e) { - throw new FileNotFoundException(e.getMessage()); - } - Scene returnScene = load(reader); - fileType = FILE_TYPE_NONE; - return returnScene; - } - - /** - * This method loads the named file and returns the Scene - * containing the scene. Any data files referenced by this - * file should be located in the same place as the named file; - * otherwise users should specify an alternate base path with - * the setBasePath(String) method. - */ - @Override - public Scene load(String fileName) throws FileNotFoundException, - IncorrectFormatException, ParsingErrorException { - - fileType = FILE_TYPE_FILENAME; - setInternalBasePath(fileName); - Reader reader = new BufferedReader(new FileReader(fileName)); - Scene returnScene = load(reader); - fileType = FILE_TYPE_NONE; - return returnScene; - } - - /** - * This method loads the Reader and returns the Scene - * containing the scene. Any data files referenced by the Reader should - * be located in the user's current working directory. - */ - @Override - public Scene load(Reader reader) throws FileNotFoundException, - IncorrectFormatException, ParsingErrorException { - - if (fileType == FILE_TYPE_NONE) - fileType = FILE_TYPE_READER; - StreamTokenizer tokenizer = new StreamTokenizer(reader); - setupTokenizer(tokenizer); - - getAndCheckString(tokenizer, "LWSC"); - getNumber(tokenizer); - getAndCheckString(tokenizer, "FirstFrame"); - int firstFrame = (int)getNumber(tokenizer); - getAndCheckString(tokenizer, "LastFrame"); - int finalFrame = (int)getNumber(tokenizer); - skipUntilString(tokenizer, "FramesPerSecond"); - double fps = getNumber(tokenizer); - float totalTime = (float)(finalFrame - firstFrame)/(float)fps; - boolean done = false; - while (!done) { - int token; - try { - token = tokenizer.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - switch (tokenizer.ttype) { - case StreamTokenizer.TT_EOF: - done = true; - break; - case StreamTokenizer.TT_WORD: - debugOutputLn(VALUES, " String = " + tokenizer.sval); - if (tokenizer.sval.equals("AddNullObject")) { - LwsObject obj = - new LwsObject(tokenizer, false, - firstFrame, - finalFrame, totalTime, - this, - debugPrinter.getValidOutput()); - obj.createJava3dObject(null, loadBehaviors); - objectList.addElement(obj); - } - else if (tokenizer.sval.equals("LoadObject")) { - String filename = getString(tokenizer); - tokenizer.pushBack(); // push filename token back - debugOutputLn(TIME, "loading " + filename + " at " + - System.currentTimeMillis()); - LwsObject obj = new LwsObject(tokenizer, true, - firstFrame, - finalFrame, totalTime, - this, - debugPrinter.getValidOutput()); - debugOutputLn(TIME, "done loading at " + - System.currentTimeMillis()); - LwsObject cloneObject = null; - for (Enumeration e = objectList.elements() ; - e.hasMoreElements() ;) { - LwsObject tmpObj = (LwsObject)e.nextElement(); - if (tmpObj.fileName != null && - tmpObj.fileName.equals(filename)) { - cloneObject = tmpObj; - break; - } - } - obj.createJava3dObject(cloneObject, loadBehaviors); - objectList.addElement(obj); - } - else if (tokenizer.sval.equals("AmbientColor")) { - ambientColor.x = (float)getNumber(tokenizer)/255f; - ambientColor.y = (float)getNumber(tokenizer)/255f; - ambientColor.z = (float)getNumber(tokenizer)/255f; - } - else if (tokenizer.sval.equals("AmbIntensity")) { - // TODO: must be able to handle envelopes here - float intensity = (float)getNumber(tokenizer); - ambientColor.x *= intensity; - ambientColor.y *= intensity; - ambientColor.z *= intensity; - } - else if (tokenizer.sval.equals("AddLight")) { - LwsLight light = - new LwsLight(tokenizer, - finalFrame, totalTime, - debugPrinter.getValidOutput()); - light.createJava3dObject(loadBehaviors); - lightList.addElement(light); - } - else if (tokenizer.sval.equals("ShowCamera")) { - camera = new LwsCamera(tokenizer, firstFrame, - finalFrame, totalTime, - debugPrinter.getValidOutput()); - camera.createJava3dObject(loadBehaviors); - } - else if (tokenizer.sval.equals("FogType")) { - int fogType = (int)getNumber(tokenizer); - if (fogType != 0) { - fog = new LwsFog(tokenizer, - debugPrinter.getValidOutput()); - fog.createJava3dObject(); - } - } - else if (tokenizer.sval.equals("SolidBackdrop")) { - background = - new LwsBackground(tokenizer, - debugPrinter.getValidOutput()); - background.createJava3dObject(); - } - break; - default: - debugOutputLn(VALUES, " Unknown ttype, token = " + - tokenizer.ttype + ", " + token); - break; - } - } - - // Set up scene groups and parent objects appropriately - sceneGroupNode = new BranchGroup(); - sceneBehaviors = new Vector(); - parentObjects(); - constructScene(); - - return scene; - - } - - - /** - * This method creates the Scene (actually SceneBase) data structure - * and adds all appropriate items to it. This is the data structure - * that the user will get back from the load() call and inquire to - * get data from the scene. - */ - void constructScene() { - - // Construct Scene data structure - scene = new SceneBase(); - - if ((loadFlags & Loader.LOAD_LIGHT_NODES) != 0) { - addLights(); - addAmbient(); - } - - if ((loadFlags & Loader.LOAD_FOG_NODES) != 0) - addFog(); - - if ((loadFlags & Loader.LOAD_BACKGROUND_NODES) != 0) - addBackground(); - - if ((loadFlags & Loader.LOAD_VIEW_GROUPS) != 0) - addCamera(); - - if (loadBehaviors != 0) - addBehaviors(); - - scene.setSceneGroup(sceneGroupNode); - - // now add named objects to the scenes name table - for (Enumeration e = objectList.elements(); e.hasMoreElements() ;) { - - LwsObject obj = (LwsObject)e.nextElement(); - if (obj.fileName != null) - scene.addNamedObject(obj.fileName,(Object)obj.getObjectNode()); - else if (obj.objName != null) - scene.addNamedObject(obj.objName,(Object)obj.getObjectNode()); - - } - } - - - /** - * Creates a url for internal use. This method is not currently - * used (url's are ignored for this loader; only filenames work) - */ - void setInternalBaseUrl(URL url) { -// System.out.println("setInternalBaseUrl url = " + url); - java.util.StringTokenizer stok = - new java.util.StringTokenizer(url.toString(), -// java.io.File.separator); - "\\/"); - int tocount = stok.countTokens()-1; - StringBuffer sb = new StringBuffer(80); - for(int ji = 0; ji < tocount ; ji++) { - String a = stok.nextToken(); - if((ji == 0) && //(!a.equals("file:"))) { - (!a.regionMatches(true, 0, "file:", 0, 5))) { - sb.append(a); - // urls use / on windows also -// sb.append(java.io.File.separator); -// sb.append(java.io.File.separator); - sb.append('/'); - sb.append('/'); - } else { - sb.append(a); - // urls use / on windows also -// sb.append( java.io.File.separator ); - sb.append('/'); - } - } - internalBaseUrl = sb.toString(); -// System.out.println("internalBaseUrl = " + internalBaseUrl); - } - - /** - * Standardizes the filename for use in the loader - */ - void setInternalBasePath(String fileName) { - java.util.StringTokenizer stok = - new java.util.StringTokenizer(fileName, - java.io.File.separator); - int tocount = stok.countTokens()-1; - StringBuffer sb = new StringBuffer(80); - if (fileName!= null && - fileName.startsWith(java.io.File.separator)) - sb.append(java.io.File.separator); - for(int ji = 0; ji < tocount ; ji++) { - String a = stok.nextToken(); - sb.append(a); - sb.append( java.io.File.separator ); - } - internalBasePath = sb.toString(); - } - - String getInternalBasePath() { - return internalBasePath; - } - - String getInternalBaseUrl() { - return internalBaseUrl; - } - - int getFileType() { - return fileType; - } - - /** - * This method parents all objects in the scene appropriately. If - * the scen file specifies a Parent node for the object, then the - * object is parented to that node. If not, then the object is - * parented to the scene's root. - */ - void parentObjects() { - debugOutputLn(TRACE, "parentObjects()"); - for (Enumeration e = objectList.elements(); e.hasMoreElements(); ) { - - LwsObject obj = (LwsObject)e.nextElement(); - if (obj.getParent() != -1) { - - LwsObject parent = (LwsObject) - objectList.elementAt(obj.getParent() - 1); - parent.addChild(obj); - debugOutputLn(VALUES, "added child successfully"); - - } else { - - if (obj.getObjectNode() != null) - sceneGroupNode.addChild(obj.getObjectNode()); - - } - - // Collect all behaviors - if (loadBehaviors != 0) { - if (!(obj.getObjectBehaviors()).isEmpty()) { - sceneBehaviors.addAll(obj.getObjectBehaviors()); - - } - } - } - - debugOutputLn(LINE_TRACE, "Done with parentObjects()"); - - } - - - /** - * This method sets the base URL name for data files - * associated with the file passed into the load(URL) method. - * The basePath should be null by default, which is an - * indicator to the loader that it should look for any - * associated files starting from the same directory as the - * file passed into the load(URL) method. - */ - @Override - public void setBaseUrl(URL url) { - baseUrl = url; - } - - /** - * This method sets the base path to be used when searching for all - * data files within a Lightwave scene. - */ - @Override - public void setBasePath(String pathName) { - // This routine standardizes path names so that all pathnames - // will have standard file separators, they'll end in a separator - // character, and if the user passes in null or "" (meaning to - // set the current directory as the base path), this will become - // "./" (or ".\") - basePath = pathName; - if (basePath == null || basePath == "") - basePath = "." + java.io.File.separator; - basePath = basePath.replace('/', java.io.File.separatorChar); - basePath = basePath.replace('\\', java.io.File.separatorChar); - if (!basePath.endsWith(java.io.File.separator)) - basePath = basePath + java.io.File.separator; - } - - /** - * Returns the current base URL setting. - */ - @Override - public URL getBaseUrl() { - return baseUrl; - } - - /** - * Returns the current base path setting. - */ - @Override - public String getBasePath() { - return basePath; - } - - /** - * This method sets the load flags for the file. The flags should - * equal 0 by default (which tells the loader to only load geometry). - */ - @Override - public void setFlags(int flags) { - loadFlags = flags; - } - - /** - * Returns the current loading flags setting. - */ - @Override - public int getFlags() { - return loadFlags; - } - - - - /** - * getObject() iterates through the objectList checking the given - * name against the fileName and objectName of each object in turn. - * For the filename, it carves off the pathname and just checks the - * final name (e.g., "missile.lwo"). - * If name has []'s at the end, it will use the number inside those - * brackets to pick which object out of an ordered set it will - * send back (objectList is created in the order that objects - * exist in the file, so this order should correspond to the order - * specified by the user). If no []'s exist, just pass back the - * first one encountered that matches. - */ - public TransformGroup getObject(String name) { - debugOutputLn(TRACE, "getObject()"); - int indexNumber = -1; - int currentObjectCount = 0; - String subobjectName = name; - if (name.indexOf("[") != -1) { - // caller wants specifically numbered subjbect; get that number - int bracketsIndex = name.indexOf("["); - subobjectName = name.substring(0, bracketsIndex); - String bracketsString = name.substring(bracketsIndex); - int bracketEndIndex = bracketsString.indexOf("]"); - String indexString = bracketsString.substring(1, bracketEndIndex); - indexNumber = (new Integer(indexString)).intValue(); - } - for (Enumeration e = objectList.elements() ; - e.hasMoreElements() ;) { - LwsObject tempObj = (LwsObject)e.nextElement(); - debugOutputLn(VALUES, "tempObj, file, objname = " + - tempObj + tempObj.fileName + - tempObj.objName); - if ((tempObj.fileName != null && - tempObj.fileName.indexOf(subobjectName) != -1) || - (tempObj.objName != null && - tempObj.objName.indexOf(subobjectName) != -1)) { - if (indexNumber < 0 || - indexNumber == currentObjectCount) - return tempObj.getObjectNode(); - else - currentObjectCount++; - } - } - debugOutputLn(VALUES, " no luck - wanted " + - name + " returning null"); - return null; - } - - - /** - * This method sets up the StreamTokenizer for the scene file. Note - * that we're not parsing numbers as numbers because the tokenizer - * does not interpret scientific notation correctly. - */ - void setupTokenizer(StreamTokenizer tokenizer) { - tokenizer.resetSyntax(); - tokenizer.wordChars('a', 'z'); - tokenizer.wordChars('A', 'Z'); - tokenizer.wordChars(128 + 32, 255); - tokenizer.whitespaceChars(0, ' '); - tokenizer.commentChar('/'); - tokenizer.quoteChar('"'); - tokenizer.quoteChar('\''); - tokenizer.wordChars('0', '9'); - tokenizer.wordChars('.', '.'); - tokenizer.wordChars('-', '-'); - tokenizer.wordChars('/', '/'); - tokenizer.wordChars('\\', '\\'); - tokenizer.wordChars('_', '_'); - tokenizer.wordChars('&', '&'); - tokenizer.ordinaryChar('('); - tokenizer.ordinaryChar(')'); - tokenizer.whitespaceChars('\r', '\r'); - - // add ':' as wordchar so urls will work - tokenizer.wordChars(':', ':'); - // add '~' as wordchar for urls - tokenizer.wordChars('~', '~'); - } - - /** - * Adds Ambient lighting effects to the scene - */ - void addAmbient() { - AmbientLight aLgt = new AmbientLight(ambientColor); - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 100000.0); - aLgt.setInfluencingBounds(bounds); - sceneGroupNode.addChild(aLgt); - // scope ambient light to the lw3d scene - aLgt.addScope(sceneGroupNode); - scene.addLightNode(aLgt); - } - - /** - * Add any defined lights to the java3d scene - */ - void addLights() { - // Add lights to the scene - for (Enumeration e1 = lightList.elements(); e1.hasMoreElements(); ) { - - debugOutputLn(LINE_TRACE, "adding light to scene group"); - LwsLight light = (LwsLight)e1.nextElement(); - - if (light.getObjectNode() != null) { - // scope light to the lw3d scene - light.getLight().addScope(sceneGroupNode); - - if (light.getParent() != -1) { - LwsObject parent = (LwsObject) - objectList.elementAt(light.getParent() - 1); - parent.addChild(light); - } - else { // No parent - add to scene group - sceneGroupNode.addChild(light.getObjectNode()); - - } - - // collect behaviors if LOAD_BEHAVIOR_NODES is set - if (loadBehaviors != 0) { - if (!(light.getObjectBehaviors()).isEmpty()) - sceneBehaviors.addAll(light.getObjectBehaviors()); - - } - - scene.addLightNode(light.getLight()); - } - else - debugOutputLn(LINE_TRACE, "light object null?"); - } - } - - /** - * Adds the Camera's transform group to the scene, either by parenting - * it to the appropriate object or by adding it to the scene root. - * To use this camera data, users can request the camera/view data - * for the scene and can then insert a ViewPlatform in the transform group. - */ - void addCamera() { - // Add camera effects to scene. - if (camera != null) { - if (camera.getParent() != -1) { - debugOutputLn(VALUES, "camera parent = " + - camera.getParent()); - LwsObject parent = (LwsObject) - objectList.elementAt(camera.getParent() - 1); - parent.addChild(camera); - debugOutputLn(VALUES, "added child successfully"); - } - else { - sceneGroupNode.addChild(camera.getObjectNode()); - - } - - // collect behaviors if LOAD_BEHAVIOR_NODES is set - if (loadBehaviors != 0) { - if (!(camera.getObjectBehaviors()).isEmpty()) - sceneBehaviors.addAll(camera.getObjectBehaviors()); - } - - scene.addViewGroup(camera.getObjectNode()); - } - } - - /** - * Add appropriate fog effects to the scene - */ - void addFog() { - if (fog != null) { - Fog fogNode = fog.getObjectNode(); - if (fogNode != null) { - sceneGroupNode.addChild(fogNode); - scene.addFogNode(fogNode); - } - } - } - - /** - * Add the behaviors to the scene - */ - void addBehaviors() { - if (!sceneBehaviors.isEmpty()) { - Enumeration e = sceneBehaviors.elements(); - while (e.hasMoreElements()) { - scene.addBehaviorNode((Behavior)e.nextElement()); - } - } - } - - /** - * Add appropriate background effects to the scene. Note that the java3d - * background may not have all of the information of the lw3d background, - * as the loader does not currently process items such as gradients between - * the horizon and sky colors - */ - void addBackground() { - if (background != null) { - Background bgNode = background.getObjectNode(); - if (bgNode != null) { - sceneGroupNode.addChild(bgNode); - scene.addBackgroundNode(bgNode); - } - } - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwLightObject.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwLightObject.java deleted file mode 100644 index a1affc5..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwLightObject.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import javax.media.j3d.Light; -import javax.vecmath.Color3f; - - -/** - * This class is used to set the Light Intensity value according to the - * keyframe value of the envelope for that light. The class is used in - * conjunction with LightIntensityPathInterpolator, which uses this - * class as the target of its interpolations. - */ - -class LwLightObject { - - float intensity; - Color3f color; - Light theLight; - - LwLightObject(Light theLight, float intensity, Color3f color) { - this.intensity = intensity; - this.color = color; - this.theLight = theLight; - } - - void setIntensity(float intensity) { - Color3f newLightColor = new Color3f(color.x * intensity, - color.y * intensity, - color.z * intensity); - if (theLight != null) - theLight.setColor(newLightColor); - this.intensity = intensity; - } - - void setColor(Color3f color) { - Color3f newLightColor = new Color3f(color.x * intensity, - color.y * intensity, - color.z * intensity); - if (theLight != null) - theLight.setColor(newLightColor); - this.color = color; - } - - void setLight(Light l) { - theLight = l; - Color3f newLightColor = new Color3f(color.x * intensity, - color.y * intensity, - color.z * intensity); - if (theLight != null) - theLight.setColor(newLightColor); - } -} - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoParser.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwoParser.java deleted file mode 100644 index 25f8ab7..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoParser.java +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Vector; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - - -/** - * This class is responsible for parsing a binary Object file and storing - * the data. This class is not called directly, but is the parent class of - * J3dLwoObject. The subclass calls this class to parse the file, then it - * turns the resulting data into Java3D objects. LwoObject instantiates - * an LWOBFileReader object to parse the data. Then the class creates a - * list of ShapeHolder objects to hold all of the vertex/facet data and - * surface references and creates a list of LwoSurface objects to hold - * the data for each surface.<BR> - * Rather than describe in detail how the file is parsed for each method, - * I advise the user of this code to understand the lw3d file format - * specs, which are pretty clear. - */ - -class LwoParser extends ParserObject { - - LWOBFileReader theReader; - int currLength; - float coordsArray[]; - float normalCoordsArray[]; - int facetIndicesArray[]; - int facetSizesArray[]; - int normalIndicesArray[]; - int red = 255, green = 255, blue = 255; - float diffuse = 0.0f, specular = 0.0f, transparency = 0.0f, luminosity = 0.0f; - int gloss = 128; - Vector surfNameList = null; - Vector surfaceList = new Vector(200); - Vector shapeList = new Vector(200); - - /** - * Constructor: Creates file reader and calls parseFile() to actually - * read the file and grab the data - */ - LwoParser(String fileName, int debugVals) - throws FileNotFoundException { - - super(debugVals); - debugOutputLn(TRACE, "parser()"); - long start = System.currentTimeMillis(); - theReader = new LWOBFileReader(fileName); - debugOutputLn(TIME, " file opened in " + - (System.currentTimeMillis() - start)); - parseFile(); - } - - LwoParser(URL url, int debugVals) - throws FileNotFoundException { - super(debugVals); - debugOutputLn(TRACE, "parser()"); - try { - long start = System.currentTimeMillis(); - theReader = new LWOBFileReader(url); - debugOutputLn(TIME, " file opened in " + - (System.currentTimeMillis() - start)); - } - catch (IOException ex) { - throw new FileNotFoundException(url.toString()); - } - parseFile(); - } - - - /** - * Detail polygons are currently not implemented by this loader. Their - * structure in geometry files is a bit complex, so there's this separate - * method for simply parsing through and ignoring the data for detail - * polygons - */ - int skipDetailPolygons(int numPolys) throws ParsingErrorException { - debugOutputLn(TRACE, "skipDetailPolygons(), numPolys = " + numPolys); - int lengthRead = 0; - int vert; - - try { - for (int polyNum = 0; polyNum < numPolys; ++polyNum) { - debugOutputLn(VALUES, "polyNum = " + polyNum); - int numVerts = theReader.getShortInt(); - theReader.skip(numVerts * 2 + 2); // skip indices plus surf - lengthRead += (numVerts * 2) + 4; // increment counter - } - } - catch (IOException e) { - debugOutputLn(EXCEPTION, "Exception in reading detail polys: " + e); - throw new ParsingErrorException(e.getMessage()); - } - return lengthRead; - } - - /** - * Returns already-existing ShapeHolder if one exists with the same - * surface and the same geometry type (point, line, or poly) - */ - ShapeHolder getAppropriateShape(int numSurf, int numVerts) { - for (Enumeration e = shapeList.elements(); - e.hasMoreElements() ;) { - ShapeHolder shape = (ShapeHolder)e.nextElement(); - if (shape.numSurf == numSurf) - if (shape.numVerts == numVerts || - (shape.numVerts > 3 && - numVerts > 3)) - return shape; - } - return null; - } - - - /** - * Parse the file for all the data for a POLS object (polygon - * description) - */ - void getPols(int length) { - debugOutputLn(TRACE, "getPols(len), len = " + length); - int vert; - int lengthRead = 0; - int prevNumVerts = -1; - int prevNumSurf = 0; - Vector facetSizesList; - int facetIndicesArray[]; - facetSizesList = - new Vector(length/6); // worst case size (every poly one vert) - // Note that our array sizes are hardcoded because we don't - // know until we're done how large they will be - facetIndicesArray = new int[length/2]; - ShapeHolder shape = new ShapeHolder(debugPrinter.getValidOutput()); - debugOutputLn(VALUES, "new shape = " + shape); - shape.coordsArray = coordsArray; - shape.facetSizesList = facetSizesList; - //shape.facetIndicesList = facetIndicesList; - shape.facetIndicesArray = facetIndicesArray; - shapeList.addElement(shape); - - //long startTime = (new Date()).getTime(); - boolean firstTime = true; - while (lengthRead < length) { - int numVerts = theReader.getShortInt(); - lengthRead += 2; - int intArray[] = new int[numVerts]; - for (int i = 0; i < numVerts; ++i) { - intArray[i] = theReader.getShortInt(); - lengthRead += 2; - } - - int numSurf = theReader.getShortInt(); - lengthRead += 2; - long startTimeBuff = 0, startTimeList = 0; - if (!firstTime && - (numSurf != prevNumSurf || - ((numVerts != prevNumVerts) && - ((prevNumVerts < 3) || - (numVerts < 3))))) { - // If above true, then start new shape - shape = getAppropriateShape(numSurf, numVerts); - if (shape == null) { - //debugOutputLn(LINE_TRACE, "Starting new shape"); - facetSizesList = new Vector(length/6); - facetIndicesArray = new int[length/2]; - shape = new ShapeHolder(debugPrinter.getValidOutput()); - shape.coordsArray = coordsArray; - shape.facetSizesList = facetSizesList; - //shape.facetIndicesList = facetIndicesList; - shape.facetIndicesArray = facetIndicesArray; - shape.numSurf = numSurf; - shape.numVerts = numVerts; - shapeList.addElement(shape); - } - else { - facetSizesList = shape.facetSizesList; - facetIndicesArray = shape.facetIndicesArray; - } - } - else { - shape.numSurf = numSurf; - shape.numVerts = numVerts; - } - prevNumVerts = numVerts; - prevNumSurf = numSurf; - facetSizesList.addElement(new Integer(numVerts)); - - int currPtr = 0; - System.arraycopy(intArray, 0, - facetIndicesArray, shape.currentNumIndices, - numVerts); - shape.currentNumIndices += numVerts; - if (numSurf < 0) { // neg number means detail poly - int numPolys = theReader.getShortInt(); - lengthRead += skipDetailPolygons(numPolys); - shape.numSurf = ~shape.numSurf & 0xffff; - if (shape.numSurf == 0) - shape.numSurf = 1; // Can't have surface = 0 - } - firstTime = false; - } - } - - /** - * Parses file to get the names of all surfaces. Each polygon will - * be associated with a particular surface number, which is the index - * number of these names - */ - void getSrfs(int length) { - String surfName = new String(); - surfNameList = new Vector(length/2); // worst case size (each name 2 chars long) - int lengthRead = 0; - int stopMarker = theReader.getMarker() + length; - - int surfIndex = 0; - while (theReader.getMarker() < stopMarker) { - debugOutputLn(VALUES, "marker, stop = " + - theReader.getMarker() + ", " + stopMarker); - debugOutputLn(LINE_TRACE, "About to call getString"); - surfName = theReader.getString(); - debugOutputLn(VALUES, "Surfname = " + surfName); - surfNameList.addElement(surfName); - } - } - - /** - * Parses file to get all vertices - */ - void getPnts(int length) throws ParsingErrorException { - int numVerts = length / 12; - float x, y, z; - - coordsArray = new float[numVerts*3]; - theReader.getVerts(coordsArray, numVerts); - } - - /** - * Creates new LwoSurface object that parses file and gets all - * surface parameters for a particular surface - */ - void getSurf(int length) throws FileNotFoundException { - debugOutputLn(TRACE, "getSurf()"); - - // Create LwoSurface object to read and hold each surface, then - // store that surface in a vector of all surfaces. - - LwoSurface surf = new LwoSurface(theReader, length, - debugPrinter.getValidOutput()); - surfaceList.addElement(surf); - } - - - /** - * parses entire file. - * return -1 on error or 0 on completion - */ - int parseFile() throws FileNotFoundException, IncorrectFormatException { - debugOutputLn(TRACE, "parseFile()"); - int length = 0; - int lengthRead = 0; - int fileLength = 100000; - - long loopStartTime = System.currentTimeMillis(); - // Every parsing unit begins with a four character string - String tokenString = theReader.getToken(); - - while (!(tokenString == null) && - lengthRead < fileLength) { - long startTime = System.currentTimeMillis(); - // Based on value of tokenString, go to correct parsing method - length = theReader.getInt(); - - lengthRead += 4; - //debugOutputLn(VALUES, "length, lengthRead, fileLength = " + - // length + ", " + lengthRead + ", " + fileLength); - //debugOutputLn(VALUES, "LWOB marker is at: " + theReader.getMarker()); - - if (tokenString.equals("FORM")) { - //debugOutputLn(LINE_TRACE, "got a form"); - fileLength = length + 4; - length = 0; - tokenString = theReader.getToken(); - lengthRead += 4; - if (!tokenString.equals("LWOB")) - throw new IncorrectFormatException( - "File not of FORM-length-LWOB format"); - } - else if (tokenString.equals("PNTS")) { - //debugOutputLn(LINE_TRACE, "PNTS"); - getPnts(length); - debugOutputLn(TIME, "done with " + tokenString + " in " + - (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("POLS")) { - //debugOutputLn(LINE_TRACE, "POLS"); - getPols(length); - debugOutputLn(TIME, "done with " + tokenString + " in " + - (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("SRFS")) { - //debugOutputLn(LINE_TRACE, "SRFS"); - getSrfs(length); - debugOutputLn(TIME, "done with " + tokenString + " in " + - (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("CRVS")) { - //debugOutputLn(LINE_TRACE, "CRVS"); - theReader.skipLength(length); - //debugOutputLn(TIME, "done with " + tokenString + " in " + - // (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("PCHS")) { - //debugOutputLn(LINE_TRACE, "PCHS"); - theReader.skipLength(length); - //debugOutputLn(TIME, "done with " + tokenString + " in " + - // (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("SURF")) { - //debugOutputLn(LINE_TRACE, "SURF"); - getSurf(length); - //debugOutputLn(VALUES, "Done with SURF, marker = " + theReader.getMarker()); - debugOutputLn(TIME, "done with " + tokenString + " in " + - (System.currentTimeMillis() - startTime)); - } - else if (tokenString.equals("LWOB")) { - //debugOutputLn(LINE_TRACE, "LWOB"); - } - else { - //debugOutputLn(LINE_TRACE, "Unknown object = " + tokenString); - theReader.skipLength(length); - //debugOutputLn(TIME, "done with " + tokenString + " in " + - // (System.currentTimeMillis() - startTime)); - } - lengthRead += length; - if (lengthRead < fileLength) { - //debugOutputLn(VALUES, "end of parseFile, length, lengthRead = " + - // length + ", " + lengthRead); - tokenString = theReader.getToken(); - lengthRead += 4; - //debugOutputLn(VALUES, "just got tokenString = " + tokenString); - } - } - debugOutputLn(TIME, "done with parseFile in " + - (System.currentTimeMillis() - loopStartTime)); - return 0; - } - - /** - * This method is used only for testing - */ - static void main(String[] args) { - String fileName; - if (args.length == 0) - fileName = "cube.obj"; - else - fileName = args[0]; - - try { - LwoParser theParser = new LwoParser(fileName, 0); - } - catch (FileNotFoundException e) { - System.err.println(e.getMessage()); - e.printStackTrace(); - System.exit(1); - } - } -} - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoSurface.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwoSurface.java deleted file mode 100644 index fd23902..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoSurface.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.awt.Image; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Vector; - -import javax.vecmath.Color3f; -import javax.vecmath.Vector3f; - -import com.sun.j3d.internal.J3dUtilsI18N; -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - - -/** - * This class is responsible for retrieving the surface parameters for a - * particular surface from a binary Object file and turning that data - * into Java3D data. These surface parameters include - * diffuse/specular/emissive properties, color, shininess, transparency, - * and textures. For textures, this class instantiates a LwoTexture object - * to parse that data and turn it into Java3D texture data. - */ - -class LwoSurface extends ParserObject { - - LWOBFileReader theReader; - int red = 255, green = 255, blue = 255; - float diffuse = 0.0f, specular = 0.0f, transparency = 0.0f, luminosity = 0.0f; - float creaseAngle = 0.0f; - int gloss = 128; - Color3f color, diffuseColor, specularColor, emissiveColor; - float shininess; - Image theImage = null; - Vector3f textureCenter = null, textureSize = null; - int textureAxis; - String surfName; - Vector textureList = new Vector(); - - /** - * Constructor that parses surface data from the binary file - * and creates the necessary Java3d objects - */ - LwoSurface(LWOBFileReader reader, int length, int debugVals) - throws FileNotFoundException { - - super(debugVals); - debugOutputLn(TRACE, "LwoSurface()"); - theReader = reader; - getSurf(length); - setJ3dColors(); - } - - /** - * Creates Java3d color objects from the lw3d surface data - */ - void setJ3dColors() { - color = new Color3f((float)red/(float)255, - (float)green/(float)255, - (float)blue/(float)255); - diffuseColor = new Color3f(diffuse*color.x, - diffuse*color.y, - diffuse*color.z); - specularColor = new Color3f(specular*color.x, - specular*color.y, - specular*color.z); - emissiveColor = new Color3f(luminosity*color.x, - luminosity*color.y, - luminosity*color.z); - shininess = (float)(128.0 * ((float)gloss/1024.0)); - } - - Color3f getColor() { - return color; - } - - Color3f getDiffuseColor() { - return diffuseColor; - } - - Color3f getSpecularColor() { - return specularColor; - } - - Color3f getEmissiveColor() { - return emissiveColor; - } - - float getShininess() { - return shininess; - } - - float getCreaseAngle() { - return creaseAngle; - } - - /** - * Returns the LwoTexture for the surface, if any is defined. Note that - * lw3d allows users to define multiple textures for any surface, which - * is not possible through Java3d. Therefore, we just grab the first - * texture in any list of textures for a surface - */ - LwoTexture getTexture() { - debugOutputLn(TRACE, "getTexture()"); - try { - if (textureList.isEmpty()) { - return null; - } - else { - return (LwoTexture)textureList.elementAt(0); - } - } - catch (ArrayIndexOutOfBoundsException e) { - debugOutputLn(EXCEPTION, - "getTexture(), exception returning first element: " + e); - return null; - } - } - - String getSurfName() { - return surfName; - } - - float getTransparency() { - return transparency; - } - - /** - * Parses the binary file and gets all data for this surface - */ - void getSurf(int length) - throws FileNotFoundException, IncorrectFormatException, - ParsingErrorException { - - debugOutputLn(TRACE, "getSurf()"); - - // These "got*" booleans are to help use read the best version of - // the data - the float values for these parameters should take - // precedence over the other format - boolean gotLuminosityFloat = false; - boolean gotTransparencyFloat = false; - boolean gotDiffuseFloat = false; - boolean gotSpecularFloat = false; - int surfStopMarker = theReader.getMarker() + length; - surfName = theReader.getString(); - String tokenString = theReader.getToken(); - while (!(tokenString == null) && - theReader.getMarker() < surfStopMarker) { - debugOutputLn(VALUES, " tokenString = " + tokenString); - debugOutputLn(VALUES, " marker, stop = " + - theReader.getMarker() + ", " + surfStopMarker); - String textureToken = null; - int fieldLength = theReader.getShortInt(); - debugOutputLn(VALUES, " fl = " + fieldLength); - - if (tokenString.equals("COLR")) { - debugOutputLn(LINE_TRACE, " COLR"); - try { - red = theReader.read(); - green = theReader.read(); - blue = theReader.read(); - theReader.read(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - if (fieldLength != 4) - throw new IncorrectFormatException( - J3dUtilsI18N.getString("LwoSurface0")); - } - else if (tokenString.equals("FLAG")) { - debugOutputLn(LINE_TRACE, " FLAG"); - theReader.skipLength(fieldLength); - } - else if (tokenString.equals("VLUM")) { - debugOutputLn(LINE_TRACE, " VLUM"); - luminosity = theReader.getFloat(); - gotLuminosityFloat = true; - } - else if (tokenString.equals("LUMI")) { - debugOutputLn(LINE_TRACE, " LUMI"); - if (gotLuminosityFloat) - theReader.skipLength(fieldLength); - else - luminosity = (float)(theReader.getShortInt())/255; - } - else if (tokenString.equals("VDIF")) { - debugOutputLn(LINE_TRACE, " VDIF"); - if (fieldLength != 4) - throw new IncorrectFormatException("VDIF problem"); - diffuse = theReader.getFloat(); - gotDiffuseFloat = true; - debugOutputLn(VALUES, "diff = " + diffuse); - } - else if (tokenString.equals("DIFF")) { - debugOutputLn(LINE_TRACE, " DIFF"); - if (gotDiffuseFloat) - theReader.skipLength(fieldLength); - else - diffuse = (float)theReader.getShortInt()/255; - } - else if (tokenString.equals("VTRN")) { - debugOutputLn(LINE_TRACE, " VTRN"); - transparency = theReader.getFloat(); - gotTransparencyFloat = true; - } - else if (tokenString.equals("TRAN")) { - debugOutputLn(LINE_TRACE, " TRAN"); - if (gotTransparencyFloat) - theReader.skipLength(fieldLength); - else - transparency = (float)theReader.getShortInt()/255; - } - else if (tokenString.equals("VSPC")) { - debugOutputLn(LINE_TRACE, " VSPC"); - specular = theReader.getFloat(); - gotSpecularFloat = true; - debugOutputLn(VALUES, "spec = " + specular); - } - else if (tokenString.equals("SPEC")) { - debugOutputLn(LINE_TRACE, " SPEC"); - if (gotSpecularFloat) - theReader.skipLength(fieldLength); - else { - if (fieldLength == 4) // Bug in some LW versions - specular = (float)theReader.getInt()/255; - else - specular = (float)theReader.getShortInt()/255; - } - } - else if (tokenString.equals("GLOS")) { - debugOutputLn(LINE_TRACE, " GLOS"); - if (fieldLength == 4) - gloss = theReader.getInt(); - else - gloss = theReader.getShortInt(); - } - else if (tokenString.equals("SMAN")) { - debugOutputLn(LINE_TRACE, " SMAN"); - creaseAngle = theReader.getFloat(); - } - else if (tokenString.endsWith("TEX")) { - // Textures are complex - hand off this bit to the - // LwoTexture class - LwoTexture texture = - new LwoTexture(theReader, - surfStopMarker - theReader.getMarker(), - tokenString, - debugPrinter.getValidOutput()); - textureToken = texture.getNextToken(); - if (texture.isHandled()) - textureList.addElement(texture); - debugOutputLn(WARNING, "val = " + tokenString); - } - else { - debugOutputLn(WARNING, - "unrecognized token: " + tokenString); - theReader.skipLength(fieldLength); - } - if (theReader.getMarker() < surfStopMarker) { - if (textureToken == null) - tokenString = theReader.getToken(); - else - tokenString = textureToken; - } - } - } - -} - - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoTexture.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwoTexture.java deleted file mode 100644 index 9249b02..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwoTexture.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Hashtable; - -import javax.media.j3d.Texture; -import javax.media.j3d.Texture2D; -import javax.vecmath.Color3f; -import javax.vecmath.Vector3f; - -import com.sun.j3d.loaders.ParsingErrorException; -import com.sun.j3d.utils.image.TextureLoader; - -/** - * This class is responsible for parsing the binary data in an Object file - * that describes a texture for a particular surface and turning that data - * into Java3D texture data. If the texture is coming from a file (which - * is the only type of texture handled by the loader currently; other - * types of texture definitions are ignored), then this class instantiates - * a TargaReader object to read the data in that file. Once all of the - * data has been read, the class creates a Java3D Texture object by first - * scaling the image using the ImageScaler class (since all textures must - * have width/height = power of 2; Note: this functionality is now built - * into the TextureLoader class, so it could be removed from this loader) - * and then creating a Texture with that image. - */ - -class LwoTexture extends ParserObject { - - LWOBFileReader theReader; - int red = 255, green = 255, blue = 255; - Color3f color, diffuseColor, specularColor, emissiveColor; - Image theImage = null; - String imageFile = null; - Vector3f textureSize = new Vector3f(1f, 1f, 1f);; - Vector3f textureCenter = new Vector3f(0f, 0f, 0f); - int textureAxis; - int flags = 0; - String type; - String mappingType; - String nextToken = null; - static Hashtable imageTable = new Hashtable(); - static Hashtable textureTable = new Hashtable(); - - /** - * Constructor: calls readTexture() to parse the file and retrieve - * texture parameters - */ - LwoTexture(LWOBFileReader reader, int length, String typename, - int debugVals) throws FileNotFoundException { - super(debugVals); - debugOutputLn(TRACE, "Constructor"); - theReader = reader; - type = typename; - readTexture(length); - } - - String getNextToken() { - return nextToken; - } - - /** - * The loader currently only handles CTEX and DTEX texture types - * (These either represent the surface color like a decal (CTEX) - * or modify the diffuse color (DTEX) - */ - boolean isHandled() { - if ((type.equals("CTEX") || - type.equals("DTEX")) && - theImage != null) - return true; - debugOutputLn(LINE_TRACE, "failed isHandled(), type, theImage = " + - type + ", " + theImage); - return false; - } - - /** - * Return the actual Texture object associated with the current image. - * If we've already created a texture for this image, return that; - * otherwise create a new Texture - */ - Texture getTexture() { - debugOutputLn(TRACE, "getTexture()"); - if (theImage == null) - return null; - Texture2D t2d = (Texture2D)textureTable.get(theImage); - if (t2d == null) { - ImageScaler scaler = new ImageScaler((BufferedImage)theImage); - BufferedImage scaledImage = (BufferedImage)scaler.getScaledImage(); - TextureLoader tl = new TextureLoader(scaledImage); - t2d = (Texture2D)tl.getTexture(); - textureTable.put(theImage, t2d); - } - - return t2d; - } - - String getType() { - return type; - } - - Color3f getColor() { - return color; - } - - Image getImage() { - return theImage; - } - - Vector3f getTextureSize() { - return textureSize; - } - - int getTextureAxis() { - return textureAxis; - } - - Vector3f getTextureCenter() { - return textureCenter; - } - - String getMappingType() { - return mappingType; - } - - /** - * Parse the binary file to retrieve all texture parameters for this - * surface. If/when we encounter a TIMG parameter, which contains the - * filename of an image, then create a new TargaReader object to - * read that image file - */ - void readTexture(int length) - throws FileNotFoundException, ParsingErrorException { - - debugOutputLn(TRACE, "readTexture()"); - - int surfStopMarker = theReader.getMarker() + length; - mappingType = theReader.getString(); - debugOutputLn(VALUES, "mappingType = " + mappingType); - String tokenString = theReader.getToken(); - while (!(tokenString == null) && theReader.getMarker() < surfStopMarker) { - - debugOutputLn(VALUES, " tokenString = " + tokenString); - debugOutputLn(VALUES, " marker, stop = " + theReader.getMarker() + ", " + surfStopMarker); - - if (tokenString.endsWith("TEX") || - (!tokenString.startsWith("T") || tokenString.equals("TRAN"))) { - nextToken = tokenString; - return; - } - - int fieldLength = theReader.getShortInt(); - debugOutputLn(VALUES, " fl = " + fieldLength); - - if (tokenString.equals("TFLG")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - flags = theReader.getShortInt(); - textureAxis = flags & 0x07; - debugOutputLn(WARNING, "val = " + flags); - } - else if (tokenString.equals("TCLR")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - try { - red = theReader.read(); - green = theReader.read(); - blue = theReader.read(); - theReader.read(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - debugOutputLn(WARNING, "val = " + red + ", " + green + - ", " + blue); - } - else if (tokenString.equals("TIMG")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - imageFile = theReader.getString(); - debugOutputLn(VALUES, "imageFile = " + imageFile); - if (imageFile.indexOf("none") == -1) { - if ((theImage = - (Image)imageTable.get(imageFile)) == null) { - try { - TargaReader tr = - new TargaReader(imageFile, - debugPrinter.getValidOutput()); - theImage = tr.getImage(); - imageTable.put(imageFile, theImage); - } - catch (FileNotFoundException e) { - // Ignore texture if can't find it - debugOutputLn(WARNING, "Image File skipped: " + - imageFile); - } - } - } - debugOutputLn(WARNING, "val = __" + imageFile + "__"); - } - else if (tokenString.equals("TWRP")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - int widthWrap = theReader.getShortInt(); - int heightWrap = theReader.getShortInt(); - debugOutputLn(WARNING, "val = " + widthWrap + ", " + - heightWrap); - } - else if (tokenString.equals("TCTR")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - textureCenter.x = theReader.getFloat(); - textureCenter.y = theReader.getFloat(); - textureCenter.z = theReader.getFloat(); - debugOutputLn(WARNING, "val = " + textureCenter); - } - else if (tokenString.equals("TSIZ")) { - debugOutputLn(WARNING, "Not yet handling: " + tokenString); - textureSize.x = theReader.getFloat(); - textureSize.y = theReader.getFloat(); - textureSize.z = theReader.getFloat(); - debugOutputLn(WARNING, "val = " + textureSize); - } - else { - debugOutputLn(WARNING, - "unrecognized token: " + tokenString); - theReader.skipLength(fieldLength); - } - if (theReader.getMarker() < surfStopMarker) { - tokenString = theReader.getToken(); - } - } - } -} - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsBackground.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsBackground.java deleted file mode 100644 index cf548ea..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsBackground.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.IOException; -import java.io.StreamTokenizer; - -import javax.media.j3d.Background; -import javax.media.j3d.BoundingSphere; -import javax.vecmath.Color3f; -import javax.vecmath.Point3d; - -import com.sun.j3d.loaders.ParsingErrorException; - - -/** - * This class creates a Background object (solid color only, no geometry) - * according to some of the data stored in a Scene file. Note: Lightwave - * defines much more complex backgrounds that the loader currently - * handles. It should be possible to se Background Geometry to handle - * most of these cases, if there's time and will to work on the problem. - */ - -class LwsBackground extends TextfileParser { - - // data from the file - int solidBackdrop; - Color3f color, zenithColor, skyColor, groundColor, nadirColor; - Background backgroundObject = null; - - - /** - * Constructor: parses stream and retrieves all Background-related data - */ - LwsBackground(StreamTokenizer st, int debugVals) - throws ParsingErrorException { - - debugPrinter.setValidOutput(debugVals); - debugOutput(TRACE, "LwsBackground()"); - color = new Color3f(0f, 0f, 0f); - zenithColor = new Color3f(0f, 0f, 0f); - skyColor = new Color3f(0f, 0f, 0f); - groundColor = new Color3f(0f, 0f, 0f); - nadirColor = new Color3f(0f, 0f, 0f); - - solidBackdrop = (int)getNumber(st); - while (!isCurrentToken(st, "FogType")) { - debugOutputLn(LINE_TRACE, "currentToken = " + st.sval); - - if (isCurrentToken(st, "BackdropColor")) { - color.x = (float)getNumber(st)/255f; - color.y = (float)getNumber(st)/255f; - color.z = (float)getNumber(st)/255f; - } - else if (isCurrentToken(st, "NadirColor")) { - nadirColor.x = (float)getNumber(st)/255f; - nadirColor.y = (float)getNumber(st)/255f; - nadirColor.z = (float)getNumber(st)/255f; - } - else if (isCurrentToken(st, "SkyColor")) { - skyColor.x = (float)getNumber(st)/255f; - skyColor.y = (float)getNumber(st)/255f; - skyColor.z = (float)getNumber(st)/255f; - } - else if (isCurrentToken(st, "GroundColor")) { - groundColor.x = (float)getNumber(st)/255f; - groundColor.y = (float)getNumber(st)/255f; - groundColor.z = (float)getNumber(st)/255f; - } - else if (isCurrentToken(st, "NadirColor")) { - nadirColor.x = (float)getNumber(st)/255f; - nadirColor.y = (float)getNumber(st)/255f; - nadirColor.z = (float)getNumber(st)/255f; - } - try { - st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - st.pushBack(); // push token back on stack - } - - /** - * Creates Java3d objects from the background data. Note that there - * are plenty of lw3d background attributes that the loader currently - * ignores. Some of these may best be handled by creating background - * geometry rather than a solid background color - */ - void createJava3dObject() { - // TODO: there are various attributes of - // backdrops that we're not currently handling. In - // particular, if the file calls for a gradient background - // (solidBackdrop == 0), we ignore the request and just - // create a solid background from the sky color instead. - // We should be able to do something with the - // various colors specified, perhaps by creating - // background geometry with the appropriate vertex - // colors? - - if (solidBackdrop != 0) { - backgroundObject = new Background(color); - debugOutput(VALUES, "Background color = " + color); - } - else { - backgroundObject = new Background(skyColor); - debugOutput(VALUES, "Background color = " + skyColor); - } - BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100000.0); - backgroundObject.setApplicationBounds(bounds); - } - - Background getObjectNode() { - return backgroundObject; - } - - void printVals() { - debugOutputLn(VALUES, " BACKGROUND vals: "); - } - - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsCamera.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsCamera.java deleted file mode 100644 index bef9f5d..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsCamera.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.IOException; -import java.io.StreamTokenizer; -import java.util.Vector; - -import javax.media.j3d.Behavior; -import javax.media.j3d.Transform3D; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Matrix4d; - -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class parses the data in a Scene file related to the camera and - * creates Java3D TransformGroup that holds the data for positioning - * and orienting the view according to the camera specifications. - */ - -class LwsCamera extends TextfileParser implements LwsPrimitive { - - // data from the file - String fileName; - String objName; - LwsMotion motion; - int parent; - TransformGroup objectTransform; - Vector objectBehavior; - - /** - * Constructor: parses camera info and creates LwsMotion object for - * keyframe data - */ - LwsCamera(StreamTokenizer st, int firstFrame, - int totalFrames, float totalTime, - int debugVals) throws ParsingErrorException { - debugPrinter.setValidOutput(debugVals); - parent = -1; - getNumber(st); // Skip ShowCamera parameters - getNumber(st); - getAndCheckString(st, "CameraMotion"); - motion = new LwsMotion(st, firstFrame, totalFrames, totalTime, - debugPrinter.getValidOutput()); - - // TODO: buggy way to stop processing the camera. Should actually - // process required/optional fields in order and stop when there's - // no more. - - while (!isCurrentToken(st, "DepthOfField")) { - debugOutputLn(LINE_TRACE, "currentToken = " + st.sval); - - if (isCurrentToken(st, "ParentObject")) { - parent = (int)getNumber(st); - } - try { - st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - getNumber(st); // skip shadow type parameter - } - - /** - * Returns parent of the camera object - */ - int getParent() { - return parent; - } - - /** - * Creates Java3D items from the camera data. These objects consist - * of: a TransformGroup to hold the view platform, and the behaviors - * (if any) that act upon the view's TransformGroup. - */ - void createJava3dObject(int loadBehaviors) - { - Matrix4d mat = new Matrix4d(); - mat.setIdentity(); - // Set the node's transform matrix according to the first frame - // of the object's motion - LwsFrame firstFrame = motion.getFirstFrame(); - firstFrame.setMatrix(mat); - debugOutputLn(VALUES, " Camera Matrix = \n" + mat); - Transform3D t1 = new Transform3D(); - Matrix4d m = new Matrix4d(); - double scale = .1; - m.setColumn(0, scale, 0, 0, 0); // setScale not yet implemented - m.setColumn(1, 0, scale, 0, 0); - m.setColumn(2, 0, 0, scale, 0); - m.setColumn(3, 0, 0, 0, 1); - Transform3D scaleTrans = new Transform3D(m); - TransformGroup scaleGroup = new TransformGroup(scaleTrans); - scaleGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - scaleGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); - // mat.mul(m); - t1.set(mat); - objectTransform = new TransformGroup(t1); - objectTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - objectBehavior = new Vector();; - if (loadBehaviors != 0) { - motion.createJava3dBehaviors(objectTransform); - Behavior b = motion.getBehaviors(); - if (b != null) - objectBehavior.addElement(b); - } - } - - /** - * Returns TransformGroup of camera - */ - @Override - public TransformGroup getObjectNode() - { - return objectTransform; - } - - /** - * Returns animation behaviors for camera - */ - @Override - public Vector getObjectBehaviors() - { - debugOutputLn(TRACE, "getObjectBehaviors()"); - return objectBehavior; - } - - /** - * This is a debuggin utility, not currently activated. It prints - * out the camera values - */ - void printVals() - { - System.out.println(" objName = " + objName); - motion.printVals(); - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelope.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelope.java deleted file mode 100644 index 1e9fb86..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelope.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.IOException; -import java.io.StreamTokenizer; - -import javax.media.j3d.Behavior; -import javax.media.j3d.TransformGroup; - -import com.sun.j3d.internal.J3dUtilsI18N; -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class is a superclass for any implementation of envelopes; the - * only subclass currently is LwsEnvelopeLightIntensity. LwsEnvelope - * parses the data in a Scene file and extracts the envelope data. - */ - -class LwsEnvelope extends TextfileParser { - - // data from the file - String name; - LwsEnvelopeFrame frames[]; - int numFrames; - int numChannels; - boolean loop; - float totalTime; - int totalFrames; - Behavior behaviors; - - /** - * Constructor: calls getEnvelope() to parse the stream for the - * envelope data - */ - LwsEnvelope(StreamTokenizer st, int frames, float time) { - numFrames = 0; - totalTime = time; - totalFrames = frames; - name = getName(st); - getEnvelope(st); - } - - /** - * Parses the stream to retrieve all envelope data. Creates - * LwsEnvelopeFrame objects for each keyframe of the envelope - * (these frames differ slightly from LwsFrame objects because - * envelopes contain slightly different data) - */ - void getEnvelope(StreamTokenizer st) - throws IncorrectFormatException, ParsingErrorException - { - debugOutputLn(TRACE, "getEnvelope()"); - numChannels = (int)getNumber(st); - if (numChannels != 1) { - throw new IncorrectFormatException( - J3dUtilsI18N.getString("LwsEnvelope0")); - } - debugOutputLn(LINE_TRACE, "got channels"); - - numFrames = (int)getNumber(st); - frames = new LwsEnvelopeFrame[numFrames]; - debugOutputLn(VALUES, "got frames" + numFrames); - - for (int i = 0; i < numFrames; ++i) { - frames[i] = new LwsEnvelopeFrame(st); - } - debugOutput(LINE_TRACE, "got all frames"); - - try { - st.nextToken(); - while (!isCurrentToken(st, "EndBehavior")) { - // There is an undocumented "FrameOffset" in some files - st.nextToken(); - } - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - int repeatVal = (int)getNumber(st); - if (repeatVal == 1) - loop = false; - else - loop = true; - } - - /** - * This superclass does nothing here - if the loader understands - * how to deal with a particular type of envelope, it will use - * a subclass of LwsEnvelope that will override this method - */ - void createJava3dBehaviors(TransformGroup target) { - behaviors = null; - } - - Behavior getBehaviors() { - return behaviors; - } - - - LwsEnvelopeFrame getFirstFrame() { - if (numFrames > 0) - return frames[0]; - else - return null; - } - - - void printVals() { - debugOutputLn(VALUES, " name = " + name); - debugOutputLn(VALUES, " numChannels = " + numChannels); - debugOutputLn(VALUES, " numFrames = " + numFrames); - debugOutputLn(VALUES, " loop = " + loop); - for (int i = 0; i < numFrames; ++i) { - debugOutputLn(VALUES, " FRAME " + i); - frames[i].printVals(); - } - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeFrame.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeFrame.java deleted file mode 100644 index 0bd9145..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeFrame.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.StreamTokenizer; - -/** - * This class represents one keyframe in an envelope sequence. - */ - -class LwsEnvelopeFrame extends TextfileParser { - - // data from the file - double value; - double frameNumber; - int linearValue; - double tension, continuity, bias; - - - /** - * Constructor: parses stream and stores data for one keyframe of - * an envelope sequence - */ - LwsEnvelopeFrame(StreamTokenizer st) { - value = getNumber(st); - debugOutputLn(VALUES, "value = " + value); - frameNumber = (int)getNumber(st); - linearValue = (int)getNumber(st); - debugOutputLn(VALUES, "framenum, linear " + frameNumber + " , " + linearValue); - tension = getNumber(st); - continuity = getNumber(st); - bias = getNumber(st); - debugOutputLn(VALUES, "tension, cont, bias = " + tension + ", " + continuity + ", " + bias); - //System.out.println(" FRAME VALS"); - //printVals(); - } - - - double getValue() { - return value; - } - - - double getFrameNum() { - return frameNumber; - } - - - void printVals() { - debugOutputLn(VALUES, " value = " + value); - debugOutputLn(VALUES, " frameNum = " + frameNumber); - debugOutputLn(VALUES, " lin = " + linearValue); - debugOutputLn(VALUES, " tension = " + tension); - debugOutputLn(VALUES, " continuity = " + continuity); - debugOutputLn(VALUES, " bias = " + bias); - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeLightIntensity.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeLightIntensity.java deleted file mode 100644 index b8ff1b8..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsEnvelopeLightIntensity.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.StreamTokenizer; - -import javax.media.j3d.Alpha; -import javax.media.j3d.Behavior; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Point3d; - - -/** - * This class creates a LightIntensityPathInterpolator object from the - * keyframe-based envelope specified in a Scene file. - */ - -class LwsEnvelopeLightIntensity extends LwsEnvelope { - - - /** - * Constructor: Calls superclass, which will parse the stream - * and store the envelope data - */ - LwsEnvelopeLightIntensity(StreamTokenizer st, - int frames, float time) { - super(st, frames, time); - } - - /** - * Creates Java3d behaviors given the stored envelope data. The - * Behavior created is a LightIntensityPathInterpolator - */ - void createJava3dBehaviors(Object target) { - if (numFrames <= 1) - behaviors = null; - else { - long alphaAtOne = 0; - int loopCount; - if (loop) - loopCount = -1; - else - loopCount = 1; - // Note: hardcoded to always loop... - loopCount = -1; - debugOutputLn(VALUES, "totalTime = " + totalTime); - debugOutputLn(VALUES, "loopCount = " + loopCount); - float animTime = 1000.0f * totalTime * - (float)(frames[numFrames-1].getFrameNum()/(float)totalFrames); - debugOutputLn(VALUES, " anim time: " + animTime); - debugOutputLn(VALUES, " totalFrames = " + totalFrames); - debugOutputLn(VALUES, " lastFrame = " + - frames[numFrames-1].getFrameNum()); - if (!loop) - alphaAtOne = (long)(1000.0*totalTime - animTime); - Alpha theAlpha = - new Alpha(loopCount, Alpha.INCREASING_ENABLE, - 0, 0, (long)animTime, 0, - alphaAtOne, 0, 0, 0); - float knots[] = new float[numFrames]; - float values[] = new float[numFrames]; - for (int i=0; i < numFrames; ++i) { - values[i] = (float)frames[i].getValue(); - knots[i] = (float)(frames[i].getFrameNum())/ - (float)(frames[numFrames-1].getFrameNum()); - debugOutputLn(VALUES, "value, knot = " + - values[i] + ", " + knots[i]); - } - LightIntensityPathInterpolator l = new - LightIntensityPathInterpolator(theAlpha, - knots, - values, - target); - if (l != null) { - behaviors = l; - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000000.0); - behaviors.setSchedulingBounds(bounds); - ((TransformGroup)target).setCapability - (TransformGroup.ALLOW_TRANSFORM_WRITE); - ((TransformGroup)target).addChild(behaviors); - } - } - } - - - @Override - Behavior getBehaviors() { - return behaviors; - } - - - @Override - LwsEnvelopeFrame getFirstFrame() { - if (numFrames > 0) - return frames[0]; - else - return null; - } - - - @Override - void printVals() { - debugOutputLn(VALUES, " name = " + name); - debugOutputLn(VALUES, " numChannels = " + numChannels); - debugOutputLn(VALUES, " numFrames = " + numFrames); - debugOutputLn(VALUES, " loop = " + loop); - for (int i = 0; i < numFrames; ++i) { - debugOutputLn(VALUES, " FRAME " + i); - frames[i].printVals(); - } - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFog.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFog.java deleted file mode 100644 index 9c90ef5..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFog.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.IOException; -import java.io.StreamTokenizer; - -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.Fog; -import javax.media.j3d.LinearFog; -import javax.vecmath.Color3f; -import javax.vecmath.Point3d; - -import com.sun.j3d.loaders.ParsingErrorException; - - -/** - * This class creates a Fog object from the data in a Scene file. - */ - -class LwsFog extends TextfileParser { - - // data from the file - float minDist, maxDist, minAmount, maxAmount; - int backdropFog; - Color3f color; - int type; - Fog fogObject = null; - - /** - * Constructor: parses stream and stores fog data - */ - LwsFog(StreamTokenizer st, int debugVals) throws ParsingErrorException { - debugPrinter.setValidOutput(debugVals); - debugOutput(TRACE, "LwsFog()"); - color = new Color3f(0f, 0f, 0f); - - while (!isCurrentToken(st, "DitherIntensity")) { - debugOutputLn(LINE_TRACE, "currentToken = " + st.sval); - - if (isCurrentToken(st, "FogMinDist")) { - minDist = (float)getNumber(st); - } - else if (isCurrentToken(st, "FogMaxDist")) { - maxDist = (float)getNumber(st); - } - else if (isCurrentToken(st, "FogMinAmount")) { - minAmount = (float)getNumber(st); - } - else if (isCurrentToken(st, "FogMaxAmount")) { - maxAmount = (float)getNumber(st); - } - else if (isCurrentToken(st, "BackdropFog")) { - backdropFog = (int)getNumber(st); - } - else if (isCurrentToken(st, "FogColor")) { - color.x = (float)getNumber(st)/255f; - color.y = (float)getNumber(st)/255f; - color.z = (float)getNumber(st)/255f; - } - try { - st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - st.pushBack(); // push token back on stack - } - - /** - * Creates Java3d Fog object given the fog parameters in the file. - * Note that various fog parameters in lw3d are not currently handled. - */ - void createJava3dObject() { - // TODO: there are various attributes of lw fog that - // we're not currently handing, including non-linear fog - // (need to understand the two different types - these may - // map onto java3d's expontential fog node), non-solid - // backdrop colors (how to handle this?), min/max amount - // (j3d only handles 0 -> 1 case) - - fogObject = new LinearFog(color, minDist, maxDist); - debugOutputLn(VALUES, - "just set linearFog with color, minDist, maxDist = " + - color + ", " + - minDist + ", " + - maxDist); - BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100000.0); - fogObject.setInfluencingBounds(bounds); - } - - Fog getObjectNode() - { - return fogObject; - } - - void printVals() - { - debugOutputLn(VALUES, " FOG vals: "); - } - - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFrame.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFrame.java deleted file mode 100644 index 48ba728..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsFrame.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.StreamTokenizer; - -import javax.vecmath.Matrix4d; -import javax.vecmath.Point3f; -import javax.vecmath.Vector3d; - -/** - * This class is responsible for parsing the data in a Scene file - * associated with a single keyframe. This data includes the position, - * orientation, and scaling information, in addition to the frame number - * of that keyframe and some spline controls which are currently - * ignored. - */ - -class LwsFrame extends TextfileParser { - - // data from the file - double x, y, z; - double heading, pitch, bank; - double xScale, yScale, zScale; - double frameNumber; - int linearValue; - double tension, continuity, bias; - - /** - * Constructor: parses and stores all data associated with a particular - * keyframe - */ - LwsFrame(StreamTokenizer st) { - x = getNumber(st); - y = getNumber(st); - z = -getNumber(st); - debugOutputLn(VALUES, "x, y, z " + x + ", " + y + ", " + z); - heading = getNumber(st); - pitch = getNumber(st); - bank = getNumber(st); - debugOutputLn(VALUES, "(degrees) h, p, b = " + heading + ", " + pitch + ", " + bank); - heading *= (Math.PI / 180.0); // Java3d works with radians - pitch *= (Math.PI / 180.0); - bank *= (Math.PI / 180.0); - debugOutputLn(VALUES, "(radians) h, p, b = " + heading + ", " + pitch + ", " + bank); - debugOutputLn(LINE_TRACE, "got pos and ori"); - xScale = getNumber(st); - yScale = getNumber(st); - zScale = getNumber(st); - debugOutputLn(VALUES, "xs, ys, zs " + xScale +", " + yScale + ", " + zScale); - frameNumber = (int)getNumber(st); - // Note: The following spline controls are ignored - linearValue = (int)getNumber(st); - debugOutputLn(VALUES, "framenum, linear " + frameNumber + " , " + linearValue); - tension = getNumber(st); - continuity = getNumber(st); - bias = getNumber(st); - debugOutputLn(VALUES, "tension, cont, bias = " + tension + ", " + continuity + ", " + bias); - } - - - - /** - * Construct new frame that's in-between two given frames - * Ratio gives the interpolation value for how far in-between - * the new frame should be (0.5 is half-way, etc) - */ - LwsFrame(LwsFrame prevFrame, LwsFrame nextFrame, double ratio) { - - x = prevFrame.x + (nextFrame.x - prevFrame.x) * ratio; - y = prevFrame.y + (nextFrame.y - prevFrame.y) * ratio; - z = prevFrame.z + (nextFrame.z - prevFrame.z) * ratio; - - heading = prevFrame.heading + - (nextFrame.heading - prevFrame.heading) * ratio; - pitch = prevFrame.pitch + - (nextFrame.pitch - prevFrame.pitch) * ratio; - bank = prevFrame.bank + - (nextFrame.bank - prevFrame.bank) * ratio; - xScale = prevFrame.xScale + - (nextFrame.xScale - prevFrame.xScale) * ratio; - yScale = prevFrame.yScale + - (nextFrame.yScale - prevFrame.yScale) * ratio; - zScale = prevFrame.zScale + - (nextFrame.zScale - prevFrame.zScale) * ratio; - frameNumber = prevFrame.frameNumber + - (nextFrame.frameNumber - prevFrame.frameNumber) * ratio; - - // The following are not interpolated - linearValue = prevFrame.linearValue; - tension = prevFrame.tension; - continuity = prevFrame.continuity; - bias = prevFrame.bias; - } - - /** - * Using hermite interpolation construct a new frame that's - * in-between two given frames. We also need to be given a - * frame before the first frame and a frame after the second - * frame. The calling function will make sure that we get the - * four appropriate frames. - * - * Ratio gives the interpolation value for how far in-between - * the new frame should be. (.5 is half-way, etc.) - */ - LwsFrame(LwsFrame prevFrame, LwsFrame frame1, - LwsFrame frame2, LwsFrame nextFrame, double u, - double adj0, double adj1) { - - double h1, h2, h3, h4; - double dd0a, dd0b, ds1a, ds1b; - - // pre-compute spline coefficients - double u2, u3, z1; - u2 = u * u; - u3 = u2 *u; - z1 = 3.0f *u2 - u3 - u3; - h1 = 1.0f - z1; - h2 = z1; - h3 = u3 - u2 - u2 + u; - h4 = u3 - u2; - - dd0a = (1.0f - frame1.tension) * (1.0f + frame1.continuity) - * (1.0f + frame1.bias); - - dd0b = (1.0f - frame1.tension) * (1.0f - frame1.continuity) - * (1.0f - frame1.bias); - - ds1a = (1.0f - frame2.tension) * (1.0f - frame2.continuity) - * (1.0f + frame2.bias); - - ds1b = (1.0f - frame2.tension) * (1.0f + frame2.continuity) - * (1.0f - frame2.bias); - - double[] v = new double[4]; - - // interpolate x, y, z - v[0] = prevFrame.x; v[1] = frame1.x; - v[2] = frame2.x; v[3] = nextFrame.x; - x = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - v[0] = prevFrame.y; v[1] = frame1.y; - v[2] = frame2.y; v[3] = nextFrame.y; - y = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - v[0] = prevFrame.z; v[1] = frame1.z; - v[2] = frame2.z; v[3] = nextFrame.z; - z = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - - // interpolate heading pitch and bank - v[0] = prevFrame.heading; v[1] = frame1.heading; - v[2] = frame2.heading ; v[3] = nextFrame.heading; - heading = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - - v[0] = prevFrame.pitch; v[1] = frame1.pitch; - v[2] = frame2.pitch; v[3] = nextFrame.pitch; - pitch = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - - v[0] = prevFrame.bank; v[1] = frame1.bank; - v[2] = frame2.bank; v[3] = nextFrame.bank; - bank = computeInterpolation (v, dd0a, dd0b, ds1a, ds1b, - adj0, adj1, h1, h2, h3, h4); - - // interpolate scale - scale interpolation is assumed to be linear - xScale = frame1.xScale + (frame2.xScale - frame1.xScale) * u; - yScale = frame1.yScale + (frame2.yScale - frame1.yScale) * u; - zScale = frame1.zScale + (frame2.zScale - frame1.zScale) * u; - - // interpolate frame number - frameNumber = frame1.frameNumber + - (frame2.frameNumber - frame1.frameNumber) * u; - - // The following are not interpolated - linearValue = frame2.linearValue; - - // We need to keep the spline smooth between knot points - tension = 0.0; - continuity = 0.0; - bias = 0.0; - } - - - double computeInterpolation(double[] value, double dd0a, - double dd0b, double ds1a, - double ds1b, double adj0, - double adj1, double h1, - double h2, double h3, double h4) { - - double dd0, ds1; - double delta = value[2] - value[1] ; - double result; - - // if adj != 0 - if (adj0 < -0.0001 || adj0 > 0.0001) - dd0 = adj0 * (dd0a * (value[1] - value[0]) + dd0b * delta); - else - dd0 = 0.5f * (dd0a + dd0b) * delta; - - // if adj != 0 - if (adj1 < -0.0001 || adj1 > 0.0001) - ds1 = adj1 * (ds1a * delta + ds1b * (value[3] - value[2])); - else - ds1 = 0.5f * (ds1a + ds1b) * delta; - - result = value[1] * h1 + value[2] * h2 + dd0 * h3 + ds1 * h4; - - return (result); - } - - double getHeading() { - return heading; - } - - double getPitch() { - return pitch; - } - - double getBank() { - return bank; - } - - /** - * Sets the given matrix to contain the position, orientation, and - * scale values for the keyframe - */ - void setMatrix(Matrix4d mat) { - setRotationMatrix(mat); - mat.setTranslation(new Vector3d(x, y, z)); - Matrix4d m = new Matrix4d(); - m.setColumn(0, xScale, 0, 0, 0); // setScale not yet implemented - m.setColumn(1, 0, yScale, 0, 0); - m.setColumn(2, 0, 0, zScale, 0); - m.setColumn(3, 0, 0, 0, 1); - mat.mul(m); - } - - /** - * Sets the given matrix to contain the orientation for this keyframe - */ - void setRotationMatrix(Matrix4d mat) - { - debugOutputLn(TRACE, "setRotMat()"); - debugOutputLn(VALUES, " p, h, b = " + - pitch + ", " + - heading + ", " + - bank); - Matrix4d pitchMat = new Matrix4d(); - pitchMat.rotX(-pitch); - Matrix4d bankMat = new Matrix4d(); - bankMat.rotZ(bank); - mat.rotY(-heading); - mat.mul(pitchMat); - mat.mul(bankMat); - debugOutputLn(VALUES, "setRotMat(), mat = " + mat); - } - - Point3f getPosition() { - return (new Point3f((float)x, (float)y, (float)z)); - } - - Point3f getScale() { - // Make sure we don't have zero scale components - if ((xScale < -0.0001 || xScale > 0.0001) && - (yScale < -0.0001 || yScale > 0.0001) && - (zScale < -0.0001 || zScale > 0.0001)) { - return (new Point3f((float)xScale, (float)yScale, (float)zScale)); - } else { - return (new Point3f(1.0f, 1.0f, 1.0f)); - } - } - - double getFrameNum() { - return frameNumber; - } - - void printVals() { - debugOutputLn(VALUES, " x = " + x); - debugOutputLn(VALUES, " y = " + y); - debugOutputLn(VALUES, " z = " + z); - debugOutputLn(VALUES, " xScale = " + xScale); - debugOutputLn(VALUES, " yScale = " + yScale); - debugOutputLn(VALUES, " zScale = " + zScale); - debugOutputLn(VALUES, " heading = " + heading); - debugOutputLn(VALUES, " pitch = " + pitch); - debugOutputLn(VALUES, " bank = " + bank); - debugOutputLn(VALUES, " frameNum = " + frameNumber); - debugOutputLn(VALUES, " lin = " + linearValue); - debugOutputLn(VALUES, " tension = " + tension); - debugOutputLn(VALUES, " continuity = " + continuity); - debugOutputLn(VALUES, " bias = " + bias); - } - -} - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsLight.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsLight.java deleted file mode 100644 index bd800dd..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsLight.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.io.IOException; -import java.io.StreamTokenizer; -import java.util.Vector; - -import javax.media.j3d.Behavior; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.DirectionalLight; -import javax.media.j3d.Light; -import javax.media.j3d.PointLight; -import javax.media.j3d.SpotLight; -import javax.media.j3d.Transform3D; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Color3f; -import javax.vecmath.Matrix4d; -import javax.vecmath.Point3d; -import javax.vecmath.Point3f; -import javax.vecmath.Vector3f; - -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class creates a light object from the data in a Scene file. It - * instantiates an LwsMotion object to create any associated - * animations. - */ - -class LwsLight extends TextfileParser implements LwsPrimitive { - - // data from the file - String fileName; - String objName; - LwsMotion motion; - int parent; - TransformGroup objectTransform; - Vector objectBehavior; - Color3f color; - int type; - Point3f attenuation = new Point3f(1.0f, 0.0f, 0.0f); - float spotConeAngle = (float)(Math.PI); - // Meta object, used for holding light and - LwLightObject lwLight; - // light parameters - LwsEnvelopeLightIntensity intensityEnvelope = null; - Light light = null; - final static int DIRECTIONAL = 0, POINT = 1, SPOT = 2; - - /** - * Constructor: parses stream and creates data structures for all - * light parameters currently handled by the loader - */ - LwsLight(StreamTokenizer st, int totalFrames, float totalTime, - int debugVals) throws ParsingErrorException { - - debugPrinter.setValidOutput(debugVals); - - debugOutput(TRACE, "LwsLight()"); - color = new Color3f(1f, 1f, 1f); - lwLight = new LwLightObject(null, 0.0f, null); - - parent = -1; - debugOutputLn(LINE_TRACE, "about to get LightName"); - getAndCheckString(st, "LightName"); - debugOutputLn(LINE_TRACE, "about to get LightName value"); - objName = getName(st); - debugOutputLn(LINE_TRACE, "got LightName"); - skip(st, "ShowLight", 2); - debugOutputLn(LINE_TRACE, "got ShowLight"); - getAndCheckString(st, "LightMotion"); - debugOutputLn(LINE_TRACE, "got LightMotion"); - motion = new LwsMotion(st, totalFrames, totalTime); - debugOutputLn(LINE_TRACE, "got motions"); - - // TODO: buggy way to stop processing the light. Should actually - // process required/optional fields in order and stop when there's - // no more. However, spec says "ShadowCasing" but the files say - // "ShadowType". - - while (!isCurrentToken(st, "ShowCamera") && - !isCurrentToken(st, "AddLight")) { - // TODO: - // Things that we're not yet processing (and should): - // - EdgeAngle: for spotlights, this is the angle which - // contains the linear falloff toward the edge of the - // ConeAngle. This doesn't directly map to J3d's - // "concentration" value, so it's left out for now. - - debugOutputLn(LINE_TRACE, "currentToken = " + st.sval); - - if (isCurrentToken(st, "ParentObject")) { - parent = (int)getNumber(st); - } - else if (isCurrentToken(st, "LightColor")) { - color.x = (float)getNumber(st)/255f; - color.y = (float)getNumber(st)/255f; - color.z = (float)getNumber(st)/255f; - lwLight.setColor(color); - } - else if (isCurrentToken(st, "LgtIntensity")) { - // TODO: must be able to handle envelopes here - String className = getClass().getName(); - int classIndex = className.lastIndexOf('.'); - String packageName; - if (classIndex < 0) - packageName = ""; - else - packageName = className.substring(0, classIndex) + "."; - EnvelopeHandler env = - new EnvelopeHandler(st, totalFrames, totalTime, - packageName + "LwsEnvelopeLightIntensity"); - if (env.hasValue) { - float intensity = (float)env.theValue; - color.x *= intensity; - color.y *= intensity; - color.z *= intensity; - lwLight.setIntensity(intensity); - } - else { - intensityEnvelope = - (LwsEnvelopeLightIntensity)env.theEnvelope; - } - } - else if (isCurrentToken(st, "LightType")) { - type = (int)getNumber(st); - } - else if (isCurrentToken(st, "Falloff")) { - float falloff = (float)getNumber(st); - attenuation.y = 1.0f/(1.0f - falloff) - 1.0f; - } - else if (isCurrentToken(st, "ConeAngle")) { - spotConeAngle = (float)getNumber(st) * (float)(Math.PI / 180.0); - } - try { - st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - st.pushBack(); // push "ShowCamera" or "AddLight" back on stack - } - - int getParent() { - return parent; - } - - /** - * Create Java3D objects from the data we got from the file - */ - void createJava3dObject(int loadBehaviors) { - Matrix4d mat = new Matrix4d(); - mat.setIdentity(); - // Set the node's transform matrix according to the first frame - // of the object's motion - LwsFrame firstFrame = motion.getFirstFrame(); - firstFrame.setMatrix(mat); - debugOutputLn(VALUES, "Light transform = " + mat); - Transform3D t1 = new Transform3D(); - t1.set(mat); - objectTransform = new TransformGroup(t1); - objectTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - Vector3f defaultDir = new Vector3f(0f, 0f, -1f); - Point3f defaultPos = new Point3f(0f, 0f, 0f); - - switch (type) { - case DIRECTIONAL: - light = new DirectionalLight(color, defaultDir); - break; - case POINT: - light = new PointLight(color, defaultPos, attenuation); - break; - case SPOT: - // Note: spotConeAngle in lw3d is half that of Java3d... - light = new SpotLight(color, defaultPos, attenuation, defaultDir, - 2 * spotConeAngle, 0.0f); - break; - default: - // Shouldn't get here - break; - } - - light.setCapability(Light.ALLOW_COLOR_WRITE); - if (light != null) { - lwLight.setLight(light); - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 100000.0); - light.setInfluencingBounds(bounds); - objectTransform.addChild(light); - - // load behaviors if we have to - objectBehavior = new Vector(); - if (loadBehaviors != 0) { - Behavior b; - b = null; - motion.createJava3dBehaviors(objectTransform); - b = motion.getBehaviors(); - if (b != null) - objectBehavior.addElement(b); - - if (intensityEnvelope != null) { - b = null; - intensityEnvelope.createJava3dBehaviors(lwLight); - b = intensityEnvelope.getBehaviors(); - if (b != null) - objectBehavior.addElement(b); - } - } - } - } - - @Override - public TransformGroup getObjectNode() - { - return objectTransform; - } - - Light getLight() { - return light; - } - - @Override - public Vector getObjectBehaviors() - { - debugOutputLn(TRACE, "getObjectBehaviors()"); - return objectBehavior; - } - - - void printVals() - { - debugOutputLn(VALUES, " LIGHT vals: "); - debugOutputLn(VALUES, " objName = " + objName); - motion.printVals(); - } - - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsMotion.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsMotion.java deleted file mode 100644 index 0aa7304..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsMotion.java +++ /dev/null @@ -1,693 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.StreamTokenizer; -import java.util.Enumeration; -import java.util.Vector; - -import javax.media.j3d.Alpha; -import javax.media.j3d.Behavior; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.Transform3D; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Matrix4d; -import javax.vecmath.Point3d; -import javax.vecmath.Point3f; -import javax.vecmath.Quat4f; - -import com.sun.j3d.internal.J3dUtilsI18N; -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; -import com.sun.j3d.utils.behaviors.interpolators.KBKeyFrame; -import com.sun.j3d.utils.behaviors.interpolators.KBRotPosScaleSplinePathInterpolator; - -/** - * This class is responsible for parsing the data in a Scene file related to - * an object's animation and constructing the appropriate Java3D - * Behavior objects. For each keyframe defined for the animation in the - * Lightwave file, this class creates a LwsFrame object to parse that - * keyframe data and create the appropriate data structures. Then for - * each of those LwsFrame objects created, LwsMotion creates a knot - * value for a PathInterpolator and fills in the appropriate field. Finally, - * the class creates a RotPosScalePathInterpolator with all of the data - * from the animation. There are also some utility functions in this - * class for dealing with special cases of animations, such as animations - * that begin after the first frame of the scene and animations that - * define frames in a way that Java3D cannot easily interpret. - */ - -class LwsMotion extends TextfileParser { - - // data from the file - String motionName; - LwsFrame frames[]; - int numFrames; - int numChannels; - boolean loop; - float totalTime; - int firstFrame; - int totalFrames; - Behavior behaviors; - - /** - * Constructor - */ - LwsMotion(StreamTokenizer st, int frames, float time) { - this(st, 0, frames, time, EXCEPTION); - - } - - /** - * Constructor: takes tokenizer, 1st frame of this animation, total - * number of frames, total time of animation, and the debug settings - */ - LwsMotion(StreamTokenizer st, int firstFrame, - int frames, float time, int debugVals) - throws ParsingErrorException, IncorrectFormatException { - - debugPrinter.setValidOutput(debugVals); - numFrames = 0; - totalTime = time; - this.firstFrame = firstFrame; - totalFrames = frames; - debugOutputLn(LINE_TRACE, "about to get motion name"); - motionName = getName(st); - debugOutputLn(LINE_TRACE, "about to get motion"); - getMotion(st); - } - - /** - * This method parses the tokenizer and creates the data structures - * that hold the data from that file. For each separate keyframe, - * this method calls LwsFrame to parse and interpret that data. - */ - void getMotion(StreamTokenizer st) - throws ParsingErrorException, IncorrectFormatException - { - debugOutputLn(TRACE, "getMotion()"); - numChannels = (int)getNumber(st); - if (numChannels != 9) { - throw new IncorrectFormatException( - J3dUtilsI18N.getString("LwsMotion0")); - } - debugOutputLn(LINE_TRACE, "got channels"); - - numFrames = (int)getNumber(st); - frames = new LwsFrame[numFrames]; - debugOutputLn(VALUES, "got frames" + numFrames); - - for (int i = 0; i < numFrames; ++i) { - frames[i] = new LwsFrame(st); - } - - debugOutput(LINE_TRACE, "got all frames"); - - getAndCheckString(st, "EndBehavior"); - int repeatVal = (int)getNumber(st); - if (repeatVal == 1) - loop = false; - else - loop = true; - - // need to make sure frame info is in sycn with j3d - // fixFrames(); - } - - /** - * The previous version of this method looked for sucessive frames with - * the same rotation value (mod 2PI). If it found such frames, it would - * divide that interval into 4 separate frames. - * This fix is not sufficient for various rotation cases, though. For - * instance, if the rotation difference between two frames is more than - * 2PI, the rotation will not case a flag to be fixed and the resulting - * rotation will only be between the delta of the two rotations, mod 2PI. - * The real fix should behave as follows: - * - Iterate through all sucessive frames - * - For any two frames that have rotation components that differ by more - * than PI/2 (one quarter rotation - no reason for this, but let's pick a - * small value to give our resulting path interpolations a better chance - * of behaving correctly), figure out how many frames we need to create to - * get increments of <= PI/2 between each frame. - * - Create these new frames - * - Set the odl frames pointer to the new frames structures. - */ - - void fixFrames() { - - boolean addedFrames = false; - Vector newFramesList = new Vector(); - double halfPI = (float)(Math.PI/2); - LwsFrame finalFrame = null; - - for (int i = 1 ; i < numFrames; ++i) { - LwsFrame prevFrame; - LwsFrame lastFrame = frames[i-1]; - LwsFrame thisFrame = frames[i]; - LwsFrame nextFrame; - - finalFrame = thisFrame; - newFramesList.add(lastFrame); - - double largestAngleDifference = 0; - double thisAngle = thisFrame.getHeading(); - double lastAngle = lastFrame.getHeading(); - double angleDifference = Math.abs(thisAngle - lastAngle); - if (angleDifference > largestAngleDifference) - largestAngleDifference = angleDifference; - - thisAngle = thisFrame.getPitch(); - lastAngle = lastFrame.getPitch(); - angleDifference = Math.abs(thisAngle - lastAngle); - if (angleDifference > largestAngleDifference) - largestAngleDifference = angleDifference; - - thisAngle = thisFrame.getBank(); - lastAngle = lastFrame.getBank(); - angleDifference = Math.abs(thisAngle - lastAngle); - if (angleDifference > largestAngleDifference) - largestAngleDifference = angleDifference; - - if (largestAngleDifference > halfPI) { - // Angles too big - create new frames - addedFrames = true; - int numNewFrames = (int)(largestAngleDifference/halfPI); - double increment = 1.0/(double)(numNewFrames+1); - double currentRatio = increment; - - double totalf = frames[numFrames-1].getFrameNum(); - double tlength = (thisFrame.getFrameNum() - - lastFrame.getFrameNum())/totalf; - double adj0; - double adj1; - - // get the previous and next frames - if ((i-1) < 1) { - prevFrame = frames[i-1]; - adj0 = 0.0; - } else { - prevFrame = frames[i-2]; - adj0 = tlength/((thisFrame.getFrameNum() - - prevFrame.getFrameNum())/totalf); - } - - if ((i+1) < numFrames) { - nextFrame = frames[i+1]; - adj1 = tlength/((nextFrame.getFrameNum()- - lastFrame.getFrameNum())/totalf); - } else { - nextFrame = frames[i]; - adj1 = 1.0; - } - - for (int j = 0; j < numNewFrames; ++j) { - - LwsFrame newFrame; - - // if linear interpolation - if (thisFrame.linearValue == 1) { - newFrame = new LwsFrame(lastFrame, - thisFrame, currentRatio); - - // if spline interpolation - } else { - newFrame = new LwsFrame(prevFrame, lastFrame, - thisFrame, nextFrame, - currentRatio, adj0, adj1); - } - - currentRatio += increment; - newFramesList.add(newFrame); - } - } - } - - // Now add in final frame - if (finalFrame != null) - newFramesList.add(finalFrame); - if (addedFrames) { - - // Recreate frames array from newFramesList - LwsFrame newFrames[] = new LwsFrame[newFramesList.size()]; - Enumeration elements = newFramesList.elements(); - int index = 0; - while (elements.hasMoreElements()) { - newFrames[index++] = (LwsFrame)elements.nextElement(); - } - frames = newFrames; - numFrames = frames.length; - for (int i = 0; i < numFrames; ++i) { - debugOutputLn(VALUES, "frame " + i + " = " + frames[i]); - frames[i].printVals(); - } - } - } - - /** - * Utility for getting integer mod value - */ - int intMod(int divisee, int divisor) { - int tmpDiv = divisee; - int tmpDivisor = divisor; - if (tmpDiv < 0) - tmpDiv = -tmpDiv; - if (tmpDivisor < 0) - tmpDivisor = -tmpDivisor; - while (tmpDiv > tmpDivisor) { - tmpDiv -= tmpDivisor; - } - return tmpDiv; - } - - /** - * Class that associates a particular frame with its effective frame - * number (which accounts for animations that start after frame 1) - */ - class FrameHolder { - double frameNumber; - LwsFrame frame; - - FrameHolder(LwsFrame theFrame, double number) { - frame = theFrame; - frameNumber = number; - } - } - - - /** - * This method was added to account for animations that start after - * the first frame (e.g., Juggler.lws starts at frame 30). We need - * to alter some of the information for the frames in this "frame subset" - */ - void playWithFrameTimes(Vector framesVector) { - debugOutputLn(TRACE, "playWithFrameTimes: firstFrame = " + - firstFrame); - if (firstFrame == 1) { - return; - } - else if (frames[numFrames-1].getFrameNum() < totalFrames) { - // First, create a vector that holds all LwsFrame's in frame - // increasing order (where order is started at firstFrame Modulo - // this motion's last frame - int motionLastFrame = - (int)(frames[numFrames-1].getFrameNum() + .4999999); - int newFirstFrame = intMod(firstFrame, motionLastFrame); - int newLastFrame = intMod(totalFrames, motionLastFrame); - int index = 0; - while (index < numFrames) { - if (frames[index].getFrameNum() >= newFirstFrame) - break; - ++index; - } - int startIndex = index; - if (frames[startIndex].getFrameNum() > firstFrame && - startIndex > 0) - startIndex--; // Actually, should interpolate - index = startIndex; - if (newFirstFrame < newLastFrame) { - while (index < numFrames && - frames[index].getFrameNum() <= newLastFrame) { - FrameHolder frameHolder = - new FrameHolder(frames[index], - frames[index].getFrameNum() - - newFirstFrame); - framesVector.addElement(frameHolder); - ++index; - } - } - else { - double currentNewFrameNumber = -1.0; - while (index < numFrames) { - currentNewFrameNumber = frames[index].getFrameNum() - - newFirstFrame; - FrameHolder frameHolder = - new FrameHolder(frames[index], - currentNewFrameNumber); - framesVector.addElement(frameHolder); - ++index; - } - index = 0; - while (index <= startIndex && - frames[index].getFrameNum() <= newLastFrame) { - if (index == 0) { - LwsFrame newFrame = - new LwsFrame(frames[index], - frames[index+1], - 1.0/(frames[index+1].getFrameNum() - - frames[index].getFrameNum())); - FrameHolder frameHolder = - new FrameHolder(newFrame, - newFrame.getFrameNum() + - currentNewFrameNumber); - framesVector.addElement(frameHolder); - } - else { - FrameHolder frameHolder = - new FrameHolder(frames[index], - frames[index].getFrameNum() + - currentNewFrameNumber); - framesVector.addElement(frameHolder); - } - ++index; - } - } - } - else { - int index = 0; - while (index < numFrames) { - if (frames[index].getFrameNum() >= firstFrame) - break; - ++index; - } - int startIndex = index; - if (frames[startIndex].getFrameNum() > firstFrame && - startIndex > 0) { - // Interpolate to first frame - double ratio = (double)firstFrame / - (frames[startIndex].getFrameNum() - - frames[startIndex-1].getFrameNum()); - LwsFrame newFrame = new LwsFrame(frames[startIndex-1], - frames[startIndex], - ratio); - FrameHolder frameHolder = - new FrameHolder(newFrame, newFrame.getFrameNum() - - firstFrame); - framesVector.addElement(frameHolder); - } - index = startIndex; - while (index < numFrames && - frames[index].getFrameNum() <= totalFrames) { - FrameHolder frameHolder = - new FrameHolder(frames[index], - frames[index].getFrameNum() - - firstFrame); - framesVector.addElement(frameHolder); - ++index; - } - if (frames[index-1].getFrameNum() < totalFrames) { - // Interpolate to last frame - double ratio = (double)(totalFrames - - frames[index-1].getFrameNum()) / - (frames[index].getFrameNum() - - frames[index-1].getFrameNum()); - LwsFrame newFrame = new LwsFrame(frames[index-1], - frames[index], - ratio); - FrameHolder frameHolder = - new FrameHolder(newFrame, totalFrames - firstFrame); - framesVector.addElement(frameHolder); - } - } - } - - /** - * Normally, we just create j3d behaviors from the frames. But if the - * animation's first frame is after frame number one, then we have to - * shuffle things around to account for playing/looping on this subset - * of the total frames of the animation - */ - void createJava3dBehaviorsForFramesSubset(TransformGroup target) { - - debugOutputLn(TRACE, "createJava3dBehaviorsForFramesSubset"); - Vector frameHolders = new Vector(); - playWithFrameTimes(frameHolders); - long alphaAtOne = 0; - - // determine looping - int loopCount; - if (loop) - loopCount = -1; - else - loopCount = 1; - loopCount = -1; - - int numFrames = frameHolders.size(); - - debugOutputLn(VALUES, "totalTime = " + totalTime); - debugOutputLn(VALUES, "loopCount = " + loopCount); - - FrameHolder lastFrameHolder = - (FrameHolder)frameHolders.elementAt(frameHolders.size() - 1); - LwsFrame lastFrame = lastFrameHolder.frame; - float animTime = 1000.0f * totalTime * - (float)(lastFrameHolder.frameNumber/(float)(totalFrames - - firstFrame)); - debugOutputLn(VALUES, " anim time: " + animTime); - debugOutputLn(VALUES, " totalFrames = " + totalFrames); - - if (!loop) - alphaAtOne = (long)(1000.0*totalTime - animTime); - Alpha theAlpha = - new Alpha(loopCount, Alpha.INCREASING_ENABLE, - 0, 0, (long)animTime, 0, - alphaAtOne, 0, 0, 0); - - float knots[] = new float[numFrames]; - Point3f[] positions = new Point3f[numFrames]; - Quat4f[] quats = new Quat4f[numFrames]; - Point3f[] scales = new Point3f[numFrames]; - Transform3D yAxis = new Transform3D(); - Matrix4d mat = new Matrix4d(); - KBKeyFrame[] keyFrames = new KBKeyFrame[numFrames]; - - for (int i=0; i < numFrames; ++i) { - - FrameHolder frameHolder = (FrameHolder)frameHolders.elementAt(i); - LwsFrame frame = frameHolder.frame; - - // copy position - positions[i] = frame.getPosition(); - - // copy scale - // Used to hardcode no-scale: scales[i] = 1.0f, 1.0f, 1.0f; - // Note that we can't do non-uniform scaling in the current Path - // interpolators. The interpolator just uses the x scale. - // getScale makes sure that we don't have any zero scale component - scales[i] = frame.getScale(); - - // copy rotation information - frame.setRotationMatrix(mat); - debugOutputLn(VALUES, "LwsMotion::createj3dbeh, mat = " + mat); - quats[i] = new Quat4f(); - quats[i].set(mat); - debugOutputLn(VALUES, " and quat = " + quats[i]); - - // calculate knot points from frame numbers - if (i == 0) - knots[i] = 0.0f; - else - knots[i] = (float)(frameHolder.frameNumber)/ - (float)(lastFrameHolder.frameNumber); - - // Create KB key frames - keyFrames[i] = new KBKeyFrame(knots[i], frame.linearValue, - positions[i], - (float)frame.heading, - (float)frame.pitch, - (float)frame.bank, - scales[i], - (float)frame.tension, - (float)frame.continuity, - (float)frame.bias); - - debugOutputLn(VALUES, "pos, knots, quat = " + - positions[i] + knots[i] + quats[i]); - } - - // Pass the KeyFrames to the interpolator an let it do its thing - KBRotPosScaleSplinePathInterpolator b = new - KBRotPosScaleSplinePathInterpolator(theAlpha, - target, - yAxis, - keyFrames); - if (b != null) { - behaviors = b; - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000000.0); - b.setSchedulingBounds(bounds); - target.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - target.addChild(behaviors); - } - } - - /** - * Create j3d behaviors for the data stored in this animation. This is - * done by creating a RotPosScalePathInterpolator object that contains - * all of the position, orientation, scale data for each keyframe. - */ - void createJava3dBehaviors(TransformGroup target) { - - if (numFrames <= 1) - behaviors = null; - else { - if (firstFrame > 1) { - createJava3dBehaviorsForFramesSubset(target); - return; - } - - long alphaAtOne = 0; - - // determine looping - int loopCount; - if (loop) - loopCount = -1; - else - loopCount = 1; - loopCount = -1; - - debugOutputLn(VALUES, "totalTime = " + totalTime); - debugOutputLn(VALUES, "loopCount = " + loopCount); - - float animTime = 1000.0f * totalTime * - (float)(frames[numFrames-1].getFrameNum()/(float)totalFrames); - - debugOutputLn(VALUES, " anim time: " + animTime); - debugOutputLn(VALUES, " totalFrames = " + totalFrames); - debugOutputLn(VALUES, " lastFrame = " + - frames[numFrames-1].getFrameNum()); - - if (!loop) - alphaAtOne = (long)(1000.0*totalTime - animTime); - Alpha theAlpha = - new Alpha(loopCount, Alpha.INCREASING_ENABLE, - 0, 0, (long)animTime, 0, - alphaAtOne, 0, 0, 0); - - float knots[] = new float[numFrames]; - Point3f[] positions = new Point3f[numFrames]; - Quat4f[] quats = new Quat4f[numFrames]; - Point3f[] scales = new Point3f[numFrames]; - Transform3D yAxis = new Transform3D(); - Matrix4d mat = new Matrix4d(); - KBKeyFrame[] keyFrames = new KBKeyFrame[numFrames]; - - for (int i=0; i < numFrames; ++i) { - - // copy position - positions[i] = frames[i].getPosition(); - - // copy scale - // Used to hardcode no-scale: scales[i] = 1.0f, 1.0f, 1.0f; - // Note that we can't do non-uniform scaling in the current Path - // interpolators. The interpolator just uses the x scale. - // getScale makes sure that we don't have any 0 scale component - scales[i] = frames[i].getScale(); - - // copy rotation information - frames[i].setRotationMatrix(mat); - debugOutputLn(VALUES, "LwsMotion::createj3dbeh, mat = " + mat); - quats[i] = new Quat4f(); - quats[i].set(mat); - debugOutputLn(VALUES, " and quat = " + quats[i]); - - // calculate knot points from frame numbers - if (i == 0) - knots[i] = 0.0f; - else - knots[i] = (float)(frames[i].getFrameNum())/ - (float)(frames[numFrames-1].getFrameNum()); - - // Create KB key frames - keyFrames[i] = new KBKeyFrame(knots[i],frames[i].linearValue, - positions[i], - (float)frames[i].heading, - (float)frames[i].pitch, - (float)frames[i].bank, - scales[i], - (float)frames[i].tension, - (float)frames[i].continuity, - (float)frames[i].bias); - - - debugOutputLn(VALUES, "pos, knots, quat = " + - positions[i] + knots[i] + quats[i]); - } - - // Pass the KeyFrames to the interpolator an let it do its thing - KBRotPosScaleSplinePathInterpolator b = new - KBRotPosScaleSplinePathInterpolator(theAlpha, - target, - yAxis, - keyFrames); - if (b != null) { - behaviors = b; - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000000.0); - b.setSchedulingBounds(bounds); - target.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - target.addChild(behaviors); - } - } - - } - - /** - * Returns the Behavior object created for this animation - */ - Behavior getBehaviors() { - return behaviors; - } - - /** - * Returns the first LwsFrame object (which contains the initial - * setup for a given object) - */ - LwsFrame getFirstFrame() { - if (numFrames > 0) - return frames[0]; - else - return null; - } - - /** - * Utility function for printing values - */ - void printVals() { - debugOutputLn(VALUES, " motionName = " + motionName); - debugOutputLn(VALUES, " numChannels = " + numChannels); - debugOutputLn(VALUES, " numFrames = " + numFrames); - debugOutputLn(VALUES, " loop = " + loop); - for (int i = 0; i < numFrames; ++i) { - debugOutputLn(VALUES, " FRAME " + i); - frames[i].printVals(); - } - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsObject.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsObject.java deleted file mode 100644 index 555655e..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsObject.java +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.StreamTokenizer; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Enumeration; -import java.util.StringTokenizer; -import java.util.Vector; - -import javax.media.j3d.Behavior; -import javax.media.j3d.Group; -import javax.media.j3d.Shape3D; -import javax.media.j3d.Transform3D; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Matrix4d; -import javax.vecmath.Vector3f; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * An LwsObject is passed a handle to the text file that contains the scene - * and is responsible for parsing a particular section of that file that - * describes a single object. This section defines the type of object - * (either a group or some geometry specified by an Object file) and - * some keyframe data that describes the an animation of the - * orientation/position/scale of the object. For geometry objects, this - * class instantiates a J3dLwoParser object to parse the binary data file. - * For the keyframe data, the class instantiates an LwsMotion object to - * parse and store that data. - */ - -class LwsObject extends TextfileParser implements LwsPrimitive { - - // data from the file - String fileName; - String objName; - LwsMotion motion; - int parent; - TransformGroup objectTransform; - Vector objectBehavior; - Vector shapeList = null; - boolean hasPivot = false; - TransformGroup pivotTransGroup = null; - - URL urlName; - String protocol; - int fileType; - - /** - * Constructor: parses object section of this scene file and - * creates all appropriate data structures to hold the information - * @param st StreamTokenizer for scene file - * @param loadObject boolean specifying that object is not a lw3d Null - * object - * @param firstFrame int holding the first frame of the scene's animation - * @param totalFrames int holding the total number of frames in the scene - * @param totalTime float holding the total time of the animation - * @param loader Lw3dLoader loader object that was created by user - * @param debugVals in holding current debug flags - */ - LwsObject(StreamTokenizer st, boolean loadObject, - int firstFrame, int totalFrames, float totalTime, - Lw3dLoader loader, int debugVals) - throws java.io.FileNotFoundException, - ParsingErrorException { - debugPrinter.setValidOutput(debugVals); - parent = -1; - - fileType = loader.getFileType(); - - try { - if (loadObject) { - // If this is true, then the object is actually described - // in an external geometry file. Get that filename - fileName = getString(st); - String path = null; - switch (loader.getFileType()) { - case Lw3dLoader.FILE_TYPE_FILENAME: - // No other case is current implemented in this loader - path = loader.getBasePath(); - if (path == null) - path = loader.getInternalBasePath(); - if (path != null) { - // It's not sufficient to just use the base path. - // Lightwave scene files tend to embed path names - // to object files that are only correct if you - // start from a certain directory. For example, a - // scene file in data/ may point to an object in - // data/Objects - but in this case - // getInternalBasePath() would be data/, so you'd - // look for the object in data/data/Objects... - // To attempt to overcome this confusing state of - // affairs, let's check path/filename - // first, then iterate all the way up the path - // until there are no more members of path. This - // will ensure that we'll at least pick up data - // files if they exist off of one of the parent - // directories of wherever the scene file is - // stored. - // No, I don't really like this solution, but I don't - // know of a better general approach for now... - - fileName = getQualifiedFilename(path, fileName); - } - break; - case Lw3dLoader.FILE_TYPE_URL: - path = ""; - URL pathUrl = loader.getBaseUrl(); - if (pathUrl != null) { - path = pathUrl.toString(); - // store the protocol - protocol = pathUrl.getProtocol(); - } - else { - path = loader.getInternalBaseUrl(); - // store the protocol - protocol = (new URL(path)).getProtocol(); - } - - urlName = getQualifiedURL(path, fileName); - break; - } - } - else - // else the object is a lw3d Null object; essentially a group - // which contains other objects - objName = getString(st); - skip(st, "ShowObject", 2); - debugOutputLn(LINE_TRACE, - "skipped showobject, about to get objectmotion"); - getAndCheckString(st, "ObjectMotion"); - debugOutputLn(LINE_TRACE, "got string " + st.sval); - // Create an LwsMotion object to parse the animation data - motion = new LwsMotion(st, firstFrame, totalFrames, - totalTime, debugVals); - debugOutputLn(LINE_TRACE, "got motion"); - boolean hasParent = false; // keeps bones prim from reassigning par - - // TODO: This isn't the greatest way to stop parsing an object - // (keying on the ShowOptions parameter), but it seems to be valid - // for the current lw3d format - while (!isCurrentToken(st, "ShadowOptions")) { - if (!hasParent && - isCurrentToken(st, "ParentObject")) { - parent = (int)getNumber(st); - hasParent = true; - } - else if (isCurrentToken(st, "PivotPoint")) { - // PivotPoint objects are tricky - they make the object - // rotate about this new point instead of the default - // So setup transform groups such that this happens - // correctly. - hasPivot = true; - float x = (float)getNumber(st); - float y = (float)getNumber(st); - float z = (float)getNumber(st); - Vector3f pivotPoint = new Vector3f(-x, -y, z); - Transform3D pivotTransform = new Transform3D(); - pivotTransform.set(pivotPoint); - pivotTransGroup = new TransformGroup(pivotTransform); - pivotTransGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - } - - else if (isCurrentToken(st, "ObjDissolve")) { - // Just handle it for now, don't care about value - EnvelopeHandler env = - new EnvelopeHandler(st, totalFrames, totalTime); - } - st.nextToken(); - } - getNumber(st); // skip shadow options parameter - debugOutputLn(LINE_TRACE, "done with LwsObject constructor"); - } - catch (MalformedURLException e) { - throw new FileNotFoundException(e.getMessage()); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - catch (NumberFormatException e) { - throw new ParsingErrorException("Expected a number, got " + - e.getMessage()); - } - } - - /** - * This method takes the given path and filename and checks whether - * that file exists. If not, it chops off the last part of pathname - * and recurse to try again. This has the effect of searching all the - * way up a given pathname for the existence of the file anywhere - * along that path. This is somewhat of a hack to get around the - * constraining way that Lightwave uses to define its data object - * locations in its scene files. - * - * If the filename is absolute, it will use the path information from - * the filename first, then the path information from the lws file. - * If the file can not be found in these locations, the local directory - * will be searched. - * In addition, it will look for filenames converted to lowercase to - * make it easier to use between Windows and Unix. - */ - - String getQualifiedFilename(String pathname, String filename) - throws java.io.FileNotFoundException { - - int index; - String pathname2 = ""; - - // System.out.println ("pathname:"+pathname+" filename:"+filename); - - // Do we have an absolute filename ? - if (filename.indexOf (File.separator) == 0) { - if ((index = filename.lastIndexOf (File.separator)) != -1) { - pathname2 = filename.substring (0, index+1); - filename = filename.substring (index+1); - } - else { - return null; // something out of the ordinary happened - } - } - - // See if we can find the file - // --------------------------- - - // Try pathname from absolute filename - try { - if (new File(pathname2 + filename).exists()) { - return (pathname2 + filename); - } - } - catch (NullPointerException ex) { - ex.printStackTrace(); - } - // Try lowercase filename - if (new File(pathname2 + filename.toLowerCase()).exists()) { - return (pathname2 + filename.toLowerCase()); - } - - // Try original pathname - if (new File(pathname + filename).exists()) { - return (pathname + filename); - } - // Try lowercase filename - if (new File(pathname + filename.toLowerCase()).exists()) { - return (pathname + filename.toLowerCase()); - } - - // Finally, let's check the local directory - if (new File(filename).exists()) { - return (filename); - } - // Try lowercase filename - if (new File(filename.toLowerCase()).exists()) { - return (filename.toLowerCase()); - } - - // Conditions that determine when we give up on the recursive search - if ((pathname.equals(File.separator)) || - (pathname == null) || - (pathname.equals(""))) { - - throw new java.io.FileNotFoundException(filename); - } - - // Try to find the file in the upper directories - // Chop off the last directory from pathname and recurse - StringBuffer newPathName = new StringBuffer(128); - StringTokenizer st = new StringTokenizer(pathname, File.separator); - int tokenCount = st.countTokens() - 1; - if (pathname.startsWith(java.io.File.separator)) - newPathName.append(File.separator); - for (int i = 0; i < tokenCount; ++i) { - String directory = st.nextToken(); - newPathName.append(directory); - newPathName.append(File.separator); - } - - String newPath = newPathName.toString(); - return getQualifiedFilename(newPath, filename); - } - - URL getQualifiedURL(String path, String file) - throws MalformedURLException { - - URL url = null; - - // try the path and the file -- this is the lightwave spec - try { - // create url - url = new URL(path + file); - // see if file exists - url.getContent(); - // return url if no exception is thrown - return url; - } - catch (IOException e) { - // Ignore - try something different - } - - // try a couple other options, but trying to open connections is slow, - // so don't try as many options as getQualifiedFilename - - // try absolute path - try { - url = new URL(file); - url.getContent(); - } - catch (IOException ex) { - // Ignore - try something different - } - - // try the absolute path with the protocol - try { - url = new URL(protocol + ":" + file); - url.getContent(); - return url; - } - catch (IOException ex) { - // Nothing else to try so give up - throw new MalformedURLException(path + file); - } - } - - /** - * Returns parent object - */ - int getParent() { - return parent; - } - - /** - * Adds the given child to the transform of this node (its parent). - */ - void addChild(LwsPrimitive child) { - debugOutputLn(TRACE, "addChild()"); - if (objectTransform != null) { - debugOutputLn(LINE_TRACE, "objectTransform = " + objectTransform); - if (child.getObjectNode() != null) { - debugOutputLn(LINE_TRACE, "child has object node"); - if (hasPivot) - pivotTransGroup.addChild(child.getObjectNode()); - else - objectTransform.addChild(child.getObjectNode()); - } -/* - if (child.getObjectBehaviors() != null) { - debugOutputLn(LINE_TRACE, "child has behaviors"); - Group bg = child.getObjectBehaviors(); - debugOutputLn(VALUES, " child behaviors = " + bg); - // TODO: should remove intermediate group nodes - objectBehavior.addChild(bg); - } -*/ - } - } - - /** - * Creates Java3d objects from the data stored for this object. - * The objects created consist of: A TransformGroup that holds the - * transform specified by the first keyframe, a Behavior that acts - * on the TransformGroup if there are more than 1 keyframes, and - * some geometry (created by J3dLwoParser) from an external geometry - * file (if the object wasn't an lw3d Null object (group)). - */ - void createJava3dObject(LwsObject cloneObject, int loadBehaviors) - throws IncorrectFormatException, ParsingErrorException, - FileNotFoundException - { - String seqToken = new String("_sequence_"); - Matrix4d mat = new Matrix4d(); - mat.setIdentity(); - // Set the node's transform matrix according to the first frame - // of the object's motion - LwsFrame firstFrame = motion.getFirstFrame(); - firstFrame.setMatrix(mat); - Transform3D t1 = new Transform3D(); - t1.set(mat); - objectTransform = new TransformGroup(t1); - objectTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - - // This following bit is a hack and should probably be removed. - // It was put in here in order to handle the "Tloop" functionality - // of holosketch, which was needed for the 1998 Javaone conference - // (the HighNoon demo, in particular). Having the code here, or - // using it, means that some object file names are tagged as special - // because they contain the phrase "_sequence_", which tells this - // object file reader that that object file is, in fact, a - // sequence file. It then creates a SequenceReader object to - // read that file and create an animation from the objects defined - // in that file. - // See SequenceReader.java for more information on this. - // By the way, a better/fuller implementation of this functionality - // would involve investigating a standard Plug-In for Lightwave - // that allows the writing out of sequence files from Bones data. - // i think it would be better to base any Tloop stuff on that - // standard than on some proprietary hack of our own. - - if (fileName != null && fileName.indexOf(seqToken) != -1) { // Tloop - - int index = fileName.indexOf(seqToken); - index += seqToken.length(); - String seqFilename = fileName.substring(index); - int endIndex = seqFilename.indexOf(".lwo"); - if (endIndex != -1) - seqFilename = seqFilename.substring(0, endIndex); - if ((new File(seqFilename)).exists()) { - SequenceReader sr = - new SequenceReader(seqFilename, - motion.totalTime, - (int)motion.totalFrames); - sr.printLines(); - sr.createJava3dObjects(debugPrinter.getValidOutput(), - loadBehaviors); - Group g = sr.getObjectNode(); - if (g != null) - objectTransform.addChild(g); - - // Sequence reader's getObjectBehaviors creates new Vector - objectBehavior = sr.getObjectBehaviors(); - - return; - } - } - - // Okay, now that that hack is out of the way, let's get on with - // "normal" Lightwave object files. - if (fileName != null || urlName != null) { - // If this object refers to an obj file, load it and create - // geometry from it. - if (cloneObject == null) { - debugOutputLn(VALUES, - "About to load binary file for " + fileName); - // Create a J3dLwoParser object to parse the geometry file - // and create the appropriate geometry - J3dLwoParser objParser = null; - switch (fileType) { - case Lw3dLoader.FILE_TYPE_FILENAME: - objParser = - new J3dLwoParser(fileName, - debugPrinter.getValidOutput()); - break; - case Lw3dLoader.FILE_TYPE_URL: - objParser = new J3dLwoParser(urlName, - debugPrinter.getValidOutput()); - break; - } - objParser.createJava3dGeometry(); - // pivot points change the parent transform - if (hasPivot) { - objectTransform.addChild(pivotTransGroup); - } - if (objParser.getJava3dShapeList() != null) { - shapeList = objParser.getJava3dShapeList(); - for (Enumeration e = shapeList.elements() ; - e.hasMoreElements() ;) { - if (!hasPivot || pivotTransGroup == null) - objectTransform.addChild((Shape3D)e.nextElement()); - else - pivotTransGroup.addChild((Shape3D)e.nextElement()); - } - } - } - else { - // Already read that file: Clone original object - debugOutputLn(LINE_TRACE, "Cloning shapes"); - Vector cloneShapeList = cloneObject.getShapeList(); - for (Enumeration e = cloneShapeList.elements() ; - e.hasMoreElements() ;) { - debugOutputLn(LINE_TRACE, " shape clone"); - Shape3D shape = (Shape3D)e.nextElement(); - Shape3D cloneShape = (Shape3D)shape.cloneTree(); - objectTransform.addChild(cloneShape); - } - } - } - - // Create j3d behaviors for the object's animation - objectBehavior = new Vector(); - if (loadBehaviors != 0) { - motion.createJava3dBehaviors(objectTransform); - Behavior b = motion.getBehaviors(); - if (b != null) - objectBehavior.addElement(b); - } - } - - /** - * Return list of Shape3D objects for this object file. This is used - * when cloning objects (if the scene file requests the same object file - * more than once, that object will be cloned instead of recreated each - * time). - */ - Vector getShapeList() { - return shapeList; - } - - /** - * Return the TransformGroup that holds this object file - */ - @Override - public TransformGroup getObjectNode() { - return objectTransform; - } - - /** - * Return the Group that holds this object's behaviors. The behaviors - * are grouped separately from the geometry so that they can be handled - * differently by the parent application. - */ - @Override - public Vector getObjectBehaviors() - { - debugOutputLn(TRACE, "getObjectBehaviors()"); - return objectBehavior; - } - - - /** - * Utiliy function to print some of the object values. Used in - * debugging. - */ - void printVals() - { - debugOutputLn(VALUES, " OBJECT vals: "); - debugOutputLn(VALUES, " fileName = " + fileName); - debugOutputLn(VALUES, " objName = " + objName); - motion.printVals(); - } -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsPrimitive.java b/src/classes/share/com/sun/j3d/loaders/lw3d/LwsPrimitive.java deleted file mode 100644 index f80d795..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/LwsPrimitive.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - - - -import java.util.Vector; - -import javax.media.j3d.TransformGroup; - -/** - * This is an interface which is implemented by LwsObject, - * LwsFog, LwsBackground, LwsLight, etc. It provides a generic method - * for objects to access some of the common data in these classes. - */ - -interface LwsPrimitive { - - // interface from which other Lws types (Object, Camera, etc.) - // inherit methods - - public Vector getObjectBehaviors(); - - public TransformGroup getObjectNode(); - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/ParserObject.java b/src/classes/share/com/sun/j3d/loaders/lw3d/ParserObject.java deleted file mode 100644 index 95e1453..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/ParserObject.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -/** - * This class is a superclass of the binary parsing classes. It provides - * some basic debugging utilities. - */ - -class ParserObject { - - - final static int TRACE = DebugOutput.TRACE, VALUES = DebugOutput.VALUES; - final static int MISC = DebugOutput.MISC, LINE_TRACE = DebugOutput.LINE_TRACE; - final static int NONE = DebugOutput.NONE, EXCEPTION = DebugOutput.EXCEPTION; - final static int TIME = DebugOutput.TIME, WARNING = DebugOutput.WARNING; - - protected DebugOutput debugPrinter; - - - ParserObject() { - debugPrinter = new DebugOutput(EXCEPTION); - } - - ParserObject(int debugVals) { - this(); - debugPrinter.setValidOutput(debugVals); - } - - - protected void debugOutputLn(int outputType, String theOutput) { - if (theOutput.equals("")) - debugPrinter.println(outputType, theOutput); - else - debugPrinter.println(outputType, - getClass().getName() + "::" + theOutput); - } - - protected void debugOutput(int outputType, String theOutput) { - debugPrinter.print(outputType, theOutput); - } - - - -} - - - - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceLine.java b/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceLine.java deleted file mode 100644 index 8629c7e..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceLine.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.StreamTokenizer; -import java.util.Enumeration; -import java.util.Hashtable; - -import javax.media.j3d.Alpha; -import javax.media.j3d.Behavior; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.Group; -import javax.media.j3d.Link; -import javax.media.j3d.Shape3D; -import javax.media.j3d.SharedGroup; -import javax.media.j3d.Switch; -import javax.media.j3d.SwitchValueInterpolator; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Point3d; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class was created to handle "sequence files", which allow - * holosketch-type Tloop sequences to be loaded through the lw3d loader. - * The class reads a sequence file line by line and uses SequenceLine to - * load the file specified in each line.<BR> - * Idea behind the Tloop process:<BR> - * Artist creates "tloops" (animations with each keyframe's - * geometry saved out explicitly) where the geometries are spaced - * one frame apart. Then I can automatically create a SwitchValueInterpolator - * based on this spacing. If the number of frames in the sequence is - * greater than the number of frames in the tloop, then it will automatically - * loop until the end of the sequence.<BR> - * Process:<BR> - * 1) Artist creates an animation of a null group that has a child with some - * special name, such as "bucket_sequence_bucketsequence.txt.lwo", which tells - * the lw3d loader that it should look for a sequence file by the name of - * bucketsequence.txt. What happens to this object is irrelevant (as far as - * the loader is concerned); all animation information is taken from its - * parent instead.<BR> - * 2) Artist saves out the geometry of the bucket at whatever frames she wants - * to. If she's saving a tloop (a sequence of frames), she should save them - * under the names <filename>xxx.lwo, where xxx is the 3-digit sequence number - * (000, 001, 002, etc.).<BR> - * 3) Artist creates the sequence file, which lists all saved geometry files - * (except sequences - these can be referred to simply by the first file - * (...000.lwo)), along with their associated start/end frames. She also lists - * the number of files in the sequence, although this parameter is implied - * anyway, through the existence of the sequence files and their naming - * convention. Maybe we should trash this guy.<BR> - * 4) In the lw3d loader, when LwsObject encounters an object with the - * filename "..._sequence_<filename>.lwo", it searches for filename. If - * found, it parses the file (using the SequenceReader class) to retrieve - * all parameters.<BR> - * 5) Each SequenceLine creates a Java3D group containing its objects. This - * is either a plain-old-Group (if there is only one object) or a Switch group - * with a SwitchValueInterpolator.<BR> - * 6) SequenceReader constructs a Switch group and adds all SequenceLine groups - * to this new group. It also creates a SwitchPathInterpolator (child of - * PathInterolator) that contsructs an Alpha based on the startFrame values of - * each SequenceLine. It creates a group and adds the SwitchPathInterpolator - * plus any SequenceLine SwitchValueInterpolators to this group.<BR> - * 7) LwsObject adds the SequenceReader Switch group to its objectTransform. - * It does a getBehaviors() from SequenceReader and adds the result (the - * SwitchPathInterpolator group) to its objectBehaviors group.<BR> - * 8) Done. - */ - -class SequenceLine { - - int startFrame; - int endFrame; - String fileName; - - Group geometryGroup = null; - Behavior behaviors; - int numFrames; - float totalTime; - int totalFrames; - - // storedRefList keeps references to already loaded objects - static Hashtable storedRefList = new Hashtable(); - - SequenceLine(StreamTokenizer st, float time, int frames) - throws ParsingErrorException { - try { - totalTime = time; - totalFrames = frames; - startFrame = (int)st.nval; - st.nextToken(); - endFrame = (int)st.nval; - st.nextToken(); - fileName = st.sval; - numFrames = endFrame - startFrame + 1; - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - - /** - * Creates a SwitchValueInterpolator which is used to switch between - * the objects specified for the sequence. This is done for files - * that end in "000", meaning that there are a sequence of files - * with that same base name that should specify every frame of a - * sequence for an object. The Switch node is used to hold all of the - * files and the Switch Behavior node is used to activate switching - * at the right time and to the right object. - */ - private void createSwitchBehavior(Switch target) { - - int loopCount = -1; - float animTime = 1000.0f * totalTime * - (float)(target.numChildren())/(float)totalFrames; - float startTime = 1000f * totalTime * - (float)startFrame/(float)totalFrames; - Alpha theAlpha = - new Alpha(-1, (long)startTime, 0, (long)animTime, 0, 0); - - SwitchValueInterpolator b=new SwitchValueInterpolator(theAlpha,target); - behaviors = b; - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000000.0); - b.setSchedulingBounds(bounds); - target.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); - target.addChild(behaviors); - - } - - /** - * Create Java3d objects from the data in the sequence line. This - * means that for a tloop file (ends in "000"), we're going to create - * the appropriate geometry for each file, put them all in a Switch - * node, then create a SwitchValueInterpolator to swap between the - * frames of the tloop. If it's not a tloop, then we're just going to - * create the geometry for that file. - */ - void createJava3dObjects(int debugVals, int loadBehaviors) - throws IncorrectFormatException, FileNotFoundException { - if (fileName.indexOf("000") != -1) { // Tloop - int index = fileName.indexOf("000"); - String fileNameBase = fileName.substring(0, index); - Switch s = new Switch(); - s.setCapability(Switch.ALLOW_SWITCH_READ); - s.setCapability(Switch.ALLOW_SWITCH_WRITE); - String tempFileName = fileName; - int fileNum = 0; - while ((new File(tempFileName)).exists()) { - if (storedRefList.get(tempFileName) != null) { - // System.out.println("retrieve stored version of " + - // tempFileName); - SharedGroup storedGroup = - (SharedGroup)storedRefList.get(tempFileName); - Link newLink = new Link(storedGroup); - s.addChild(newLink); - } - else { - // System.out.println("reading " + tempFileName); - J3dLwoParser objParser = new J3dLwoParser(tempFileName, - debugVals); - objParser.createJava3dGeometry(); - TransformGroup t = new TransformGroup(); - SharedGroup newSharedGroup = new SharedGroup(); - storedRefList.put(tempFileName, newSharedGroup); - newSharedGroup.addChild(t); - Link newLink = new Link(newSharedGroup); - s.addChild(newLink); - if (objParser.getJava3dShapeList() != null) { - for (Enumeration e = - objParser.getJava3dShapeList().elements() ; - e.hasMoreElements() ;) { - t.addChild((Shape3D)e.nextElement()); - } - } - } - ++fileNum; - String fileNumString = String.valueOf(fileNum); - if (fileNum < 10) - fileNumString = "00" + fileNumString; - else if (fileNum < 100) - fileNumString = "0" + fileNumString; - tempFileName = fileNameBase + fileNumString + ".lwo"; - } - behaviors = null; - if (loadBehaviors != 0) { - createSwitchBehavior(s); - } - geometryGroup = (Group)s; - } - else {// Not a tloop, just a file - geometryGroup = new Group(); - if (storedRefList.get(fileName) != null) { - // System.out.println("getting old ref to " + fileName); - SharedGroup storedGroup = - (SharedGroup)storedRefList.get(fileName); - Link newLink = new Link(storedGroup); - geometryGroup.addChild(newLink); - } - else { - // System.out.println("reading " + fileName); - J3dLwoParser objParser = new J3dLwoParser(fileName, - debugVals); - objParser.createJava3dGeometry(); - TransformGroup t = new TransformGroup(); - if (objParser.getJava3dShapeList() != null) { - for (Enumeration e = objParser.getJava3dShapeList().elements() ; - e.hasMoreElements() ;) { - t.addChild((Shape3D)e.nextElement()); - } - } - SharedGroup newSharedGroup = new SharedGroup(); - newSharedGroup.addChild(t); - Link newLink = new Link(newSharedGroup); - geometryGroup.addChild(newLink); - storedRefList.put(fileName, newSharedGroup); - } - } - } - - Group getGeometry() { - return geometryGroup; - } - - Behavior getBehavior() { - return behaviors; - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceReader.java b/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceReader.java deleted file mode 100644 index ac79dff..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/SequenceReader.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.StreamTokenizer; -import java.util.Enumeration; -import java.util.Vector; - -import javax.media.j3d.Alpha; -import javax.media.j3d.BoundingSphere; -import javax.media.j3d.Switch; -import javax.media.j3d.TransformGroup; -import javax.vecmath.Point3d; - -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class was created to read a special file format devised for - * JavaOne '98 that allowed Tloop functionality inside of Lightwave. It - * would be best to find a more standard solution, including using some - * plug-in for lw3d that I've heard of that allows artists to automatically - * save out the geometry for a file at every frame. - */ - -class SequenceReader { - - - Vector sequenceLines; - float totalTime; - int totalFrames; - - TransformGroup objectTransform; - Vector behaviorVector; - - /** - * Constructor: parses a sequence file and creates a new SequenceLine - * object to read in every line of the file - */ - SequenceReader(String filename, float time, int frames) - throws ParsingErrorException { - totalTime = time; - totalFrames = frames; - sequenceLines = new Vector(); - try { - // System.out.println("reading sequence from " + filename); - StreamTokenizer st = new StreamTokenizer(new BufferedReader( - new FileReader(filename))); - st.wordChars('_', '_'); - st.wordChars('/', '/'); - int type = st.nextToken(); - while (st.ttype != StreamTokenizer.TT_EOF) { - sequenceLines.addElement(new SequenceLine(st, - totalTime, - totalFrames)); - st.nextToken(); - } - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - - /** - * Creates Java3D objects from the data defined in the sequence - * file. Calls each sequenceLine object to create its own - * j3d objects, then puts all of those objects in a single Switch - * node. Finally, it creates a SwitchPathInterpolator object which - * handles switching between each object/s defined by each line - */ - void createJava3dObjects(int debugVals, int loadBehaviors) - throws FileNotFoundException { - - objectTransform = new TransformGroup(); - behaviorVector = new Vector(); - Enumeration e = sequenceLines.elements(); - Switch switchNode = new Switch(); - switchNode.setCapability(Switch.ALLOW_SWITCH_READ); - switchNode.setCapability(Switch.ALLOW_SWITCH_WRITE); - objectTransform.addChild(switchNode); - while (e.hasMoreElements()) { - SequenceLine line = (SequenceLine)e.nextElement(); - line.createJava3dObjects(debugVals, loadBehaviors); - if (line.getGeometry() != null) - switchNode.addChild(line.getGeometry()); - //objectTransform.addChild(line.getGeometry()); - if (line.getBehavior() != null) { - behaviorVector.addElement(line.getBehavior()); - } - } - float knots[] = new float[sequenceLines.size() + 1]; - for (int i = 0; i < knots.length-1; ++i) { - SequenceLine sl = (SequenceLine)sequenceLines.elementAt(i); - knots[i] = (float)sl.startFrame/(float)totalFrames; - } - knots[knots.length-1] = 1.0f; - Alpha theAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, - 0, 0, (long)(1000f * totalTime), 0, - 0, 0, 0, 0); - - SwitchPathInterpolator switchPath = - new SwitchPathInterpolator(theAlpha, - knots, - switchNode); - BoundingSphere bounds = - new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000000.0); - switchPath.setSchedulingBounds(bounds); - switchNode.addChild(switchPath); - behaviorVector.addElement(switchPath); - } - - TransformGroup getObjectNode() { - return objectTransform; - } - - Vector getObjectBehaviors() { - return behaviorVector; - } - - void printLines() { - Enumeration e = sequenceLines.elements(); - while (e.hasMoreElements()) { - SequenceLine line = (SequenceLine)e.nextElement(); - } - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/ShapeHolder.java b/src/classes/share/com/sun/j3d/loaders/lw3d/ShapeHolder.java deleted file mode 100644 index 70d2d5f..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/ShapeHolder.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.util.Vector; - -import javax.vecmath.Vector3f; - - -/** - * This class holds all of the vertex/facet/normal/surface-reference - * data for a particular object. It has utilities to calculate facet normals, - * but this is no longer in use since using the new GeomInfo utilities. - */ - -class ShapeHolder extends ParserObject { - - - Vector facetSizesList; - Vector facetIndicesList; - int facetIndicesArray[]; - int currentNumIndices = 0; - int numSurf; - int numVerts; - int facetIndices[]; - int facetSizes[]; - int normalIndices[]; - float normalCoords[]; - float coordsArray[]; - - ShapeHolder() { - } - - ShapeHolder(int debugVals) { - super(debugVals); - } - - - /** - * Print out (to stdout) the geometry data (coords, indices, - * and facet sizes). This is a debugging utility. - */ - void printGeometryData(LwoSurface surface) { - int i, j; - int indicesIndex = 0; - System.out.println("\nPolygon Data:"); - System.out.println(" Surface color = " + surface.color); - System.out.println(" Surface diffuse = " + surface.diffuseColor); - for (i = 0; i < facetSizes.length; ++i) { - int polySize = facetSizes[i]; - System.out.println("Facet of size " + polySize); - for (j = 0; j < polySize; ++j) { - int coordIndex = 3 * facetIndices[indicesIndex++]; - System.out.println("x, y, z = " + - coordsArray[coordIndex] + ", " + - coordsArray[coordIndex+1] + ", " + - coordsArray[coordIndex+2]); - } - } - } - - /** - * Constructs geometry arrays given a winding rule (it turns out that - * lw3d winding is opposite of j3d winding, so this is always set to - * true in J3dLwoParser) - */ - void createArrays(boolean reverseWinding) { - debugOutputLn(TRACE, "createArrays()"); - // debugOutputLn(VALUES, "facetIndices, faceSizesList = " + - // facetIndicesList + facetSizesList); - //debugOutputLn(VALUES, "ind and sizes size " + - // facetIndicesList.size() + ", " + - // facetSizesList.size()); - //facetIndices = - // new int[facetIndicesList.size()]; - facetIndices = new int[currentNumIndices]; - if (reverseWinding) { - int facetBeginIndex = 0; - for (int facetIndex = 0; - facetIndex < facetSizesList.size(); - ++facetIndex) { - int currFaceSize = - ((Integer)facetSizesList.elementAt(facetIndex)).intValue(); - int tempFace[] = new int[currFaceSize]; - for (int j = 0; j < currFaceSize; ++j) { - facetIndices[facetBeginIndex + j] = - facetIndicesArray[facetBeginIndex + - currFaceSize - j - 1]; - } - facetBeginIndex += currFaceSize; - } - - } - else { - for (int i = 0; i < facetIndices.length; ++i) { - facetIndices[i] = facetIndicesArray[i]; - } - } - - debugOutputLn(LINE_TRACE, "facetIndices.len and coordsArray.len = " + - facetIndices.length + ", " + coordsArray.length); - if (((Integer)facetSizesList.elementAt(0)).intValue() < 3) { - // if we're dealing with point/line primitives, then let's abandon - // the indexed route and simply construct a new coordsArray - // that holds the direct values we need for a GeometryArray - // object - debugOutputLn(LINE_TRACE, "Using direct geometry because " + - "facetIndices is of size " + - facetIndices.length + - " and coordsArray is of length "+ - coordsArray.length); - float newCoordsArray[] = new float[facetIndices.length * 3]; - int newCoordsIndex = 0; - for (int i = 0; i < facetIndices.length; ++i) { - newCoordsArray[newCoordsIndex++] = - coordsArray[facetIndices[i]*3]; - newCoordsArray[newCoordsIndex++] = - coordsArray[facetIndices[i]*3+1]; - newCoordsArray[newCoordsIndex++] = - coordsArray[facetIndices[i]*3+2]; - } - coordsArray = newCoordsArray; - facetIndices = null; - } - - facetSizes = - new int[facetSizesList.size()]; - for (int i = 0; i < facetSizes.length; ++i) { - facetSizes[i] = - ((Integer)facetSizesList.elementAt(i)).intValue(); - } - - facetSizesList = null; // Force garbage collection on Vectors - facetIndicesList = null; - facetIndicesArray = null; - } - - /** - * Force gc on all array objects - */ - void nullify() { - facetSizesList = null; // Force garbage collection on everything - facetIndicesList = null; - facetIndicesArray = null; - facetSizes = null; - facetIndices = null; - normalCoords = null; - normalIndices = null; - } - - /** - * This method calculates facet normals for the geometry. It is no - * longer used, as we're now using the GeometryInfo utility to calculate - * smooth normals - */ - void calcNormals() { - debugOutputLn(TRACE, "calcNormals()"); - debugOutputLn(LINE_TRACE, "coordsLength, facetsizes.len = " + - coordsArray.length + ", " + facetSizes.length); - if (facetSizes[0] > 2) { - // points and lines don't need normals, polys do - if (facetIndices != null) { - normalIndices = new int[facetIndices.length]; - normalCoords = new float[facetIndices.length * 3]; - } - else { - normalCoords = new float[coordsArray.length]; - } - debugOutputLn(LINE_TRACE, "normalCoords, incides len = " + - normalCoords.length + ", " + - ((facetIndices == null) ? 0 : normalIndices.length)); - int facetIndex = 0; - int tempIndex = -1; - for (int i = 0; i < facetSizes.length; i += 1) { - Vector3f norm; - int currFacetSize = facetSizes[i]; - //debugOutputLn(LINE_TRACE, " i, facetIndex, currSize = " + - // i + ", " + facetIndex + ", " + currFacetSize); - if (currFacetSize < 3) { - // This shouldn't occur - norm = new Vector3f(0f, 0f, 1f); - } - else { - Vector3f v1, v2; - int index1, index2, index3; - if (facetIndices != null) { - index1 = facetIndices[facetIndex]; - index2 = facetIndices[facetIndex+1]; - index3 = facetIndices[facetIndex+2]; - //debugOutputLn(VALUES, " index123 = " + - // index1 + ", " + index2 + ", " + index3); - } - else { - index1 = facetIndex; - index2 = facetIndex+1; - index3 = facetIndex+2; - } - v1 = new - Vector3f(coordsArray[index2*3] - coordsArray[index1*3], - coordsArray[index2*3+1] - coordsArray[index1*3+1], - coordsArray[index2*3+2] - coordsArray[index1*3+2]); - v2 = new - Vector3f(coordsArray[index3*3] - coordsArray[index1*3], - coordsArray[index3*3+1] - coordsArray[index1*3+1], - coordsArray[index3*3+2] - coordsArray[index1*3+2]); - //debugOutputLn(VALUES, "v1, v2 = " + v1 + v2); - norm = new Vector3f(); - norm.cross(v1, v2); - norm.normalize(norm); - } - - for (int j = 0; j < currFacetSize; ++j) { - int normIndex = facetIndex + j; - normalCoords[normIndex*3] = norm.x; - normalCoords[normIndex*3+1] = norm.y; - normalCoords[normIndex*3+2] = norm.z; - if (facetIndices != null) - normalIndices[normIndex] = normIndex; - } - facetIndex += currFacetSize; - } - } - debugOutputLn(TRACE, "done with calcNormals()"); - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/SwitchPathInterpolator.java b/src/classes/share/com/sun/j3d/loaders/lw3d/SwitchPathInterpolator.java deleted file mode 100644 index b52e1bf..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/SwitchPathInterpolator.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - - package com.sun.j3d.loaders.lw3d; - - -import java.util.Enumeration; - -import javax.media.j3d.Alpha; -import javax.media.j3d.Switch; - -import com.sun.j3d.internal.J3dUtilsI18N; - -/** - * This class was used in conjunction with SequenceReader to create - * Tloop functionality inside of Lightwave files. This behavior handles - * the switching between objects defined in separate lines of a - * sequence file. That is, each line in a sequence file has the name - * of an object (or an object sequence, if the name ends in "000") - * and details the start and end frames that that object should be active. - * This class determines which object/s defined in the file should be active - * at any given time during the animation. - */ - -class SwitchPathInterpolator extends FloatValueInterpolator { - - Switch target; - int firstSwitchIndex; - int lastSwitchIndex; - int currentChild; - int childCount; - - /** - * Constructs a new SwitchPathInterpolator object. - * @param alpha the alpha object for this interpolator - * @param knots an array of knot values that specify a spline - */ - SwitchPathInterpolator(Alpha alpha, float knots[], Switch target) { - - super(alpha, knots, new float[knots.length]); - - if (knots.length != (target.numChildren() + 1)) - throw new IllegalArgumentException(J3dUtilsI18N.getString("SwitchPathInterpolator0")); - - this.target = target; - firstSwitchIndex = 0; - lastSwitchIndex = target.numChildren() - 1; - childCount = lastSwitchIndex + 1; - } - - /** - * This method sets the correct child for the Switch node according - * to alpha - * @param criteria enumeration of criteria that have triggered this wakeup - */ - - @Override - public void processStimulus(Enumeration criteria) { - - int child; - - // Handle stimulus - if (this.getAlpha() != null) { - - // Let PathInterpolator calculate the correct - // interpolated knot point - computePathInterpolation(); - - if (currentKnotIndex > 0) - child = currentKnotIndex - 1; - else - child = 0; - - if (target.getWhichChild() != child) { - target.setWhichChild(child); - } - - if ((this.getAlpha()).finished()) - return; - } - - wakeupOn(defaultWakeupCriterion); - } - -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/TargaReader.java b/src/classes/share/com/sun/j3d/loaders/lw3d/TargaReader.java deleted file mode 100644 index 617c710..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/TargaReader.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class parses a standard Targa file and retrieves the image stored - * therein, storing the pixel data in a BufferedImage. - */ - -class TargaReader extends ParserObject { - - BufferedInputStream bufferedReader; - Image theImage = null; - - /** - * Constructor: creates file reader and calls parseFile() to do the real - * work - */ - TargaReader(String fileName, int debugVals) throws FileNotFoundException { - super(debugVals); - debugOutputLn(TRACE, "constructor"); - bufferedReader = new BufferedInputStream( - new DataInputStream(new FileInputStream(fileName))); - if (bufferedReader != null) - parseFile(); - } - - /** - * Returns the image that was created from parsing the targa file (null - * if the file reading failed) - */ - Image getImage() { - return theImage; - } - - /** - * This method parses the file and stores the pixel data in a - * BufferedImage. The basic file format is: - * Byte Description - * - * 0 Image ID Length - * 1 Colormap type - * 2 Image Type - * 3-4 Colormap spec: 1st entry index - * 5-6 Colormap spec: length - * 7 Colormap spec: entry size - * 8-9 X-origin of lower-left corner - * 10-11 Y-origin of lower-left corner - * 12-13 Image width - * 14-15 Image height - * 16 Pixel depth - * 17 00(origin)(alpha) - * first 2 bytes 0, next 2 starting corner, - * last four number of overlay bits per pixel - * 18- Image ID - * ?? Colormap data - * ?? Image Data - * ?? Developer Area - * ?? Extension Area - * ?? File Footer - * - * We're going to make some assumptions about the format of files we're - * asked to load. In particular, we're not going to do any colormpa-based - * images: the images need to be either 24-bit or 32-bit true color. - * We're also going to ignore vaiours parameters in the header block, since - * they complicate life and don't appear to be used in Lightwave image - * files. In particular, the following fields will be ignored: - * Image ID, colormap info, xy origins, and alpha/overlay bits. - */ - - void parseFile() - throws IncorrectFormatException, ParsingErrorException { - try { - int idLength = bufferedReader.read(); - int colormapPresent = bufferedReader.read(); - int imageType = bufferedReader.read(); - bufferedReader.skip(9); // skipping camp and xy origin data - int width = bufferedReader.read() | bufferedReader.read() << 8; - int height = bufferedReader.read() | bufferedReader.read() << 8; - int depth = bufferedReader.read(); - int flags = bufferedReader.read(); - boolean bottomToTop = ((flags & 0x20) == 0); - boolean leftToRight = ((flags & 0x10) == 0); - bufferedReader.skip(idLength); - - // Check on the file parameters to see whether we should punt - if ((colormapPresent == 1) || - imageType != 2 || - (depth != 24 && - depth != 32)) { - // Punt - throw new IncorrectFormatException( - "This format is not readable by the Lightwave " + - "loader. Only 24- or 32-bit true-color " + - "uncompressed Targa images will work"); - } - - // Image format must be okay for us to read - BufferedImage bImage = - new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - int[] imageBits = - ((DataBufferInt)bImage.getRaster().getDataBuffer()).getData(); - - int row; - int column; - - for (int i = 0; i < height; ++i) { - if (bottomToTop) - row = (height - i - 1); - else - row = i; - for (int j = 0; j < width; ++j) { - - if (leftToRight) - column = j; - else - column = (width - j - 1); - - int blue = bufferedReader.read(); - int green = bufferedReader.read(); - int red = bufferedReader.read(); - int alpha = 0xff; - if (depth == 32) - alpha = bufferedReader.read(); - imageBits[row*width + column] = alpha << 24 | - red << 16 | - green << 8 | - blue; - } - } - theImage = bImage; - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - -} - diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/TextfileParser.java b/src/classes/share/com/sun/j3d/loaders/lw3d/TextfileParser.java deleted file mode 100644 index f0cc401..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/TextfileParser.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.lw3d; - -import java.io.IOException; -import java.io.StreamTokenizer; - -import com.sun.j3d.loaders.ParsingErrorException; - -/** - * This class is a superclass for most of the Lws* Scene-file parsing - * classes. It provides some debugging utilities, as well as utilities for - * reading the types of data common to this loader. - */ - -class TextfileParser { - - // class variables - static int WORD = StreamTokenizer.TT_WORD; - static int NUMBER = StreamTokenizer.TT_NUMBER; - int currentLevel = 3; - final static int TRACE = DebugOutput.TRACE, VALUES = DebugOutput.VALUES; - final static int MISC = DebugOutput.MISC, LINE_TRACE = DebugOutput.LINE_TRACE; - final static int NONE = DebugOutput.NONE, EXCEPTION = DebugOutput.EXCEPTION; - final static int TIME = DebugOutput.TIME; - protected DebugOutput debugPrinter; - char lineSeparatorChar = 0; - - TextfileParser() { - debugPrinter = new DebugOutput(EXCEPTION); - String lineSeparator = System.getProperty("line.separator"); - lineSeparatorChar = lineSeparator.charAt(0); - debugOutputLn(VALUES, "lineSeparatorChar = " + (int)lineSeparatorChar); - } - - - protected void debugOutputLn(int outputType, String theOutput) { - if (theOutput.equals("")) - debugPrinter.println(outputType, theOutput); - else { - debugPrinter.println(outputType, - getClass().getName() + "::" + theOutput); - } - } - - protected void debugOutput(int outputType, String theOutput) { - debugPrinter.print(outputType, theOutput); - } - - /** - * Utility method to advance the tokenizer until we see the given - * string. This is used to skip by various parameters that we - * currently ignore in the loader. - */ - void skipUntilString(StreamTokenizer st, String theString) - throws ParsingErrorException { - boolean done = false; - try { - while (!done) { - st.nextToken(); - if (st.ttype == WORD && - st.sval.equals(theString)) - done = true; - } - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - - - /** - * Returns number from the tokenizer. Note that we don't recognize - * numbers in the tokenizer automatically because numbers might be in - * scientific notation, which isn't processed correctly by - * StreamTokenizer - */ - double getNumber(StreamTokenizer st) - throws ParsingErrorException, NumberFormatException { - try { - int token = st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - checkType(st, WORD); - return ((Double.valueOf(st.sval)).doubleValue()); - } - - /** - * Returns String from the tokenizer - */ - String getString(StreamTokenizer st) throws ParsingErrorException { - try { - st.nextToken(); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - checkType(st, WORD); - return (st.sval); - } - - /** - * Returns a "name" from the stream. This is different from simply a - * String because the name could contain whitespace characters - * (such as "object 1" or "objectname (sequence)") that would confuse - * the string parser. So we just grab all characters until EOL and - * concatenate them together to form the name - */ - String getName(StreamTokenizer st) throws ParsingErrorException { - String theName = ""; - st.ordinaryChar(lineSeparatorChar); - st.ordinaryChar('\n'); - st.ordinaryChar('\r'); - try { - st.nextToken(); - while (st.ttype != lineSeparatorChar && - st.ttype != '\r' && - st.ttype != '\n') { - if (st.ttype != '(' && - st.ttype != ')') - theName += st.sval; - st.nextToken(); - } - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - st.whitespaceChars(lineSeparatorChar, lineSeparatorChar); - st.whitespaceChars('\n', '\n'); - st.whitespaceChars('\r', '\r'); - debugOutputLn(VALUES, "name = " + theName); - return theName; - } - - /** - * Gets the next token and ensures that it is the string we were - * expecting to see - */ - void getAndCheckString(StreamTokenizer st, String expectedValue) - throws ParsingErrorException { - try { - st.nextToken(); - checkString(st, expectedValue); - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - - /** - * Error checking routine - makes sure the current token is the string - * we were expecting - */ - void checkString(StreamTokenizer st, String theString) throws - ParsingErrorException { - if (!(st.ttype == StreamTokenizer.TT_WORD) || - !st.sval.equals(theString)) - throw new ParsingErrorException( - "Bad String Token (wanted " + theString + ", got " + st.sval + - ": " + st.toString()); - } - - /** - * Error checking routine - makes sure the current token is of the right - * type - */ - void checkType(StreamTokenizer st, int theType) - throws ParsingErrorException { - if (!(st.ttype == theType)) - throw new ParsingErrorException( - "Bad Type Token, Expected " + theType + " and received" + - st.ttype); - } - - /** - * Utility routine - gets next token, checks it against our expectation, - * then skips a given number of tokens. This can be used to parse - * through (and ignore) certain parameter/value sets in the files - */ - void skip(StreamTokenizer st, String tokenString, int skipVals) - throws ParsingErrorException { - try { - st.nextToken(); - checkString(st, tokenString); - for (int i = 0; i < skipVals; ++i) { - st.nextToken(); - } - } - catch (IOException e) { - throw new ParsingErrorException(e.getMessage()); - } - } - - /** - * Utility method- used to check whether the current token is equal - * to the given string - */ - boolean isCurrentToken(StreamTokenizer st, String tokenString) { - if (st.ttype == WORD) - return (st.sval.equals(tokenString)); - return false; - } -} diff --git a/src/classes/share/com/sun/j3d/loaders/lw3d/package.html b/src/classes/share/com/sun/j3d/loaders/lw3d/package.html deleted file mode 100644 index e87c100..0000000 --- a/src/classes/share/com/sun/j3d/loaders/lw3d/package.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> -<head> - <meta content="text/html; charset=ISO-8859-1" - http-equiv="content-type"> - <title>com.sun.j3d.loaders.lw3d</title> -</head> -<body> -<p>Provides a Java 3D loader for Lightwave 3D scene files.</p> -</body> -</html> diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/DefaultMaterials.java b/src/classes/share/com/sun/j3d/loaders/objectfile/DefaultMaterials.java deleted file mode 100644 index dfa102d..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/DefaultMaterials.java +++ /dev/null @@ -1,947 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.objectfile; - -/** - * This class provides default materials for the object file loader - */ -class DefaultMaterials { - /** - * String that describes the default materials. - */ - static final String materials = - "newmtl amber\n" + - "Ka 0.0531 0.0531 0.0531\n" + - "Kd 0.5755 0.2678 0.0000\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl amber_trans\n" + - "Ka 0.0531 0.0531 0.0531\n" + - "Kd 0.5755 0.2678 0.0000\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "d 0.8400\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl charcoal\n" + - "Ka 0.0082 0.0082 0.0082\n" + - "Kd 0.0041 0.0041 0.0041\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl lavendar\n" + - "Ka 0.1281 0.0857 0.2122\n" + - "Kd 0.2187 0.0906 0.3469\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl navy_blue\n" + - "Ka 0.0000 0.0000 0.0490\n" + - "Kd 0.0000 0.0000 0.0531\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl pale_green\n" + - "Ka 0.0444 0.0898 0.0447\n" + - "Kd 0.0712 0.3796 0.0490\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl pale_pink\n" + - "Ka 0.0898 0.0444 0.0444\n" + - "Kd 0.6531 0.2053 0.4160\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl pale_yellow\n" + - "Ka 0.3606 0.3755 0.0935\n" + - "Kd 0.6898 0.6211 0.1999\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl peach\n" + - "Ka 0.3143 0.1187 0.0167\n" + - "Kd 0.6367 0.1829 0.0156\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl periwinkle\n" + - "Ka 0.0000 0.0000 0.1184\n" + - "Kd 0.0000 0.0396 0.8286\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl redwood\n" + - "Ka 0.0204 0.0027 0.0000\n" + - "Kd 0.2571 0.0330 0.0000\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl smoked_glass\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0041 0.0041 0.0041\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "d 0.9800\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl aqua_filter\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.3743 0.6694 0.5791\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "d 0.9800\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl yellow_green\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.1875 0.4082 0.0017\n" + - "Ks 0.1878 0.1878 0.1878\n" + - "illum 2\n" + - "Ns 91.4700\n" + - "\n" + - "newmtl bluetint\n" + - "Ka 0.1100 0.4238 0.5388\n" + - "Kd 0.0468 0.7115 0.9551\n" + - "Ks 0.3184 0.3184 0.3184\n" + - "illum 9\n" + - "d 0.5700\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl plasma\n" + - "Ka 0.4082 0.0816 0.2129\n" + - "Kd 1.0000 0.0776 0.4478\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 9\n" + - "d 0.7500\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl emerald\n" + - "Ka 0.0470 1.0000 0.0000\n" + - "Kd 0.0470 1.0000 0.0000\n" + - "Ks 0.2000 0.2000 0.2000\n" + - "illum 9\n" + - "d 0.7500\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl ruby\n" + - "Ka 1.0000 0.0000 0.0000\n" + - "Kd 1.0000 0.0000 0.0000\n" + - "Ks 0.2000 0.2000 0.2000\n" + - "illum 9\n" + - "d 0.7500\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl sapphire\n" + - "Ka 0.0235 0.0000 1.0000\n" + - "Kd 0.0235 0.0000 1.0000\n" + - "Ks 0.2000 0.2000 0.2000\n" + - "illum 9\n" + - "d 0.7500\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl white\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 1.0000 1.0000 1.0000\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl red\n" + - "Ka 0.4449 0.0000 0.0000\n" + - "Kd 0.7714 0.0000 0.0000\n" + - "Ks 0.8857 0.0000 0.0000\n" + - "illum 2\n" + - "Ns 136.4300\n" + - "\n" + - "newmtl blue_pure\n" + - "Ka 0.0000 0.0000 0.5000\n" + - "Kd 0.0000 0.0000 1.0000\n" + - "Ks 0.0000 0.0000 0.5000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl lime\n" + - "Ka 0.0000 0.5000 0.0000\n" + - "Kd 0.0000 1.0000 0.0000\n" + - "Ks 0.0000 0.5000 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl green\n" + - "Ka 0.0000 0.2500 0.0000\n" + - "Kd 0.0000 0.2500 0.0000\n" + - "Ks 0.0000 0.2500 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl yellow\n" + - "Ka 1.0000 0.6667 0.0000\n" + - "Kd 1.0000 0.6667 0.0000\n" + - "Ks 1.0000 0.6667 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl purple\n" + - "Ka 0.5000 0.0000 1.0000\n" + - "Kd 0.5000 0.0000 1.0000\n" + - "Ks 0.5000 0.0000 1.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl orange\n" + - "Ka 1.0000 0.1667 0.0000\n" + - "Kd 1.0000 0.1667 0.0000\n" + - "Ks 1.0000 0.1667 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl grey\n" + - "Ka 0.5000 0.5000 0.5000\n" + - "Kd 0.1837 0.1837 0.1837\n" + - "Ks 0.5000 0.5000 0.5000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl rubber\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0100 0.0100 0.0100\n" + - "Ks 0.1000 0.1000 0.1000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl flaqua\n" + - "Ka 0.0000 0.4000 0.4000\n" + - "Kd 0.0000 0.5000 0.5000\n" + - "illum 1\n" + - "\n" + - "newmtl flblack\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0041 0.0041 0.0041\n" + - "illum 1\n" + - "\n" + - "newmtl flblue_pure\n" + - "Ka 0.0000 0.0000 0.5592\n" + - "Kd 0.0000 0.0000 0.7102\n" + - "illum 1\n" + - "\n" + - "newmtl flgrey\n" + - "Ka 0.2163 0.2163 0.2163\n" + - "Kd 0.5000 0.5000 0.5000\n" + - "illum 1\n" + - "\n" + - "newmtl fllime\n" + - "Ka 0.0000 0.3673 0.0000\n" + - "Kd 0.0000 1.0000 0.0000\n" + - "illum 1\n" + - "\n" + - "newmtl florange\n" + - "Ka 0.6857 0.1143 0.0000\n" + - "Kd 1.0000 0.1667 0.0000\n" + - "illum 1\n" + - "\n" + - "newmtl flpurple\n" + - "Ka 0.2368 0.0000 0.4735\n" + - "Kd 0.3755 0.0000 0.7510\n" + - "illum 1\n" + - "\n" + - "newmtl flred\n" + - "Ka 0.4000 0.0000 0.0000\n" + - "Kd 1.0000 0.0000 0.0000\n" + - "illum 1\n" + - "\n" + - "newmtl flyellow\n" + - "Ka 0.7388 0.4925 0.0000\n" + - "Kd 1.0000 0.6667 0.0000\n" + - "illum 1\n" + - "\n" + - "newmtl pink\n" + - "Ka 0.9469 0.0078 0.2845\n" + - "Kd 0.9878 0.1695 0.6702\n" + - "Ks 0.7429 0.2972 0.2972\n" + - "illum 2\n" + - "Ns 106.2000\n" + - "\n" + - "newmtl flbrown\n" + - "Ka 0.0571 0.0066 0.0011\n" + - "Kd 0.1102 0.0120 0.0013\n" + - "illum 1\n" + - "\n" + - "newmtl brown\n" + - "Ka 0.1020 0.0185 0.0013\n" + - "Kd 0.0857 0.0147 0.0000\n" + - "Ks 0.1633 0.0240 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl glass\n" + - "Ka 1.0000 1.0000 1.0000\n" + - "Kd 0.4873 0.4919 0.5306\n" + - "Ks 0.6406 0.6939 0.9020\n" + - "illum 2\n" + - "Ns 200.0000\n" + - "\n" + - "newmtl flesh\n" + - "Ka 0.4612 0.3638 0.2993\n" + - "Kd 0.5265 0.4127 0.3374\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl aqua\n" + - "Ka 0.0000 0.4000 0.4000\n" + - "Kd 0.0000 0.5000 0.5000\n" + - "Ks 0.5673 0.5673 0.5673\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl black\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0020 0.0020 0.0020\n" + - "Ks 0.5184 0.5184 0.5184\n" + - "illum 2\n" + - "Ns 157.3600\n" + - "\n" + - "newmtl silver\n" + - "Ka 0.9551 0.9551 0.9551\n" + - "Kd 0.6163 0.6163 0.6163\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl dkblue_pure\n" + - "Ka 0.0000 0.0000 0.0449\n" + - "Kd 0.0000 0.0000 0.1347\n" + - "Ks 0.0000 0.0000 0.5673\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl fldkblue_pure\n" + - "Ka 0.0000 0.0000 0.0449\n" + - "Kd 0.0000 0.0000 0.1347\n" + - "illum 1\n" + - "\n" + - "newmtl dkgreen\n" + - "Ka 0.0000 0.0122 0.0000\n" + - "Kd 0.0058 0.0245 0.0000\n" + - "Ks 0.0000 0.0490 0.0000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl dkgrey\n" + - "Ka 0.0490 0.0490 0.0490\n" + - "Kd 0.0490 0.0490 0.0490\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl ltbrown\n" + - "Ka 0.1306 0.0538 0.0250\n" + - "Kd 0.2776 0.1143 0.0531\n" + - "Ks 0.3000 0.1235 0.0574\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl fldkgreen\n" + - "Ka 0.0000 0.0122 0.0000\n" + - "Kd 0.0058 0.0245 0.0000\n" + - "illum 1\n" + - "\n" + - "newmtl flltbrown\n" + - "Ka 0.1306 0.0538 0.0250\n" + - "Kd 0.2776 0.1143 0.0531\n" + - "illum 1\n" + - "\n" + - "newmtl tan\n" + - "Ka 0.4000 0.3121 0.1202\n" + - "Kd 0.6612 0.5221 0.2186\n" + - "Ks 0.5020 0.4118 0.2152\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl fltan\n" + - "Ka 0.4000 0.3121 0.1202\n" + - "Kd 0.6612 0.4567 0.1295\n" + - "illum 1\n" + - "\n" + - "newmtl brzskin\n" + - "Ka 0.4408 0.2694 0.1592\n" + - "Kd 0.3796 0.2898 0.2122\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl lips\n" + - "Ka 0.4408 0.2694 0.1592\n" + - "Kd 0.9265 0.2612 0.2898\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl redorange\n" + - "Ka 0.3918 0.0576 0.0000\n" + - "Kd 0.7551 0.0185 0.0000\n" + - "Ks 0.4694 0.3224 0.1667\n" + - "illum 2\n" + - "Ns 132.5600\n" + - "\n" + - "newmtl blutan\n" + - "Ka 0.4408 0.2694 0.1592\n" + - "Kd 0.0776 0.2571 0.2041\n" + - "Ks 0.1467 0.1469 0.0965\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl bluteal\n" + - "Ka 0.0041 0.1123 0.1224\n" + - "Kd 0.0776 0.2571 0.2041\n" + - "Ks 0.1467 0.1469 0.0965\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl pinktan\n" + - "Ka 0.4408 0.2694 0.1592\n" + - "Kd 0.6857 0.2571 0.2163\n" + - "Ks 0.1467 0.1469 0.0965\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl brnhair\n" + - "Ka 0.0612 0.0174 0.0066\n" + - "Kd 0.0898 0.0302 0.0110\n" + - "Ks 0.1306 0.0819 0.0352\n" + - "illum 2\n" + - "Ns 60.4700\n" + - "\n" + - "newmtl blondhair\n" + - "Ka 0.4449 0.2632 0.0509\n" + - "Kd 0.5714 0.3283 0.0443\n" + - "Ks 0.7755 0.4602 0.0918\n" + - "illum 2\n" + - "Ns 4.6500\n" + - "\n" + - "newmtl flblonde\n" + - "Ka 0.4449 0.2632 0.0509\n" + - "Kd 0.5714 0.3283 0.0443\n" + - "illum 1\n" + - "\n" + - "newmtl yelloworng\n" + - "Ka 0.5837 0.1715 0.0000\n" + - "Kd 0.8857 0.2490 0.0000\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl bone\n" + - "Ka 0.3061 0.1654 0.0650\n" + - "Kd 0.9000 0.7626 0.4261\n" + - "Ks 0.8939 0.7609 0.5509\n" + - "illum 2\n" + - "Ns 200.0000\n" + - "\n" + - "newmtl teeth\n" + - "Ka 0.6408 0.5554 0.3845\n" + - "Kd 0.9837 0.7959 0.4694\n" + - "illum 1\n" + - "\n" + - "newmtl brass\n" + - "Ka 0.2490 0.1102 0.0000\n" + - "Kd 0.4776 0.1959 0.0000\n" + - "Ks 0.5796 0.5796 0.5796\n" + - "illum 2\n" + - "Ns 134.8800\n" + - "\n" + - "newmtl dkred\n" + - "Ka 0.0939 0.0000 0.0000\n" + - "Kd 0.2286 0.0000 0.0000\n" + - "Ks 0.2490 0.0000 0.0000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl taupe\n" + - "Ka 0.1061 0.0709 0.0637\n" + - "Kd 0.2041 0.1227 0.1058\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 84.5000\n" + - "\n" + - "newmtl dkteal\n" + - "Ka 0.0000 0.0245 0.0163\n" + - "Kd 0.0000 0.0653 0.0449\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 55.0400\n" + - "\n" + - "newmtl dkdkgrey\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0122 0.0122 0.0122\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl dkblue\n" + - "Ka 0.0000 0.0029 0.0408\n" + - "Kd 0.0000 0.0041 0.0571\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl gold\n" + - "Ka 0.7224 0.1416 0.0000\n" + - "Kd 1.0000 0.4898 0.0000\n" + - "Ks 0.7184 0.3695 0.3695\n" + - "illum 2\n" + - "Ns 123.2600\n" + - "\n" + - "newmtl redbrick\n" + - "Ka 0.1102 0.0067 0.0067\n" + - "Kd 0.3306 0.0398 0.0081\n" + - "illum 1\n" + - "\n" + - "newmtl flmustard\n" + - "Ka 0.4245 0.2508 0.0000\n" + - "Kd 0.8898 0.3531 0.0073\n" + - "illum 1\n" + - "\n" + - "newmtl flpinegreen\n" + - "Ka 0.0367 0.0612 0.0204\n" + - "Kd 0.1061 0.2163 0.0857\n" + - "illum 1\n" + - "\n" + - "newmtl fldkred\n" + - "Ka 0.0939 0.0000 0.0000\n" + - "Kd 0.2286 0.0082 0.0082\n" + - "illum 1\n" + - "\n" + - "newmtl fldkgreen2\n" + - "Ka 0.0025 0.0122 0.0014\n" + - "Kd 0.0245 0.0694 0.0041\n" + - "illum 1\n" + - "\n" + - "newmtl flmintgreen\n" + - "Ka 0.0408 0.1429 0.0571\n" + - "Kd 0.1306 0.2898 0.1673\n" + - "illum 1\n" + - "\n" + - "newmtl olivegreen\n" + - "Ka 0.0167 0.0245 0.0000\n" + - "Kd 0.0250 0.0367 0.0000\n" + - "Ks 0.2257 0.2776 0.1167\n" + - "illum 2\n" + - "Ns 97.6700\n" + - "\n" + - "newmtl skin\n" + - "Ka 0.2286 0.0187 0.0187\n" + - "Kd 0.1102 0.0328 0.0139\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 17.8300\n" + - "\n" + - "newmtl redbrown\n" + - "Ka 0.1469 0.0031 0.0000\n" + - "Kd 0.2816 0.0060 0.0000\n" + - "Ks 0.3714 0.3714 0.3714\n" + - "illum 2\n" + - "Ns 141.0900\n" + - "\n" + - "newmtl deepgreen\n" + - "Ka 0.0000 0.0050 0.0000\n" + - "Kd 0.0000 0.0204 0.0050\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 113.1800\n" + - "\n" + - "newmtl flltolivegreen\n" + - "Ka 0.0167 0.0245 0.0000\n" + - "Kd 0.0393 0.0531 0.0100\n" + - "illum 1\n" + - "\n" + - "newmtl jetflame\n" + - "Ka 0.7714 0.0000 0.0000\n" + - "Kd 0.9510 0.4939 0.0980\n" + - "Ks 0.8531 0.5222 0.0000\n" + - "illum 2\n" + - "Ns 132.5600\n" + - "\n" + - "newmtl brownskn\n" + - "Ka 0.0122 0.0041 0.0000\n" + - "Kd 0.0204 0.0082 0.0000\n" + - "Ks 0.0735 0.0508 0.0321\n" + - "illum 2\n" + - "Ns 20.1600\n" + - "\n" + - "newmtl greenskn\n" + - "Ka 0.0816 0.0449 0.0000\n" + - "Kd 0.0000 0.0735 0.0000\n" + - "Ks 0.0490 0.1224 0.0898\n" + - "illum 3\n" + - "Ns 46.5100\n" + - "sharpness 146.5100\n" + - "\n" + - "newmtl ltgrey\n" + - "Ka 0.5000 0.5000 0.5000\n" + - "Kd 0.3837 0.3837 0.3837\n" + - "Ks 0.5000 0.5000 0.5000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl bronze\n" + - "Ka 0.0449 0.0204 0.0000\n" + - "Kd 0.0653 0.0367 0.0122\n" + - "Ks 0.0776 0.0408 0.0000\n" + - "illum 3\n" + - "Ns 137.2100\n" + - "sharpness 125.5800\n" + - "\n" + - "newmtl bone1\n" + - "Ka 0.6408 0.5554 0.3845\n" + - "Kd 0.9837 0.7959 0.4694\n" + - "illum 1\n" + - "\n" + - "newmtl flwhite1\n" + - "Ka 0.9306 0.9306 0.9306\n" + - "Kd 1.0000 1.0000 1.0000\n" + - "illum 1\n" + - "\n" + - "newmtl flwhite\n" + - "Ka 0.6449 0.6116 0.5447\n" + - "Kd 0.9837 0.9309 0.8392\n" + - "Ks 0.8082 0.7290 0.5708\n" + - "illum 2\n" + - "Ns 200.0000\n" + - "\n" + - "newmtl shadow\n" + - "Kd 0.0350 0.0248 0.0194\n" + - "illum 0\n" + - "d 0.7500\n" + - "\n" + - "newmtl fldkolivegreen\n" + - "Ka 0.0056 0.0082 0.0000\n" + - "Kd 0.0151 0.0204 0.0038\n" + - "illum 1\n" + - "\n" + - "newmtl fldkdkgrey\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 0.0122 0.0122 0.0122\n" + - "illum 1\n" + - "\n" + - "newmtl lcdgreen\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.5878 1.0000 0.5061\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl brownlips\n" + - "Ka 0.1143 0.0694 0.0245\n" + - "Kd 0.1429 0.0653 0.0408\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl muscle\n" + - "Ka 0.2122 0.0077 0.0154\n" + - "Kd 0.4204 0.0721 0.0856\n" + - "Ks 0.1184 0.1184 0.1184\n" + - "illum 2\n" + - "Ns 25.5800\n" + - "\n" + - "newmtl flltgrey\n" + - "Ka 0.5224 0.5224 0.5224\n" + - "Kd 0.8245 0.8245 0.8245\n" + - "illum 1\n" + - "\n" + - "newmtl offwhite.warm\n" + - "Ka 0.5184 0.4501 0.3703\n" + - "Kd 0.8367 0.6898 0.4490\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl offwhite.cool\n" + - "Ka 0.5184 0.4501 0.3703\n" + - "Kd 0.8367 0.6812 0.5703\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl yellowbrt\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 1.0000 0.7837 0.0000\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl chappie\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.5837 0.1796 0.0367\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl archwhite\n" + - "Ka 0.2816 0.2816 0.2816\n" + - "Kd 0.9959 0.9959 0.9959\n" + - "illum 1\n" + - "\n" + - "newmtl archwhite2\n" + - "Ka 0.2816 0.2816 0.2816\n" + - "Kd 0.8408 0.8408 0.8408\n" + - "illum 1\n" + - "\n" + - "newmtl lighttan\n" + - "Ka 0.0980 0.0536 0.0220\n" + - "Kd 0.7020 0.4210 0.2206\n" + - "Ks 0.8286 0.8057 0.5851\n" + - "illum 2\n" + - "Ns 177.5200\n" + - "\n" + - "newmtl lighttan2\n" + - "Ka 0.0980 0.0492 0.0144\n" + - "Kd 0.3143 0.1870 0.0962\n" + - "Ks 0.8286 0.8057 0.5851\n" + - "illum 2\n" + - "Ns 177.5200\n" + - "\n" + - "newmtl lighttan3\n" + - "Ka 0.0980 0.0492 0.0144\n" + - "Kd 0.1796 0.0829 0.0139\n" + - "Ks 0.8286 0.8057 0.5851\n" + - "illum 2\n" + - "Ns 177.5200\n" + - "\n" + - "newmtl lightyellow\n" + - "Ka 0.5061 0.1983 0.0000\n" + - "Kd 1.0000 0.9542 0.3388\n" + - "Ks 1.0000 0.9060 0.0000\n" + - "illum 2\n" + - "Ns 177.5200\n" + - "\n" + - "newmtl lighttannew\n" + - "Ka 0.0980 0.0492 0.0144\n" + - "Kd 0.7878 0.6070 0.3216\n" + - "Ks 0.8286 0.8057 0.5851\n" + - "illum 2\n" + - "Ns 177.5200\n" + - "\n" + - "newmtl default\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.7102 0.7020 0.6531\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 128.0000\n" + - "\n" + - "newmtl ship2\n" + - "Ka 0.0000 0.0000 0.0000\n" + - "Kd 1.0000 1.0000 1.0000\n" + - "Ks 0.1143 0.1143 0.1143\n" + - "illum 2\n" + - "Ns 60.0000\n" + - "\n" + - "newmtl dkpurple\n" + - "Ka 0.0082 0.0000 0.0163\n" + - "Kd 0.0245 0.0000 0.0490\n" + - "Ks 0.1266 0.0000 0.2531\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl dkorange\n" + - "Ka 0.4041 0.0123 0.0000\n" + - "Kd 0.7143 0.0350 0.0000\n" + - "Ks 0.7102 0.0870 0.0000\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl mintgrn\n" + - "Ka 0.0101 0.1959 0.0335\n" + - "Kd 0.0245 0.4776 0.0816\n" + - "Ks 0.0245 0.4776 0.0816\n" + - "illum 2\n" + - "Ns 65.8900\n" + - "\n" + - "newmtl fgreen\n" + - "Ka 0.0000 0.0449 0.0000\n" + - "Kd 0.0000 0.0449 0.0004\n" + - "Ks 0.0062 0.0694 0.0000\n" + - "illum 2\n" + - "Ns 106.2000\n" + - "\n" + - "newmtl glassblutint\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.5551 0.8000 0.7730\n" + - "Ks 0.7969 0.9714 0.9223\n" + - "illum 4\n" + - "d 0.3300\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl bflesh\n" + - "Ka 0.0122 0.0122 0.0122\n" + - "Kd 0.0245 0.0081 0.0021\n" + - "Ks 0.0531 0.0460 0.0153\n" + - "illum 2\n" + - "Ns 20.1600\n" + - "\n" + - "newmtl meh\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.5551 0.8000 0.7730\n" + - "Ks 0.7969 0.9714 0.9223\n" + - "illum 4\n" + - "d 0.7500\n" + - "Ns 183.7200\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl violet\n" + - "Ka 0.0083 0.0000 0.1265\n" + - "Kd 0.0287 0.0269 0.1347\n" + - "Ks 0.2267 0.4537 0.6612\n" + - "illum 2\n" + - "Ns 96.9000\n" + - "\n" + - "newmtl iris\n" + - "Ka 0.3061 0.0556 0.0037\n" + - "Kd 0.0000 0.0572 0.3184\n" + - "Ks 0.8041 0.6782 0.1477\n" + - "illum 2\n" + - "Ns 188.3700\n" + - "\n" + - "newmtl blugrn\n" + - "Ka 0.4408 0.4144 0.1592\n" + - "Kd 0.0811 0.6408 0.2775\n" + - "Ks 0.1467 0.1469 0.0965\n" + - "illum 2\n" + - "Ns 25.0000\n" + - "\n" + - "newmtl glasstransparent\n" + - "Ka 0.2163 0.2163 0.2163\n" + - "Kd 0.4694 0.4694 0.4694\n" + - "Ks 0.6082 0.6082 0.6082\n" + - "illum 4\n" + - "d 0.7500\n" + - "Ns 200.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl fleshtransparent\n" + - "Ka 0.4000 0.2253 0.2253\n" + - "Kd 0.6898 0.2942 0.1295\n" + - "Ks 0.7388 0.4614 0.4614\n" + - "illum 4\n" + - "d 0.7500\n" + - "Ns 6.2000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl fldkgrey\n" + - "Ka 0.0449 0.0449 0.0449\n" + - "Kd 0.0939 0.0939 0.0939\n" + - "illum 1\n" + - "\n" + - "newmtl sky_blue\n" + - "Ka 0.1363 0.2264 0.4122\n" + - "Kd 0.1241 0.5931 0.8000\n" + - "Ks 0.0490 0.0490 0.0490\n" + - "illum 2\n" + - "Ns 13.9500\n" + - "\n" + - "newmtl fldkpurple\n" + - "Ka 0.0443 0.0257 0.0776\n" + - "Kd 0.1612 0.0000 0.3347\n" + - "Ks 0.0000 0.0000 0.0000\n" + - "illum 2\n" + - "Ns 13.9500\n" + - "\n" + - "newmtl dkbrown\n" + - "Ka 0.0143 0.0062 0.0027\n" + - "Kd 0.0087 0.0038 0.0016\n" + - "Ks 0.2370 0.2147 0.1821\n" + - "illum 3\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl bone2\n" + - "Ka 0.6408 0.5388 0.3348\n" + - "Kd 0.9837 0.8620 0.6504\n" + - "illum 1\n" + - "\n" + - "newmtl bluegrey\n" + - "Ka 0.4000 0.4000 0.4000\n" + - "Kd 0.1881 0.2786 0.2898\n" + - "Ks 0.3000 0.3000 0.3000\n" + - "illum 2\n" + - "Ns 14.7300\n" + - "\n" + - "newmtl metal\n" + - "Ka 0.9102 0.8956 0.1932\n" + - "Kd 0.9000 0.7626 0.4261\n" + - "Ks 0.8939 0.8840 0.8683\n" + - "illum 2\n" + - "Ns 200.0000\n" + - "\n" + - "newmtl sand_stone\n" + - "Ka 0.1299 0.1177 0.0998\n" + - "Kd 0.1256 0.1138 0.0965\n" + - "Ks 0.2370 0.2147 0.1821\n" + - "illum 3\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n" + - "\n" + - "newmtl hair\n" + - "Ka 0.0013 0.0012 0.0010\n" + - "Kd 0.0008 0.0007 0.0006\n" + - "Ks 0.0000 0.0000 0.0000\n" + - "illum 3\n" + - "Ns 60.0000\n" + - "sharpness 60.0000\n"; -} diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFile.java b/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFile.java deleted file mode 100644 index ac2aeef..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFile.java +++ /dev/null @@ -1,1330 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.objectfile; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import javax.media.j3d.BranchGroup; -import javax.media.j3d.Shape3D; -import javax.vecmath.Point3f; -import javax.vecmath.TexCoord2f; -import javax.vecmath.Vector3f; - -import com.sun.j3d.loaders.IncorrectFormatException; -import com.sun.j3d.loaders.Loader; -import com.sun.j3d.loaders.ParsingErrorException; -import com.sun.j3d.loaders.Scene; -import com.sun.j3d.loaders.SceneBase; -import com.sun.j3d.utils.geometry.GeometryInfo; -import com.sun.j3d.utils.geometry.NormalGenerator; -import com.sun.j3d.utils.geometry.Stripifier; - - - -/** - * The ObjectFile class implements the Loader interface for the Wavefront - * .obj file format, a standard 3D object file format created for use with - * Wavefront's Advanced Visualizer (tm) and available for purchase from - * Viewpoint DataLabs, as well as other 3D model companies. Object Files - * are text based - * files supporting both polygonal and free-form geometry (curves - * and surfaces). The Java 3D .obj file loader supports a subset of the - * file format, but it is enough to load almost all commonly available - * Object Files. Free-form geometry is not supported.</p> - * - * The Object File tokens currently supported by this loader are:</p> - * <code>v <i>float</i> <i>float</i> <i>float</i></code></p> - * <dl><dd>A single vertex's geometric position in space. The first vertex - * listed in the file has index 1, - * and subsequent vertices are numbered sequentially.</dl></p> - * <code>vn <i>float</i> <i>float</i> <i>float</i></code></p> - * <dl><dd>A normal. The first normal in the file is index 1, and - * subsequent normals are numbered sequentially.</dl></p> - * <code>vt <i>float</i> <i>float</i></code></p> - * <dl><dd>A texture coordinate. The first texture coordinate in the file is - * index 1, and subsequent normals are numbered sequentially.</dl></p> - * <code>f <i>int</i> <i>int</i> <i>int</i> . . .</code></p> - * <dl><dd><i><b>or</b></i></dl></p> - * <code>f <i>int</i>/<i>int</i> <i>int</i>/<i>int</i> <i>int</i>/<i>int</i> . . .</code></p> - * <dl><dd><i><b>or</i></b></dl></p> - * <code>f <i>int</i>/<i>int</i>/<i>int</i> <i>int</i>/<i>int</i>/<i>int</i> <i>int</i>/<i>int</i>/<i>int</i> . . .</code></p> - * <dl><dd>A polygonal face. The numbers are indexes into the arrays of - * vertex positions, texture coordinates, and normals respectively. - * There is no maximum number of vertices that a single polygon may - * contain. The .obj file specification says that each face must - * be flat and convex, but if the TRIANGULATE flag is sent to the - * ObjectFile constructor, each face will be triangulated by the - * Java 3D Triangulator, and therefore may be concave. - * A number may be omitted if, for example, texture coordinates are - * not being defined in the model. Numbers are normally positive - * indexes, but may also be negative. An index of -1 means the last - * member added to the respective array, -2 is the one before that, - * and so on.</dl></p> - * <code>g <i>name</i></code></p> - * <dl><dd>Faces defined after this token will be added to the named group. - * These geometry groups are returned as separated Shape3D objects - * attached to the parent SceneGroup. Each named Shape3D will also - * be in the Hashtable returned by Scene.getNamedObjects(). It is - * legal to add faces to a group, switch to another group, and then - * add more faces to the original group by reissuing the same name - * with the g token. If faces are added to the model before the g - * token is seen, the faces are put into the default group called - * "default."</dl></p> - * <code>s <i>int</i></code></p> - * <dl><dd><i><b>or</i></b></dl></p> - * <code>s off</code></p> - * <dl><dd>If the vn token is not used in the file to specify vertex normals - * for the model, this token may be used to put faces into groups - * for normal calculation ("smoothing groups") in the same manner as - * the 'g' token - * is used to group faces geometrically. Faces in the same smoothing - * group will have their normals calculated as if they are part of - * the same smooth surface. To do this, we use the Java 3D NormalGenerator - * utility with the creaseAngle parameter set to PI (180 degrees - - * smooth shading, no creases) or to whatever the user has set the - * creaseAngle. Faces in group 0 or 'off' use a - * creaseAngle of zero, meaning there is no smoothing (the normal - * of the face is used at all vertices giving the surface a faceted - * look; there will be a - * crease, or "Hard Edge," between each face in group zero). There is - * also an implied hard edge <i>between</i> each smoothing group, where they - * meet each other.</p> - * </p> - * If neither the vn nor the s token is used in the file, then normals - * are calculated using the creaseAngle set in the contructor. - * Normals are calculated on each geometry - * group separately, meaning there will be a hard edge between each - * geometry group.</dl></p> - * </p> - * <code>usemtl <i>name</i></code></p> - * <dl><dd>The current (and subsequent) geometry groups (specified with - * the 'g' token) have applied - * to them the named material property. The following set of material - * properties are available by default:</dl></p> - * <pre> - * amber amber_trans aqua aqua_filter - * archwhite archwhite2 bflesh black - * blondhair blue_pure bluegrey bluetint - * blugrn blutan bluteal bone - * bone1 bone2 brass brnhair - * bronze brown brownlips brownskn - * brzskin chappie charcoal deepgreen - * default dkblue dkblue_pure dkbrown - * dkdkgrey dkgreen dkgrey dkorange - * dkpurple dkred dkteal emerald - * fgreen flaqua flblack flblonde - * flblue_pure flbrown fldkblue_pure fldkdkgrey - * fldkgreen fldkgreen2 fldkgrey fldkolivegreen - * fldkpurple fldkred flesh fleshtransparent - * flgrey fllime flltbrown flltgrey - * flltolivegreen flmintgreen flmustard florange - * flpinegreen flpurple flred fltan - * flwhite flwhite1 flyellow glass - * glassblutint glasstransparent gold green - * greenskn grey hair iris - * jetflame lavendar lcdgreen lighttan - * lighttan2 lighttan3 lighttannew lightyellow - * lime lips ltbrown ltgrey - * meh metal mintgrn muscle - * navy_blue offwhite.cool offwhite.warm olivegreen - * orange pale_green pale_pink pale_yellow - * peach periwinkle pink pinktan - * plasma purple red redbrick - * redbrown redorange redwood rubber - * ruby sand_stone sapphire shadow - * ship2 silver skin sky_blue - * smoked_glass tan taupe teeth - * violet white yellow yellow_green - * yellowbrt yelloworng - * </pre> - * <code>mtllib <i>filename</i></code></p> - * <dl><dd>Load material properties from the named file. Materials - * with the same name as the predefined materials above will override - * the default value. Any directory path information in (filename) - * is ignored. The .mtl files are assumed to be in the same directory - * as the .obj file. If they are in a different directory, use - * Loader.setBasePath() (or Loader.setBaseUrl() ). The format of the - * material properties files - * are as follows:</p> - * <code>newmtl <i>name</i></code></p> - * <dl><dd>Start the definition of a new named material property.</dl></p> - * <code>Ka <i>float</i> <i>float</i> <i>float</i></code></p> - * <dl><dd>Ambient color.</dl></p> - * <code>Kd <i>float</i> <i>float</i> <i>float</i></code></p> - * <dl><dd>Diffuse color.</dl></p> - * <code>Ks <i>float</i> <i>float</i> <i>float</i></code></p> - * <dl><dd>Specular color.</dl></p> - * <code>illum <i>(0, 1, or 2)</i></code></p> - * <dl><dd>0 to disable lighting, 1 for ambient & diffuse only (specular - * color set to black), 2 for full lighting.</dl></p> - * <code>Ns <i>float</i></code></p> - * <dl><dd>Shininess (clamped to 1.0 - 128.0).</dl></p> - * <code>map_Kd <i>filename</i></code></p> - * <dl><dd>Texture map. Supports .rgb, .rgba, .int, .inta, .sgi, and - * .bw files in addition to those supported by - * <a href="../../utils/image/TextureLoader.html">TextureLoader</a>. - * </dl></dl></p> - */ - -public class ObjectFile implements Loader { - // 0=Input file assumed good - // 1=Input file checked for inconsistencies - // 2=path names - // 4=flags - // 8=Timing Info - // 16=Tokens - // 32=Token details (use with 16) - // 64=limits of model coordinates - private static final int DEBUG = 0; - - /** - * Flag sent to constructor. The object's vertices will be changed - * so that the object is centered at (0,0,0) and the coordinate - * positions are all in the range of (-1,-1,-1) to (1,1,1). - */ - public static final int RESIZE = LOAD_SOUND_NODES << 1; - - /** - * Flag sent to constructor. The Shape3D object will be created - * by using the GeometryInfo POLYGON_ARRAY primitive, causing - * them to be Triangulated by GeometryInfo. Use - * this if you suspect concave or other non-behaving polygons - * in your model. - */ - public static final int TRIANGULATE = RESIZE << 1; - - /** - * Flag sent to constructor. Use if the vertices in your .obj - * file were specified with clockwise winding (Java 3D wants - * counter-clockwise) so you see the back of the polygons and - * not the front. Calls GeometryInfo.reverse(). - */ - public static final int REVERSE = TRIANGULATE << 1; - - /** - * Flag sent to contructor. After normals are generated the data - * will be analyzed to find triangle strips. Use this if your - * hardware supports accelerated rendering of strips. - */ - public static final int STRIPIFY = REVERSE << 1; - - private static final char BACKSLASH = '\\'; - - private int flags; - private String basePath = null; - private URL baseUrl = null; - private boolean fromUrl = false; - private float radians; - - // First, lists of points are read from the .obj file into these arrays. . . - private ArrayList<Point3f> coordList; - private ArrayList<TexCoord2f> texList; - private ArrayList<Vector3f> normList; - - // . . . and index lists are read into these arrays. - private ArrayList coordIdxList; // Holds Integer index into coordList - private ArrayList texIdxList; // Holds Integer index into texList - private ArrayList normIdxList; // Holds Integer index into normList - - // The length of each face is stored in this array. - private ArrayList stripCounts; // Holds Integer - - // Each face's Geometry Group membership is kept here. . . - private HashMap groups; // key=Integer index into stripCounts - // value=String name of group - private String curGroup; - - // . . . and Smoothing Group membership is kept here - private HashMap sGroups; // key=Integer index into stripCounts - // value=String name of group - private String curSgroup; - - // The name of each group's "usemtl" material property is kept here - private HashMap groupMaterials; // key=String name of Group - // value=String name of material - - - // After reading the entire file, the faces are converted into triangles. - // The Geometry Group information is converted into these structures. . . - private HashMap triGroups; // key=String name of group - // value=ArrayList of Integer - // indices into coordIdxList - private ArrayList curTriGroup; - - // . . . and Smoothing Group info is converted into these. - private HashMap triSgroups; // key=String name of group - // value=ArrayList of Integer - // indices into coordIdxList - private ArrayList curTriSgroup; - - - // Finally, coordList, texList, and normList are converted to arrays for - // use with GeometryInfo - private Point3f coordArray[] = null; - private Vector3f normArray[] = null; - private TexCoord2f texArray[] = null; - - // Used for debugging - private long time; - - private ObjectFileMaterials materials = null; - - - void readVertex(ObjectFileParser st) throws ParsingErrorException { - Point3f p = new Point3f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - st.getNumber(); - p.z = (float)st.nval; - - if ((DEBUG & 32) != 0) - System.out.println(" (" + p.x + "," + p.y + "," + p.z + ")"); - - st.skipToNextLine(); - - // Add this vertex to the array - coordList.add(p); - } // End of readVertex - - - /** - * readNormal - */ - void readNormal(ObjectFileParser st) throws ParsingErrorException { - Vector3f p = new Vector3f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - st.getNumber(); - p.z = (float)st.nval; - - if ((DEBUG & 32) != 0) - System.out.println(" (" + p.x + "," + p.y + "," + p.z + ")"); - - st.skipToNextLine(); - - // Add this vertex to the array - normList.add(p); - } // End of readNormal - - - /** - * readTexture - */ - void readTexture(ObjectFileParser st) throws ParsingErrorException { - TexCoord2f p = new TexCoord2f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - - if ((DEBUG & 32) != 0) - System.out.println(" (" + p.x + "," + p.y + ")"); - - st.skipToNextLine(); - - // Add this vertex to the array - texList.add(p); - } // End of readTexture - - - /** - * readFace - * - * Adds the indices of the current face to the arrays. - * - * ViewPoint files can have up to three arrays: Vertex Positions, - * Texture Coordinates, and Vertex Normals. Each vertex can - * contain indices into all three arrays. - */ - void readFace(ObjectFileParser st) throws ParsingErrorException { - int vertIndex, texIndex = 0, normIndex = 0; - int count = 0; - - // There are n vertices on each line. Each vertex is comprised - // of 1-3 numbers separated by slashes ('/'). The slashes may - // be omitted if there's only one number. - - st.getToken(); - - while (st.ttype != st.TT_EOL) { - // First token is always a number (or EOL) - st.pushBack(); - st.getNumber(); - vertIndex = (int)st.nval - 1; - if (vertIndex < 0) vertIndex += coordList.size() + 1; - coordIdxList.add(new Integer(vertIndex)); - - // Next token is a slash, a number, or EOL. Continue on slash - st.getToken(); - if (st.ttype == '/') { - - // If there's a number after the first slash, read it - st.getToken(); - if (st.ttype == st.TT_WORD) { - // It's a number - st.pushBack(); - st.getNumber(); - texIndex = (int)st.nval - 1; - if (texIndex < 0) texIndex += texList.size() + 1; - texIdxList.add(new Integer(texIndex)); - st.getToken(); - } - - // Next token is a slash, a number, or EOL. Continue on slash - if (st.ttype == '/') { - - // There has to be a number after the 2nd slash - st.getNumber(); - normIndex = (int)st.nval - 1; - if (normIndex < 0) normIndex += normList.size() + 1; - normIdxList.add(new Integer(normIndex)); - st.getToken(); - } - } - if ((DEBUG & 32) != 0) { - System.out.println(" " + vertIndex + '/' + texIndex + - '/' + normIndex); - } - count++; - } - - Integer faceNum = new Integer(stripCounts.size()); - stripCounts.add(new Integer(count)); - - // Add face to current groups - groups.put(faceNum, curGroup); - if (curSgroup != null) sGroups.put(faceNum, curSgroup); - - // In case we exited early - st.skipToNextLine(); - } // End of readFace - - - /** - * readPartName - */ - void readPartName(ObjectFileParser st) { - st.getToken(); - - // Find the Material Property of the current group - String curMat = (String)groupMaterials.get(curGroup); - - // New faces will be added to the curGroup - if (st.ttype != ObjectFileParser.TT_WORD) curGroup = "default"; - else curGroup = st.sval; - if ((DEBUG & 32) != 0) System.out.println(" Changed to group " + curGroup); - - // See if this group has Material Properties yet - if (groupMaterials.get(curGroup) == null) { - // It doesn't - carry over from last group - groupMaterials.put(curGroup, curMat); - } - - st.skipToNextLine(); - } // End of readPartName - - - /** - * readMaterialName - */ - void readMaterialName(ObjectFileParser st) throws ParsingErrorException { - st.getToken(); - if (st.ttype == ObjectFileParser.TT_WORD) { - groupMaterials.put(curGroup, new String(st.sval)); - if ((DEBUG & 32) != 0) { - System.out.println(" Material Property " + st.sval + - " assigned to group " + curGroup); - } - } - st.skipToNextLine(); - } // End of readMaterialName - - - /** - * loadMaterialFile - * - * Both types of slashes are returned as tokens from our parser, - * so we go through the line token by token and keep just the - * last token on the line. This should be the filename without - * any directory info. - */ - void loadMaterialFile(ObjectFileParser st) throws ParsingErrorException { - String s = null; - - // Filenames are case sensitive - st.lowerCaseMode(false); - - // Get name of material file (skip path) - do { - st.getToken(); - if (st.ttype == ObjectFileParser.TT_WORD) s = st.sval; - } while (st.ttype != ObjectFileParser.TT_EOL); - - materials.readMaterialFile(fromUrl, - fromUrl ? baseUrl.toString() : basePath, s); - - st.lowerCaseMode(true); - st.skipToNextLine(); - } // End of loadMaterialFile - - - /** - * readSmoothingGroup - */ - void readSmoothingGroup(ObjectFileParser st) throws ParsingErrorException { - st.getToken(); - if (st.ttype != ObjectFileParser.TT_WORD) { - st.skipToNextLine(); - return; - } - if (st.sval.equals("off")) curSgroup = "0"; - else curSgroup = st.sval; - if ((DEBUG & 32) != 0) System.out.println(" Smoothing group " + curSgroup); - st.skipToNextLine(); - } // End of readSmoothingGroup - - - /** - * readFile - * - * Read the model data from the file. - */ - void readFile(ObjectFileParser st) throws ParsingErrorException { - int t; - - st.getToken(); - while (st.ttype != ObjectFileParser.TT_EOF) { - - // Print out one token for each line - if ((DEBUG & 16) != 0) { - System.out.print("Token "); - if (st.ttype == ObjectFileParser.TT_EOL) System.out.println("EOL"); - else if (st.ttype == ObjectFileParser.TT_WORD) - System.out.println(st.sval); - else System.out.println((char)st.ttype); - } - - if (st.ttype == ObjectFileParser.TT_WORD) { - if (st.sval.equals("v")) { - readVertex(st); - } else if (st.sval.equals("vn")) { - readNormal(st); - } else if (st.sval.equals("vt")) { - readTexture(st); - } else if (st.sval.equals("f")) { - readFace(st); - } else if (st.sval.equals("fo")) { // Not sure what the dif is - readFace(st); - } else if (st.sval.equals("g")) { - readPartName(st); - } else if (st.sval.equals("s")) { - readSmoothingGroup(st); - } else if (st.sval.equals("p")) { - st.skipToNextLine(); - } else if (st.sval.equals("l")) { - st.skipToNextLine(); - } else if (st.sval.equals("mtllib")) { - loadMaterialFile(st); - } else if (st.sval.equals("usemtl")) { - readMaterialName(st); - } else if (st.sval.equals("maplib")) { - st.skipToNextLine(); - } else if (st.sval.equals("usemap")) { - st.skipToNextLine(); - } else { - throw new ParsingErrorException( - "Unrecognized token, line " + st.lineno()); - } - } - - st.skipToNextLine(); - - // Get next token - st.getToken(); - } - } // End of readFile - - - /** - * Constructor. - * - * @param flags The constants from above or from - * com.sun.j3d.loaders.Loader, possibly "or'ed" (|) together. - * @param radians Ignored if the vn token is present in the model (user - * normals supplied). Otherwise, crease angle to use within smoothing - * groups, or within geometry groups if the s token isn't present either. - */ - public ObjectFile(int flags, float radians) { - setFlags(flags); - this.radians = radians; - } // End of ObjectFile(int, float) - - - /** - * Constructor. Crease Angle set to default of - * 44 degrees (see NormalGenerator utility for details). - * @param flags The constants from above or from - * com.sun.j3d.loaders.Loader, possibly "or'ed" (|) together. - */ - public ObjectFile(int flags) { - this(flags, -1.0f); - } // End of ObjectFile(int) - - - /** - * Default constructor. Crease Angle set to default of - * 44 degrees (see NormalGenerator utility for details). Flags - * set to zero (0). - */ - public ObjectFile() { - this(0, -1.0f); - } // End of ObjectFile() - - - /** - * Takes a file name and sets the base path to the directory - * containing that file. - */ - private void setBasePathFromFilename(String fileName) { - if (fileName.lastIndexOf(java.io.File.separator) == -1) { - // No path given - current directory - setBasePath("." + java.io.File.separator); - } else { - setBasePath( - fileName.substring(0, fileName.lastIndexOf(java.io.File.separator))); - } - } // End of setBasePathFromFilename - - - /** - * The Object File is loaded from the .obj file specified by - * the filename. - * To attach the model to your scene, call getSceneGroup() on - * the Scene object passed back, and attach the returned - * BranchGroup to your scene graph. For an example, see - * j3d-examples/ObjLoad/ObjLoad.java. - */ - @Override - public Scene load(String filename) throws FileNotFoundException, - IncorrectFormatException, - ParsingErrorException { - - setBasePathFromFilename(filename); - - Reader reader = new BufferedReader(new FileReader(filename)); - return load(reader); - } // End of load(String) - - - private void setBaseUrlFromUrl(URL url) throws FileNotFoundException { - String u = url.toString(); - String s; - if (u.lastIndexOf('/') == -1) { - s = url.getProtocol() + ":"; - } else { - s = u.substring(0, u.lastIndexOf('/') + 1); - } - try { - baseUrl = new URL(s); - } - catch (MalformedURLException e) { - throw new FileNotFoundException(e.getMessage()); - } - } // End of setBaseUrlFromUrl - - - /** - * The object file is loaded off of the web. - * To attach the model to your scene, call getSceneGroup() on - * the Scene object passed back, and attach the returned - * BranchGroup to your scene graph. For an example, see - * j3d-examples/ObjLoad/ObjLoad.java. - */ - @Override - public Scene load(URL url) throws FileNotFoundException, - IncorrectFormatException, - ParsingErrorException { - BufferedReader reader; - - if (baseUrl == null) setBaseUrlFromUrl(url); - - try { - reader = new BufferedReader(new InputStreamReader(url.openStream())); - } - catch (IOException e) { - throw new FileNotFoundException(e.getMessage()); - } - fromUrl = true; - return load(reader); - } // End of load(URL) - - - /** - * getLimits - * - * Returns an array of Point3f which form a bounding box around the - * object. Element 0 is the low value, element 1 is the high value. - * See normalize() below for an example of how to use this method. - */ - private Point3f[] getLimits() { - // Find the limits of the model - Point3f[] limit = new Point3f[2]; - limit[0] = new Point3f(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE); - limit[1] = new Point3f(Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE); - for (int i = 0 ; i < coordList.size() ; i++) { - Point3f cur_vtx = coordList.get(i); - - // Keep track of limits for normalization - if (cur_vtx.x < limit[0].x) limit[0].x = cur_vtx.x; - if (cur_vtx.x > limit[1].x) limit[1].x = cur_vtx.x; - if (cur_vtx.y < limit[0].y) limit[0].y = cur_vtx.y; - if (cur_vtx.y > limit[1].y) limit[1].y = cur_vtx.y; - if (cur_vtx.z < limit[0].z) limit[0].z = cur_vtx.z; - if (cur_vtx.z > limit[1].z) limit[1].z = cur_vtx.z; - } - - if ((DEBUG & 64) != 0) { - System.out.println("Model range: (" + - limit[0].x + "," + limit[0].y + "," + limit[0].z + ") to (" + - limit[1].x + "," + limit[1].y + "," + limit[1].z + ")"); - } - - return limit; - } // End of getLimits - - - - /** - * Center the object and make it (-1,-1,-1) to (1,1,1). - */ - private void resize() { - int i, j; - float biggest_dif; - - Point3f[] limit = getLimits(); - - // Move object so it's centered on (0,0,0) - Vector3f offset = new Vector3f(-0.5f * (limit[0].x + limit[1].x), - -0.5f * (limit[0].y + limit[1].y), - -0.5f * (limit[0].z + limit[1].z)); - - if ((DEBUG & 64) != 0) { - System.out.println("Offset amount: (" + - offset.x + "," + offset.y + "," + offset.z + ")"); - } - - // Find the divide-by value for the normalization - biggest_dif = limit[1].x - limit[0].x; - if (biggest_dif < limit[1].y - limit[0].y) - biggest_dif = limit[1].y - limit[0].y; - if (biggest_dif < limit[1].z - limit[0].z) - biggest_dif = limit[1].z - limit[0].z; - biggest_dif /= 2.0f; - - for (i = 0 ; i < coordList.size() ; i++) { - Point3f cur_vtx = coordList.get(i); - - cur_vtx.add(cur_vtx, offset); - - cur_vtx.x /= biggest_dif; - cur_vtx.y /= biggest_dif; - cur_vtx.z /= biggest_dif; - - // coordList.setElementAt(cur_vtx, i); - } - } // End of resize - - - private int[] objectToIntArray(ArrayList inList) { - int outList[] = new int[inList.size()]; - for (int i = 0 ; i < inList.size() ; i++) { - outList[i] = ((Integer)inList.get(i)).intValue(); - } - return outList; - } // End of objectToIntArray - - - private Point3f[] objectToPoint3Array(ArrayList<Point3f> inList) { - Point3f outList[] = new Point3f[inList.size()]; - for (int i = 0 ; i < inList.size() ; i++) { - outList[i] = inList.get(i); - } - return outList; - } // End of objectToPoint3Array - - - - private TexCoord2f[] objectToTexCoord2Array(ArrayList<TexCoord2f> inList) { - TexCoord2f outList[] = new TexCoord2f[inList.size()]; - for (int i = 0 ; i < inList.size() ; i++) { - outList[i] = inList.get(i); - } - return outList; - } // End of objectToTexCoord2Array - - - private Vector3f[] objectToVectorArray(ArrayList<Vector3f> inList) { - Vector3f outList[] = new Vector3f[inList.size()]; - for (int i = 0 ; i < inList.size() ; i++) { - outList[i] = inList.get(i); - } - return outList; - } // End of objectToVectorArray - - - /** - * Each group is a list of indices into the model's index lists, - * indicating the starting index of each triangle in the group. - * This method converts those data structures - * into an integer array to use with GeometryInfo. - */ - private int[] groupIndices(ArrayList sourceList, ArrayList group) { - int indices[] = new int[group.size() * 3]; - for (int i = 0 ; i < group.size() ; i++) { - int j = ((Integer)group.get(i)).intValue(); - indices[i * 3 + 0] = ((Integer)sourceList.get(j + 0)).intValue(); - indices[i * 3 + 1] = ((Integer)sourceList.get(j + 1)).intValue(); - indices[i * 3 + 2] = ((Integer)sourceList.get(j + 2)).intValue(); - } - return indices; - } // end of groupIndices - - - /** - * smoothingGroupNormals - * - * Smoothing groups are groups of faces who should be grouped - * together for normal calculation purposes. The faces are - * put into a GeometryInfo object and normals are calculated - * with a 180 degree creaseAngle (no creases) or whatever the - * user has specified. The normals - * are then copied out of the GeometryInfo and back into - * ObjectFile data structures. - */ - private void smoothingGroupNormals() { - NormalGenerator ng = - new NormalGenerator(radians == -1.0f ? Math.PI : radians); - NormalGenerator ng0 = new NormalGenerator(0.0); - normList.clear(); - normIdxList = null; - int newNormIdxArray[] = new int[coordIdxList.size()]; - - Iterator e = triSgroups.keySet().iterator(); - while (e.hasNext()) { - String curname = (String)e.next(); - ArrayList triList = (ArrayList)triSgroups.get(curname); - - // Check for group with no faces - if (triList.size() > 0) { - - GeometryInfo gi = new GeometryInfo(GeometryInfo.TRIANGLE_ARRAY); - - gi.setCoordinateIndices(groupIndices(coordIdxList, triList)); - gi.setCoordinates(coordArray); - - if (curname.equals("0")) ng0.generateNormals(gi); - else ng.generateNormals(gi); - - // Get the generated normals and indices - Vector3f genNorms[] = gi.getNormals(); - int genNormIndices[] = gi.getNormalIndices(); - - // Now we need to copy the generated normals into ObjectFile - // data structures (normList and normIdxList). The variable - // normIdx is the index of the index of the normal currently - // being put into the list. It takes some calculation to - // figure out the new index and where to put it. - int normIdx = 0; - // Repeat for each triangle in the smoothing group - for (int i = 0 ; i < triList.size() ; i++) { - - // Get the coordIdxList index of the first index in this face - int idx = ((Integer)triList.get(i)).intValue(); - - // Repeat for each vertex in the triangle - for (int j = 0 ; j < 3 ; j++) { - - // Put the new normal's index into the index list - newNormIdxArray[idx + j] = normList.size(); - - // Add the vertex's normal to the normal list - normList.add(genNorms[genNormIndices[normIdx++]]); - } - } - } - } - normIdxList = new ArrayList(coordIdxList.size()); - for (int i = 0 ; i < coordIdxList.size() ; i++) { - normIdxList.add(new Integer(newNormIdxArray[i])); - } - normArray = objectToVectorArray(normList); - } // end of smoothingGroupNormals - - - /** - * Each face is converted to triangles. As each face is converted, - * we look up which geometry group and smoothing group the face - * belongs to. The generated triangles are added to each of these - * groups, which are also being converted to a new triangle based format. - * - * We need to convert to triangles before normals are generated - * because of smoothing groups. The faces in a smoothing group - * are copied into a GeometryInfo to have their normals calculated, - * and then the normals are copied out of the GeometryInfo using - * GeometryInfo.getNormalIndices. As part of Normal generation, - * the geometry gets converted to Triangles. So we need to convert - * to triangles *before* Normal generation so that the normals we - * read out of the GeometryInfo match up with the vertex data - * that we sent in. If we sent in TRIANGLE_FAN data, the normal - * generator would convert it to triangles and we'd read out - * normals formatted for Triangle data. This would not match up - * with our original Fan data, so we couldn't tell which normals - * go with which vertices. - */ - private void convertToTriangles() { - boolean triangulate = (flags & TRIANGULATE) != 0; - boolean textures = !texList.isEmpty() && !texIdxList.isEmpty() && - (texIdxList.size() == coordIdxList.size()); - boolean normals = !normList.isEmpty() && !normIdxList.isEmpty() && - (normIdxList.size() == coordIdxList.size()); - int numFaces = stripCounts.size(); - boolean haveSgroups = curSgroup != null; - - triGroups = new HashMap(50); - if (haveSgroups) triSgroups = new HashMap(50); - - ArrayList newCoordIdxList = null; - ArrayList newTexIdxList = null; - ArrayList newNormIdxList = null; - - if (triangulate) { - GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); - gi.setStripCounts(objectToIntArray(stripCounts)); - gi.setCoordinates(coordArray); - gi.setCoordinateIndices(objectToIntArray(coordIdxList)); - if (textures) { - gi.setTextureCoordinateParams(1, 2); - gi.setTextureCoordinates(0, texArray); - gi.setTextureCoordinateIndices(0, objectToIntArray(texIdxList)); - } - if (normals) { - gi.setNormals(normArray); - gi.setNormalIndices(objectToIntArray(normIdxList)); - } - gi.convertToIndexedTriangles(); - - // Data is now indexed triangles. Next step is to take the data - // out of the GeometryInfo and put into internal data structures - - int coordIndicesArray[] = gi.getCoordinateIndices(); - - // Fix for #4366060 - // Make sure triangulated geometry has the correct number of triangles - int tris = 0; - for (int i = 0 ; i < numFaces ; i++) - tris += ((Integer)stripCounts.get(i)).intValue() - 2; - - if (coordIndicesArray.length != (tris * 3)) { - // Model contains bad polygons that didn't triangulate into the - // correct number of triangles. Fall back to "simple" triangulation - triangulate = false; - } else { - - int texIndicesArray[] = gi.getTextureCoordinateIndices(); - int normIndicesArray[] = gi.getNormalIndices(); - - // Convert index arrays to internal ArrayList format - coordIdxList.clear(); - texIdxList.clear(); - normIdxList.clear(); - for (int i = 0 ; i < coordIndicesArray.length ; i++) { - coordIdxList.add(new Integer(coordIndicesArray[i])); - if (textures) texIdxList.add(new Integer(texIndicesArray[i])); - if (normals) normIdxList.add(new Integer(normIndicesArray[i])); - } - } - } - - if (!triangulate) { - newCoordIdxList = new ArrayList(); - if (textures) newTexIdxList = new ArrayList(); - if (normals) newNormIdxList = new ArrayList(); - } - - // Repeat for each face in the model - add the triangles from each - // face to the Geometry and Smoothing Groups - int baseVertex = 0; - for (int f = 0 ; f < numFaces ; f++) { - int faceSize = ((Integer)stripCounts.get(f)).intValue(); - - // Find out the name of the group to which this face belongs - Integer curFace = new Integer(f); - curGroup = (String)groups.get(curFace); - - // Change to a new geometry group, create if it doesn't exist - curTriGroup = (ArrayList)triGroups.get(curGroup); - if (curTriGroup == null) { - curTriGroup = new ArrayList(); - triGroups.put(curGroup, curTriGroup); - } - - // Change to a new smoothing group, create if it doesn't exist - if (haveSgroups) { - curSgroup = (String)sGroups.get(curFace); - if (curSgroup == null) { - // Weird case - this face has no smoothing group. Happens if the - // first 's' token comes after some faces have already been defined. - // Assume they wanted no smoothing for these faces - curSgroup = "0"; - } - curTriSgroup = (ArrayList)triSgroups.get(curSgroup); - if (curTriSgroup == null) { - curTriSgroup = new ArrayList(); - triSgroups.put(curSgroup, curTriSgroup); - } - } - - if (triangulate) { - - // Each polygon of n vertices is now n-2 triangles - for (int t = 0 ; t < faceSize - 2 ; t++) { - - // The groups just remember the first vertex of each triangle - Integer triBaseVertex = new Integer(baseVertex); - curTriGroup.add(triBaseVertex); - if (haveSgroups) curTriSgroup.add(triBaseVertex); - - baseVertex += 3; - } - } else { - // Triangulate simply - for (int v = 0 ; v < faceSize - 2 ; v++) { - // Add this triangle to the geometry group and the smoothing group - Integer triBaseVertex = new Integer(newCoordIdxList.size()); - curTriGroup.add(triBaseVertex); - if (haveSgroups) curTriSgroup.add(triBaseVertex); - - newCoordIdxList.add(coordIdxList.get(baseVertex)); - newCoordIdxList.add(coordIdxList.get(baseVertex + v + 1)); - newCoordIdxList.add(coordIdxList.get(baseVertex + v + 2)); - - if (textures) { - newTexIdxList.add(texIdxList.get(baseVertex)); - newTexIdxList.add(texIdxList.get(baseVertex + v + 1)); - newTexIdxList.add(texIdxList.get(baseVertex + v + 2)); - } - - if (normals) { - newNormIdxList.add(normIdxList.get(baseVertex)); - newNormIdxList.add(normIdxList.get(baseVertex + v + 1)); - newNormIdxList.add(normIdxList.get(baseVertex + v + 2)); - } - } - baseVertex += faceSize; - } - } - - // No need to keep these around - stripCounts = null; - groups = null; - sGroups = null; - - if (!triangulate) { - coordIdxList = newCoordIdxList; - texIdxList = newTexIdxList; - normIdxList = newNormIdxList; - } - } // End of convertToTriangles - - - private SceneBase makeScene() { - // Create Scene to pass back - SceneBase scene = new SceneBase(); - BranchGroup group = new BranchGroup(); - scene.setSceneGroup(group); - - boolean gen_norms = normList.isEmpty() || normIdxList.isEmpty() || - (normIdxList.size() != coordIdxList.size()); - boolean do_tex = !texList.isEmpty() && !texIdxList.isEmpty() && - (texIdxList.size() == coordIdxList.size()); - - // Convert ArrayLists to arrays - coordArray = objectToPoint3Array(coordList); - if (!gen_norms) normArray = objectToVectorArray(normList); - if (do_tex) texArray = objectToTexCoord2Array(texList); - - convertToTriangles(); - - if ((DEBUG & 8) != 0) { - time = System.currentTimeMillis() - time; - System.out.println("Convert to triangles: " + time + " ms"); - time = System.currentTimeMillis(); - } - - if ((gen_norms) && (curSgroup != null)) { - smoothingGroupNormals(); - gen_norms = false; - if ((DEBUG & 8) != 0) { - time = System.currentTimeMillis() - time; - System.out.println("Smoothing group normals: " + time + " ms"); - time = System.currentTimeMillis(); - } - } - - NormalGenerator ng = null; - if (gen_norms) ng = new NormalGenerator(radians); - - Stripifier strippy = null; - if ((flags & STRIPIFY) != 0) strippy = new Stripifier(); - - long t1 = 0, t2 = 0, t3 = 0, t4 = 0; - - // Each "Group" of faces in the model will be one Shape3D - Iterator e = triGroups.keySet().iterator(); - while (e.hasNext()) { - - String curname = (String)e.next(); - ArrayList triList = (ArrayList)triGroups.get(curname); - - // Check for group with no faces - if (triList.size() > 0) { - - GeometryInfo gi = new GeometryInfo(GeometryInfo.TRIANGLE_ARRAY); - - gi.setCoordinateIndices(groupIndices(coordIdxList, triList)); - gi.setCoordinates(coordArray); - - if (do_tex) { - gi.setTextureCoordinateParams(1, 2); - gi.setTextureCoordinates(0, texArray); - gi.setTextureCoordinateIndices(0, groupIndices(texIdxList, triList)); - } - - if ((DEBUG & 8) != 0) time = System.currentTimeMillis(); - if (gen_norms) { - if ((flags & REVERSE) != 0) gi.reverse(); - ng.generateNormals(gi); - if ((DEBUG & 8) != 0) { - t2 += System.currentTimeMillis() - time; - System.out.println("Generate normals: " + t2 + " ms"); - time = System.currentTimeMillis(); - } - } else { - gi.setNormalIndices(groupIndices(normIdxList, triList)); - gi.setNormals(normArray); - if ((flags & REVERSE) != 0) gi.reverse(); - } - - if ((flags & STRIPIFY) != 0) { - strippy.stripify(gi); - if ((DEBUG & 8) != 0) { - t3 += System.currentTimeMillis() - time; - System.out.println("Stripify: " + t3 + " ms"); - time = System.currentTimeMillis(); - } - } - - // Put geometry into Shape3d - Shape3D shape = new Shape3D(); - // issue 638; default to BY_COPY for consistency - shape.setGeometry(gi.getGeometryArray(false, false, false)); - - String matName = (String)groupMaterials.get(curname); - materials.assignMaterial(matName, shape); - - group.addChild(shape); - scene.addNamedObject(curname, shape); - - if ((DEBUG & 8) != 0) { - t4 += System.currentTimeMillis() - time; - System.out.println("Shape 3D: " + t4 + " ms"); - time = System.currentTimeMillis(); - } - } - } - - return scene; - } // end of makeScene - - - /** - * The Object File is loaded from the already opened file. - * To attach the model to your scene, call getSceneGroup() on - * the Scene object passed back, and attach the returned - * BranchGroup to your scene graph. For an example, see - * j3d-examples/ObjLoad/ObjLoad.java. - */ - @Override - public Scene load(Reader reader) throws FileNotFoundException, - IncorrectFormatException, - ParsingErrorException { - // ObjectFileParser does lexical analysis - ObjectFileParser st = new ObjectFileParser(reader); - - coordList = new ArrayList<Point3f>(); - texList = new ArrayList<TexCoord2f>(); - normList = new ArrayList<Vector3f>(); - coordIdxList = new ArrayList(); - texIdxList = new ArrayList(); - normIdxList = new ArrayList(); - groups = new HashMap(50); - curGroup = "default"; - sGroups = new HashMap(50); - curSgroup = null; - stripCounts = new ArrayList(); - groupMaterials = new HashMap(50); - groupMaterials.put(curGroup, "default"); - materials = new ObjectFileMaterials(); - - time = 0L; - if ((DEBUG & 8) != 0) { - time = System.currentTimeMillis(); - } - - readFile(st); - - if ((DEBUG & 8) != 0) { - time = System.currentTimeMillis() - time; - System.out.println("Read file: " + time + " ms"); - time = System.currentTimeMillis(); - } - - if ((flags & RESIZE) != 0) resize(); - - return makeScene(); - } // End of load(Reader) - - - /** - * For an .obj file loaded from a URL, set the URL where associated files - * (like material properties files) will be found. - * Only needs to be called to set it to a different URL - * from that containing the .obj file. - */ - @Override - public void setBaseUrl(URL url) { - baseUrl = url; - } // End of setBaseUrl - - - /** - * Return the URL where files associated with this .obj file (like - * material properties files) will be found. - */ - @Override - public URL getBaseUrl() { - return baseUrl; - } // End of getBaseUrl - - - /** - * Set the path where files associated with this .obj file are - * located. - * Only needs to be called to set it to a different directory - * from that containing the .obj file. - */ - @Override - public void setBasePath(String pathName) { - basePath = pathName; - if (basePath == null || basePath == "") - basePath = "." + java.io.File.separator; - basePath = basePath.replace('/', java.io.File.separatorChar); - basePath = basePath.replace('\\', java.io.File.separatorChar); - if (!basePath.endsWith(java.io.File.separator)) - basePath = basePath + java.io.File.separator; - } // End of setBasePath - - - /** - * Return the path where files associated with this .obj file (like material - * files) are located. - */ - @Override - public String getBasePath() { - return basePath; - } // End of getBasePath - - - /** - * Set parameters for loading the model. - * Flags defined in Loader.java are ignored by the ObjectFile Loader - * because the .obj file format doesn't include lights, fog, background, - * behaviors, views, or sounds. However, several flags are defined - * specifically for use with the ObjectFile Loader (see above). - */ - @Override - public void setFlags(int flags) { - this.flags = flags; - if ((DEBUG & 4) != 0) System.out.println("Flags = " + flags); - } // End of setFlags - - - /** - * Get the parameters currently defined for loading the model. - * Flags defined in Loader.java are ignored by the ObjectFile Loader - * because the .obj file format doesn't include lights, fog, background, - * behaviors, views, or sounds. However, several flags are defined - * specifically for use with the ObjectFile Loader (see above). - */ - @Override - public int getFlags() { - return flags; - } // End of getFlags - -} // End of class ObjectFile - -// End of file ObjectFile.java diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileMaterials.java b/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileMaterials.java deleted file mode 100644 index d294795..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileMaterials.java +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.objectfile; - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.ImageObserver; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; - -import javax.media.j3d.Appearance; -import javax.media.j3d.GeometryArray; -import javax.media.j3d.Material; -import javax.media.j3d.Shape3D; -import javax.media.j3d.TexCoordGeneration; -import javax.media.j3d.Texture2D; -import javax.media.j3d.TransparencyAttributes; -import javax.vecmath.Color3f; - -import com.sun.j3d.loaders.ParsingErrorException; -import com.sun.j3d.utils.image.ImageException; -import com.sun.j3d.utils.image.TextureLoader; - - -class ObjectFileMaterials implements ImageObserver { - // DEBUG - // 1 = Name of materials - // 16 = Tokens - private static final int DEBUG = 0; - - private String curName = null; - private ObjectFileMaterial cur = null; - - private HashMap materials; // key=String name of material - // value=ObjectFileMaterial - - private String basePath; - private boolean fromUrl; - - private class ObjectFileMaterial { - - public Color3f Ka; - public Color3f Kd; - public Color3f Ks; - public int illum; - public float Ns; - public Texture2D t; - public boolean transparent; - public float transparencyLevel; - - } - - - void assignMaterial(String matName, Shape3D shape) { - ObjectFileMaterial p = null; - - if ((DEBUG & 1) != 0) System.out.println("Color " + matName); - - Material m = new Material(); - p = (ObjectFileMaterial)materials.get(matName); - Appearance a = new Appearance(); - - if (p != null) { - // Set ambient & diffuse color - if (p.Ka != null) m.setAmbientColor(p.Ka); - if (p.Kd != null) m.setDiffuseColor(p.Kd); - - // Set specular color - if ((p.Ks != null) && (p.illum != 1)) m.setSpecularColor(p.Ks); - else if (p.illum == 1) m.setSpecularColor(0.0f, 0.0f, 0.0f); - - if (p.illum >= 1) m.setLightingEnable(true); - else if (p.illum == 0) m.setLightingEnable(false); - - if (p.Ns != -1.0f) m.setShininess(p.Ns); - - if (p.t != null) { - a.setTexture(p.t); - // Create Texture Coordinates if not already present - if ((((GeometryArray)shape.getGeometry()).getVertexFormat() & - GeometryArray.TEXTURE_COORDINATE_2) == 0) { - TexCoordGeneration tcg = new TexCoordGeneration(); - a.setTexCoordGeneration(tcg); - } - } - - if (p.transparent) - a.setTransparencyAttributes( - new TransparencyAttributes(TransparencyAttributes.NICEST, - p.transparencyLevel)); - } - a.setMaterial(m); - if ((DEBUG & 1) != 0) System.out.println(m); - shape.setAppearance(a); - } // End of assignMaterial - - - private void readName(ObjectFileParser st) throws ParsingErrorException { - st.getToken(); - - if (st.ttype == ObjectFileParser.TT_WORD) { - - if (curName != null) materials.put(curName, cur); - curName = new String(st.sval); - cur = new ObjectFileMaterial(); - } - st.skipToNextLine(); - } // End of readName - - - private void readAmbient(ObjectFileParser st) throws ParsingErrorException { - Color3f p = new Color3f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - st.getNumber(); - p.z = (float)st.nval; - - cur.Ka = p; - - st.skipToNextLine(); - } // End of readAmbient - - - private void readDiffuse(ObjectFileParser st) throws ParsingErrorException { - Color3f p = new Color3f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - st.getNumber(); - p.z = (float)st.nval; - - cur.Kd = p; - - st.skipToNextLine(); - } // End of readDiffuse - - - private void readSpecular(ObjectFileParser st) throws ParsingErrorException { - Color3f p = new Color3f(); - - st.getNumber(); - p.x = (float)st.nval; - st.getNumber(); - p.y = (float)st.nval; - st.getNumber(); - p.z = (float)st.nval; - - cur.Ks = p; - - st.skipToNextLine(); - } // End of readSpecular - - - private void readIllum(ObjectFileParser st) throws ParsingErrorException { - - st.getNumber(); - cur.illum = (int)st.nval; - - st.skipToNextLine(); - } // End of readSpecular - - private void readTransparency(ObjectFileParser st) throws ParsingErrorException { - - st.getNumber(); - cur.transparencyLevel = (float)st.nval; - if ( cur.transparencyLevel < 1.0f ){ - cur.transparent = true; - } - st.skipToNextLine(); - } // End of readTransparency - - private void readShininess(ObjectFileParser st) throws ParsingErrorException { - float f; - - st.getNumber(); - cur.Ns = (float)st.nval; - if (cur.Ns < 1.0f) cur.Ns = 1.0f; - else if (cur.Ns > 128.0f) cur.Ns = 128.0f; - - st.skipToNextLine(); - } // End of readSpecular - - - public void readMapKd(ObjectFileParser st) { - // Filenames are case sensitive - st.lowerCaseMode(false); - - // Get name of texture file (skip path) - String tFile = null; - do { - st.getToken(); - if (st.ttype == ObjectFileParser.TT_WORD) tFile = st.sval; - } while (st.ttype != ObjectFileParser.TT_EOL); - - st.lowerCaseMode(true); - - if (tFile != null) { - // Check for filename with no extension - if (tFile.lastIndexOf('.') != -1) { - try { - // Convert filename to lower case for extension comparisons - String suffix = - tFile.substring(tFile.lastIndexOf('.') + 1).toLowerCase(); - - TextureLoader t = null; - - if ((suffix.equals("int")) || (suffix.equals("inta")) || - (suffix.equals("rgb")) || (suffix.equals("rgba")) || - (suffix.equals("bw")) || (suffix.equals("sgi"))) { - RgbFile f; - if (fromUrl) { - f = new RgbFile(new URL(basePath + tFile).openStream()); - } else { - f = new RgbFile(new FileInputStream(basePath + tFile)); - } - BufferedImage bi = f.getImage(); - - boolean luminance = suffix.equals("int") || suffix.equals("inta"); - boolean alpha = suffix.equals("inta") || suffix.equals("rgba"); - cur.transparent = alpha; - - String s = null; - if (luminance && alpha) s = "LUM8_ALPHA8"; - else if (luminance) s = "LUMINANCE"; - else if (alpha) s = "RGBA"; - else s = "RGB"; - - t = new TextureLoader(bi, s, TextureLoader.GENERATE_MIPMAP); - } else { - // For all other file types, use the TextureLoader - if (fromUrl) { - t = new TextureLoader(new URL(basePath + tFile), "RGB", - TextureLoader.GENERATE_MIPMAP, null); - } else { - t = new TextureLoader(basePath + tFile, "RGB", - TextureLoader.GENERATE_MIPMAP, null); - } - } - Texture2D texture = (Texture2D)t.getTexture(); - if (texture != null) cur.t = texture; - } - catch (FileNotFoundException e) { - // Texture won't get loaded if file can't be found - } - catch (MalformedURLException e) { - // Texture won't get loaded if file can't be found - } - catch (IOException e) { - // Texture won't get loaded if file can't be found - } // mcneillk: issue 639 - catch (ImageException iex) { - // Texture won't get loaded if other problem - } - } - } - st.skipToNextLine(); - } // End of readMapKd - - - private void readFile(ObjectFileParser st) throws ParsingErrorException { - int t; - st.getToken(); - while (st.ttype != ObjectFileParser.TT_EOF) { - - // Print out one token for each line - if ((DEBUG & 16) != 0) { - System.out.print("Token "); - if (st.ttype == ObjectFileParser.TT_EOL) System.out.println("EOL"); - else if (st.ttype == ObjectFileParser.TT_WORD) - System.out.println(st.sval); - else System.out.println((char)st.ttype); - } - - if (st.ttype == ObjectFileParser.TT_WORD) { - if (st.sval.equals("newmtl")) { - readName(st); - } else if (st.sval.equals("ka")) { - readAmbient(st); - } else if (st.sval.equals("kd")) { - readDiffuse(st); - } else if (st.sval.equals("ks")) { - readSpecular(st); - } else if (st.sval.equals("illum")) { - readIllum(st); - } else if (st.sval.equals("d")) { - readTransparency(st); - } else if (st.sval.equals("ns")) { - readShininess(st); - } else if (st.sval.equals("tf")) { - st.skipToNextLine(); - } else if (st.sval.equals("sharpness")) { - st.skipToNextLine(); - } else if (st.sval.equals("map_kd")) { - readMapKd(st); - } else if (st.sval.equals("map_ka")) { - st.skipToNextLine(); - } else if (st.sval.equals("map_ks")) { - st.skipToNextLine(); - } else if (st.sval.equals("map_ns")) { - st.skipToNextLine(); - } else if (st.sval.equals("bump")) { - st.skipToNextLine(); - } - } - - st.skipToNextLine(); - - // Get next token - st.getToken(); - } - if (curName != null) materials.put(curName, cur); - } // End of readFile - - - void readMaterialFile(boolean fromUrl, String basePath, String fileName) - throws ParsingErrorException { - - Reader reader; - - this.basePath = basePath; - this.fromUrl = fromUrl; - - try { - if (fromUrl) { - reader = (Reader) - (new InputStreamReader( - new BufferedInputStream( - (new URL(basePath + fileName).openStream())))); - } else { - reader = new BufferedReader(new FileReader(basePath + fileName)); - } - } - catch (IOException e) { - // couldn't find it - ignore mtllib - return; - } - if ((DEBUG & 1) != 0) - System.out.println("Material file: " + basePath + fileName); - - ObjectFileParser st = new ObjectFileParser(reader); - readFile(st); - } // End of readMaterialFile - - - ObjectFileMaterials() throws ParsingErrorException { - Reader reader = new StringReader(DefaultMaterials.materials); - - ObjectFileParser st = new ObjectFileParser(reader); - materials = new HashMap(50); - readFile(st); - } // End of ObjectFileMaterials - - - /** - * Implement the ImageObserver interface. Needed to load jpeg and gif - * files using the Toolkit. - */ - @Override - public boolean imageUpdate(Image img, int flags, - int x, int y, int w, int h) { - - return (flags & (ALLBITS | ABORT)) == 0; - } // End of imageUpdate - -} // End of class ObjectFileMaterials - -// End of file ObjectFileMaterials.java diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileParser.java b/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileParser.java deleted file mode 100644 index b5a8426..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/ObjectFileParser.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.objectfile; - -import java.io.IOException; -import java.io.Reader; -import java.io.StreamTokenizer; - -import com.sun.j3d.loaders.ParsingErrorException; - -class ObjectFileParser extends StreamTokenizer { - - private static final char BACKSLASH = '\\'; - - - /** - * setup - * - * Sets up StreamTokenizer for reading ViewPoint .obj file format. - */ - void setup() { - resetSyntax(); - eolIsSignificant(true); - lowerCaseMode(true); - - // All printable ascii characters - wordChars('!', '~'); - - // Comment from ! to end of line - commentChar('!'); - - whitespaceChars(' ', ' '); - whitespaceChars('\n', '\n'); - whitespaceChars('\r', '\r'); - whitespaceChars('\t', '\t'); - - // These characters returned as tokens - ordinaryChar('#'); - ordinaryChar('/'); - ordinaryChar(BACKSLASH); - } // End of setup - - - /** - * getToken - * - * Gets the next token from the stream. Puts one of the four - * constants (TT_WORD, TT_NUMBER, TT_EOL, or TT_EOF) or the token value - * for single character tokens into ttype. Handles backslash - * continuation of lines. - */ - void getToken() throws ParsingErrorException { - int t; - boolean done = false; - - try { - do { - t = nextToken(); - if (t == BACKSLASH) { - t = nextToken(); - if (ttype != TT_EOL) done = true; - } else done = true; - } while (!done); - } - catch (IOException e) { - throw new ParsingErrorException( - "IO error on line " + lineno() + ": " + e.getMessage()); - } - } // End of getToken - - - void printToken() { - switch (ttype) { - case TT_EOL: - System.out.println("Token EOL"); - break; - case TT_EOF: - System.out.println("Token EOF"); - break; - case TT_WORD: - System.out.println("Token TT_WORD: " + sval); - break; - case '/': - System.out.println("Token /"); - break; - case BACKSLASH: - System.out.println("Token " + BACKSLASH); - break; - case '#': - System.out.println("Token #"); - break; - } - } // end of printToken - - - /** - * skipToNextLine - * - * Skips all tokens on the rest of this line. Doesn't do anything if - * We're already at the end of a line - */ - void skipToNextLine() throws ParsingErrorException { - while (ttype != TT_EOL && ttype != -1 /* issue 587*/) { - getToken(); - } - } // end of skipToNextLine - - - /** - * getNumber - * - * Gets a number from the stream. Note that we don't recognize - * numbers in the tokenizer automatically because numbers might be in - * scientific notation, which isn't processed correctly by - * StreamTokenizer. The number is returned in nval. - */ - void getNumber() throws ParsingErrorException { - int t; - - try { - getToken(); - if (ttype != TT_WORD) - throw new ParsingErrorException("Expected number on line " + lineno()); - nval = (Double.valueOf(sval)).doubleValue(); - } - catch (NumberFormatException e) { - throw new ParsingErrorException(e.getMessage()); - } - } // end of getNumber - - - // ObjectFileParser constructor - ObjectFileParser(Reader r) { - super(r); - setup(); - } // end of ObjectFileParser - -} // End of file ObjectFileParser.java diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/RgbFile.java b/src/classes/share/com/sun/j3d/loaders/objectfile/RgbFile.java deleted file mode 100644 index fe2446a..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/RgbFile.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2007 Sun Microsystems, Inc. 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. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may 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. SUN MICROSYSTEMS, INC. ("SUN") AND ITS 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 SUN OR ITS 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 SUN HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - * - */ - -package com.sun.j3d.loaders.objectfile; - -import java.awt.Transparency; -import java.awt.color.ColorSpace; -import java.awt.image.BufferedImage; -import java.awt.image.ComponentColorModel; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.WritableRaster; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; - -class RgbFile extends BufferedInputStream { - - // Header data - short dimension; - short xSize; - short ySize; - short zSize; - - String filename; - - private static final int DEBUG = 0; - - - short getShort() throws IOException { - int t1 = (short)read(); - if (t1 == -1) throw new IOException("Unexpected EOF"); - int t2 = (short)read(); - if (t2 == -1) throw new IOException("Unexpected EOF"); - return (short)((t1 << 8) | t2); - } // End of getShort() - - - byte getByte() throws IOException { - int t = read(); - if (t == -1) throw new IOException("Unexpected EOF"); - return (byte)t; - } // End of getByte - - - int getInt() throws IOException { - int ret = 0; - for (int i = 0 ; i < 4 ; i++) { - int t = read(); - if (t == -1) throw new IOException("Unexpected EOF"); - ret = (ret << 8) | t; - } - return ret; - } // end of getInt - - - public BufferedImage getImage() throws IOException { - short magic = getShort(); - - if (magic != 474) throw new IOException("Unrecognized file format."); - - byte storage = getByte(); - - if (storage != 0) - throw new IOException("RLE Compressed files not supported"); - - byte bpc = getByte(); - dimension = getShort(); - xSize = getShort(); - ySize = getShort(); - zSize = getShort(); - int pixMin = getInt(); - int pixMax = getInt(); - skip(84l); - int colorMap = getInt(); - - if ((DEBUG & 1) != 0) { - System.out.println(filename + ":"); - System.out.println(" bpc = " + bpc); - System.out.println(" dimension = " + dimension); - System.out.println(" xSize = " + xSize); - System.out.println(" ySize = " + ySize); - System.out.println(" zSize = " + zSize); - System.out.println(" pixMin = " + pixMin); - System.out.println(" pixMax = " + pixMax); - System.out.println(" colorMap = " + colorMap); - } - - if ((pixMin != 0) || (pixMax != 0xff) || (colorMap != 0) || (bpc != 1)) - throw new IOException("Unsupported options in file"); - - skip(404l); - - ComponentColorModel cm = null; - if (zSize == 1) { - // Black and White image - ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); - - int[] nBits = {8}; - cm = new ComponentColorModel(cs, nBits, false, false, - Transparency.OPAQUE, - DataBuffer.TYPE_BYTE); - - } else if (zSize == 2) { - // Black and White image with alpha - ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); - - int[] nBits = {8, 8}; - cm = new ComponentColorModel(cs, nBits, true, false, - Transparency.TRANSLUCENT, - DataBuffer.TYPE_BYTE); - - } else if (zSize == 3) { - // RGB Image - ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); - - int[] nBits = {8, 8, 8}; - cm = new ComponentColorModel(cs, nBits, false, false, - Transparency.OPAQUE, - DataBuffer.TYPE_BYTE); - - } else if (zSize == 4) { - // RGBA Image - ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); - - int[] nBits = {8, 8, 8, 8}; - cm = new ComponentColorModel(cs, nBits, true, false, - Transparency.TRANSLUCENT, - DataBuffer.TYPE_BYTE); - } else { - throw new IOException("Unsupported options in file"); - } - - WritableRaster r = cm.createCompatibleWritableRaster(xSize, ySize); - BufferedImage bi = new BufferedImage(cm, r, false, null); - - int t; - byte image[] = ((DataBufferByte)r.getDataBuffer()).getData(); - for (short z = 0 ; z < zSize ; z++) { - for (int y = ySize - 1 ; y >= 0 ; y--) { - for (short x = 0 ; x < xSize ; x++) { - t = read(); - if (t == -1) throw new IOException("Unexpected EOF"); - image[y * (xSize * zSize) + (x * zSize) + z] = (byte)t; - } - } - } - - return bi; - } // End of getImage - - - public RgbFile(InputStream s) { - super(s); - } // End of RgbFile(URL) - -} // End of class RgbFile - -// End of file RgbFile.java diff --git a/src/classes/share/com/sun/j3d/loaders/objectfile/package.html b/src/classes/share/com/sun/j3d/loaders/objectfile/package.html deleted file mode 100644 index 1171815..0000000 --- a/src/classes/share/com/sun/j3d/loaders/objectfile/package.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> -<head> - <meta content="text/html; charset=ISO-8859-1" - http-equiv="content-type"> - <title>com.sun.j3d.loaders.objectfile</title> -</head> -<body> -<p>Provides a Java 3D loader for Wavefront .obj files.</p> -</body> -</html> diff --git a/src/classes/share/com/sun/j3d/loaders/package.html b/src/classes/share/com/sun/j3d/loaders/package.html deleted file mode 100644 index 6b38d00..0000000 --- a/src/classes/share/com/sun/j3d/loaders/package.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> -<head> - <meta content="text/html; charset=ISO-8859-1" - http-equiv="content-type"> - <title>com.sun.j3d.loaders</title> -</head> -<body> -<p>Provides interfaces and abstract classes for writing Java 3D loaders.</p> -</body> -</html> |