001: /*
002: * $RCSfile: TransparentRenderingInfo.java,v $
003: *
004: * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
006: *
007: * This code is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License version 2 only, as
009: * published by the Free Software Foundation. Sun designates this
010: * particular file as subject to the "Classpath" exception as provided
011: * by Sun in the LICENSE file that accompanied this code.
012: *
013: * This code is distributed in the hope that it will be useful, but WITHOUT
014: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: * version 2 for more details (a copy is included in the LICENSE file that
017: * accompanied this code).
018: *
019: * You should have received a copy of the GNU General Public License version
020: * 2 along with this work; if not, write to the Free Software Foundation,
021: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
022: *
023: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
024: * CA 95054 USA or visit www.sun.com if you need additional information or
025: * have any questions.
026: *
027: * $Revision: 1.7 $
028: * $Date: 2008/02/28 20:17:32 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: class TransparentRenderingInfo extends Object implements
035: com.sun.j3d.utils.scenegraph.transparency.TransparencySortGeom {
036: // For DepthSortedTransparency, rm is the rendermolecule
037: // that this rInfo is part of
038: // For non depth sorted transparency, rm is one of the rendermolecules
039: // in the textureBin that is rendered, all renderMolecules under
040: // rm.textureBin's will be rendered
041: RenderMolecule rm;
042: RenderAtomListInfo rInfo;
043: TransparentRenderingInfo prev;
044: TransparentRenderingInfo next;
045: GeometryAtom geometryAtom;
046: double zVal; // Used in DepthSorted Transparency
047:
048: // XXXX: Add Dirty info
049:
050: /**
051: * update state before rendering transparent objects
052: */
053: boolean updateState(Canvas3D cv) {
054:
055: TextureBin textureBin = rm.textureBin;
056: AttributeBin attributeBin = textureBin.attributeBin;
057: ShaderBin shaderBin = textureBin.shaderBin;
058:
059: // Get a collection to check if switch is on
060:
061: RenderMolecule rm = textureBin.transparentRMList;
062:
063: // Optimization to skip updating Attributes if
064: // all switch are off. Note that switch condition
065: // is check again in rm.render().
066: while (rm != null) {
067: if (rm.isSwitchOn()) {
068: break;
069: }
070: if (rm.next != null) {
071: rm = rm.next;
072: } else {
073: rm = rm.nextMap;
074: }
075: }
076:
077: if (rm == null) {
078: return false;
079: }
080:
081: // XXXX : Code cleanup needed : The following code segment should simply test
082: // each bin independently and update it if necessary.
083: if (cv.environmentSet != attributeBin.environmentSet) {
084:
085: boolean visible = (attributeBin.definingRenderingAttributes == null || attributeBin.definingRenderingAttributes.visible);
086:
087: if ((attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy == View.VISIBILITY_DRAW_VISIBLE && !visible)
088: || (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy == View.VISIBILITY_DRAW_INVISIBLE && visible)) {
089: return false;
090: }
091:
092: // Fix to issue 314. Set the appropriate bits for the dirty bins
093: // and call the update state method.
094: cv.setStateToUpdate(Canvas3D.LIGHTBIN_BIT,
095: attributeBin.environmentSet.lightBin);
096: cv.setStateToUpdate(Canvas3D.ENVIRONMENTSET_BIT,
097: attributeBin.environmentSet);
098: cv
099: .setStateToUpdate(Canvas3D.ATTRIBUTEBIN_BIT,
100: attributeBin);
101: cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin);
102: cv.updateEnvState();
103:
104: } else if (cv.attributeBin != attributeBin) {
105: boolean visible = (attributeBin.definingRenderingAttributes == null || attributeBin.definingRenderingAttributes.visible);
106:
107: if ((attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy == View.VISIBILITY_DRAW_VISIBLE && !visible)
108: || (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy == View.VISIBILITY_DRAW_INVISIBLE && visible)) {
109: return false;
110: }
111:
112: // Fix to issue 314. Set the appropriate bits for the dirty bins
113: // and call the update state method.
114: cv
115: .setStateToUpdate(Canvas3D.ATTRIBUTEBIN_BIT,
116: attributeBin);
117: cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin);
118: cv.updateEnvState();
119:
120: } else if (cv.shaderBin != shaderBin) {
121:
122: // Fix to issue 314. Set the appropriate bits for the dirty bins
123: // and call the update state method.
124: cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin);
125: cv.updateEnvState();
126:
127: }
128:
129: return true;
130: }
131:
132: void render(Canvas3D cv) {
133: if (updateState(cv)) {
134: rm.textureBin.render(cv, rm.textureBin.transparentRMList);
135: }
136: }
137:
138: void sortRender(Canvas3D cv) {
139: if (updateState(cv)) {
140: rm.textureBin.render(cv, this );
141: }
142: }
143:
144: public double getDistanceSquared() {
145: return zVal;
146: }
147:
148: public Geometry getGeometry() {
149: // XXXX: verify 0 is always the correct index. Assumption is that for
150: // Shape3D with multiple geometry each geometry is put in it's
151: // own geometryAtom.
152: if (geometryAtom.geometryArray[0] == null)
153: return null;
154: return (Geometry) geometryAtom.geometryArray[0].source;
155: }
156:
157: public void getLocalToVWorld(Transform3D localToVW) {
158: localToVW
159: .set(rm.localToVworld[NodeRetained.LAST_LOCAL_TO_VWORLD]);
160: }
161:
162: public Shape3D getShape3D() {
163: return (Shape3D) geometryAtom.source.source;
164: }
165: }
|