diff options
Diffstat (limited to 'src/javax/media/j3d/TransparentRenderingInfo.java')
-rw-r--r-- | src/javax/media/j3d/TransparentRenderingInfo.java | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/javax/media/j3d/TransparentRenderingInfo.java b/src/javax/media/j3d/TransparentRenderingInfo.java new file mode 100644 index 0000000..3901bc9 --- /dev/null +++ b/src/javax/media/j3d/TransparentRenderingInfo.java @@ -0,0 +1,163 @@ +/* + * Copyright 2001-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; + + +class TransparentRenderingInfo extends Object implements TransparencySortGeom { + // For DepthSortedTransparency, rm is the rendermolecule + // that this rInfo is part of + // For non depth sorted transparency, rm is one of the rendermolecules + // in the textureBin that is rendered, all renderMolecules under + // rm.textureBin's will be rendered + RenderMolecule rm; + RenderAtomListInfo rInfo; + TransparentRenderingInfo prev; + TransparentRenderingInfo next; + GeometryAtom geometryAtom; + double zVal; // Used in DepthSorted Transparency + // XXXX: Add Dirty info + + /** + * update state before rendering transparent objects + */ + boolean updateState(Canvas3D cv) { + + TextureBin textureBin = rm.textureBin; + AttributeBin attributeBin = textureBin.attributeBin; + ShaderBin shaderBin = textureBin.shaderBin; + + // Get a collection to check if switch is on + + RenderMolecule rm = textureBin.transparentRMList ; + + // Optimization to skip updating Attributes if + // all switch are off. Note that switch condition + // is check again in rm.render(). + while (rm != null) { + if (rm.isSwitchOn()) { + break; + } + if (rm.next != null) { + rm = rm.next; + } else { + rm = rm.nextMap; + } + } + + if (rm == null) { + return false; + } + + // XXXX : Code cleanup needed : The following code segment should simply test + // each bin independently and update it if necessary. + if (cv.environmentSet != attributeBin.environmentSet) { + + boolean visible = (attributeBin.definingRenderingAttributes == null || + attributeBin.definingRenderingAttributes.visible); + + if ( (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy + == View.VISIBILITY_DRAW_VISIBLE && !visible) || + (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy + == View.VISIBILITY_DRAW_INVISIBLE && visible)) { + return false; + } + + // Fix to issue 314. Set the appropriate bits for the dirty bins + // and call the update state method. + cv.setStateToUpdate(Canvas3D.LIGHTBIN_BIT, attributeBin.environmentSet.lightBin); + cv.setStateToUpdate(Canvas3D.ENVIRONMENTSET_BIT, attributeBin.environmentSet); + cv.setStateToUpdate(Canvas3D.ATTRIBUTEBIN_BIT, attributeBin); + cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin); + cv.updateEnvState(); + + } else if (cv.attributeBin != attributeBin) { + boolean visible = (attributeBin.definingRenderingAttributes == null || + attributeBin.definingRenderingAttributes.visible); + + if ( (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy + == View.VISIBILITY_DRAW_VISIBLE && !visible) || + (attributeBin.environmentSet.renderBin.view.viewCache.visibilityPolicy + == View.VISIBILITY_DRAW_INVISIBLE && visible)) { + return false; + } + + // Fix to issue 314. Set the appropriate bits for the dirty bins + // and call the update state method. + cv.setStateToUpdate(Canvas3D.ATTRIBUTEBIN_BIT, attributeBin); + cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin); + cv.updateEnvState(); + + } else if (cv.shaderBin != shaderBin) { + + // Fix to issue 314. Set the appropriate bits for the dirty bins + // and call the update state method. + cv.setStateToUpdate(Canvas3D.SHADERBIN_BIT, shaderBin); + cv.updateEnvState(); + + } + + return true; + } + + void render(Canvas3D cv) { + if (updateState(cv)) { + rm.textureBin.render(cv, rm.textureBin.transparentRMList); + } + } + + + void sortRender(Canvas3D cv) { + if (updateState(cv)) { + rm.textureBin.render(cv, this); + } + } + + @Override + public double getDistanceSquared() { + return zVal; + } + + @Override + public Geometry getGeometry() { + // XXXX: verify 0 is always the correct index. Assumption is that for + // Shape3D with multiple geometry each geometry is put in it's + // own geometryAtom. + if (geometryAtom.geometryArray[0]==null) + return null; + return (Geometry)geometryAtom.geometryArray[0].source; + } + + @Override + public void getLocalToVWorld(Transform3D localToVW) { + localToVW.set(rm.localToVworld[NodeRetained.LAST_LOCAL_TO_VWORLD]); + } + + @Override + public Shape3D getShape3D() { + return (Shape3D)geometryAtom.source.source; + } +} |