diff options
Diffstat (limited to 'src/javax/media/j3d/BackgroundRetained.java')
-rw-r--r-- | src/javax/media/j3d/BackgroundRetained.java | 782 |
1 files changed, 0 insertions, 782 deletions
diff --git a/src/javax/media/j3d/BackgroundRetained.java b/src/javax/media/j3d/BackgroundRetained.java deleted file mode 100644 index 847d8de..0000000 --- a/src/javax/media/j3d/BackgroundRetained.java +++ /dev/null @@ -1,782 +0,0 @@ -/* - * Copyright 1997-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; - -import javax.vecmath.Color3f; - - -/** - * The Background leaf node defines either a solid background color - * or a background image that is used to fill the window at the - * beginning of each new frame. It also specifies an application - * region in which this background is active. - */ -class BackgroundRetained extends LeafRetained { - - static final int COLOR_CHANGED = 0x00001; - static final int IMAGE_CHANGED = 0x00002; - static final int GEOMETRY_CHANGED = 0x00004; - static final int BOUNDS_CHANGED = 0x00008; - static final int BOUNDINGLEAF_CHANGED = 0x00010; - static final int IMAGE_SCALE_CHANGED = 0x00020; - // Background color or image. If non-null, the image overrides the - // color. - Color3f color = new Color3f(0.0f, 0.0f, 0.0f); - ImageComponent2DRetained image = null; - Texture2DRetained texture = null; - - // the image scale mode if image is used. - int imageScaleMode = Background.SCALE_NONE; - - /** - * The Boundary object defining the lights's application region. - */ - Bounds applicationRegion = null; - - /** - * The bounding leaf reference - */ - BoundingLeafRetained boundingLeaf = null; - - /** - * Background geometry branch group - */ - BranchGroup geometryBranch = null; - - /** - * The transformed value of the applicationRegion. - */ - Bounds transformedRegion = null; - - /** - * The state structure used for Background Geometry - */ - SetLiveState setLiveState = null; - - /** - * The locale of this Background node since we don't have mirror object - * when clearLive is called - * locale is set to null, we still want locale to have a - * non-null value, since renderingEnv structure may be using the - * locale - */ - Locale cachedLocale = null; - - // This is true when this background is referenced in an immediate mode context - boolean inImmCtx = false; - -// list of light nodes for background geometry -ArrayList<LightRetained> lights = new ArrayList<LightRetained>(); - -// list of fog nodes for background geometry -ArrayList<FogRetained> fogs = new ArrayList<FogRetained>(); - -// a list of background geometry atoms -ArrayList<GeometryAtom> bgGeometryAtomList = new ArrayList<GeometryAtom>(); - -// false is background geometry atoms list has changed -boolean bgGeometryAtomListDirty = true; - -// an array of background geometry atoms -GeometryAtom[] bgGeometryAtoms = null; - - // Target threads to be notified when light changes - // Note, the rendering env structure only get notified - // when there is a bounds related change - final static int targetThreads = J3dThread.UPDATE_RENDERING_ENVIRONMENT | - J3dThread.UPDATE_RENDER; - - // Is true, if the background is viewScoped - boolean isViewScoped = false; - - BackgroundRetained () { - this.nodeType = NodeRetained.BACKGROUND; - localBounds = new BoundingBox((Bounds)null); - } - - /** - * Initializes the background color to the specified color. - * This color is used - * if the image is null. - * @param color the new background color - */ - final void initColor(Color3f color) { - this.color.set(color); - } - - - /** - * Sets the background color to the specified color. This color is used - * if the image is null. - * @param color the new background color - */ - final void setColor(Color3f color) { - initColor(color); - if (source.isLive()) { - sendMessage(COLOR_CHANGED, new Color3f(color)); - } - } - - /** - * Initializes the background color to the specified color. - * This color is used - * if the image is null. - * @param r the red component of the background color - * @param g the green component of the background color - * @param b the blue component of the background color - */ - final void initColor(float r, float g, float b) { - this.color.x = r; - this.color.y = g; - this.color.z = b; - } - - - - /** - * Sets the background color to the specified color. This color is used - * if the image is null. - * @param r the red component of the background color - * @param g the green component of the background color - * @param b the blue component of the background color - */ - final void setColor(float r, float g, float b) { - setColor(new Color3f(r, g, b)); - } - - - /** - * Retrieves the background color. - * @param color the vector that will receive the current background color - */ - final void getColor(Color3f color) { - color.set(this.color); - } - - /** - * Initialize the image scale mode to the specified mode - * @imageScaleMode the image scale mode to the used - */ - final void initImageScaleMode(int imageScaleMode){ - this.imageScaleMode = imageScaleMode; - } - - /** - * Sets the image scale mode for this Background node. - * @param imageScaleMode the image scale mode - */ - final void setImageScaleMode(int imageScaleMode){ - initImageScaleMode(imageScaleMode); - if(source.isLive()){ - sendMessage(IMAGE_SCALE_CHANGED, new Integer(imageScaleMode)); - } - } - - /** - * gets the image scale mode for this Background node. - */ - final int getImageScaleMode(){ - return imageScaleMode; - } - - /** - * Initializes the background image to the specified image. - * @param image new ImageCompoent2D object used as the background image - */ - final void initImage(ImageComponent2D img) { - int texFormat; - - if (img == null) { - image = null; - texture = null; - return; - } - - if (img.retained != image ) { - image = (ImageComponent2DRetained) img.retained; - image.setEnforceNonPowerOfTwoSupport(true); - switch(image.getNumberOfComponents()) { - case 1: - texFormat = Texture.INTENSITY; - break; - case 2: - texFormat = Texture.LUMINANCE_ALPHA; - break; - case 3: - texFormat = Texture.RGB; - break; - case 4: - texFormat = Texture.RGBA; - break; - default: - assert false; - return; - } - - Texture2D tex2D = new Texture2D(Texture.BASE_LEVEL, texFormat, - img.getWidth(), img.getHeight()); - texture = (Texture2DRetained) tex2D.retained; - // Background is special case of Raster. - texture.setUseAsRaster(true); - // Fix to issue 373 : ImageComponent.set(BufferedImage) ignored when used by Background - image.addUser(texture); - texture.initImage(0,img); - } - } - - /** - * Sets the background image to the specified image. - * @param image new ImageCompoent3D object used as the background image - */ - final void setImage(ImageComponent2D img) { - if (source.isLive()) { - if (texture != null) { - texture.clearLive(refCount); - } - } - initImage(img); - if (source.isLive()) { - if (texture != null) { - texture.setLive(inBackgroundGroup, refCount); - } - - sendMessage(IMAGE_CHANGED, - (texture != null ? texture.mirror : null)); - - } - } - - /** - * Retrieves the background image. - * @return the current background image - */ - final ImageComponent2D getImage() { - return (image == null ? null : - (ImageComponent2D)image.source); - } - - /** - * Initializes the background geometry branch group to the specified branch. - * @param branch new branch group object used for background geometry - */ - final void initGeometry(BranchGroup branch) { - geometryBranch = branch; - } - - - /** - * Sets the background geometry branch group to the specified branch. - * @param branch new branch group object used for background geometry - */ - final void setGeometry(BranchGroup branch) { - int numMessages = 0; - int i; - - if (source.isLive()) { - J3dMessage m[]; - if (geometryBranch != null) - numMessages+=2; // REMOVE_NODES, ORDERED_GROUP_REMOVED - if (branch != null) - numMessages+=2; // INSERT_NODES, ORDERED_GROUP_INSERTED - m = new J3dMessage[numMessages]; - for (i=0; i<numMessages; i++) { - m[i] = new J3dMessage(); - } - i = 0; - if (geometryBranch != null) { - clearGeometryBranch((BranchGroupRetained)geometryBranch.retained); - m[i].threads = (J3dThread.UPDATE_RENDER | - J3dThread.UPDATE_RENDERING_ENVIRONMENT); - m[i].type = J3dMessage.ORDERED_GROUP_REMOVED; - m[i].universe = universe; - m[i].args[0] = setLiveState.ogList.toArray(); - m[i].args[1] = setLiveState.ogChildIdList.toArray(); - m[i].args[3] = setLiveState.ogCIOList.toArray(); - m[i].args[4] = setLiveState.ogCIOTableList.toArray(); - i++; - - m[i].threads = setLiveState.notifyThreads; - m[i].type = J3dMessage.REMOVE_NODES; - m[i].universe = universe; - m[i].args[0] = setLiveState.nodeList.toArray(); - i++; - - } - if (branch != null) { - setGeometryBranch((BranchGroupRetained)branch.retained); - m[i].threads = (J3dThread.UPDATE_RENDER | - J3dThread.UPDATE_RENDERING_ENVIRONMENT); - m[i].type = J3dMessage.ORDERED_GROUP_INSERTED; - m[i].universe = universe; - m[i].args[0] = setLiveState.ogList.toArray(); - m[i].args[1] = setLiveState.ogChildIdList.toArray(); - m[i].args[2] = setLiveState.ogOrderedIdList.toArray(); - m[i].args[3] = setLiveState.ogCIOList.toArray(); - m[i].args[4] = setLiveState.ogCIOTableList.toArray(); - i++; - - m[i].threads = setLiveState.notifyThreads; - m[i].type = J3dMessage.INSERT_NODES; - m[i].universe = universe; - m[i].args[0] = setLiveState.nodeList.toArray(); - } - VirtualUniverse.mc.processMessage(m); - // Free up memory - setLiveState.reset(null); - } - initGeometry(branch); - } - - /** - * Retrieves the background geometry branch group. - * @return the current background geometry branch group - */ - final BranchGroup getGeometry() { - return geometryBranch; - } - - /** - * Initializes the Background's application region. - * @param region a region that contains the Backgound's new application bounds - */ - final void initApplicationBounds(Bounds region) { - if (region != null) { - applicationRegion = (Bounds) region.clone(); - } else { - applicationRegion = null; - } - } - - /** - * Set the Background's application region. - * @param region a region that contains the Backgound's new application bounds - */ - final void setApplicationBounds(Bounds region) { - initApplicationBounds(region); - // Don't send the message if there is a valid boundingleaf - if (boundingLeaf == null) { - J3dMessage createMessage = new J3dMessage(); - createMessage.threads = targetThreads | - J3dThread.UPDATE_RENDERING_ENVIRONMENT; - createMessage.type = J3dMessage.BACKGROUND_CHANGED; - createMessage.universe = universe; - createMessage.args[0] = this; - createMessage.args[1]= new Integer(BOUNDS_CHANGED); - if (region != null) - createMessage.args[2] = region.clone(); - else - createMessage.args[2] = null; - VirtualUniverse.mc.processMessage(createMessage); - } - } - - /** - * Get the Backgound's application region. - * @return this Backgound's application region information - */ - final Bounds getApplicationBounds() { - return (applicationRegion != null ? (Bounds) applicationRegion.clone() : null); - } - - /** - * Initializes the Background's application region - * to the specified Leaf node. - */ - void initApplicationBoundingLeaf(BoundingLeaf region) { - if (region != null) { - boundingLeaf = (BoundingLeafRetained)region.retained; - } else { - boundingLeaf = null; - } - } - - /** - * Set the Background's application region to the specified Leaf node. - */ - void setApplicationBoundingLeaf(BoundingLeaf region) { - if (boundingLeaf != null) - boundingLeaf.mirrorBoundingLeaf.removeUser(this); - - if (region != null) { - boundingLeaf = (BoundingLeafRetained)region.retained; - boundingLeaf.mirrorBoundingLeaf.addUser(this); - } else { - boundingLeaf = null; - } - J3dMessage createMessage = new J3dMessage(); - createMessage.threads = targetThreads | - J3dThread.UPDATE_RENDERING_ENVIRONMENT; - createMessage.type = J3dMessage.BACKGROUND_CHANGED; - createMessage.universe = universe; - createMessage.args[0] = this; - createMessage.args[1]= new Integer(BOUNDINGLEAF_CHANGED); - if (boundingLeaf != null) { - createMessage.args[2] = boundingLeaf.mirrorBoundingLeaf; - createMessage.args[3] = null; - } else { - createMessage.args[2] = null; - if (applicationRegion != null) - createMessage.args[3] = applicationRegion.clone(); - else - createMessage.args[3] = null; - } - VirtualUniverse.mc.processMessage(createMessage); - } - - - /** - * Get the Background's application region - */ - BoundingLeaf getApplicationBoundingLeaf() { - return (boundingLeaf != null ? - (BoundingLeaf)boundingLeaf.source : null); - } - - /** - * This sets the immedate mode context flag - */ - void setInImmCtx(boolean inCtx) { - inImmCtx = inCtx; - } - - /** - * This gets the immedate mode context flag - */ - boolean getInImmCtx() { - return (inImmCtx); - } - - void setGeometryBranch(BranchGroupRetained branch) { - setLiveState.reset(locale); - setLiveState.inBackgroundGroup = true; - - setLiveState.geometryBackground = this; - setLiveState.currentTransforms[0] = new Transform3D[2]; - setLiveState.currentTransforms[0][0] = new Transform3D(); - setLiveState.currentTransforms[0][1] = new Transform3D(); - setLiveState.currentTransformsIndex[0] = new int[2]; - setLiveState.currentTransformsIndex[0][0] = 0; - setLiveState.currentTransformsIndex[0][1] = 0; - - setLiveState.localToVworld = setLiveState.currentTransforms; - setLiveState.localToVworldIndex = setLiveState.currentTransformsIndex; - - setLiveState.branchGroupPaths = new ArrayList<BranchGroupRetained[]>(); - setLiveState.branchGroupPaths.add(new BranchGroupRetained[0]); - - setLiveState.orderedPaths = new ArrayList<OrderedPath>(1); - setLiveState.orderedPaths.add(new OrderedPath()); - - setLiveState.switchStates = new ArrayList<SwitchState>(1); - setLiveState.switchStates.add(new SwitchState(false)); - - branch.setLive(setLiveState); - - - } - - void clearGeometryBranch(BranchGroupRetained branch) { - setLiveState.reset(locale); - setLiveState.inBackgroundGroup = true; - setLiveState.geometryBackground = this; - branch.clearLive(setLiveState); - branch.setParent(null); - branch.setLocale(null); - - } - - /** - * This setLive routine first calls the superclass's method, then - * it adds itself to the list of lights - */ - @Override - void setLive(SetLiveState s) { - super.doSetLive(s); - - if (inImmCtx) { - throw new IllegalSharingException( - J3dI18N.getString("BackgroundRetained1")); - } - if (inBackgroundGroup) { - throw new - IllegalSceneGraphException(J3dI18N.getString("BackgroundRetained5")); - } - - if (inSharedGroup) { - throw new - IllegalSharingException(J3dI18N.getString("BackgroundRetained6")); - } - - - if (geometryBranch != null) { - BranchGroupRetained branch = - (BranchGroupRetained)geometryBranch.retained; - if (branch.inBackgroundGroup == true) - throw new IllegalSharingException( - J3dI18N.getString("BackgroundRetained0")); - - if (branch.parent != null) - throw new IllegalSharingException( - J3dI18N.getString("BackgroundRetained3")); - - if (branch.locale != null) - throw new IllegalSharingException( - J3dI18N.getString("BackgroundRetained4")); - - if (setLiveState == null) { - setLiveState = new SetLiveState(universe); - setLiveState.universe = universe; - } - setGeometryBranch((BranchGroupRetained)geometryBranch.retained); - // add background geometry nodes to setLiveState's nodeList - s.nodeList.addAll(setLiveState.nodeList); - s.notifyThreads |= setLiveState.notifyThreads; - s.ogList.addAll(setLiveState.ogList); - s.ogChildIdList.addAll(setLiveState.ogChildIdList); - s.ogOrderedIdList.addAll(setLiveState.ogOrderedIdList); - // Free up memory. - setLiveState.reset(null); - } - - if ((s.viewScopedNodeList != null) && (s.viewLists != null)) { - s.viewScopedNodeList.add(this); - s.scopedNodesViewList.add(s.viewLists.get(0)); - } else { - s.nodeList.add(this); - } - // System.err.println("bkg.setlive nodeList " + s.nodeList); - - // process switch leaf - if (s.switchTargets != null && s.switchTargets[0] != null) { - s.switchTargets[0].addNode(this, Targets.ENV_TARGETS); - } - switchState = s.switchStates.get(0); - - // Initialize some mirror values - if (boundingLeaf != null) { - transformedRegion = boundingLeaf.mirrorBoundingLeaf.transformedRegion; - } - else { // Evaluate applicationRegion if not null - if (applicationRegion != null) { - transformedRegion = (Bounds)applicationRegion.clone(); - transformedRegion.transform( - applicationRegion, - getLastLocalToVworld()); - } - else { - transformedRegion = null; - } - - } - cachedLocale = s.locale; - - // add this node to the transform target - if (s.transformTargets != null && s.transformTargets[0] != null) { - s.transformTargets[0].addNode(this, Targets.ENV_TARGETS); - s.notifyThreads |= J3dThread.UPDATE_TRANSFORM; - } - - s.notifyThreads |= J3dThread.UPDATE_RENDERING_ENVIRONMENT| - J3dThread.UPDATE_RENDER; - - if (texture != null) { - texture.setLive(inBackgroundGroup, refCount); - } - super.markAsLive(); - - } - - /** - * This clearLive routine first calls the superclass's method, then - * it removes itself to the list of lights - */ - @Override - void clearLive(SetLiveState s) { - super.clearLive(s); - if ((s.viewScopedNodeList != null) && (s.viewLists != null)) { - s.viewScopedNodeList.add(this); - s.scopedNodesViewList.add(s.viewLists.get(0)); - } else { - s.nodeList.add(this); - } - if (s.transformTargets != null && s.transformTargets[0] != null) { - s.transformTargets[0].addNode(this, Targets.ENV_TARGETS); - s.notifyThreads |= J3dThread.UPDATE_TRANSFORM; - } - - if (s.switchTargets != null && s.switchTargets[0] != null) { - s.switchTargets[0].addNode(this, Targets.ENV_TARGETS); - } - - if (geometryBranch != null) { - BranchGroupRetained branch = (BranchGroupRetained)geometryBranch.retained; - clearGeometryBranch(branch); - // add background geometry nodes to setLiveState's nodeList - s.nodeList.addAll(setLiveState.nodeList); - s.ogList.addAll(setLiveState.ogList); - s.ogChildIdList.addAll(setLiveState.ogChildIdList); - s.notifyThreads |= setLiveState.notifyThreads; - // Free up memory. - setLiveState.reset(null); - lights.clear(); - fogs.clear(); - } - - if (texture != null) { - texture.clearLive(refCount); - } - - s.notifyThreads |= J3dThread.UPDATE_RENDERING_ENVIRONMENT| - J3dThread.UPDATE_RENDER; - } - - // The update Object function. - synchronized void updateImmediateMirrorObject(Object[] objs) { - int component = ((Integer)objs[1]).intValue(); - // If initialization - - // Bounds message only sent when boundingleaf is null - if ((component & BOUNDS_CHANGED) != 0) { - if (objs[2] != null) { - transformedRegion = ((Bounds) objs[2]).copy(transformedRegion); - transformedRegion.transform( - (Bounds) objs[2], getCurrentLocalToVworld()); - } - else { - transformedRegion = null; - } - } - else if ((component & BOUNDINGLEAF_CHANGED) != 0) { - if (objs[2] != null) { - transformedRegion = ((BoundingLeafRetained)objs[2]).transformedRegion; - } - else { // Evaluate applicationRegion if not null - Bounds appRegion = (Bounds)objs[3]; - if (appRegion != null) { - transformedRegion = appRegion.copy(transformedRegion); - transformedRegion.transform( - appRegion, getCurrentLocalToVworld()); - } - else { - transformedRegion = null; - } - - } - } - - } - - /** Note: This routine will only be called - * to update the object's - * transformed region - */ - @Override - void updateBoundingLeaf() { - if (boundingLeaf != null && - boundingLeaf.mirrorBoundingLeaf.switchState.currentSwitchOn) { - transformedRegion = - boundingLeaf.mirrorBoundingLeaf.transformedRegion; - } else { // Evaluate applicationRegion if not null - if (applicationRegion != null) { - transformedRegion = applicationRegion.copy(transformedRegion); - transformedRegion.transform( - applicationRegion, getCurrentLocalToVworld()); - } else { - transformedRegion = null; - } - } - } - - void updateImmediateTransformChange() { - // If bounding leaf is null, tranform the bounds object - if (boundingLeaf == null) { - if (applicationRegion != null) { - transformedRegion = applicationRegion.copy(transformedRegion); - transformedRegion.transform( - applicationRegion, getCurrentLocalToVworld()); - } - } - } - - - final void sendMessage(int attrMask, Object attr) { - J3dMessage createMessage = new J3dMessage(); - createMessage.threads = targetThreads; - createMessage.universe = universe; - createMessage.type = J3dMessage.BACKGROUND_CHANGED; - createMessage.args[0] = this; - createMessage.args[1]= new Integer(attrMask); - createMessage.args[2] = attr; - VirtualUniverse.mc.processMessage(createMessage); - } - -void addBgGeometryAtomList(GeometryAtom geomAtom) { - bgGeometryAtomList.add(geomAtom); - bgGeometryAtomListDirty = true; -} - -void removeBgGeometryAtomList(GeometryAtom geomAtom) { - bgGeometryAtomList.remove(geomAtom); - bgGeometryAtomListDirty = true; -} - -GeometryAtom[] getBackgroundGeometryAtoms() { - if (bgGeometryAtomListDirty) { - int nAtoms = bgGeometryAtomList.size(); - if (nAtoms == 0) { - bgGeometryAtoms = null; - } - else { - bgGeometryAtoms = bgGeometryAtomList.toArray(new GeometryAtom[nAtoms]); - bgGeometryAtomListDirty = false; - } - } - return bgGeometryAtoms; -} - - @Override - void mergeTransform(TransformGroupRetained xform) { - super.mergeTransform(xform); - if (applicationRegion != null) { - applicationRegion.transform(xform.transform); - } - } - - // notifies the Background object that the image data in a referenced - // ImageComponent object is changed. - // Currently we are not making use of this information. - - void notifyImageComponentImageChanged(ImageComponentRetained image, - ImageComponentUpdateInfo value) { - } - @Override - void getMirrorObjects(ArrayList leafList, HashKey key) { - leafList.add(this); // No Mirror in this case - } -} |