aboutsummaryrefslogtreecommitdiffstats
path: root/src/javax/media/j3d/AppearanceRetained.java
diff options
context:
space:
mode:
authorHarvey Harrison <[email protected]>2015-04-19 21:02:06 -0700
committerHarvey Harrison <[email protected]>2015-04-19 21:02:06 -0700
commit7a2e20caac9db6f789a7b3fab344b9758af45335 (patch)
treeb5236ff2570178de356eab569225108948eb4d30 /src/javax/media/j3d/AppearanceRetained.java
parentf76ce302c4bb2a9f03bbee571ec5d05c29633023 (diff)
j3dcore: flatten the directory structure a bit
Signed-off-by: Harvey Harrison <[email protected]>
Diffstat (limited to 'src/javax/media/j3d/AppearanceRetained.java')
-rw-r--r--src/javax/media/j3d/AppearanceRetained.java1413
1 files changed, 1413 insertions, 0 deletions
diff --git a/src/javax/media/j3d/AppearanceRetained.java b/src/javax/media/j3d/AppearanceRetained.java
new file mode 100644
index 0000000..987e911
--- /dev/null
+++ b/src/javax/media/j3d/AppearanceRetained.java
@@ -0,0 +1,1413 @@
+/*
+ * Copyright 1996-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 java.util.ArrayList;
+
+
+/**
+ * The Appearance object defines all rendering state that can be set
+ * as a component object of a Shape3D node.
+ */
+class AppearanceRetained extends NodeComponentRetained {
+
+ //
+ // State variables: these should all be initialized to approproate
+ // Java 3D defaults.
+ //
+
+ // Material object used when lighting is enabled
+ MaterialRetained material = null;
+
+ // Texture object used to apply a texture map to an object
+ TextureRetained texture = null;
+
+ // Texture coordinate generation object
+ TexCoordGenerationRetained texCoordGeneration = null;
+
+ // Texture Attributes bundle object
+ TextureAttributesRetained textureAttributes = null;
+
+ TextureUnitStateRetained texUnitState[] = null;
+
+ // Coloring Attributes bundle object
+ ColoringAttributesRetained coloringAttributes = null;
+
+ // Transparency Attributes bundle object
+ TransparencyAttributesRetained transparencyAttributes = null;
+
+ // Rendering Attributes bundle object
+ RenderingAttributesRetained renderingAttributes = null;
+
+ // Polygon Attributes bundle object
+ PolygonAttributesRetained polygonAttributes = null;
+
+ // Line Attributes bundle object
+ LineAttributesRetained lineAttributes = null;
+
+ // Point Attributes bundle object
+ PointAttributesRetained pointAttributes = null;
+
+
+ // Lock used for synchronization of live state
+ Object liveStateLock = new Object();
+
+ // NOTE: Consider grouping random state into common objects
+
+ // Cache used during compilation. If map == compState, then
+ // mapAppearance can be used for this appearance
+ CompileState map = null;
+ AppearanceRetained mapAppearance = null;
+
+ static final int MATERIAL = 0x0001;
+ static final int TEXTURE = 0x0002;
+ static final int TEXCOORD_GEN = 0x0004;
+ static final int TEXTURE_ATTR = 0x0008;
+ static final int COLOR = 0x0010;
+ static final int TRANSPARENCY = 0x0020;
+ static final int RENDERING = 0x0040;
+ static final int POLYGON = 0x0080;
+ static final int LINE = 0x0100;
+ static final int POINT = 0x0200;
+ static final int TEXTURE_UNIT_STATE = 0x0400;
+
+ static final int ALL_SOLE_USERS = 0;
+
+ // A pointer to the scene graph appearance object
+ AppearanceRetained sgApp = null;
+
+ // The object level hashcode for this appearance
+ // int objHashCode = super.hashCode();
+
+ /**
+ * Set the material object to the specified object.
+ * @param material object that specifies the desired material
+ * @exception IllegalSharingException
+ * properties
+ */
+ void setMaterial(Material material) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.material != null) {
+ this.material.clearLive(refCount);
+ this.material.removeMirrorUsers(this);
+ }
+ if (material != null) {
+ ((MaterialRetained)material.retained).setLive(inBackgroundGroup, refCount);
+ // If appearance is live, then copy all the users of this
+ // appaearance as users of this material
+ ((MaterialRetained)material.retained).copyMirrorUsers(this);
+ }
+ sendMessage(MATERIAL,
+ (material != null ?
+ ((MaterialRetained)material.retained).mirror : null), true);
+ }
+ if (material == null) {
+ this.material = null;
+ } else {
+ this.material = (MaterialRetained)material.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieve the current material object.
+ * @return the material object
+ */
+ Material getMaterial() {
+ return (material == null ? null : (Material)material.source);
+ }
+
+ /**
+ * Sets the texture object to the specified object.
+ * @param texture object that specifies the desired texture
+ * map and texture parameters
+ */
+ void setTexture(Texture texture) {
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.texture != null) {
+ this.texture.clearLive(refCount);
+ this.texture.removeMirrorUsers(this);
+ }
+
+ if (texture != null) {
+ ((TextureRetained)texture.retained).setLive(inBackgroundGroup, refCount);
+ ((TextureRetained)texture.retained).copyMirrorUsers(this);
+ }
+ sendMessage(TEXTURE,
+ (texture != null ?
+ ((TextureRetained)texture.retained).mirror : null), true);
+
+ }
+
+
+ if (texture == null) {
+ this.texture = null;
+ } else {
+ this.texture = (TextureRetained)texture.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current texture object.
+ * @return the texture object
+ */
+ Texture getTexture() {
+ return (texture == null ? null : (Texture)texture.source);
+ }
+
+ /**
+ * Sets the textureAttrbutes object to the specified object.
+ * @param textureAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setTextureAttributes(TextureAttributes textureAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.textureAttributes != null) {
+ this.textureAttributes.clearLive(refCount);
+ this.textureAttributes.removeMirrorUsers(this);
+ }
+
+ if (textureAttributes != null) {
+ ((TextureAttributesRetained)textureAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((TextureAttributesRetained)textureAttributes.retained).copyMirrorUsers(this);
+ }
+ sendMessage(TEXTURE_ATTR,
+ (textureAttributes != null ?
+ ((TextureAttributesRetained)textureAttributes.retained).mirror:
+ null), true);
+
+ }
+
+
+ if (textureAttributes == null) {
+ this.textureAttributes = null;
+ } else {
+ this.textureAttributes = (TextureAttributesRetained)textureAttributes.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current textureAttributes object.
+ * @return the textureAttributes object
+ */
+ TextureAttributes getTextureAttributes() {
+ return (textureAttributes == null ? null :
+ (TextureAttributes)textureAttributes.source);
+ }
+
+ /**
+ * Sets the coloringAttrbutes object to the specified object.
+ * @param coloringAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setColoringAttributes(ColoringAttributes coloringAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.coloringAttributes != null) {
+ this.coloringAttributes.clearLive(refCount);
+ this.coloringAttributes.removeMirrorUsers(this);
+ }
+
+ if (coloringAttributes != null) {
+ ((ColoringAttributesRetained)coloringAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((ColoringAttributesRetained)coloringAttributes.retained).copyMirrorUsers(this);
+ }
+ sendMessage(COLOR,
+ (coloringAttributes != null ?
+ ((ColoringAttributesRetained)coloringAttributes.retained).mirror:
+ null), true);
+ }
+
+
+ if (coloringAttributes == null) {
+ this.coloringAttributes = null;
+ } else {
+ this.coloringAttributes = (ColoringAttributesRetained)coloringAttributes.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current coloringAttributes object.
+ * @return the coloringAttributes object
+ */
+ ColoringAttributes getColoringAttributes() {
+ return (coloringAttributes == null ? null :
+ (ColoringAttributes)coloringAttributes.source);
+ }
+
+ /**
+ * Sets the transparencyAttrbutes object to the specified object.
+ * @param transparencyAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setTransparencyAttributes(TransparencyAttributes transparencyAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.transparencyAttributes != null) {
+ this.transparencyAttributes.clearLive(refCount);
+ this.transparencyAttributes.removeMirrorUsers(this);
+ }
+
+ if (transparencyAttributes != null) {
+ ((TransparencyAttributesRetained)transparencyAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((TransparencyAttributesRetained)transparencyAttributes.retained).copyMirrorUsers(this);
+ }
+
+ sendMessage(TRANSPARENCY,
+ (transparencyAttributes != null ?
+ ((TransparencyAttributesRetained)transparencyAttributes.retained).mirror: null), true);
+ }
+
+
+ if (transparencyAttributes == null) {
+ this.transparencyAttributes = null;
+ } else {
+ this.transparencyAttributes = (TransparencyAttributesRetained)transparencyAttributes.retained;
+
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current transparencyAttributes object.
+ * @return the transparencyAttributes object
+ */
+ TransparencyAttributes getTransparencyAttributes() {
+ return (transparencyAttributes == null ? null :
+ (TransparencyAttributes)transparencyAttributes.source);
+ }
+
+ /**
+ * Sets the renderingAttrbutes object to the specified object.
+ * @param renderingAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setRenderingAttributes(RenderingAttributes renderingAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+ if (this.renderingAttributes != null) {
+ this.renderingAttributes.clearLive(refCount);
+ this.renderingAttributes.removeMirrorUsers(this);
+ }
+
+ if (renderingAttributes != null) {
+ ((RenderingAttributesRetained)renderingAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((RenderingAttributesRetained)renderingAttributes.retained).copyMirrorUsers(this);
+ }
+ Object m = null;
+ boolean v = true;
+ if (renderingAttributes != null) {
+ m = ((RenderingAttributesRetained)renderingAttributes.retained).mirror;
+ v = ((RenderingAttributesRetained)renderingAttributes.retained).visible;
+ }
+ sendMessage(RENDERING,m, v);
+ // Also need to send a message to GeometryStructure.
+ sendRenderingAttributesChangedMessage( v);
+ }
+ if (renderingAttributes == null) {
+ this.renderingAttributes = null;
+ } else {
+ this.renderingAttributes = (RenderingAttributesRetained)renderingAttributes.retained;
+
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current renderingAttributes object.
+ * @return the renderingAttributes object
+ */
+ RenderingAttributes getRenderingAttributes() {
+ if (renderingAttributes == null)
+ return null;
+
+ return (RenderingAttributes)renderingAttributes.source;
+ }
+
+ /**
+ * Sets the polygonAttrbutes object to the specified object.
+ * @param polygonAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setPolygonAttributes(PolygonAttributes polygonAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+ if (this.polygonAttributes != null) {
+ this.polygonAttributes.clearLive(refCount);
+ this.polygonAttributes.removeMirrorUsers(this);
+ }
+
+ if (polygonAttributes != null) {
+ ((PolygonAttributesRetained)polygonAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((PolygonAttributesRetained)polygonAttributes.retained).copyMirrorUsers(this);
+ }
+ sendMessage(POLYGON,
+ (polygonAttributes != null ?
+ ((PolygonAttributesRetained)polygonAttributes.retained).mirror :
+ null), true);
+
+ }
+
+ if (polygonAttributes == null) {
+ this.polygonAttributes = null;
+ } else {
+ this.polygonAttributes = (PolygonAttributesRetained)polygonAttributes.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current polygonAttributes object.
+ * @return the polygonAttributes object
+ */
+ PolygonAttributes getPolygonAttributes() {
+ return (polygonAttributes == null ? null:
+ (PolygonAttributes)polygonAttributes.source);
+ }
+
+ /**
+ * Sets the lineAttrbutes object to the specified object.
+ * @param lineAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setLineAttributes(LineAttributes lineAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.lineAttributes != null) {
+ this.lineAttributes.clearLive(refCount);
+ this.lineAttributes.removeMirrorUsers(this);
+ }
+
+ if (lineAttributes != null) {
+ ((LineAttributesRetained)lineAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((LineAttributesRetained)lineAttributes.retained).copyMirrorUsers(this);
+ }
+ sendMessage(LINE,
+ (lineAttributes != null ?
+ ((LineAttributesRetained)lineAttributes.retained).mirror: null), true);
+ }
+
+
+ if (lineAttributes == null) {
+ this.lineAttributes = null;
+ } else {
+ this.lineAttributes = (LineAttributesRetained)lineAttributes.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current lineAttributes object.
+ * @return the lineAttributes object
+ */
+ LineAttributes getLineAttributes() {
+ return (lineAttributes == null ? null :
+ (LineAttributes)lineAttributes.source);
+ }
+
+ /**
+ * Sets the pointAttrbutes object to the specified object.
+ * @param pointAttributes object that specifies the desired texture
+ * attributes
+ */
+ void setPointAttributes(PointAttributes pointAttributes) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.pointAttributes != null) {
+ this.pointAttributes.clearLive(refCount);
+ this.pointAttributes.removeMirrorUsers(this);
+ }
+ if (pointAttributes != null) {
+ ((PointAttributesRetained)pointAttributes.retained).setLive(inBackgroundGroup, refCount);
+ ((PointAttributesRetained)pointAttributes.retained).copyMirrorUsers(this);
+ }
+ sendMessage(POINT,
+ (pointAttributes != null ?
+ ((PointAttributesRetained)pointAttributes.retained).mirror:
+ null), true);
+ }
+
+
+ if (pointAttributes == null) {
+ this.pointAttributes = null;
+ } else {
+ this.pointAttributes = (PointAttributesRetained)pointAttributes.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current pointAttributes object.
+ * @return the pointAttributes object
+ */
+ PointAttributes getPointAttributes() {
+ return (pointAttributes == null? null : (PointAttributes)pointAttributes.source);
+ }
+
+ /**
+ * Sets the texCoordGeneration object to the specified object.
+ * @param texCoordGeneration object that specifies the texture coordinate
+ * generation parameters
+ */
+ void setTexCoordGeneration(TexCoordGeneration texGen) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ if (this.texCoordGeneration != null) {
+ this.texCoordGeneration.clearLive(refCount);
+ this.texCoordGeneration.removeMirrorUsers(this);
+ }
+
+ if (texGen != null) {
+ ((TexCoordGenerationRetained)texGen.retained).setLive(inBackgroundGroup, refCount);
+ ((TexCoordGenerationRetained)texGen.retained).copyMirrorUsers(this);
+ }
+ sendMessage(TEXCOORD_GEN,
+ (texGen != null ?
+ ((TexCoordGenerationRetained)texGen.retained).mirror : null), true);
+ }
+
+ if (texGen == null) {
+ this.texCoordGeneration = null;
+ } else {
+ this.texCoordGeneration = (TexCoordGenerationRetained)texGen.retained;
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current texCoordGeneration object.
+ * @return the texCoordGeneration object
+ */
+ TexCoordGeneration getTexCoordGeneration() {
+ return (texCoordGeneration == null ? null :
+ (TexCoordGeneration)texCoordGeneration.source);
+ }
+
+
+ /**
+ * Sets the texture unit state array to the specified array.
+ * @param textureUnitState array that specifies the texture unit state
+ */
+ void setTextureUnitState(TextureUnitState[] stateArray) {
+
+ int i;
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ // remove the existing texture unit states from this appearance
+ if (this.texUnitState != null) {
+ for (i = 0; i < this.texUnitState.length; i++) {
+ if (this.texUnitState[i] != null) {
+ this.texUnitState[i].clearLive(refCount);
+ this.texUnitState[i].removeMirrorUsers(this);
+ }
+ }
+ }
+
+ // add the specified texture unit states to this appearance
+ // also make a copy of the array of references to the units
+ if (stateArray != null && stateArray.length > 0) {
+
+ Object [] args = new Object[2];
+
+ // -1 index means the entire array is to be set
+ args[0] = new Integer(-1);
+
+ // make a copy of the array for the message,
+ TextureUnitStateRetained mirrorStateArray[] =
+ new TextureUnitStateRetained[stateArray.length];
+
+ args[1] = mirrorStateArray;
+
+ for (i = 0; i < stateArray.length; i++) {
+ TextureUnitState tu = stateArray[i];
+ if (tu != null) {
+ ((TextureUnitStateRetained)tu.retained).setLive(
+ inBackgroundGroup, refCount);
+ ((TextureUnitStateRetained)tu.retained).copyMirrorUsers(
+ this);
+ mirrorStateArray[i] = (TextureUnitStateRetained)
+ ((TextureUnitStateRetained)tu.retained).mirror;
+ } else {
+ mirrorStateArray[i] = null;
+ }
+ }
+ sendMessage(TEXTURE_UNIT_STATE, args, true);
+
+ } else {
+ sendMessage(TEXTURE_UNIT_STATE, null, true);
+ }
+ }
+
+ // assign the retained copy of the texture unit state to the
+ // appearance
+ if (stateArray == null) {
+ this.texUnitState = null;
+ } else {
+
+ // make another copy of the array for the retained object
+ // itself if it doesn't have a copy or the array size is
+ // not the same
+ if ((this.texUnitState == null) ||
+ (this.texUnitState.length != stateArray.length)) {
+ this.texUnitState = new TextureUnitStateRetained[
+ stateArray.length];
+ }
+ for (i = 0; i < stateArray.length; i++) {
+ if (stateArray[i] != null) {
+ this.texUnitState[i] =
+ (TextureUnitStateRetained)stateArray[i].retained;
+ } else {
+ this.texUnitState[i] = null;
+ }
+ }
+ }
+ }
+ }
+
+ void setTextureUnitState(int index, TextureUnitState state) {
+
+ synchronized(liveStateLock) {
+ if (source.isLive()) {
+
+ // remove the existing texture unit states from this appearance
+ // Note: Let Java throw an exception if texUnitState is null
+ // or index is >= texUnitState.length.
+ if (this.texUnitState[index] != null) {
+ this.texUnitState[index].clearLive(refCount);
+ this.texUnitState[index].removeMirrorUsers(this);
+ }
+
+ // add the specified texture unit states to this appearance
+ // also make a copy of the array of references to the units
+ Object args[] = new Object[2];
+ args[0] = new Integer(index);
+
+ if (state != null) {
+ ((TextureUnitStateRetained)state.retained).setLive(
+ inBackgroundGroup, refCount);
+ ((TextureUnitStateRetained)state.retained).copyMirrorUsers(this);
+ args[1] = ((TextureUnitStateRetained)state.retained).mirror;
+ sendMessage(TEXTURE_UNIT_STATE, args, true);
+ } else {
+ args[1] = null;
+ sendMessage(TEXTURE_UNIT_STATE, args, true);
+ }
+ }
+
+ // assign the retained copy of the texture unit state to the
+ // appearance
+ if (state != null) {
+ this.texUnitState[index] = (TextureUnitStateRetained)state.retained;
+ } else {
+ this.texUnitState[index] = null;
+ }
+ }
+ }
+
+
+
+ /**
+ * Retrieves the array of texture unit state objects from this
+ * Appearance object. A shallow copy of the array of references to
+ * the TextureUnitState objects is returned.
+ *
+ */
+ TextureUnitState[] getTextureUnitState() {
+ if (texUnitState == null) {
+ return null;
+ } else {
+ TextureUnitState tus[] =
+ new TextureUnitState[texUnitState.length];
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null) {
+ tus[i] = (TextureUnitState) texUnitState[i].source;
+ } else {
+ tus[i] = null;
+ }
+ }
+ return tus;
+ }
+ }
+
+ /**
+ * Retrieves the texture unit state object at the specified
+ * index within the texture unit state array.
+ */
+ TextureUnitState getTextureUnitState(int index) {
+
+ // let Java throw an exception if texUnitState == null or
+ // index is >= length
+ if (texUnitState[index] != null)
+ return (TextureUnitState)texUnitState[index].source;
+ else
+ return null;
+ }
+
+
+ /**
+ * Retrieves the length of the texture unit state array from
+ * this appearance object. The length of this array specifies the
+ * maximum number of texture units that will be used by this
+ * appearance object. If the array is null, a count of 0 is
+ * returned.
+ */
+
+ int getTextureUnitCount() {
+ if (texUnitState == null)
+ return 0;
+ else
+ return texUnitState.length;
+ }
+
+
+ @Override
+ synchronized void createMirrorObject() {
+ if (mirror == null) {
+ // we can't check isStatic() since it sub-NodeComponent
+ // create a new one, we should create a
+ // new AppearanceRetained() even though isStatic() = true.
+ // For simplicity, always create a retained side.
+ mirror = new AppearanceRetained();
+ }
+ initMirrorObject();
+ }
+
+ /**
+ * This routine updates the mirror appearance for this appearance.
+ * It also calls the update method for each node component if it
+ * is not null.
+ */
+ @Override
+ synchronized void initMirrorObject() {
+
+ AppearanceRetained mirrorApp = (AppearanceRetained)mirror;
+
+ mirrorApp.source = source;
+ mirrorApp.sgApp = this;
+
+ // Fix for Issue 33: copy the changedFrequent mask to mirror
+ mirrorApp.changedFrequent = changedFrequent;
+
+ if (material != null) {
+ mirrorApp.material = (MaterialRetained)material.mirror;
+ } else {
+ mirrorApp.material = null;
+ }
+
+ if (texture != null) {
+ mirrorApp.texture = (TextureRetained)texture.mirror;
+ } else {
+ mirrorApp.texture = null;
+ }
+ if (texCoordGeneration != null) {
+ mirrorApp.texCoordGeneration = (TexCoordGenerationRetained)texCoordGeneration.mirror;
+ } else {
+ mirrorApp.texCoordGeneration = null;
+ }
+
+ if (textureAttributes != null) {
+ mirrorApp.textureAttributes = (TextureAttributesRetained)textureAttributes.mirror;
+ } else {
+ mirrorApp.textureAttributes = null;
+ }
+
+ // TextureUnitState supercedes the single texture interface
+ if (texUnitState != null && texUnitState.length > 0) {
+ mirrorApp.texUnitState =
+ new TextureUnitStateRetained[texUnitState.length];
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null) {
+ mirrorApp.texUnitState[i] =
+ (TextureUnitStateRetained)texUnitState[i].mirror;
+ }
+ }
+ } else if (mirrorApp.texture != null ||
+ mirrorApp.textureAttributes != null ||
+ mirrorApp.texCoordGeneration != null) {
+
+ mirrorApp.texUnitState = new TextureUnitStateRetained[1];
+ mirrorApp.texUnitState[0] = new TextureUnitStateRetained();
+ mirrorApp.texUnitState[0].set(
+ mirrorApp.texture,
+ mirrorApp.textureAttributes,
+ mirrorApp.texCoordGeneration);
+ }
+
+ if (coloringAttributes != null) {
+ mirrorApp.coloringAttributes = (ColoringAttributesRetained)coloringAttributes.mirror;
+ } else {
+ mirrorApp.coloringAttributes = null;
+ }
+ if (transparencyAttributes != null) {
+ mirrorApp.transparencyAttributes = (TransparencyAttributesRetained)transparencyAttributes.mirror;
+ } else {
+ mirrorApp.transparencyAttributes = null;
+ }
+
+ if (renderingAttributes != null) {
+ mirrorApp.renderingAttributes = (RenderingAttributesRetained)renderingAttributes.mirror;
+ } else {
+ mirrorApp.renderingAttributes = null;
+ }
+
+ if (polygonAttributes != null) {
+ mirrorApp.polygonAttributes = (PolygonAttributesRetained)polygonAttributes.mirror;
+ } else {
+ mirrorApp.polygonAttributes = null;
+ }
+
+ if (lineAttributes != null) {
+ mirrorApp.lineAttributes = (LineAttributesRetained)lineAttributes.mirror;
+ } else {
+ mirrorApp.lineAttributes = null;
+ }
+
+ if (pointAttributes != null) {
+ mirrorApp.pointAttributes = (PointAttributesRetained)pointAttributes.mirror;
+ } else {
+ mirrorApp.pointAttributes = null;
+ }
+ }
+
+ /**
+ * Update the "component" field of the mirror object with the
+ * given "value"
+ */
+ @Override
+ synchronized void updateMirrorObject(int component, Object value) {
+ AppearanceRetained mirrorApp = (AppearanceRetained)mirror;
+ if ((component & MATERIAL) != 0) {
+ mirrorApp.material = (MaterialRetained)value;
+ }
+ else if ((component & TEXTURE) != 0) {
+ // Issue 435: set mirror texture
+ mirrorApp.texture = (TextureRetained)value;
+ if (mirrorApp.texUnitState == null) {
+ mirrorApp.texUnitState = new TextureUnitStateRetained[1];
+ mirrorApp.texUnitState[0] = new TextureUnitStateRetained();
+ }
+ mirrorApp.texUnitState[0].texture = (TextureRetained)value;
+ }
+ else if ((component & TEXCOORD_GEN) != 0) {
+ if (mirrorApp.texUnitState == null) {
+ mirrorApp.texUnitState = new TextureUnitStateRetained[1];
+ mirrorApp.texUnitState[0] = new TextureUnitStateRetained();
+ }
+ mirrorApp.texUnitState[0].texGen = (TexCoordGenerationRetained)value;
+ }
+ else if ((component & TEXTURE_ATTR) != 0) {
+ if (mirrorApp.texUnitState == null) {
+ mirrorApp.texUnitState = new TextureUnitStateRetained[1];
+ mirrorApp.texUnitState[0] = new TextureUnitStateRetained();
+ }
+ mirrorApp.texUnitState[0].texAttrs = (TextureAttributesRetained)value;
+ }
+ else if ((component & TEXTURE_UNIT_STATE) != 0) {
+ Object [] args = (Object [])value;
+
+ if (args == null) {
+ mirrorApp.texUnitState = null;
+ } else {
+ int index = ((Integer)args[0]).intValue();
+ if (index == -1) {
+ mirrorApp.texUnitState =
+ (TextureUnitStateRetained [])args[1];
+ } else {
+ mirrorApp.texUnitState[index] =
+ (TextureUnitStateRetained)args[1];
+ }
+ }
+ }
+ else if ((component & COLOR) != 0) {
+ mirrorApp.coloringAttributes = (ColoringAttributesRetained)value;
+ }
+ else if ((component & TRANSPARENCY) != 0) {
+ mirrorApp.transparencyAttributes = (TransparencyAttributesRetained)value;
+ }
+ else if ((component & RENDERING) != 0) {
+ mirrorApp.renderingAttributes = (RenderingAttributesRetained)value;
+ }
+ else if ((component & POLYGON) != 0) {
+ mirrorApp.polygonAttributes = (PolygonAttributesRetained)value;
+ }
+ else if ((component & LINE) != 0) {
+ mirrorApp.lineAttributes = (LineAttributesRetained)value;
+ }
+ else if ((component & POINT) != 0) {
+ mirrorApp.pointAttributes = (PointAttributesRetained)value;
+ }
+
+ }
+
+ @Override
+ void setLive(boolean backgroundGroup, int refCount) {
+ // System.err.println("AppearceRetained.setLive()");
+ doSetLive(backgroundGroup, refCount);
+ markAsLive();
+ }
+
+ /**
+ * This method calls the setLive method of all appearance bundle
+ * objects.
+ */
+ @Override
+ void doSetLive(boolean backgroundGroup, int refCount) {
+ // System.err.println("AppearceRetained.doSetLive()");
+
+ if (material != null) {
+
+ material.setLive(backgroundGroup, refCount);
+ }
+
+ if (texture != null) {
+
+ texture.setLive(backgroundGroup, refCount);
+ }
+
+ if (texCoordGeneration != null) {
+
+ texCoordGeneration.setLive(backgroundGroup, refCount);
+ }
+
+ if (textureAttributes != null) {
+
+ textureAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null)
+ texUnitState[i].setLive(backgroundGroup, refCount);
+ }
+ }
+
+
+ if (coloringAttributes != null) {
+ coloringAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (transparencyAttributes != null) {
+ transparencyAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (renderingAttributes != null) {
+ renderingAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (polygonAttributes != null) {
+ polygonAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (lineAttributes != null) {
+ lineAttributes.setLive(backgroundGroup, refCount);
+ }
+
+ if (pointAttributes != null) {
+ pointAttributes.setLive(backgroundGroup, refCount);
+ }
+
+
+ // Increment the reference count and initialize the appearance
+ // mirror object
+ super.doSetLive(backgroundGroup, refCount);
+ }
+
+ /**
+ * This method calls the clearLive method of all appearance bundle
+ * objects.
+ */
+ @Override
+ void clearLive(int refCount) {
+ super.clearLive(refCount);
+
+ if (texture != null) {
+ texture.clearLive(refCount);
+ }
+
+ if (texCoordGeneration != null) {
+ texCoordGeneration.clearLive(refCount);
+ }
+
+ if (textureAttributes != null) {
+ textureAttributes.clearLive(refCount);
+ }
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null)
+ texUnitState[i].clearLive(refCount);
+ }
+ }
+
+ if (coloringAttributes != null) {
+ coloringAttributes.clearLive(refCount);
+ }
+
+ if (transparencyAttributes != null) {
+ transparencyAttributes.clearLive(refCount);
+ }
+
+ if (renderingAttributes != null) {
+ renderingAttributes.clearLive(refCount);
+ }
+
+ if (polygonAttributes != null) {
+ polygonAttributes.clearLive(refCount);
+ }
+
+ if (lineAttributes != null) {
+ lineAttributes.clearLive(refCount);
+ }
+
+ if (pointAttributes != null) {
+ pointAttributes.clearLive(refCount);
+ }
+
+ if (material != null) {
+ material.clearLive(refCount);
+ }
+ }
+
+
+ @Override
+ boolean isStatic() {
+ boolean flag;
+
+ flag = (source.capabilityBitsEmpty() &&
+ ((texture == null) ||
+ texture.source.capabilityBitsEmpty()) &&
+ ((texCoordGeneration == null) ||
+ texCoordGeneration.source.capabilityBitsEmpty()) &&
+ ((textureAttributes == null) ||
+ textureAttributes.source.capabilityBitsEmpty()) &&
+ ((coloringAttributes == null) ||
+ coloringAttributes.source.capabilityBitsEmpty()) &&
+ ((transparencyAttributes == null) ||
+ transparencyAttributes.source.capabilityBitsEmpty()) &&
+ ((renderingAttributes == null) ||
+ renderingAttributes.source.capabilityBitsEmpty()) &&
+ ((polygonAttributes == null) ||
+ polygonAttributes.source.capabilityBitsEmpty()) &&
+ ((lineAttributes == null) ||
+ lineAttributes.source.capabilityBitsEmpty()) &&
+ ((pointAttributes == null) ||
+ pointAttributes.source.capabilityBitsEmpty()) &&
+ ((material == null) ||
+ material.source.capabilityBitsEmpty()));
+
+ if (!flag)
+ return flag;
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length && flag; i++) {
+ if (texUnitState[i] != null) {
+ flag = flag && texUnitState[i].isStatic();
+ }
+ }
+ }
+
+ return flag;
+ }
+
+ // Issue 209 - enable this method (was previously commented out)
+ // Simply pass along to the NodeComponents
+ @Override
+ void compile(CompileState compState) {
+ setCompiled();
+
+ if (texture != null) {
+ texture.compile(compState);
+ }
+
+ if (texCoordGeneration != null) {
+ texCoordGeneration.compile(compState);
+ }
+
+ if (textureAttributes != null) {
+ textureAttributes.compile(compState);
+ }
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null)
+ texUnitState[i].compile(compState);
+ }
+ }
+
+ if (coloringAttributes != null) {
+ coloringAttributes.compile(compState);
+ }
+
+ if (transparencyAttributes != null) {
+ transparencyAttributes.compile(compState);
+ }
+
+ if (renderingAttributes != null) {
+ renderingAttributes.compile(compState);
+ }
+
+ if (polygonAttributes != null) {
+ polygonAttributes.compile(compState);
+ }
+
+ if (lineAttributes != null) {
+ lineAttributes.compile(compState);
+ }
+
+ if (pointAttributes != null) {
+ pointAttributes.compile(compState);
+ }
+
+ if (material != null) {
+ material.compile(compState);
+ }
+ }
+
+ /**
+ * Returns the hashcode for this object.
+ * hashcode should be constant for object but same for two objects
+ * if .equals() is true. For an appearance (where .equals() is going
+ * to use the values in the appearance), the only way to have a
+ * constant value is for all appearances to have the same hashcode, so
+ * we use the hashcode of the class obj.
+ *
+ * Since hashCode is only used by AppearanceMap (at present) we may be
+ * able to improve efficency by calcing a hashCode from the values.
+ */
+ @Override
+ public int hashCode() {
+ return getClass().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return ((obj instanceof AppearanceRetained) &&
+ equals((AppearanceRetained) obj));
+ }
+
+ boolean equals(AppearanceRetained app) {
+ boolean flag;
+
+ flag = (app == this) ||
+ ((app != null) &&
+ (((material == app.material) ||
+ ((material != null) && material.equivalent(app.material))) &&
+ ((texture == app.texture) ||
+ ((texture != null) && texture.equals(app.texture))) &&
+ ((renderingAttributes == app.renderingAttributes) ||
+ ((renderingAttributes != null) &&
+ renderingAttributes.equivalent(
+ app.renderingAttributes))) &&
+ ((polygonAttributes == app.polygonAttributes) ||
+ ((polygonAttributes != null) &&
+ polygonAttributes.equivalent(app.polygonAttributes))) &&
+ ((texCoordGeneration == app.texCoordGeneration) ||
+ ((texCoordGeneration != null) &&
+ texCoordGeneration.equivalent(app.texCoordGeneration))) &&
+ ((textureAttributes == app.textureAttributes) ||
+ ((textureAttributes != null) &&
+ textureAttributes.equivalent(app.textureAttributes))) &&
+ ((coloringAttributes == app.coloringAttributes) ||
+ ((coloringAttributes != null) &&
+ coloringAttributes.equivalent(app.coloringAttributes))) &&
+ ((transparencyAttributes == app.transparencyAttributes) ||
+ ((transparencyAttributes != null) &&
+ transparencyAttributes.equivalent(
+ app.transparencyAttributes))) &&
+ ((lineAttributes == app.lineAttributes) ||
+ ((lineAttributes != null) &&
+ lineAttributes.equivalent(app.lineAttributes))) &&
+ ((pointAttributes == app.pointAttributes) ||
+ ((pointAttributes != null) &&
+ pointAttributes.equivalent(app.pointAttributes)))));
+
+ if (!flag)
+ return (flag);
+
+ if (texUnitState == app.texUnitState)
+ return (flag);
+
+ if (texUnitState == null || app.texUnitState == null ||
+ texUnitState.length != app.texUnitState.length)
+ return (false);
+
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] == app.texUnitState[i])
+ continue;
+
+ if (texUnitState[i] == null || app.texUnitState[i] == null ||
+ !texUnitState[i].equals(app.texUnitState[i]))
+ return (false);
+ }
+ return (true);
+ }
+
+
+
+
+ @Override
+ synchronized void addAMirrorUser(Shape3DRetained shape) {
+
+ super.addAMirrorUser(shape);
+ if (material != null)
+ material.addAMirrorUser(shape);
+
+ if (texture != null)
+ texture.addAMirrorUser(shape);
+ if (texCoordGeneration != null)
+ texCoordGeneration.addAMirrorUser(shape);
+ if (textureAttributes != null)
+ textureAttributes.addAMirrorUser(shape);
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null)
+ texUnitState[i].addAMirrorUser(shape);
+ }
+ }
+
+ if (coloringAttributes != null)
+ coloringAttributes.addAMirrorUser(shape);
+ if (transparencyAttributes != null)
+ transparencyAttributes.addAMirrorUser(shape);
+ if (renderingAttributes != null)
+ renderingAttributes.addAMirrorUser(shape);
+ if (polygonAttributes != null)
+ polygonAttributes.addAMirrorUser(shape);
+ if (lineAttributes != null)
+ lineAttributes.addAMirrorUser(shape);
+ if (pointAttributes != null)
+ pointAttributes.addAMirrorUser(shape);
+ }
+
+ @Override
+ synchronized void removeAMirrorUser(Shape3DRetained shape) {
+ super.removeAMirrorUser(shape);
+ if (material != null)
+ material.removeAMirrorUser(shape);
+ if (texture != null)
+ texture.removeAMirrorUser(shape);
+ if (texCoordGeneration != null)
+ texCoordGeneration.removeAMirrorUser(shape);
+ if (textureAttributes != null)
+ textureAttributes.removeAMirrorUser(shape);
+
+ if (texUnitState != null) {
+ for (int i = 0; i < texUnitState.length; i++) {
+ if (texUnitState[i] != null)
+ texUnitState[i].removeAMirrorUser(shape);
+ }
+ }
+
+ if (coloringAttributes != null)
+ coloringAttributes.removeAMirrorUser(shape);
+ if (transparencyAttributes != null)
+ transparencyAttributes.removeAMirrorUser(shape);
+ if (renderingAttributes != null)
+ renderingAttributes.removeAMirrorUser(shape);
+ if (polygonAttributes != null)
+ polygonAttributes.removeAMirrorUser(shape);
+ if (lineAttributes != null)
+ lineAttributes.removeAMirrorUser(shape);
+ if (pointAttributes != null)
+ pointAttributes.removeAMirrorUser(shape);
+ }
+
+ // 3rd argument used only when Rendering Attr comp changes
+ final void sendMessage(int attrMask, Object attr, boolean visible) {
+ ArrayList<VirtualUniverse> univList = new ArrayList<VirtualUniverse>();
+ ArrayList<ArrayList<GeometryAtom>> gaList = Shape3DRetained.getGeomAtomsList(mirror.users, univList);
+ // Send to rendering attribute structure, regardless of
+ // whether there are users or not (alternate appearance case ..)
+ J3dMessage createMessage = new J3dMessage();
+ createMessage.threads = J3dThread.UPDATE_RENDERING_ATTRIBUTES;
+ createMessage.type = J3dMessage.APPEARANCE_CHANGED;
+ createMessage.universe = null;
+ createMessage.args[0] = this;
+ createMessage.args[1]= new Integer(attrMask);
+ createMessage.args[2] = attr;
+ createMessage.args[3] = new Integer(changedFrequent);
+
+ VirtualUniverse.mc.processMessage(createMessage);
+
+
+ // System.err.println("univList.size is " + univList.size());
+ for(int i=0; i<univList.size(); i++) {
+ createMessage = new J3dMessage();
+ createMessage.threads = J3dThread.UPDATE_RENDER;
+ createMessage.type = J3dMessage.APPEARANCE_CHANGED;
+
+ createMessage.universe = univList.get(i);
+ createMessage.args[0] = this;
+ createMessage.args[1]= new Integer(attrMask);
+ createMessage.args[2] = attr;
+
+ ArrayList<GeometryAtom> gL = gaList.get(i);
+ GeometryAtom[] gaArr = new GeometryAtom[gL.size()];
+ gL.toArray(gaArr);
+ createMessage.args[3] = gaArr;
+ // Send the value itself, since Geometry Structure cannot rely on the
+ // mirror (which may be updated lazily)
+ if (attrMask == RENDERING) {
+ if (attr != null) {
+ createMessage.args[4] = visible?Boolean.TRUE:Boolean.FALSE;
+ }
+ else {
+ createMessage.args[4] = Boolean.TRUE;
+ }
+ }
+ VirtualUniverse.mc.processMessage(createMessage);
+ }
+ }
+
+
+
+ final void sendRenderingAttributesChangedMessage(boolean visible) {
+
+ ArrayList<VirtualUniverse> univList = new ArrayList<VirtualUniverse>();
+ ArrayList<ArrayList<GeometryAtom>> gaList = Shape3DRetained.getGeomAtomsList(mirror.users, univList);
+
+ // System.err.println("univList.size is " + univList.size());
+ for(int i=0; i<univList.size(); i++) {
+ J3dMessage createMessage = new J3dMessage();
+ createMessage.threads = J3dThread.UPDATE_GEOMETRY;
+ createMessage.type = J3dMessage.RENDERINGATTRIBUTES_CHANGED;
+
+ createMessage.universe = univList.get(i);
+ createMessage.args[0] = this;
+ createMessage.args[1] = null; // Sync with RenderingAttrRetained sendMessage
+ createMessage.args[2]= visible?Boolean.TRUE:Boolean.FALSE;
+
+ ArrayList<GeometryAtom> gL = gaList.get(i);
+ GeometryAtom[] gaArr = new GeometryAtom[gL.size()];
+ gL.toArray(gaArr);
+ createMessage.args[3] = gaArr;
+ VirtualUniverse.mc.processMessage(createMessage);
+ }
+ }
+
+ boolean isOpaque(int geoType) {
+ if (TransparencyAttributesRetained.useAlpha(transparencyAttributes))
+ return false;
+
+ switch (geoType) {
+ case GeometryRetained.GEO_TYPE_POINT_SET:
+ case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET:
+ if ((pointAttributes != null) &&
+ pointAttributes.pointAntialiasing) {
+ return (false);
+ }
+ break;
+ case GeometryRetained.GEO_TYPE_LINE_SET:
+ case GeometryRetained.GEO_TYPE_LINE_STRIP_SET:
+ case GeometryRetained.GEO_TYPE_INDEXED_LINE_SET:
+ case GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET:
+ if ((lineAttributes != null) &&
+ lineAttributes.lineAntialiasing) {
+ return (false);
+ }
+ break;
+ case GeometryRetained.GEO_TYPE_RASTER:
+ case GeometryRetained.GEO_TYPE_COMPRESSED:
+ break;
+ default:
+ if (polygonAttributes != null) {
+ if((polygonAttributes.polygonMode ==
+ PolygonAttributes.POLYGON_POINT) &&
+ (pointAttributes != null) &&
+ pointAttributes.pointAntialiasing) {
+ return (false);
+ } else if ((polygonAttributes.polygonMode ==
+ PolygonAttributes.POLYGON_LINE) &&
+ (lineAttributes != null) &&
+ lineAttributes.lineAntialiasing) {
+ return (false);
+ }
+ }
+ break;
+ }
+
+ return(true);
+ }
+
+ @Override
+ void handleFrequencyChange(int bit) {
+ int mask = 0;
+ if (bit == Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE)
+ mask = COLOR;
+ else if(bit == Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE)
+ mask = TRANSPARENCY;
+ else if(bit == Appearance.ALLOW_RENDERING_ATTRIBUTES_WRITE)
+ mask = RENDERING;
+ else if (bit == Appearance.ALLOW_POLYGON_ATTRIBUTES_WRITE)
+ mask = POLYGON;
+ else if (bit == Appearance.ALLOW_LINE_ATTRIBUTES_WRITE)
+ mask = LINE;
+ else if (bit == Appearance.ALLOW_POINT_ATTRIBUTES_WRITE)
+ mask = POINT;
+ else if (bit == Appearance.ALLOW_MATERIAL_WRITE)
+ mask = MATERIAL;
+ else if (bit == Appearance.ALLOW_TEXTURE_WRITE)
+ mask = TEXTURE;
+ else if (bit == Appearance.ALLOW_TEXTURE_ATTRIBUTES_WRITE)
+ mask = TEXTURE_ATTR;
+ else if (bit == Appearance.ALLOW_TEXGEN_WRITE)
+ mask = TEXCOORD_GEN;
+ else if (bit == Appearance.ALLOW_TEXTURE_UNIT_STATE_WRITE)
+ mask = TEXTURE_UNIT_STATE;
+
+ if (mask != 0)
+ setFrequencyChangeMask(bit, mask);
+ }
+}
+
+