/* * Copyright 1999-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 LightBin manages a collection of EnvironmentSet objects. * The number of objects managed depends upon the number of Lights * in each EnvironmentSet and the number of lights supported by * the underlying rendering layer. */ class LightBin extends Object implements ObjectUpdate { /** * The maximum number of lights in a LightBin */ int maxLights = -1; /** * The Array of Light references in this LightBin. * This array is always maxLights in length. */ LightRetained[] lights = null; /** * An Array of reference counts for shared lights in * among EnvirionmentSets */ int[] lightsRef = null; /** * The number of empty light slots in this LightBin */ int numEmptySlots = -1; /** * The RenderBin for this object */ RenderBin renderBin = null; /** * The references to the next and previous LightBins in the * list. */ LightBin next = null; LightBin prev = null; /** * The list of EnvironmentSets in this LightBin. */ EnvironmentSet environmentSetList = null; /** * List of envSet to be added for the next iteration */ ArrayList insertEnvSet = new ArrayList(); /** * cache of the canvasDirty */ int canvasDirty = 0; /** * lightDirty Mask cache , used to * mark the lightdirty bits for next frame */ int lightDirtyMaskCache = 0; /** * lightDirty Mask used during rendering */ int lightDirtyMask = 0; /** * List of pointLts in this lightbin Need to reload these lights when vworld * scale changes */ ArrayList pointLts = new ArrayList(); int[] pointLtsSlotIndex; // OrderedGroup info OrderedCollection orderedCollection = null; boolean onUpdateList = false; // background node that contains geometry BackgroundRetained geometryBackground = null; LightBin(int maxLights, RenderBin rb, boolean isOpaque) { this.maxLights = maxLights; this.numEmptySlots = maxLights; lights = new LightRetained[maxLights]; lightsRef = new int[maxLights]; renderBin = rb; } void reset(boolean inOpaque) { prev = null; next = null; orderedCollection = null; environmentSetList = null; onUpdateList = false; geometryBackground = null; // No need to reset the lights and lightRef if (J3dDebug.devPhase && J3dDebug.debug) { for (int i=0; i numEmptySlots) { return (false); } else { return (true); } } /** * Adds the new EnvironmentSet to this LightBin. */ void addEnvironmentSet(EnvironmentSet e, RenderBin rb) { int i, j, numEsLights; LightRetained light; numEsLights = e.lights.size(); for (i=0; i 0) { e = insertEnvSet.get(0); if (environmentSetList == null) { environmentSetList = e; } else { e.next = environmentSetList; environmentSetList.prev = e; environmentSetList = e; } for (i = 1; i < insertEnvSet.size(); i++) { e = insertEnvSet.get(i); e.next = environmentSetList; environmentSetList.prev = e; environmentSetList = e; } } insertEnvSet.clear(); if (canvasDirty != 0) { Canvas3D canvases[] = renderBin.view.getCanvases(); for (i = 0; i < canvases.length; i++) { canvases[i].canvasDirty |= canvasDirty; } lightDirtyMask = lightDirtyMaskCache; canvasDirty = 0; lightDirtyMaskCache = 0; } onUpdateList = false; } /** * Removes the given EnvironmentSet from this LightBin. */ void removeEnvironmentSet(EnvironmentSet e) { int i, j, numEsLights; LightRetained light; e.lightBin = null; // If envSet being remove is contained in envSet, then // remove the envSet from the addList if (insertEnvSet.contains(e)) { insertEnvSet.remove(insertEnvSet.indexOf(e)); } else { numEsLights = e.lights.size(); for (i=0; i>= 1; i++; } cv.canvasDirty &= ~Canvas3D.LIGHTBIN_DIRTY; } else if ((pointLts.size() > 0) && ((cv.canvasDirty & Canvas3D.VIEW_MATRIX_DIRTY) != 0 )) { if (geometryBackground == null) { scale = cv.canvasViewCache.getVworldToCoexistenceScale(); cv.setModelViewMatrix(cv.ctx, cv.vpcToEc.mat, renderBin.vworldToVpc); } else { scale = cv.canvasViewCache.getInfVworldToCoexistenceScale(); cv.setModelViewMatrix(cv.ctx, cv.vpcToEc.mat, renderBin.infVworldToVpc); } for (i = 0; i < pointLts.size(); i++) { PointLightRetained lt = pointLts.get(i); lt.update(cv.ctx, pointLtsSlotIndex[i], scale); cv.lights[pointLtsSlotIndex[i]] = lt; cv.frameCount[pointLtsSlotIndex[i]] = frameCount; } } } }