/* * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. * */ package javax.media.j3d; import javax.vecmath.Matrix3f; import javax.vecmath.Matrix4f; import javax.vecmath.Point2f; import javax.vecmath.Point2i; import javax.vecmath.Point3f; import javax.vecmath.Point3i; import javax.vecmath.Point4f; import javax.vecmath.Point4i; import javax.vecmath.Tuple2f; import javax.vecmath.Tuple2i; import javax.vecmath.Tuple3f; import javax.vecmath.Tuple3i; import javax.vecmath.Tuple4f; import javax.vecmath.Tuple4i; /** * The ShaderAttributeValueRetained object encapsulates a uniform shader * attribute whose value is specified explicitly. */ class ShaderAttributeValueRetained extends ShaderAttributeObjectRetained { ShaderAttributeValueRetained() { } @Override synchronized void createMirrorObject() { // System.err.println("ShaderAttributeValueRetained : createMirrorObject"); // This method should only call by setLive(). if (mirror == null) { ShaderAttributeValueRetained mirrorSAV = new ShaderAttributeValueRetained(); mirrorSAV.createObjectData(getValue()); mirror = mirrorSAV; mirror.source = source; } initMirrorObject(); } /** * Computes the base class from the specified object. A * ClassCastException is thrown if the object is not an instance * of one of the allowed classes. */ @Override int computeClassType(Object value) { Class objClass = value.getClass(); if (objClass.isArray()) { throw new ClassCastException(objClass + " -- array class not allowed"); } for (int i = 0; i < classTable.length; i++) { if (classTable[i].isInstance(value)) { return i; } } throw new ClassCastException(objClass + " -- unrecognized class"); } /** * Returns the base class represented by the specified class type. */ @Override Class getBaseClass(int classType) { return classTable[classType]; } /** * Creates an attribute wrapper object of the specified class * type, and stores the specified object. */ @Override AttrWrapper createAttrWrapper(Object value, int classType) { ValueWrapper attrWrapper = null; switch (classType) { case TYPE_INTEGER: attrWrapper = new IntegerWrapper(); break; case TYPE_FLOAT: attrWrapper = new FloatWrapper(); break; // case TYPE_DOUBLE: // attrWrapper = new DoubleWrapper(); // break; case TYPE_TUPLE2I: attrWrapper = new Tuple2iWrapper(); break; case TYPE_TUPLE2F: attrWrapper = new Tuple2fWrapper(); break; // case TYPE_TUPLE2D: // attrWrapper = new Tuple2dWrapper(); // break; case TYPE_TUPLE3I: attrWrapper = new Tuple3iWrapper(); break; case TYPE_TUPLE3F: attrWrapper = new Tuple3fWrapper(); break; // case TYPE_TUPLE3D: // attrWrapper = new Tuple3dWrapper(); // break; case TYPE_TUPLE4I: attrWrapper = new Tuple4iWrapper(); break; case TYPE_TUPLE4F: attrWrapper = new Tuple4fWrapper(); break; // case TYPE_TUPLE4D: // attrWrapper = new Tuple4dWrapper(); // break; case TYPE_MATRIX3F: attrWrapper = new Matrix3fWrapper(); break; // case TYPE_MATRIX3D: // attrWrapper = new Matrix3dWrapper(); // break; case TYPE_MATRIX4F: attrWrapper = new Matrix4fWrapper(); break; // case TYPE_MATRIX4D: // attrWrapper = new Matrix4dWrapper(); // break; default: // Should never get here assert false; return null; } attrWrapper.set(value); return attrWrapper; } // // The following wrapper classes are used to store a copy of the // user-specified shader attribute value. There is a wrapper class // for each supported base class. // // Base wrapper class for non-array attribute types static abstract class ValueWrapper extends AttrWrapper { // No additional fields or methods are defined in this class } // Wrapper class for Integer static class IntegerWrapper extends ValueWrapper { private int[] value = new int[1]; @Override void set(Object value) { this.value[0] = ((Integer)value).intValue(); } @Override Object get() { return new Integer(this.value[0]); } @Override Object getRef() { return this.value; } } // Wrapper class for Float static class FloatWrapper extends ValueWrapper { private float[] value = new float[1]; @Override void set(Object value) { this.value[0] = ((Float)value).floatValue(); } @Override Object get() { return new Float(this.value[0]); } @Override Object getRef() { return this.value; } } /* // Wrapper class for Double static class DoubleWrapper extends ValueWrapper { private double[] value = new double[1]; void set(Object value) { this.value[0] = ((Double)value).doubleValue(); } Object get() { return new Double(value[0]); } Object getRef() { return value; } } */ // Wrapper class for Tuple2i static class Tuple2iWrapper extends ValueWrapper { private int[] value = new int[2]; @Override void set(Object value) { ((Tuple2i)value).get(this.value); } @Override Object get() { return new Point2i(value); } @Override Object getRef() { return value; } } // Wrapper class for Tuple2f static class Tuple2fWrapper extends ValueWrapper { private float[] value = new float[2]; @Override void set(Object value) { ((Tuple2f)value).get(this.value); } @Override Object get() { return new Point2f(value); } @Override Object getRef() { return value; } } /* // Wrapper class for Tuple2d static class Tuple2dWrapper extends ValueWrapper { private double[] value = new double[2]; void set(Object value) { ((Tuple2d)value).get(this.value); } Object get() { return new Point2d(value); } Object getRef() { return value; } } */ // Wrapper class for Tuple3i static class Tuple3iWrapper extends ValueWrapper { private int[] value = new int[3]; @Override void set(Object value) { ((Tuple3i)value).get(this.value); } @Override Object get() { return new Point3i(value); } @Override Object getRef() { return value; } } // Wrapper class for Tuple3f static class Tuple3fWrapper extends ValueWrapper { private float[] value = new float[3]; @Override void set(Object value) { ((Tuple3f)value).get(this.value); } @Override Object get() { return new Point3f(value); } @Override Object getRef() { return value; } } /* // Wrapper class for Tuple3d static class Tuple3dWrapper extends ValueWrapper { private double[] value = new double[3]; void set(Object value) { ((Tuple3d)value).get(this.value); } Object get() { return new Point3d(value); } Object getRef() { return value; } } */ // Wrapper class for Tuple4i static class Tuple4iWrapper extends ValueWrapper { private int[] value = new int[4]; @Override void set(Object value) { ((Tuple4i)value).get(this.value); } @Override Object get() { return new Point4i(value); } @Override Object getRef() { return value; } } // Wrapper class for Tuple4f static class Tuple4fWrapper extends ValueWrapper { private float[] value = new float[4]; @Override void set(Object value) { ((Tuple4f)value).get(this.value); } @Override Object get() { return new Point4f(value); } @Override Object getRef() { return value; } } /* // Wrapper class for Tuple4d static class Tuple4dWrapper extends ValueWrapper { private double[] value = new double[4]; void set(Object value) { ((Tuple4d)value).get(this.value); } Object get() { return new Point4d(value); } Object getRef() { return value; } } */ // Wrapper class for Matrix3f static class Matrix3fWrapper extends ValueWrapper { private float[] value = new float[9]; @Override void set(Object value) { Matrix3f m = (Matrix3f)value; this.value[0] = m.m00; this.value[1] = m.m01; this.value[2] = m.m02; this.value[3] = m.m10; this.value[4] = m.m11; this.value[5] = m.m12; this.value[6] = m.m20; this.value[7] = m.m21; this.value[8] = m.m22; } @Override Object get() { return new Matrix3f(value); } @Override Object getRef() { return value; } } /* // Wrapper class for Matrix3d static class Matrix3dWrapper extends ValueWrapper { private double[] value = new double[9]; void set(Object value) { Matrix3d m = (Matrix3d)value; this.value[0] = m.m00; this.value[1] = m.m01; this.value[2] = m.m02; this.value[3] = m.m10; this.value[4] = m.m11; this.value[5] = m.m12; this.value[6] = m.m20; this.value[7] = m.m21; this.value[8] = m.m22; } Object get() { return new Matrix3d(value); } Object getRef() { return value; } } */ // Wrapper class for Matrix4f static class Matrix4fWrapper extends ValueWrapper { private float[] value = new float[16]; @Override void set(Object value) { Matrix4f m = (Matrix4f)value; this.value[0] = m.m00; this.value[1] = m.m01; this.value[2] = m.m02; this.value[3] = m.m03; this.value[4] = m.m10; this.value[5] = m.m11; this.value[6] = m.m12; this.value[7] = m.m13; this.value[8] = m.m20; this.value[9] = m.m21; this.value[10] = m.m22; this.value[11] = m.m23; this.value[12] = m.m30; this.value[13] = m.m31; this.value[14] = m.m32; this.value[15] = m.m33; } @Override Object get() { return new Matrix4f(value); } @Override Object getRef() { return value; } } /* // Wrapper class for Matrix4d static class Matrix4dWrapper extends ValueWrapper { private double[] value = new double[16]; void set(Object value) { Matrix4d m = (Matrix4d)value; this.value[0] = m.m00; this.value[1] = m.m01; this.value[2] = m.m02; this.value[3] = m.m03; this.value[4] = m.m10; this.value[5] = m.m11; this.value[6] = m.m12; this.value[7] = m.m13; this.value[8] = m.m20; this.value[9] = m.m21; this.value[10] = m.m22; this.value[11] = m.m23; this.value[12] = m.m30; this.value[13] = m.m31; this.value[14] = m.m32; this.value[15] = m.m33; } Object get() { return new Matrix4d(value); } Object getRef() { return value; } } */ }