aboutsummaryrefslogtreecommitdiffstats
path: root/src/TextureByReference
diff options
context:
space:
mode:
Diffstat (limited to 'src/TextureByReference')
-rw-r--r--src/TextureByReference/AnimateTexturesBehavior.java315
-rw-r--r--src/TextureByReference/ImageOps.java173
-rw-r--r--src/TextureByReference/Tetrahedron.java221
-rw-r--r--src/TextureByReference/TextureByReference.html15
-rw-r--r--src/TextureByReference/TextureByReference.java530
-rw-r--r--src/TextureByReference/TextureByReference_plugin.html39
-rw-r--r--src/TextureByReference/build.xml66
7 files changed, 1359 insertions, 0 deletions
diff --git a/src/TextureByReference/AnimateTexturesBehavior.java b/src/TextureByReference/AnimateTexturesBehavior.java
new file mode 100644
index 0000000..adf9e60
--- /dev/null
+++ b/src/TextureByReference/AnimateTexturesBehavior.java
@@ -0,0 +1,315 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 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.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+import javax.media.j3d.*;
+import java.awt.image.BufferedImage;
+import java.awt.*;
+import com.sun.j3d.utils.image.TextureLoader;
+import java.util.Enumeration;
+
+public class AnimateTexturesBehavior extends Behavior {
+
+
+ // what image are we on
+ private int current;
+ private int max;
+
+ // the images
+ private ImageComponent2D[] images;
+
+ // the target
+ private Texture2D texture;
+ private Appearance appearance;
+
+ // the wakeup criterion
+ private WakeupCriterion wakeupC;
+
+ // are the images flipped?
+ private boolean flip;
+
+ // need the current type because by copy changes all images
+ // to TYPE_INT_ARGB
+ private int currentType;
+
+ // for custom types
+ public static final int TYPE_CUSTOM_RGBA = 0x01;
+ public static final int TYPE_CUSTOM_RGB = 0x02;
+
+ private int customType;
+
+ // create a new AnimateTextureBehavior
+ // initialize the images
+ public AnimateTexturesBehavior(Texture2D texP,
+ java.net.URL[] fnames,
+ Appearance appP,
+ TextureByReference applet) {
+ int size = fnames.length;
+ images = new ImageComponent2D[size];
+ BufferedImage bImage;
+ TextureLoader loader;
+ for (int i = 0; i < size; i++) {
+ loader = new TextureLoader(fnames[i],
+ TextureLoader.BY_REFERENCE |
+ TextureLoader.Y_UP, applet);
+ images[i] = loader.getImage();
+ bImage = images[i].getImage();
+
+ // convert the image to TYPE_4BYTE_ABGR
+ currentType = BufferedImage.TYPE_4BYTE_ABGR;
+ bImage = ImageOps.convertImage(bImage, currentType);
+ // flip the image
+ flip = true;
+ ImageOps.flipImage(bImage);
+
+ // set the image on the ImageComponent to the new one
+ images[i].set(bImage);
+
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ texture = texP;
+ current = 0;
+ max = size;
+ wakeupC = new WakeupOnElapsedFrames(20);
+ appearance = appP;
+ }
+
+ // initialize to the first image
+ public void initialize() {
+ texture.setImage(0, images[current]);
+ if (current < max-1) current++;
+ else current = 0;
+ wakeupOn(wakeupC);
+ }
+
+ // procesStimulus changes the ImageComponent of the texture
+ public void processStimulus(Enumeration criteria) {
+ // ImageOps.printType(images[current].getImage());
+ texture.setImage(0, images[current]);
+ appearance.setTexture(texture);
+ if (current < max-1) current++;
+ else current = 0;
+ wakeupOn(wakeupC);
+ }
+
+ // flip the image -- useful depending on yUp
+ public void setFlipImages(boolean b) {
+ // double check that flipping is necessary
+ if (b != flip) {
+ BufferedImage bImage;
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean byRef = images[0].isByReference();
+ boolean yUp = images[0].isYUp();
+
+ // flip all the images
+ // have to new ImageComponents because can't set the image at runtime
+ for (int i = 0; i < images.length; i++) {
+ bImage = images[i].getImage();
+ ImageOps.flipImage(bImage);
+ // if we are byRef and the bImage type does not match currentType
+ // we need to convert it. If we are not byRef we will
+ // save converting until it is changed to byRef
+ if (byRef && bImage.getType() != currentType) {
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+
+ // set flip to new value
+ flip = b;
+ }
+ }
+
+ // create new ImageComponents with yUp set to the parameter. yUp on
+ // an ImageComponent cannot be changed at runtim
+ public void setYUp(boolean b) {
+ // double check that changing yUp is necessary
+ if (b != images[0].isYUp()) {
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean byRef = images[0].isByReference();
+
+ // reset yUp on all the images -- have to new ImageComponents because
+ // cannot change the value at runtime
+ for (int i = 0; i < images.length; i++) {
+ // if we are byRef and the bImage type does not match currentType
+ // we need to convert it. If we are not byRef we will
+ // save converting until it is changed to byRef
+ BufferedImage bImage = images[i].getImage();
+ if (byRef && bImage.getType() != currentType) {
+ // bImage = ImageOps.convertImage(bImage, currentType);
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage,
+ byRef, b);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ // create new ImageComponents with ByReference set by parameter.
+ // by reference cannot be changed on an image component at runtime
+ public void setByReference(boolean b) {
+ // double check that changing is necessary
+ if (b != images[0].isByReference()) {
+
+ // these are the same for all images so get info once
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+
+ // reset yUp on all the images
+ // have to new ImageComponents because cannot set value
+ for (int i = 0; i < images.length; i++) {
+ // if the bImage type does not match currentType and we are setting
+ // to byRef we need to convert it
+ BufferedImage bImage = images[i].getImage();
+ if (bImage.getType() != currentType && b) {
+ // bImage = ImageOps.convertImage(bImage, currentType);
+ if (currentType != BufferedImage.TYPE_CUSTOM) {
+ bImage = ImageOps.convertImage(bImage, currentType);
+ }
+ else if (customType == this.TYPE_CUSTOM_RGBA) {
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ }
+ else {
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ }
+ }
+ images[i] = new ImageComponent2D(format, bImage, b, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ // make a new wakeup criterion object based on the new delay time
+ public void setFrameDelay(int delay) {
+ wakeupC = new WakeupOnElapsedFrames(delay);
+ }
+
+ //change the type of image
+ public void setImageType(int newType) {
+ currentType = newType;
+
+ // only need to change the images if we are byRef otherwise will change
+ // them when we chnage to byRef
+ if (images[0].isByReference() == true) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertImage(bImage, currentType);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ public void setImageTypeCustomRGBA() {
+ currentType = BufferedImage.TYPE_CUSTOM;
+ customType = this.TYPE_CUSTOM_RGBA;
+
+ // only need to change images if we are byRef otherwise will change
+ // them when we change to byRef
+ if (images[0].isByReference()) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertToCustomRGBA(bImage);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+
+ public void setImageTypeCustomRGB() {
+ currentType = BufferedImage.TYPE_CUSTOM;
+ customType = this.TYPE_CUSTOM_RGB;
+
+ // only need to change images if we are byRef otherwise will change
+ // them when we change to byRef
+ if (images[0].isByReference()) {
+ // this information is the same for all
+ int format = images[0].getFormat();
+ boolean yUp = images[0].isYUp();
+ boolean byRef = true;
+ for (int i = 0; i < images.length; i++) {
+ BufferedImage bImage = images[i].getImage();
+ bImage = ImageOps.convertToCustomRGB(bImage);
+ images[i] = new ImageComponent2D(format, bImage, byRef, yUp);
+ images[i].setCapability(ImageComponent.ALLOW_IMAGE_READ);
+ images[i].setCapability(ImageComponent.ALLOW_FORMAT_READ);
+ }
+ }
+ }
+}
diff --git a/src/TextureByReference/ImageOps.java b/src/TextureByReference/ImageOps.java
new file mode 100644
index 0000000..b099ba2
--- /dev/null
+++ b/src/TextureByReference/ImageOps.java
@@ -0,0 +1,173 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 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.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.color.*;
+
+// some useful, static image operations
+
+public class ImageOps {
+
+ // flip the image
+ public static void flipImage(BufferedImage bImage) {
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+ int[] rgbArray = new int[width*height];
+ bImage.getRGB(0, 0, width, height, rgbArray, 0, width);
+ int[] tempArray = new int[width*height];
+ int y2 = 0;
+ for (int y = height-1; y >= 0; y--) {
+ for (int x = 0; x < width; x++) {
+ tempArray[y2*width+x] = rgbArray[y*width+x];
+ }
+ y2++;
+ }
+ bImage.setRGB(0, 0, width, height, tempArray, 0, width);
+ }
+
+
+ // convert the image to a specified BufferedImage type and return it
+ public static BufferedImage convertImage(BufferedImage bImage, int type) {
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+ BufferedImage newImage = new BufferedImage(width, height, type);
+ int[] rgbArray = new int[width*height];
+ bImage.getRGB(0, 0, width, height, rgbArray, 0, width);
+ newImage.setRGB(0, 0, width, height, rgbArray, 0, width);
+ return newImage;
+ }
+
+ // print out some of the types of BufferedImages
+ static void printType(BufferedImage bImage) {
+ int type = bImage.getType();
+ if (type == BufferedImage.TYPE_4BYTE_ABGR) {
+ System.out.println("TYPE_4BYTE_ABGR");
+ }
+ else if (type == BufferedImage.TYPE_INT_ARGB) {
+ System.out.println("TYPE_INT_ARGB");
+ }
+ else if (type == BufferedImage.TYPE_3BYTE_BGR) {
+ System.out.println("TYPE_3BYTE_BGR");
+ }
+ else if (type == BufferedImage.TYPE_CUSTOM) {
+ System.out.println("TYPE_CUSTOM");
+ }
+ else System.out.println(type);
+ }
+
+ public static BufferedImage convertToCustomRGBA(BufferedImage bImage) {
+ if (bImage.getType() != BufferedImage.TYPE_INT_ARGB) {
+ ImageOps.convertImage(bImage, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8, 8};
+ ColorModel cm = new ComponentColorModel(cs, nBits, true, false,
+ Transparency.OPAQUE, 0);
+ int[] bandOffset = {0, 1, 2, 3};
+
+ WritableRaster newRaster =
+ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height,
+ width*4, 4, bandOffset, null);
+ byte[] byteData = ((DataBufferByte)newRaster.getDataBuffer()).getData();
+ Raster origRaster = bImage.getData();
+ int[] pixel = new int[4];
+ int k = 0;
+ for (int j = 0; j < height; j++) {
+ for (int i = 0; i < width; i++) {
+ pixel = origRaster.getPixel(i, j, pixel);
+ byteData[k++] = (byte)(pixel[0]);
+ byteData[k++] = (byte)(pixel[1]);
+ byteData[k++] = (byte)(pixel[2]);
+ byteData[k++] = (byte)(pixel[3]);
+ }
+ }
+ BufferedImage newImage = new BufferedImage(cm, newRaster, false, null);
+// if (newImage.getType() == BufferedImage.TYPE_CUSTOM) {
+// System.out.println("Type is custom");
+// }
+ return newImage;
+ }
+
+ public static BufferedImage convertToCustomRGB(BufferedImage bImage) {
+ if (bImage.getType() != BufferedImage.TYPE_INT_ARGB) {
+ ImageOps.convertImage(bImage, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ int width = bImage.getWidth();
+ int height = bImage.getHeight();
+
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8};
+ ColorModel cm = new ComponentColorModel(cs, nBits, false, false,
+ Transparency.OPAQUE, 0);
+ int[] bandOffset = {0, 1, 2};
+
+ WritableRaster newRaster =
+ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height,
+ width*3, 3, bandOffset, null);
+ byte[] byteData = ((DataBufferByte)newRaster.getDataBuffer()).getData();
+ Raster origRaster = bImage.getData();
+ int[] pixel = new int[4];
+ int k = 0;
+ for (int j = 0; j < height; j++) {
+ for (int i = 0; i < width; i++) {
+ pixel = origRaster.getPixel(i, j, pixel);
+ byteData[k++] = (byte)(pixel[0]);
+ byteData[k++] = (byte)(pixel[1]);
+ byteData[k++] = (byte)(pixel[2]);
+ }
+ }
+ BufferedImage newImage = new BufferedImage(cm, newRaster, false, null);
+// if (newImage.getType() == BufferedImage.TYPE_CUSTOM) {
+// System.out.println("Type is custom");
+// }
+ return newImage;
+ }
+}
+
diff --git a/src/TextureByReference/Tetrahedron.java b/src/TextureByReference/Tetrahedron.java
new file mode 100644
index 0000000..eefd85c
--- /dev/null
+++ b/src/TextureByReference/Tetrahedron.java
@@ -0,0 +1,221 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 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.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+
+public class Tetrahedron extends Shape3D {
+
+ private static final float sqrt3 = (float) Math.sqrt(3.0);
+ private static final float sqrt3_3 = sqrt3 / 3.0f;
+ private static final float sqrt24_3 = (float) Math.sqrt(24.0) / 3.0f;
+
+ private static final float ycenter = 0.5f * sqrt24_3;
+ private static final float zcenter = -sqrt3_3;
+
+ private static final Point3f p1 = new Point3f(-1.0f, -ycenter, -zcenter);
+ private static final Point3f p2 = new Point3f(1.0f, -ycenter, -zcenter);
+ private static final Point3f p3 = new Point3f(0.0f, -ycenter, -sqrt3 - zcenter);
+ private static final Point3f p4 = new Point3f(0.0f, sqrt24_3 - ycenter, 0.0f);
+
+ private static final Point3f[] verts = {
+ p1, p2, p4, // front face
+ p1, p4, p3, // left, back face
+ p2, p3, p4, // right, back face
+ p1, p3, p2, // bottom face
+ };
+
+ private Point2f texCoord[] = {
+ new Point2f(-0.25f, 0.0f),
+ new Point2f(1.25f, 0.0f),
+ new Point2f(0.5f, 2.0f),
+ };
+
+ private TriangleArray geometryByRef;
+ private TriangleArray geometryByCopy;
+
+ // for geometry by reference
+ private Point3f[] verticesArray = new Point3f[12];
+ private TexCoord2f[] textureCoordsArray = new TexCoord2f[12];
+ private Vector3f[] normalsArray = new Vector3f[12];
+
+ // default to geometry by copy
+ public Tetrahedron() {
+ this(false);
+ }
+
+ // creates a tetrahedron with geometry by reference or by copy depending on
+ // the byRef parameter
+ public Tetrahedron(boolean byRef) {
+ if (byRef) {
+ createGeometryByRef();
+ this.setGeometry(geometryByRef);
+ }
+ else {
+ createGeometryByCopy();
+ this.setGeometry(geometryByCopy);
+ }
+ this.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
+ this.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
+ setAppearance(new Appearance());
+ }
+
+ // create the geometry by reference and
+ // store it in the geometryByRef variable
+ public void createGeometryByRef() {
+// System.out.println("createGeometryByRef");
+ geometryByRef = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS |
+ TriangleArray.TEXTURE_COORDINATE_2 |
+ TriangleArray.BY_REFERENCE);
+
+ int i;
+
+ // the coordinates
+ for (i = 0; i < 12; i++) {
+ verticesArray[i] = new Point3f(verts[i]);
+ }
+ geometryByRef.setCoordRef3f(verticesArray);
+// System.out.println("coordinates set");
+// Point3f[] temp1 = geometryByRef.getCoordRef3f();
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp1[i]);
+// }
+
+ // the texture coordinates
+ for (i = 0; i < 12; i++) {
+ textureCoordsArray[i] = new TexCoord2f(texCoord[i%3]);
+ }
+ geometryByRef.setTexCoordRef2f(0, textureCoordsArray);
+// System.out.println("texture coords set");
+// TexCoord2f[] temp2 = geometryByRef.getTexCoordRef2f(0);
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp2[i]);
+// }
+
+ // the normals
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f[] pts = new Point3f[3];
+ for (int face = 0; face < 4; face++) {
+ pts[0] = new Point3f(verts[face*3]);
+ pts[1] = new Point3f(verts[face*3+1]);
+ pts[2] = new Point3f(verts[face*3+2]);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ normalsArray[face*3+i] = new Vector3f(normal);
+ }
+ }
+ geometryByRef.setNormalRef3f(normalsArray);
+// System.out.println("normals set");
+// Vector3f[] temp3 = geometryByRef.getNormalRef3f();
+// for (i = 0; i < 12; i++) {
+// System.out.println(temp3[i]);
+// }
+ }
+
+ // create the geometry by copy and store it in the geometryByCopy variable
+ public void createGeometryByCopy() {
+ int i;
+ geometryByCopy = new TriangleArray(12, TriangleArray.COORDINATES |
+ TriangleArray.NORMALS |
+ TriangleArray.TEXTURE_COORDINATE_2);
+
+ geometryByCopy.setCoordinates(0, verts);
+
+ for (i = 0; i < 12; i++) {
+ geometryByCopy.setTextureCoordinate(0, i,
+ new TexCoord2f(texCoord[i%3]));
+ }
+
+ int face;
+ Vector3f normal = new Vector3f();
+ Vector3f v1 = new Vector3f();
+ Vector3f v2 = new Vector3f();
+ Point3f [] pts = new Point3f[3];
+ for (i = 0; i < 3; i++) pts[i] = new Point3f();
+
+ for (face = 0; face < 4; face++) {
+ geometryByCopy.getCoordinates(face*3, pts);
+ v1.sub(pts[1], pts[0]);
+ v2.sub(pts[2], pts[0]);
+ normal.cross(v1, v2);
+ normal.normalize();
+ for (i = 0; i < 3; i++) {
+ geometryByCopy.setNormal((face * 3 + i), normal);
+ }
+ }
+ }
+
+ // set the geometry to geometryByRef or geometryByCopy depending on the
+ // parameter. Create geometryByRef or geometryByCopy if necessary
+ public void setByReference(boolean b) {
+// System.out.println("Tetrahedron.setByReference " + b);
+ // by reference is true
+ if (b) {
+ // if there is no geometryByRef, create it
+ if (geometryByRef == null) {
+ createGeometryByRef();
+ }
+ // set the geometry
+ this.setGeometry(geometryByRef);
+ }
+ // by reference is false
+ else {
+ // if there is no geometryByCopy, create it
+ if (geometryByCopy == null) {
+ createGeometryByCopy();
+ }
+ // set the geometry
+ this.setGeometry(geometryByCopy);
+ }
+ }
+}
+
+
diff --git a/src/TextureByReference/TextureByReference.html b/src/TextureByReference/TextureByReference.html
new file mode 100644
index 0000000..7d7be3e
--- /dev/null
+++ b/src/TextureByReference/TextureByReference.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>TextureByReference</TITLE>
+</HEAD>
+<BODY BGCOLOR="#000000">
+<applet align=middle code="TextureByReference.class" width=600 height=750>
+<blockquote>
+<hr>
+If you were using a Java-capable browser,
+you would see the TextureByReference applet instead of this paragraph.
+<hr>
+</blockquote>
+</applet>
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/src/TextureByReference/TextureByReference.java b/src/TextureByReference/TextureByReference.java
new file mode 100644
index 0000000..95515cb
--- /dev/null
+++ b/src/TextureByReference/TextureByReference.java
@@ -0,0 +1,530 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 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.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.*;
+import com.sun.j3d.utils.applet.MainFrame;
+import com.sun.j3d.utils.universe.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import java.awt.image.*;
+import java.awt.color.ColorSpace;
+import com.sun.j3d.utils.image.TextureLoader;
+import javax.swing.*;
+import javax.swing.event.*;
+
+
+public class TextureByReference extends Applet
+implements ItemListener, ActionListener, ChangeListener {
+
+ // need reference to animation behavior
+ private AnimateTexturesBehavior animate;
+
+ // need reference to tetrahedron
+ private Tetrahedron tetra;
+
+ // the gui buttons
+ private JCheckBox flipB;
+ private JRadioButton texByRef;
+ private JRadioButton texByCopy;
+ private JRadioButton geomByRef;
+ private JRadioButton geomByCopy;
+ private JRadioButton img4ByteABGR;
+ private JRadioButton img3ByteBGR;
+ private JRadioButton imgIntARGB;
+ private JRadioButton imgCustomRGBA;
+ private JRadioButton imgCustomRGB;
+ private JRadioButton yUp;
+ private JRadioButton yDown;
+ private JButton animationB;
+ private JSlider frameDelay;
+
+ private SimpleUniverse universe = null;
+
+ // image files used for the Texture animation for the applet,
+ // or if no parameters are passed in for the application
+ public static final String[] defaultFiles = {
+ "../images/animation1.gif",
+ "../images/animation2.gif",
+ "../images/animation3.gif",
+ "../images/animation4.gif",
+ "../images/animation5.gif",
+ "../images/animation6.gif",
+ "../images/animation7.gif",
+ "../images/animation8.gif",
+ "../images/animation9.gif",
+ "../images/animation10.gif"};
+
+ private java.net.URL[] urls = null;
+
+
+ public TextureByReference() {
+ }
+
+ public TextureByReference(java.net.URL[] fnamesP) {
+ urls = fnamesP;
+ }
+
+ public void init() {
+ if (urls == null) {
+ urls = new java.net.URL[defaultFiles.length];
+ for (int i = 0; i < defaultFiles.length; i++) {
+ try {
+ urls[i] = new java.net.URL(getCodeBase().toString() +
+ defaultFiles[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ }
+ }
+ setLayout(new BorderLayout());
+ GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
+
+ Canvas3D canvas = new Canvas3D(config);
+
+ add("Center", canvas);
+
+ // create a simple scene graph and attach it to a simple universe
+ BranchGroup scene = createSceneGraph();
+ universe = new SimpleUniverse(canvas);
+ universe.getViewingPlatform().setNominalViewingTransform();
+ universe.addBranchGraph(scene);
+
+ // create the gui
+ JPanel gui = buildGui();
+
+ this.add("South", gui);
+ }
+
+ public void destroy() {
+ universe.cleanup();
+ }
+
+ public JPanel buildGui() {
+ flipB = new JCheckBox("flip image", true);
+ flipB.addItemListener(this);
+ javax.swing.Box flipBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ flipBox.add(flipB);
+ Component strut1 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut2 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut3 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut4 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ Component strut5 = flipBox.createVerticalStrut(flipB.getPreferredSize().height);
+ flipBox.add(strut1);
+ flipBox.add(strut2);
+ flipBox.add(strut3);
+ flipBox.add(strut4);
+ flipBox.add(strut5);
+
+ yUp = new JRadioButton("y up");
+ yUp.addActionListener(this);
+ yUp.setSelected(true);
+ yDown = new JRadioButton("y down");
+ yDown.addActionListener(this);
+ ButtonGroup yGroup = new ButtonGroup();
+ yGroup.add(yUp);
+ yGroup.add(yDown);
+ JLabel yLabel = new JLabel("Image Orientation:");
+ javax.swing.Box yBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ yBox.add(yLabel);
+ yBox.add(yUp);
+ yBox.add(yDown);
+ strut1 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ strut2 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ strut3 = yBox.createVerticalStrut(yUp.getPreferredSize().height);
+ yBox.add(strut1);
+ yBox.add(strut2);
+ yBox.add(strut3);
+
+ texByRef = new JRadioButton("by reference");
+ texByRef.addActionListener(this);
+ texByRef.setSelected(true);
+ texByCopy = new JRadioButton("by copy");
+ texByCopy.addActionListener(this);
+ ButtonGroup texGroup = new ButtonGroup();
+ texGroup.add(texByRef);
+ texGroup.add(texByCopy);
+ JLabel texLabel = new JLabel("Texture:*");
+ javax.swing.Box texBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ texBox.add(texLabel);
+ texBox.add(texByRef);
+ texBox.add(texByCopy);
+ strut1 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ strut2 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ strut3 = texBox.createVerticalStrut(texByRef.getPreferredSize().height);
+ texBox.add(strut1);
+ texBox.add(strut2);
+ texBox.add(strut3);
+
+ geomByRef = new JRadioButton("by reference");
+ geomByRef.addActionListener(this);
+ geomByRef.setSelected(true);
+ geomByCopy = new JRadioButton("by copy");
+ geomByCopy.addActionListener(this);
+ ButtonGroup geomGroup = new ButtonGroup();
+ geomGroup.add(geomByRef);
+ geomGroup.add(geomByCopy);
+ JLabel geomLabel = new JLabel("Geometry:");
+ javax.swing.Box geomBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ geomBox.add(geomLabel);
+ geomBox.add(geomByRef);
+ geomBox.add(geomByCopy);
+ strut1 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ strut2 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ strut3 = geomBox.createVerticalStrut(geomByRef.getPreferredSize().height);
+ geomBox.add(strut1);
+ geomBox.add(strut2);
+ geomBox.add(strut3);
+
+ img4ByteABGR = new JRadioButton("TYPE_4BYTE_ABGR");
+ img4ByteABGR.addActionListener(this);
+ img4ByteABGR.setSelected(true);
+ img3ByteBGR = new JRadioButton("TYPE_3BYTE_BGR");
+ img3ByteBGR.addActionListener(this);
+ imgIntARGB = new JRadioButton("TYPE_INT_ARGB");
+ imgIntARGB.addActionListener(this);
+ imgCustomRGBA = new JRadioButton("TYPE_CUSTOM RGBA");
+ imgCustomRGBA.addActionListener(this);
+ imgCustomRGB = new JRadioButton("TYPE_CUSTOM RGB");
+ imgCustomRGB.addActionListener(this);
+ ButtonGroup imgGroup = new ButtonGroup();
+ imgGroup.add(img4ByteABGR);
+ imgGroup.add(img3ByteBGR);
+ imgGroup.add(imgIntARGB);
+ imgGroup.add(imgCustomRGBA);
+ imgGroup.add(imgCustomRGB);
+ JLabel imgLabel = new JLabel("Image Type:*");
+ javax.swing.Box imgBox = new javax.swing.Box(BoxLayout.Y_AXIS);
+ imgBox.add(imgLabel);
+ imgBox.add(img4ByteABGR);
+ imgBox.add(img3ByteBGR);
+ imgBox.add(imgIntARGB);
+ imgBox.add(imgCustomRGBA);
+ imgBox.add(imgCustomRGB);
+
+ javax.swing.Box topBox = new javax.swing.Box(BoxLayout.X_AXIS);
+ topBox.add(flipBox);
+ topBox.add(texBox);
+ topBox.add(geomBox);
+ topBox.add(yBox);
+ Component strut = topBox.createRigidArea(new Dimension(10, 10));
+ topBox.add(strut);
+ topBox.add(imgBox);
+
+ frameDelay = new JSlider(0, 50, 0);
+ frameDelay.addChangeListener(this);
+ frameDelay.setSnapToTicks(true);
+ frameDelay.setPaintTicks(true);
+ frameDelay.setPaintLabels(true);
+ frameDelay.setMajorTickSpacing(10);
+ frameDelay.setMinorTickSpacing(1);
+ frameDelay.setValue(20);
+ JLabel delayL = new JLabel("frame delay");
+ javax.swing.Box delayBox = new javax.swing.Box(BoxLayout.X_AXIS);
+ delayBox.add(delayL);
+ delayBox.add(frameDelay);
+
+ animationB = new JButton(" stop animation ");
+ animationB.addActionListener(this);
+
+ JLabel texInfo1 = new JLabel("*To use ImageComponent by reference feature, use TYPE_4BYTE_ABGR on Solaris");
+ JLabel texInfo2 = new JLabel("and TYPE_3BYTE_BGR on Windows");
+
+ JPanel buttonP = new JPanel();
+ GridBagLayout gridbag = new GridBagLayout();
+ GridBagConstraints c = new GridBagConstraints();
+ buttonP.setLayout(gridbag);
+ c.anchor = GridBagConstraints.CENTER;
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ gridbag.setConstraints(topBox, c);
+ buttonP.add(topBox);
+ gridbag.setConstraints(delayBox, c);
+ buttonP.add(delayBox);
+ gridbag.setConstraints(animationB, c);
+ buttonP.add(animationB);
+ gridbag.setConstraints(texInfo1, c);
+ buttonP.add(texInfo1);
+ gridbag.setConstraints(texInfo2, c);
+ buttonP.add(texInfo2);
+
+ return buttonP;
+
+ }
+
+ public BranchGroup createSceneGraph() {
+
+ // create the root of the branch group
+ BranchGroup objRoot = new BranchGroup();
+
+ // create the transform group node and initialize it
+ // enable the TRANSFORM_WRITE capability so that it can be modified
+ // at runtime. Add it to the root of the subgraph
+ Transform3D rotate = new Transform3D();
+ TransformGroup objTrans = new TransformGroup(rotate);
+ objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ objRoot.addChild(objTrans);
+
+ // bounds
+ BoundingSphere bounds =
+ new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+
+ // set up some light
+ Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
+ Vector3f lDir1 = new Vector3f(-1.0f, -0.5f, -1.0f);
+ Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
+
+ AmbientLight aLgt = new AmbientLight(alColor);
+ aLgt.setInfluencingBounds(bounds);
+ DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
+ lgt1.setInfluencingBounds(bounds);
+ objRoot.addChild(aLgt);
+ objRoot.addChild(lgt1);
+
+
+ Appearance appearance = new Appearance();
+
+ // enable the TEXTURE_WRITE so we can modify it at runtime
+ appearance.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
+
+ // load the first texture
+ TextureLoader loader = new TextureLoader(urls[0],
+ TextureLoader.BY_REFERENCE |
+ TextureLoader.Y_UP,
+ this);
+ // get the texture from the loader
+ Texture2D tex = (Texture2D)loader.getTexture();
+
+ // get the BufferedImage to convert to TYPE_4BYTE_ABGR and flip
+ // get the ImageComponent because we need it anyway
+ ImageComponent2D imageComp = (ImageComponent2D)tex.getImage(0);
+ BufferedImage bImage = imageComp.getImage();
+ // convert the image
+ bImage = ImageOps.convertImage(bImage, BufferedImage.TYPE_4BYTE_ABGR);
+ // flip the image
+ ImageOps.flipImage(bImage);
+ imageComp.set(bImage);
+
+ tex.setCapability(Texture.ALLOW_IMAGE_WRITE);
+ tex.setBoundaryModeS(Texture.CLAMP);
+ tex.setBoundaryModeT(Texture.CLAMP);
+ tex.setBoundaryColor(1.0f, 1.0f, 1.0f, 1.0f);
+
+ // set the image of the texture
+ tex.setImage(0, imageComp);
+
+ // set the texture on the appearance
+ appearance.setTexture(tex);
+
+ // set texture attributes
+ TextureAttributes texAttr = new TextureAttributes();
+ texAttr.setTextureMode(TextureAttributes.MODULATE);
+ appearance.setTextureAttributes(texAttr);
+
+ // set material properties
+ Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
+ Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
+ appearance.setMaterial(new Material(white, black, white, black, 1.0f));
+
+ // create a scale transform
+ Transform3D scale = new Transform3D();
+ scale.set(.6);
+ TransformGroup objScale = new TransformGroup(scale);
+ objTrans.addChild(objScale);
+
+ tetra = new Tetrahedron(true);
+ tetra.setAppearance(appearance);
+ objScale.addChild(tetra);
+
+ // create the behavior
+ animate = new AnimateTexturesBehavior(tex,
+ urls,
+ appearance,
+ this);
+ animate.setSchedulingBounds(bounds);
+
+ objTrans.addChild(animate);
+
+ // add a rotation behavior so we can see all sides of the tetrahedron
+ Transform3D yAxis = new Transform3D();
+ Alpha rotorAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
+ 0, 0,
+ 4000, 0, 0,
+ 0, 0, 0);
+ RotationInterpolator rotator =
+ new RotationInterpolator(rotorAlpha,
+ objTrans,
+ yAxis,
+ 0.0f, (float) Math.PI*2.0f);
+ rotator.setSchedulingBounds(bounds);
+ objTrans.addChild(rotator);
+
+
+ // have java3d perform optimizations on this scene graph
+ objRoot.compile();
+
+ return objRoot;
+ }
+
+ // callback for the animation button and delay text field
+ public void actionPerformed(ActionEvent e) {
+ Object o = e.getSource();
+
+ // for the animation button
+ if (o == animationB) {
+ if (animate.getEnable()) {
+ animate.setEnable(false);
+ animationB.setText("start animation");
+ }
+ else {
+ animate.setEnable(true);
+ animationB.setText(" stop animation ");
+ }
+ }
+
+ // for the texByRef button
+ else if (o == texByRef && texByRef.isSelected()) {
+ animate.setByReference(true);
+ }
+ // texByCopy button
+ else if (o == texByCopy && texByCopy.isSelected()) {
+ animate.setByReference(false);
+ }
+ // yUp button
+ else if (o == yUp && yUp.isSelected()) {
+ animate.setYUp(true);
+ }
+ // ydown button
+ else if (o == yDown && yDown.isSelected()) {
+ animate.setYUp(false);
+ }
+ //geomByRef button
+ else if (o == geomByRef) {
+ tetra.setByReference(true);
+ }
+ // geomByCopy button
+ else if (o == geomByCopy) {
+ tetra.setByReference(false);
+ }
+ // TYPE_INT_ARGB
+ else if (o == imgIntARGB) {
+ animate.setImageType(BufferedImage.TYPE_INT_ARGB);
+ }
+ // TYPE_4BYTE_ABGR
+ else if (o == img4ByteABGR) {
+ animate.setImageType(BufferedImage.TYPE_4BYTE_ABGR);
+ }
+ // TYPE_3BYTE_BGR
+ else if (o == img3ByteBGR) {
+ animate.setImageType(BufferedImage.TYPE_3BYTE_BGR);
+ }
+ // TYPE_CUSTOM RGBA
+ else if (o == imgCustomRGBA) {
+ animate.setImageTypeCustomRGBA();
+ }
+ // TYPE_CUSTOM RGB
+ else if (o == imgCustomRGB) {
+ animate.setImageTypeCustomRGB();
+ }
+ }
+
+ // callback for the checkboxes
+ public void itemStateChanged(ItemEvent e) {
+ Object o = e.getSource();
+ // for the flip checkbox
+ if (o == flipB) {
+ if (e.getStateChange() == ItemEvent.DESELECTED) {
+ animate.setFlipImages(false);
+ }
+ else animate.setFlipImages(true);
+ }
+ }
+
+ // callback for the slider
+ public void stateChanged(ChangeEvent e) {
+ Object o = e.getSource();
+ // for the frame delay
+ if (o == frameDelay) {
+ animate.setFrameDelay(frameDelay.getValue());
+ }
+ }
+
+ // allows TextureByReference to be run as an application as well as an applet
+ public static void main(String[] args) {
+ java.net.URL fnames[] = null;
+ if (args.length > 1) {
+ fnames = new java.net.URL[args.length];
+ for (int i = 0; i < args.length; i++) {
+ try {
+ fnames[i] = new java.net.URL("file:" + args[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ }
+ }
+ }
+ else {
+ fnames = new java.net.URL[TextureByReference.defaultFiles.length];
+ for (int i = 0; i < TextureByReference.defaultFiles.length; i++) {
+ try {
+ fnames[i] = new java.net.URL("file:" +
+ TextureByReference.defaultFiles[i]);
+ }
+ catch (java.net.MalformedURLException ex) {
+ System.out.println(ex.getMessage());
+ System.exit(1);
+ }
+ }
+ }
+ new MainFrame((new TextureByReference(fnames)), 650, 750);
+ }
+}
+
+
+
+
+
+
diff --git a/src/TextureByReference/TextureByReference_plugin.html b/src/TextureByReference/TextureByReference_plugin.html
new file mode 100644
index 0000000..ef0d161
--- /dev/null
+++ b/src/TextureByReference/TextureByReference_plugin.html
@@ -0,0 +1,39 @@
+<HTML>
+<HEAD>
+<TITLE>TextureByReference</TITLE>
+</HEAD>
+<BODY BGCOLOR="#000000">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
+WIDTH = 600 HEIGHT = 750 ALIGN = middle codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0">
+<PARAM NAME = CODE VALUE = "TextureByReference.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2">
+<PARAM NAME="scriptable" VALUE="false">
+<COMMENT>
+<EMBED type="application/x-java-applet;version=1.2.2" CODE = "TextureByReference.class" WIDTH = 600 HEIGHT = 750 ALIGN = middle scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED></COMMENT>
+<blockquote>
+<hr>
+If you were using a Java-capable browser,
+you would see the TextureByReference applet instead of this paragraph.
+<hr>
+</blockquote>
+</NOEMBED></EMBED>
+</OBJECT>
+
+<!--
+<APPLET CODE = "TextureByReference.class" WIDTH = 600 HEIGHT = 750 ALIGN = middle>
+<blockquote>
+<hr>
+If you were using a Java-capable browser,
+you would see the TextureByReference applet instead of this paragraph.
+<hr>
+</blockquote>
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</BODY>
+</HTML>
diff --git a/src/TextureByReference/build.xml b/src/TextureByReference/build.xml
new file mode 100644
index 0000000..cbf53a8
--- /dev/null
+++ b/src/TextureByReference/build.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+
+<!--
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 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.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+ -->
+
+<project basedir="." default="compile">
+ <target name="compile">
+ <javac debug="true" deprecation="true" destdir="." srcdir=".">
+ </javac>
+ </target>
+
+ <target name="all" depends="compile">
+ </target>
+
+ <target description="Clean all build products." name="clean">
+ <delete>
+ <fileset dir=".">
+ <include name="**/*.class"/>
+ </fileset>
+ </delete>
+ </target>
+
+</project>