diff options
Diffstat (limited to 'src/javax/media/j3d/RenderMolecule.java')
-rw-r--r-- | src/javax/media/j3d/RenderMolecule.java | 3039 |
1 files changed, 0 insertions, 3039 deletions
diff --git a/src/javax/media/j3d/RenderMolecule.java b/src/javax/media/j3d/RenderMolecule.java deleted file mode 100644 index 269c1a0..0000000 --- a/src/javax/media/j3d/RenderMolecule.java +++ /dev/null @@ -1,3039 +0,0 @@ -/* - * 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 javax.vecmath.Vector3d; - -/** - * The RenderMolecule manages a collection of RenderAtoms. - */ - -class RenderMolecule extends IndexedObject implements ObjectUpdate, NodeComponentUpdate { - - - // different types of IndexedUnorderedSet that store RenderMolecule - static final int REMOVE_RENDER_ATOM_IN_RM_LIST = 0; - static final int RENDER_MOLECULE_LIST = 1; - - // total number of different IndexedUnorderedSet types - static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 2; - - /** - * Values for the geometryType field - */ - static final int POINT = 0x01; - static final int LINE = 0x02; - static final int SURFACE = 0x04; - static final int RASTER = 0x08; - static final int COMPRESSED = 0x10; - - static int RM_COMPONENTS = (AppearanceRetained.POLYGON | - AppearanceRetained.LINE | - AppearanceRetained.POINT | - AppearanceRetained.MATERIAL | - AppearanceRetained.TRANSPARENCY| - AppearanceRetained.COLOR); - - // XXXX: use definingMaterial etc. instead of these - // when sole user is completely implement - PolygonAttributesRetained polygonAttributes = null; - LineAttributesRetained lineAttributes = null; - PointAttributesRetained pointAttributes = null; - MaterialRetained material = null; - ColoringAttributesRetained coloringAttributes = null; - TransparencyAttributesRetained transparency = null; - - // Use Object instead of AppearanceRetained class for - // state caching optimation memory performance - - boolean normalPresent = true; - - - // Equivalent bits - static final int POINTATTRS_DIRTY = AppearanceRetained.POINT; - static final int LINEATTRS_DIRTY = AppearanceRetained.LINE; - static final int POLYGONATTRS_DIRTY = AppearanceRetained.POLYGON; - static final int MATERIAL_DIRTY = AppearanceRetained.MATERIAL; - static final int TRANSPARENCY_DIRTY = AppearanceRetained.TRANSPARENCY; - static final int COLORINGATTRS_DIRTY = AppearanceRetained.COLOR; - - static final int ALL_DIRTY_BITS = POINTATTRS_DIRTY | LINEATTRS_DIRTY | POLYGONATTRS_DIRTY | MATERIAL_DIRTY | TRANSPARENCY_DIRTY | COLORINGATTRS_DIRTY; - - /** - * bit mask of all attr fields that are equivalent across - * renderMolecules - */ - int dirtyAttrsAcrossRms = ALL_DIRTY_BITS; - - - // Mask set to true is any of the component have changed - int soleUserCompDirty = 0; - - /** - * The PolygonAttributes for this RenderMolecule - */ - PolygonAttributesRetained definingPolygonAttributes = null; - - /** - * The LineAttributes for this RenderMolecule - */ - LineAttributesRetained definingLineAttributes = null; - - /** - * The PointAttributes for this RenderMolecule - */ - PointAttributesRetained definingPointAttributes = null; - - /** - * The TextureBin that this RenderMolecule resides - */ - TextureBin textureBin = null; - - /** - * The localToVworld for this RenderMolecule - */ - Transform3D[] localToVworld = null; - int[] localToVworldIndex = null; - - /** - * The Material reference for this RenderMolecule - */ - MaterialRetained definingMaterial = null; - - - /** - * The ColoringAttribute reference for this RenderMolecule - */ - ColoringAttributesRetained definingColoringAttributes = null; - - - /** - * The Transparency reference for this RenderMolecule - */ - TransparencyAttributesRetained definingTransparency = null; - - /** - * Transform3D - point to the right one based on bg or not - */ - Transform3D[] trans = null; - - - /** - * specify whether scale is nonuniform - */ - boolean isNonUniformScale = false; - - /** - * number of renderAtoms to be rendered in this RenderMolecule - */ - int numRenderAtoms = 0; - - /** - * number of render atoms, used during the renderBin update time - */ - int numEditingRenderAtoms = 0; - - RenderAtom addRAs = null; - RenderAtom removeRAs = null; - - /** - * The cached ColoringAttributes color value. It is - * 1.0, 1.0, 1.0 if there is no ColoringAttributes. - */ - float red = 1.0f; - float green = 1.0f; - float blue = 1.0f; - - - /** - * Cached diffuse color value - */ - float dRed = 1.0f; - float dGreen = 1.0f; - float dBlue = 1.0f; - - - - /** - * The cached TransparencyAttributes transparency value. It is - * 0.0 if there is no TransparencyAttributes. - */ - float alpha = 0.0f; - - /** - * The geometry type for this RenderMolecule - */ - int geometryType = -1; - - /** - * A boolean indicating whether or not lighting should be on. - */ - boolean enableLighting = false; - - /** - * A boolean indicating whether or not this molecule rendered Text3D - */ - - int primaryMoleculeType = 0; - static int COMPRESSED_MOLECULE = 0x1; - static int TEXT3D_MOLECULE = 0x2; - static int DLIST_MOLECULE = 0x4; - static int RASTER_MOLECULE = 0x8; - static int ORIENTEDSHAPE3D_MOLECULE = 0x10; - static int SEPARATE_DLIST_PER_RINFO_MOLECULE = 0x20; - - - /** - * Cached values for polygonMode, line antialiasing, and point antialiasing - */ - int polygonMode = PolygonAttributes.POLYGON_FILL; - boolean lineAA = false; - boolean pointAA = false; - - /** - * The vertex format for this RenderMolecule. Only looked - * at for GeometryArray and CompressedGeometry objects. - */ - int vertexFormat = -1; - - /** - * The texCoordSetMap length for this RenderMolecule. - */ - int texCoordSetMapLen = 0; - - /** - * The primary renderMethod object for this RenderMolecule - * this is either a Text3D, display list, or compressed geometry renderer. - */ - RenderMethod primaryRenderMethod = null; - - /** - * The secondary renderMethod object for this RenderMolecule - * this is used for geometry that is shared - */ - RenderMethod secondaryRenderMethod = null; - - /** - * The RenderBino for this molecule - */ - RenderBin renderBin = null; - - /** - * The references to the next and previous RenderMolecule in the - * list. - */ - RenderMolecule next = null; - RenderMolecule prev = null; - - - /** - * The list of RenderAtoms in this RenderMolecule that are not using - * vertex arrays. - */ - RenderAtomListInfo primaryRenderAtomList = null; - - - /** - * The list of RenderAtoms in this RenderMolecule that are using - * separte dlist . - */ - RenderAtomListInfo separateDlistRenderAtomList = null; - - - /** - * The list of RenderAtoms in this RenderMolecule that are using vertex - * arrays. - */ - RenderAtomListInfo vertexArrayRenderAtomList = null; - - /** - * This BoundingBox is used for View Frustum culling on the primary - * list - */ - BoundingBox vwcBounds = null; - - - /** - * If this is end of the linked list for this xform, then - * this field is non-null, if there is a map after this - */ - RenderMolecule nextMap = null; - RenderMolecule prevMap = null; - - /** - * If the any of the node component of the appearance in RM will be changed - * frequently, then confine it to a separate bin - */ - boolean soleUser = false; - Object appHandle = null; - - - VertexArrayRenderMethod cachedVertexArrayRenderMethod = - (VertexArrayRenderMethod) - VirtualUniverse.mc.getVertexArrayRenderMethod(); - - // In D3D separate Quad/Triangle Geometry with others in RenderMolecule - // Since we need to dynamically switch whether to use DisplayList - // or not in render() as a group. - boolean isQuadGeometryArray = false; - boolean isTriGeometryArray = false; - - // display list id, valid id starts from 1 - int displayListId = 0; - Integer displayListIdObj = null; - - int onUpdateList = 0; - static int NEW_RENDERATOMS_UPDATE = 0x1; - static int BOUNDS_RECOMPUTE_UPDATE = 0x2; - static int LOCALE_TRANSLATION = 0x4; - static int UPDATE_BACKGROUND_TRANSFORM = 0x8; - static int IN_DIRTY_RENDERMOLECULE_LIST = 0x10; - static int LOCALE_CHANGED = 0x20; - static int ON_UPDATE_CHECK_LIST = 0x40; - - - // background geometry rendering - boolean doInfinite; - Transform3D[] infLocalToVworld; - - // Whether alpha is used in this renderMolecule - boolean useAlpha = false; - - // Support for multiple locales - Locale locale = null; - - // Transform when locale is different from the view's locale - Transform3D[] localeLocalToVworld = null; - - // Vector used for locale translation - Vector3d localeTranslation = null; - - boolean primaryChanged = false; - - boolean isOpaqueOrInOG = true; - boolean inOrderedGroup = false; - - - // closest switch parent - SwitchRetained closestSwitchParent = null; - - // the child index from the closest switch parent - int closestSwitchIndex = -1; - - - RenderMolecule(GeometryAtom ga, - PolygonAttributesRetained polygonAttributes, - LineAttributesRetained lineAttributes, - PointAttributesRetained pointAttributes, - MaterialRetained material, - ColoringAttributesRetained coloringAttributes, - TransparencyAttributesRetained transparency, - RenderingAttributesRetained renderAttrs, - TextureUnitStateRetained[] texUnits, - Transform3D[] transform, int[] transformIndex, - RenderBin rb) { - renderBin = rb; - IndexedUnorderSet.init(this, TOTAL_INDEXED_UNORDER_SET_TYPES); - - reset(ga, polygonAttributes, lineAttributes, pointAttributes, - material, coloringAttributes, transparency, renderAttrs, - texUnits, transform, - transformIndex); - } - - void reset(GeometryAtom ga, - PolygonAttributesRetained polygonAttributes, - LineAttributesRetained lineAttributes, - PointAttributesRetained pointAttributes, - MaterialRetained material, - ColoringAttributesRetained coloringAttributes, - TransparencyAttributesRetained transparency, - RenderingAttributesRetained renderAttrs, - TextureUnitStateRetained[] texUnits, - Transform3D[] transform, int[] transformIndex) { - primaryMoleculeType = 0; - numRenderAtoms = 0; - numEditingRenderAtoms = 0; - onUpdateList = 0; - dirtyAttrsAcrossRms = ALL_DIRTY_BITS; - primaryRenderMethod = null; - isNonUniformScale = false; - primaryChanged = false; - this.material = material; - this.polygonAttributes = polygonAttributes; - this.lineAttributes = lineAttributes; - this.pointAttributes = pointAttributes; - this.coloringAttributes = coloringAttributes; - this.transparency = transparency; - - closestSwitchParent = ga.source.closestSwitchParent; - closestSwitchIndex = ga.source.closestSwitchIndex; - - // Find the first non-null geometey - GeometryRetained geo = null; - int k = 0; - isOpaqueOrInOG = true; - inOrderedGroup = false; - while (geo == null && (k < ga.geometryArray.length)) { - geo = ga.geometryArray[k]; - k++; - } - - // Issue 249 - check for sole user only if property is set - soleUser = false; - if (VirtualUniverse.mc.allowSoleUser) { - if (ga.source.appearance != null) { - soleUser = ((ga.source.appearance.changedFrequent & RM_COMPONENTS) != 0); - } - } - - // Set the appearance only for soleUser case - if (soleUser) - appHandle = ga.source.appearance; - else - appHandle = this; - - // If its of type GeometryArrayRetained - if (ga.geoType <= GeometryRetained.GEO_TYPE_GEOMETRYARRAY || - ga.geoType == GeometryRetained.GEO_TYPE_TEXT3D) { - - if (ga.source instanceof OrientedShape3DRetained) { - primaryRenderMethod = - VirtualUniverse.mc.getOrientedShape3DRenderMethod(); - primaryMoleculeType = ORIENTEDSHAPE3D_MOLECULE; - } else if (ga.geoType == GeometryRetained.GEO_TYPE_TEXT3D) { - primaryRenderMethod = - VirtualUniverse.mc.getText3DRenderMethod(); - primaryMoleculeType = TEXT3D_MOLECULE; - } else { - // Make determination of dlist or not during addRenderAtom - secondaryRenderMethod = cachedVertexArrayRenderMethod; - } - } - else { - if (ga.geoType == GeometryRetained.GEO_TYPE_COMPRESSED) { - primaryRenderMethod = - VirtualUniverse.mc.getCompressedGeometryRenderMethod(); - primaryMoleculeType = COMPRESSED_MOLECULE; - } - else if (geo instanceof RasterRetained) { - primaryRenderMethod = - VirtualUniverse.mc.getDefaultRenderMethod(); - primaryMoleculeType = RASTER_MOLECULE; - } - } - - prev = null; - next = null; - prevMap = null; - nextMap = null; - - primaryRenderAtomList = null; - vertexArrayRenderAtomList = null; - - - - switch (ga.geoType) { - case GeometryRetained.GEO_TYPE_POINT_SET: - case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET: - this.geometryType = POINT; - 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: - this.geometryType = LINE; - break; - case GeometryRetained.GEO_TYPE_RASTER: - this.geometryType = RASTER; - break; - case GeometryRetained.GEO_TYPE_COMPRESSED: - this.geometryType = COMPRESSED; - - switch (((CompressedGeometryRetained)geo).getBufferType()) { - case CompressedGeometryHeader.POINT_BUFFER: - this.geometryType |= POINT ; - break ; - case CompressedGeometryHeader.LINE_BUFFER: - this.geometryType |= LINE ; - break ; - default: - case CompressedGeometryHeader.TRIANGLE_BUFFER: - this.geometryType |= SURFACE ; - if (polygonAttributes != null) { - if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_POINT) { - this.geometryType |= POINT; - } else if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_LINE) { - this.geometryType |= LINE; - } - } - break ; - } - break; - default: - this.geometryType = SURFACE; - if (polygonAttributes != null) { - if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_POINT) { - this.geometryType |= POINT; - } else if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_LINE) { - this.geometryType |= LINE; - } - } - break; - } - - isQuadGeometryArray = (geo.getClassType() == - GeometryRetained.QUAD_TYPE); - isTriGeometryArray = (geo.getClassType() == - GeometryRetained.TRIANGLE_TYPE); - - this.localToVworld = transform; - this.localToVworldIndex = transformIndex; - doInfinite = ga.source.inBackgroundGroup; - if (doInfinite) { - if (infLocalToVworld == null) { - infLocalToVworld = new Transform3D[2]; - infLocalToVworld[0] = infLocalToVworld[1] = new Transform3D(); - } - localToVworld[0].getRotation(infLocalToVworld[0]); - } - int mask = 0; - if (polygonAttributes != null) { - if (polygonAttributes.changedFrequent != 0) { - definingPolygonAttributes = polygonAttributes; - - mask |= POLYGONATTRS_DIRTY; - } - else { - if (definingPolygonAttributes != null) { - definingPolygonAttributes.set(polygonAttributes); - } - else { - definingPolygonAttributes = (PolygonAttributesRetained)polygonAttributes.clone(); - } - } - polygonMode = definingPolygonAttributes.polygonMode; - } else { - polygonMode = PolygonAttributes.POLYGON_FILL; - definingPolygonAttributes = null; - } - - if (lineAttributes != null) { - if (lineAttributes.changedFrequent != 0) { - definingLineAttributes = lineAttributes; - mask |= LINEATTRS_DIRTY; - } - else { - if (definingLineAttributes != null) { - definingLineAttributes.set(lineAttributes); - } - else { - definingLineAttributes = (LineAttributesRetained)lineAttributes.clone(); - } - } - lineAA = definingLineAttributes.lineAntialiasing; - } else { - lineAA = false; - definingLineAttributes = null; - } - - if (pointAttributes != null) { - if (pointAttributes.changedFrequent != 0) { - definingPointAttributes = pointAttributes; - mask |= POINTATTRS_DIRTY; - - } - else { - if (definingPointAttributes != null) { - definingPointAttributes.set(pointAttributes); - } - else { - definingPointAttributes = (PointAttributesRetained)pointAttributes.clone(); - } - } - pointAA = definingPointAttributes.pointAntialiasing; - } else { - pointAA = false; - definingPointAttributes = null; - } - - normalPresent = true; - if (geo instanceof GeometryArrayRetained) { - GeometryArrayRetained gr = (GeometryArrayRetained)geo; - this.vertexFormat = gr.vertexFormat; - - if (gr.texCoordSetMap != null) { - this.texCoordSetMapLen = gr.texCoordSetMap.length; - } else { - this.texCoordSetMapLen = 0; - } - - // Throw an exception if lighting is enabled, but no normals defined - if ((vertexFormat & GeometryArray.NORMALS) == 0) { - // Force lighting to false - normalPresent = false; - } - - } - else if (geo instanceof CompressedGeometryRetained) { - this.vertexFormat = - ((CompressedGeometryRetained)geo).getVertexFormat(); - // Throw an exception if lighting is enabled, but no normals defined - if ((vertexFormat & GeometryArray.NORMALS) == 0) { - // Force lighting to false - normalPresent = false; - } - - this.texCoordSetMapLen = 0; - - } else { - this.vertexFormat = -1; - this.texCoordSetMapLen = 0; - } - - if (material != null) { - if (material.changedFrequent != 0) { - definingMaterial = material; - mask |= MATERIAL_DIRTY; - } - else { - if (definingMaterial != null) - definingMaterial.set(material); - else { - definingMaterial = (MaterialRetained)material.clone(); - } - } - - } - else { - definingMaterial = null; - } - evalMaterialCachedState(); - if (coloringAttributes != null) { - if (coloringAttributes.changedFrequent != 0) { - definingColoringAttributes = coloringAttributes; - mask |= COLORINGATTRS_DIRTY; - } - else { - if (definingColoringAttributes != null) { - definingColoringAttributes.set(coloringAttributes); - } - else { - definingColoringAttributes = (ColoringAttributesRetained)coloringAttributes.clone(); - } - } - red = coloringAttributes.color.x; - green = coloringAttributes.color.y; - blue = coloringAttributes.color.z; - } else { - red = 1.0f; - green = 1.0f; - blue = 1.0f; - definingColoringAttributes = null; - } - - if (transparency != null) { - - if (transparency.changedFrequent != 0) { - definingTransparency = transparency; - mask |= TRANSPARENCY_DIRTY; - } - else { - if (definingTransparency != null) { - definingTransparency.set(transparency); - } - else { - definingTransparency = - (TransparencyAttributesRetained)transparency.clone(); - } - } - alpha = 1.0f - transparency.transparency; - - } else { - alpha = 1.0f; - definingTransparency = null; - - } - - locale = ga.source.locale; - if (locale != renderBin.locale) { - if (localeLocalToVworld == null) { - localeLocalToVworld = new Transform3D[2]; - } - localeLocalToVworld[0] = new Transform3D(); - localeLocalToVworld[1] = new Transform3D(); - localeTranslation = new Vector3d(); - ga.locale.hiRes.difference(renderBin.locale.hiRes, localeTranslation); - translate(); - } - else { - localeLocalToVworld = localToVworld; - } - - if (doInfinite) { - trans = infLocalToVworld; - } - else { - trans = localeLocalToVworld; - } - - evalAlphaUsage(renderAttrs, texUnits); - isOpaqueOrInOG = isOpaque() || (ga.source.orderedPath != null); - inOrderedGroup = (ga.source.orderedPath != null); - // System.err.println("isOpaque = "+isOpaque() +" OrInOG = "+isOpaqueOrInOG); - if (mask != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= mask; - } - } - - - /** - * This tests if the given attributes matches this TextureBin - */ - boolean equals(RenderAtom ra, - PolygonAttributesRetained polygonAttributes, - LineAttributesRetained lineAttributes, - PointAttributesRetained pointAttributes, - MaterialRetained material, - ColoringAttributesRetained coloringAttributes, - TransparencyAttributesRetained transparency, - Transform3D[] transform) { - int geoType = 0; - GeometryAtom ga = ra.geometryAtom; - - if (this.localToVworld != transform) { - return (false); - } - - if (locale != ra.geometryAtom.source.locale) { - return (false); - } - - if (ra.geometryAtom.source.closestSwitchParent != closestSwitchParent || - ra.geometryAtom.source.closestSwitchIndex != closestSwitchIndex) { - return (false); - } - - // Find the first non-null geometey - GeometryRetained geo = null; - int k = 0; - while (geo == null && (k < ga.geometryArray.length)) { - geo = ga.geometryArray[k]; - k++; - } - - // XXXX: Add tags - switch (ga.geoType) { - case GeometryRetained.GEO_TYPE_POINT_SET: - case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET: - geoType = POINT; - 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: - geoType = LINE; - break; - case GeometryRetained.GEO_TYPE_RASTER: - geoType = RASTER; - break; - case GeometryRetained.GEO_TYPE_COMPRESSED: - geoType = COMPRESSED; - switch (((CompressedGeometryRetained)geo).getBufferType()) { - case CompressedGeometryHeader.POINT_BUFFER: - geoType |= POINT ; - break ; - case CompressedGeometryHeader.LINE_BUFFER: - geoType |= LINE ; - break ; - default: - case CompressedGeometryHeader.TRIANGLE_BUFFER: - geoType |= SURFACE ; - break ; - } - break; - default: - geoType = SURFACE; - if (polygonAttributes != null) { - if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_POINT) { - geoType |= POINT; - } else if (polygonAttributes.polygonMode == - PolygonAttributes.POLYGON_LINE) { - geoType |= LINE; - } - } - break; - } - - if (this.geometryType != geoType) { - return (false); - } - /* - // XXXX : Check this - if (useDisplayList && - (ga.geometry.isEditable || - ga.geometry.refCount > 1 || - ((GroupRetained)ga.source.parent).switchLevel >= 0 || - ga.alphaEditable)) { - return (false); - } - */ - if (ga.geoType == GeometryRetained.GEO_TYPE_TEXT3D && - primaryMoleculeType != 0 && - ((primaryMoleculeType & TEXT3D_MOLECULE) == 0)) { - return (false); - } - - - if(!(ra.geometryAtom.source instanceof OrientedShape3DRetained) - && ((primaryMoleculeType & ORIENTEDSHAPE3D_MOLECULE) != 0)) { - //System.err.println("RA's NOT a OrientedShape3DRetained and RM is a ORIENTEDSHAPE3D_MOLECULE "); - - return (false); - } - - // XXXX: Its is necessary to have same vformat for dl, - // Howabout iteration, should we have 2 vformats in rm? - if (geo instanceof GeometryArrayRetained) { - GeometryArrayRetained gr = (GeometryArrayRetained)geo; - if (this.vertexFormat != gr.vertexFormat) { - return (false); - } - - - // we are requiring that texCoordSetMap length to be the same - // so that we can either put all multi-tex ga to a display list, - // or punt all to vertex array. And we don't need to worry - // about some of the ga can be in display list for this canvas, - // and some other can be in display list for the other canvas. - if (((gr.texCoordSetMap != null) && - (this.texCoordSetMapLen != gr.texCoordSetMap.length)) || - ((gr.texCoordSetMap == null) && (this.texCoordSetMapLen != 0))) { - return (false); - } - - } else if (geo instanceof CompressedGeometryRetained) { - if (this.vertexFormat != - ((CompressedGeometryRetained)geo).getVertexFormat()) { - return (false); - } - } else { - //XXXX: compare isEditable - if (this.vertexFormat != -1) { - return (false); - } - } - - // If the any reference to the appearance components that is cached renderMolecule - // can change frequently, make a separate bin - if (soleUser || (ra.geometryAtom.source.appearance != null && - ((ra.geometryAtom.source.appearance.changedFrequent & RM_COMPONENTS) != 0))) { - if (appHandle == ra.geometryAtom.source.appearance) { - - // if this RenderMolecule is currently on a zombie state, - // we'll need to put it on the update list to reevaluate - // the state, because while it is on a zombie state, - // state could have been changed. Example, - // application could have detached an appearance, - // made changes to the appearance state, and then - // reattached the appearance. In this case, the - // changes would not have reflected to the RenderMolecule - - if (numEditingRenderAtoms == 0) { - - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= ALL_DIRTY_BITS; - } - return true; - } - else { - return false; - } - - } - // Assign the cloned value as the original value - - // Either a changedFrequent or a null case - // and the incoming one is not equal or null - // then return; - // This check also handles null == null case - if (definingPolygonAttributes != null) { - if ((this.definingPolygonAttributes.changedFrequent != 0) || - (polygonAttributes !=null && polygonAttributes.changedFrequent != 0)) - if (definingPolygonAttributes == polygonAttributes) { - if (definingPolygonAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= POLYGONATTRS_DIRTY; - } - } - else { - return false; - } - else if (!definingPolygonAttributes.equivalent(polygonAttributes)) { - return false; - } - } - else if (polygonAttributes != null) { - return false; - } - - if (definingLineAttributes != null) { - if ((this.definingLineAttributes.changedFrequent != 0) || - (lineAttributes !=null && lineAttributes.changedFrequent != 0)) - if (definingLineAttributes == lineAttributes) { - if (definingLineAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= LINEATTRS_DIRTY; - } - } - else { - return false; - } - else if (!definingLineAttributes.equivalent(lineAttributes)) { - return false; - } - } - else if (lineAttributes != null) { - return false; - } - - - if (definingPointAttributes != null) { - if ((this.definingPointAttributes.changedFrequent != 0) || - (pointAttributes !=null && pointAttributes.changedFrequent != 0)) - if (definingPointAttributes == pointAttributes) { - if (definingPointAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= POINTATTRS_DIRTY; - } - } - else { - return false; - } - else if (!definingPointAttributes.equivalent(pointAttributes)) { - return false; - } - } - else if (pointAttributes != null) { - return false; - } - - - - - if (definingMaterial != null) { - if ((this.definingMaterial.changedFrequent != 0) || - (material !=null && material.changedFrequent != 0)) - if (definingMaterial == material) { - if (definingMaterial.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= MATERIAL_DIRTY; - } - } - else { - return false; - } - else if (!definingMaterial.equivalent(material)) { - return false; - } - } - else if (material != null) { - return false; - } - - - - if (definingColoringAttributes != null) { - if ((this.definingColoringAttributes.changedFrequent != 0) || - (coloringAttributes !=null && coloringAttributes.changedFrequent != 0)) - if (definingColoringAttributes == coloringAttributes) { - if (definingColoringAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= COLORINGATTRS_DIRTY; - } - } - else { - return false; - } - else if (!definingColoringAttributes.equivalent(coloringAttributes)) { - return false; - } - } - else if (coloringAttributes != null) { - return false; - } - - // if the definingTransparency is a non cloned values and the incoming - // one is equivalent, then check if the component is dirty - // this happens when all the RAs from this RM have been removed - // but new ones are not added yet (rbin visibility) not run yet - // and when there is a change in nc based on the new RA, we wil; - // miss the change, doing this check will catch the change durin - // new RAs insertRenderAtom - if (definingTransparency != null) { - if ((this.definingTransparency.changedFrequent != 0) || - (transparency !=null && transparency.changedFrequent != 0)) - if (definingTransparency == transparency) { - if (definingTransparency.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= TRANSPARENCY_DIRTY; - } - } - else { - return false; - } - else if (!definingTransparency.equivalent(transparency)) { - return false; - } - } - else if (transparency != null) { - return false; - } - - return (true); - } - - public void updateRemoveRenderAtoms() { - RenderAtom r; - RenderAtomListInfo rinfo; - - // Check if this renderMolecule was created and destroyed this frame. - // so, no display list was created - if (numRenderAtoms == 0 && removeRAs == null && addRAs == null) { - textureBin.removeRenderMolecule(this); - return; - } - - while (removeRAs != null) { - r = removeRAs; - r.removed = null; - numRenderAtoms--; - - // Loop thru all geometries in the renderAtom, they could - // potentially be in different buckets in the rendermoleulce - for (int index = 0; index < r.rListInfo.length; index++) { - rinfo = r.rListInfo[index]; - // Don't remove null geo - if (rinfo.geometry() == null) - continue; - - if ((rinfo.groupType & RenderAtom.PRIMARY) != 0) { - primaryChanged = true; - if (rinfo.prev == null) { // At the head of the list - primaryRenderAtomList = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = null; - } - } else { // In the middle or at the end. - rinfo.prev.next = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = rinfo.prev; - } - } - - // If the molecule type is Raster, then add it to the lock list - if (primaryMoleculeType == RASTER) { - RasterRetained geo = (RasterRetained)rinfo.geometry(); - renderBin.removeGeometryFromLockList(geo); - if (geo.image != null) - renderBin.removeNodeComponent(geo.image); - - } - else if ((rinfo.groupType & RenderAtom.SEPARATE_DLIST_PER_RINFO) != 0) { - if (!rinfo.renderAtom.inRenderBin()) { - renderBin.removeDlistPerRinfo.add(rinfo); - } - } - } - else if ((rinfo.groupType & RenderAtom.SEPARATE_DLIST_PER_GEO) != 0) { - if (rinfo.prev == null) { // At the head of the list - separateDlistRenderAtomList = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = null; - } - } else { // In the middle or at the end. - rinfo.prev.next = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = rinfo.prev; - } - } - renderBin.removeGeometryDlist(rinfo); - - } - else { - if (rinfo.prev == null) { // At the head of the list - vertexArrayRenderAtomList = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = null; - } - } else { // In the middle or at the end. - rinfo.prev.next = rinfo.next; - if (rinfo.next != null) { - rinfo.next.prev = rinfo.prev; - } - } - // For indexed geometry there is no need to lock since - // the mirror is changed only when the renderer is not - // running - // For indexed geometry, if use_coord is set, then either we - // are using the index geometry as is or we will be unindexifying - // on the fly, so its better to lock - GeometryArrayRetained geo = (GeometryArrayRetained)rinfo.geometry(); - if (!(geo instanceof IndexedGeometryArrayRetained) || - ((geo.vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0)) { - renderBin.removeGeometryFromLockList(geo); - } - } - rinfo.prev = null; - rinfo.next = null; - } - removeRAs = removeRAs.nextRemove; - r.nextRemove = null; - r.prevRemove = null; - if (r.isOriented()) { - renderBin.orientedRAs.remove(r); - } - - if ((textureBin.environmentSet.lightBin.geometryBackground == null) && - !isOpaqueOrInOG && renderBin.transpSortMode == View.TRANSPARENCY_SORT_GEOMETRY) { - renderBin.removeTransparentObject(r); - } - } - // If this renderMolecule will not be touched for adding new RenderAtoms - // then .. - if (addRAs == null) { - // If there are no more renderAtoms and there will be no more - // renderatoms added to this renderMolecule , then remove - if (numRenderAtoms == 0) { - // If both lists are empty remove this renderMolecule - if ((primaryMoleculeType &DLIST_MOLECULE) != 0) { - renderBin.addDisplayListResourceFreeList(this); - vwcBounds.set(null); - displayListId = 0; - displayListIdObj = null; - } - if (locale != renderBin.locale) { - localeLocalToVworld = null; - } - textureBin.removeRenderMolecule(this); - } else { - if ((primaryMoleculeType &DLIST_MOLECULE) != 0 && primaryChanged) { - - // If a renderAtom is added to the display list - // structure then add this to the dirty list of rm - // for which the display list needs to be recreated - renderBin.addDirtyRenderMolecule(this); - vwcBounds.set(null); - rinfo = primaryRenderAtomList; - while (rinfo != null) { - vwcBounds.combine(rinfo.renderAtom.localeVwcBounds); - rinfo = rinfo.next; - } - primaryChanged = false; - } - } - } - numEditingRenderAtoms = numRenderAtoms; - } - - @Override - public void updateObject() { - int i; - RenderAtom renderAtom; - RenderAtomListInfo r; - if (textureBin == null) { - return; - } - - if (addRAs != null) { - while (addRAs != null) { - - numRenderAtoms++; - renderAtom = addRAs; - renderAtom.renderMolecule = this; - renderAtom.added = null; - for (int j = 0; j < renderAtom.rListInfo.length; j++) { - r = renderAtom.rListInfo[j]; - // Don't add null geo - if (r.geometry() == null) - continue; - r.groupType = evalRinfoGroupType(r); - if ((r.groupType & RenderAtom.PRIMARY) != 0) { - if ((r.groupType & RenderAtom.DLIST) != 0 && primaryRenderMethod == null) { - primaryMoleculeType = DLIST_MOLECULE; - renderBin.renderMoleculeList.add(this); - - if (vwcBounds == null) - vwcBounds = new BoundingBox((BoundingBox)null); - primaryRenderMethod = - VirtualUniverse.mc.getDisplayListRenderMethod(); - // Assign a displayListId for this renderMolecule - if (displayListId == 0) { - displayListIdObj = VirtualUniverse.mc.getDisplayListId(); - displayListId = displayListIdObj.intValue(); - } - } - else if ((r.groupType & RenderAtom.SEPARATE_DLIST_PER_RINFO) != 0 && - primaryRenderMethod == null) { - primaryMoleculeType = SEPARATE_DLIST_PER_RINFO_MOLECULE; - renderBin.renderMoleculeList.add(this); - primaryRenderMethod = - VirtualUniverse.mc.getDisplayListRenderMethod(); - - } - primaryChanged = true; - if (primaryRenderAtomList == null) { - primaryRenderAtomList = r; - } - else { - r.next = primaryRenderAtomList; - primaryRenderAtomList.prev = r; - primaryRenderAtomList = r; - } - if (primaryMoleculeType == SEPARATE_DLIST_PER_RINFO_MOLECULE) { - if (r.renderAtom.dlistIds == null) { - r.renderAtom.dlistIds = new int[r.renderAtom.rListInfo.length]; - - for (int k = 0; k < r.renderAtom.dlistIds.length; k++) { - r.renderAtom.dlistIds[k] = -1; - } - } - if (r.renderAtom.dlistIds[r.index] == -1) { - r.renderAtom.dlistIds[r.index] = VirtualUniverse.mc.getDisplayListId().intValue(); - renderBin.addDlistPerRinfo.add(r); - } - } - - // If the molecule type is Raster, then add it to the lock list - if (primaryMoleculeType == RASTER) { - RasterRetained geo = (RasterRetained)r.geometry(); - renderBin.addGeometryToLockList(geo); - if (geo.image != null) - renderBin.addNodeComponent(geo.image); - } - } - else if ((r.groupType & RenderAtom.SEPARATE_DLIST_PER_GEO) != 0) { - if (separateDlistRenderAtomList == null) { - separateDlistRenderAtomList = r; - } - else { - r.next = separateDlistRenderAtomList; - separateDlistRenderAtomList.prev = r; - separateDlistRenderAtomList = r; - } - ((GeometryArrayRetained)r.geometry()).assignDlistId(); - renderBin.addGeometryDlist(r); - } - else { - if (secondaryRenderMethod == null) - secondaryRenderMethod = cachedVertexArrayRenderMethod; - if (vertexArrayRenderAtomList == null) { - vertexArrayRenderAtomList = r; - } - else { - r.next = vertexArrayRenderAtomList; - vertexArrayRenderAtomList.prev = r; - vertexArrayRenderAtomList = r; - } - // For indexed geometry there is no need to lock since - // the mirror is changed only when the renderer is not - // running - // For indexed geometry, if use_coord is set, then either we - // are using the index geometry as is or we will be unindexifying - // on the fly, so its better to loc - GeometryArrayRetained geo = (GeometryArrayRetained)r.geometry(); - if (!(geo instanceof IndexedGeometryArrayRetained) || - ((geo.vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0)) { - renderBin.addGeometryToLockList(geo); - // Add the geometry to the dirty list only if the geometry is by - // refernce and there is color and we need to use alpha - // Issue 113 - ignore multiScreen - if ((( geo.vertexFormat & GeometryArray.BY_REFERENCE)!=0) && - (geo.c4fAllocated == 0) && - ((geo.vertexFormat & GeometryArray.COLOR) != 0) && - useAlpha) { - renderBin.addDirtyReferenceGeometry(geo); - } - } - } - } - addRAs = addRAs.nextAdd; - renderAtom.nextAdd = null; - renderAtom.prevAdd = null; - if (renderAtom.isOriented()) { - renderBin.orientedRAs.add(renderAtom); - - } - // If transparent and not in bg geometry and is depth sorted transparency - if (!isOpaqueOrInOG && (textureBin.environmentSet.lightBin.geometryBackground == null)&& - (renderBin.transpSortMode == View.TRANSPARENCY_SORT_GEOMETRY)) { - GeometryRetained geo = null; - int k = 0; - while (geo == null && k < renderAtom.rListInfo.length) { - geo = renderAtom.rListInfo[k].geometry(); - k++; - } - if (geo != null) { - if (renderAtom.parentTInfo != null && renderAtom.parentTInfo[k-1] != null) { - renderBin.updateTransparentInfo(renderAtom); - } - // Newly added renderAtom - else { - renderBin.addTransparentObject(renderAtom); - } - } - // Moving within the renderBin - - } - } - - if ((primaryMoleculeType &DLIST_MOLECULE) != 0 && primaryChanged) { - - // If a renderAtom is added to the display list - // structure then add this to the dirty list of rm - // for which the display list needs to be recreated - renderBin.addDirtyRenderMolecule(this); - vwcBounds.set(null); - r = primaryRenderAtomList; - while (r != null) { - vwcBounds.combine(r.renderAtom.localeVwcBounds); - r = r.next; - } - primaryChanged = false; - } - - - if ((onUpdateList & LOCALE_CHANGED) != 0) { - handleLocaleChange(); - } - - if (locale != renderBin.locale) { - translate(); - } - } - else { - // The flag LOCALE_CHANGED only gets sets when there is a new additon - // There are cases when RM updateObject() get called (due to addition - // in renderBin - see processTransformChanged()), we need to - // evaluate locale change for this case as well - if (renderBin.localeChanged) { - handleLocaleChange(); - } - - if (locale != renderBin.locale) { - translate(); - } - - if ((onUpdateList & UPDATE_BACKGROUND_TRANSFORM) != 0) { - i = localToVworldIndex[NodeRetained.LAST_LOCAL_TO_VWORLD]; - localeLocalToVworld[i].getRotation(infLocalToVworld[i]); - } - - // No new renderAtoms were added, but need to - // recompute vwcBounds in response to xform change - if ((onUpdateList & BOUNDS_RECOMPUTE_UPDATE) != 0) { - vwcBounds.set(null); - r = primaryRenderAtomList; - while (r != null) { - vwcBounds.combine(r.renderAtom.localeVwcBounds); - r = r.next; - } - } - } - - // Clear all bits except the IN_DIRTY_LIST - onUpdateList &= IN_DIRTY_RENDERMOLECULE_LIST; - - numEditingRenderAtoms = numRenderAtoms; - } - - boolean canBeInDisplayList(GeometryRetained geo, GeometryAtom ga) { - if (ga.source.sourceNode instanceof MorphRetained) { - return false; - } - - return geo.canBeInDisplayList(ga.alphaEditable); - } - - // If dlist will be altered due to alpha or ignoreVertexColors, then don't - // put in a separate dlist that can be shared ... - final boolean geoNotAltered(GeometryArrayRetained geo) { - return !(((geo.vertexFormat & GeometryArray.COLOR) != 0) && - (textureBin.attributeBin.ignoreVertexColors || useAlpha)); - } - - int evalRinfoGroupType(RenderAtomListInfo r) { - int groupType = 0; - - GeometryRetained geo = r.geometry(); - if (geo == null) - return groupType; - - if ((primaryMoleculeType & (COMPRESSED_MOLECULE | - RASTER_MOLECULE | - TEXT3D_MOLECULE | - ORIENTEDSHAPE3D_MOLECULE)) != 0) { - groupType = RenderAtom.OTHER; - } - else if (canBeInDisplayList(geo, r.renderAtom.geometryAtom)) { - // if geometry is under share group we immediate set the - // dlistID to something other than -1 - if ( !((GeometryArrayRetained)geo).isShared || - // if we do a compiled and push the transform down to - // Geometry, we can't share the displayList - (r.renderAtom.geometryAtom.source.staticTransform != null)) { - // If the molecule is already defined to be SEPARATE_DLIST_PER_RINFO_MOLECULE - // continue adding in that mode even if it was switched back to - // no depth sorted mode - // System.err.println("isOpaqueOrInOG ="+isOpaqueOrInOG+" primaryMoleculeType ="+primaryMoleculeType+" renderBin.transpSortMode ="+renderBin.transpSortMode); - if (primaryMoleculeType == SEPARATE_DLIST_PER_RINFO_MOLECULE) { - groupType = RenderAtom.SEPARATE_DLIST_PER_RINFO; - } - else { - if (isOpaqueOrInOG || - renderBin.transpSortMode == View.TRANSPARENCY_SORT_NONE) { - groupType = RenderAtom.DLIST; - } - else { - groupType = RenderAtom.SEPARATE_DLIST_PER_RINFO; - } - } - - } else if (geoNotAltered((GeometryArrayRetained)r.geometry()) ) { - groupType = RenderAtom.SEPARATE_DLIST_PER_GEO; - } - else { - groupType = RenderAtom.VARRAY; - } - } - else { - groupType = RenderAtom.VARRAY; - } - return groupType; - } - - /** - * Adds the given RenderAtom to this RenderMolecule. - */ - void addRenderAtom(RenderAtom renderAtom, RenderBin rb) { - int i; - - renderAtom.envSet = textureBin.environmentSet; - renderAtom.renderMolecule = this; - renderAtom.dirtyMask &= ~RenderAtom.NEED_SEPARATE_LOCALE_VWC_BOUNDS; - - AppearanceRetained raApp = renderAtom.geometryAtom.source.appearance; - - MaterialRetained mat = (raApp == null)? null : raApp.material; - if (!soleUser && material != mat) { - // no longer sole user - material = definingMaterial; - } - - if ((geometryType & SURFACE) != 0) { - PolygonAttributesRetained pgAttrs = - (raApp == null)? null : raApp.polygonAttributes; - if (!soleUser && polygonAttributes != pgAttrs) { - // no longer sole user - polygonAttributes = definingPolygonAttributes; - } - - } - if ((geometryType & LINE) != 0) { - LineAttributesRetained lnAttrs = - (raApp == null)? null : raApp.lineAttributes; - if (!soleUser && lineAttributes != lnAttrs) { - // no longer sole user - lineAttributes = definingLineAttributes; - } - - } - if ((geometryType & POINT) != 0) { - PointAttributesRetained pnAttrs = - (raApp == null)? null : raApp.pointAttributes; - if (!soleUser && pointAttributes != pnAttrs) { - // no longer sole user - pointAttributes = definingPointAttributes; - } - } - - ColoringAttributesRetained coAttrs = - (raApp == null)? null : raApp.coloringAttributes; - if (!soleUser && coloringAttributes != coAttrs) { - // no longer sole user - coloringAttributes = definingColoringAttributes; - } - - TransparencyAttributesRetained trAttrs = - (raApp == null)? null : raApp.transparencyAttributes; - if (!soleUser && transparency != trAttrs) { - // no longer sole user - transparency = definingTransparency; - } - - - - // If the renderAtom is being inserted first time, then evaluate - // the groupType to determine if need separate localeVwcBounds - if (!renderAtom.inRenderBin()) { - for (i = 0; i < renderAtom.rListInfo.length; i++) { - if (renderAtom.rListInfo[i].geometry() == null) - continue; - int groupType = evalRinfoGroupType(renderAtom.rListInfo[i]); - if (groupType != RenderAtom.DLIST) { - renderAtom.dirtyMask |= RenderAtom.NEED_SEPARATE_LOCALE_VWC_BOUNDS; - } - } - } - if (renderAtom.removed == this) { - // Remove the renderAtom from the list of removeRAs - // If this is at the head of the list - if (renderAtom == removeRAs) { - removeRAs = renderAtom.nextRemove; - if (removeRAs != null) - removeRAs.prevRemove = null; - renderAtom.nextRemove = null; - renderAtom.prevRemove = null; - } - // Somewhere in the middle - else { - renderAtom.prevRemove.nextRemove = renderAtom.nextRemove; - if (renderAtom.nextRemove != null) - renderAtom.nextRemove.prevRemove = renderAtom.prevRemove; - renderAtom.nextRemove = null; - renderAtom.prevRemove = null; - } - - renderAtom.removed = null; - // Redo any dlist etc, because it has been added - for ( i = 0; i < renderAtom.rListInfo.length; i++) { - if (renderAtom.rListInfo[i].geometry() == null) - continue; - if ((renderAtom.rListInfo[i].groupType & RenderAtom.DLIST) != 0) - renderBin.addDirtyRenderMolecule(this); - else if ((renderAtom.rListInfo[i].groupType & RenderAtom.SEPARATE_DLIST_PER_RINFO) != 0) { - renderBin.addDlistPerRinfo.add(renderAtom.rListInfo[i]); - } - else if ((renderAtom.rListInfo[i].groupType & RenderAtom.SEPARATE_DLIST_PER_GEO) != 0) - renderBin.addGeometryDlist(renderAtom.rListInfo[i]); - - } - if (removeRAs == null) - rb.removeRenderAtomInRMList.remove(this); - } - else { - // Add this renderAtom to the addList - if (addRAs == null) { - addRAs = renderAtom; - renderAtom.nextAdd = null; - renderAtom.prevAdd = null; - } - else { - renderAtom.nextAdd = addRAs; - renderAtom.prevAdd = null; - addRAs.prevAdd = renderAtom; - addRAs = renderAtom; - } - renderAtom.added = this; - if (onUpdateList == 0) - rb.objUpdateList.add(this); - onUpdateList |= NEW_RENDERATOMS_UPDATE; - - } - if (renderBin.localeChanged && !doInfinite) { - if (onUpdateList == 0) - rb.objUpdateList.add(this); - onUpdateList |= LOCALE_CHANGED; - } - - // inform the texture bin that this render molecule is no longer - // in zombie state - - if (numEditingRenderAtoms == 0) { - textureBin.incrActiveRenderMolecule(); - } - numEditingRenderAtoms++; - } - - /** - * Removes the given RenderAtom from this RenderMolecule. - */ - void removeRenderAtom(RenderAtom r) { - - r.renderMolecule = null; - if (r.added == this) { - //Remove this renderAtom from the addRAs list - - // If this is at the head of the list - if (r == addRAs) { - addRAs = r.nextAdd; - if (addRAs != null) - addRAs.prevAdd = null; - r.nextAdd = null; - r.prevAdd = null; - } - // Somewhere in the middle - else { - r.prevAdd.nextAdd = r.nextAdd; - if (r.nextAdd != null) - r.nextAdd.prevAdd = r.prevAdd; - r.nextAdd = null; - r.prevAdd = null; - } - - r.added = null; - r.envSet = null; - // If the number of renderAtoms is zero, and it is on the - // update list for adding new renderatroms only (not for - // bounds update), then remove this rm from the update list - - // Might be expensive to remove this entry from the renderBin - // objUpdateList, just let it call the renderMolecule - /* - if (addRAs == null) { - if (onUpdateList == NEW_RENDERATOMS_UPDATE){ - renderBin.objUpdateList.remove(renderBin.objUpdateList.indexOf(this)); - } - onUpdateList &= ~NEW_RENDERATOMS_UPDATE; - } - */ - - } - else { - // Add this renderAtom to the remove list - if (removeRAs == null) { - removeRAs = r; - r.nextRemove = null; - r.prevRemove = null; - } - else { - r.nextRemove = removeRAs; - r.prevRemove = null; - removeRAs.prevRemove = r; - removeRAs = r; - } - r.removed = this; - } - - // Add it to the removeRenderAtom List , in case the renderMolecule - // needs to be removed - if (!renderBin.removeRenderAtomInRMList.contains(this)) { - renderBin.removeRenderAtomInRMList.add(this); - } - - // decrement the number of editing render atoms in this render molecule - numEditingRenderAtoms--; - - // if there is no more editing render atoms, inform the texture bin - // that this render molecule is going to zombie state - - if (numEditingRenderAtoms == 0) { - textureBin.decrActiveRenderMolecule(); - } - } - - /** - * Recalculates the vwcBounds for a RenderMolecule - */ - void recalcBounds() { - RenderAtomListInfo ra; - - if (primaryRenderMethod == - VirtualUniverse.mc.getDisplayListRenderMethod()) { - vwcBounds.set(null); - ra = primaryRenderAtomList; - while (ra != null) { - vwcBounds.combine(ra.renderAtom.localeVwcBounds); - ra = ra.next; - } - } - } - - void evalAlphaUsage(RenderingAttributesRetained renderAttrs, - TextureUnitStateRetained[] texUnits) { - boolean alphaBlend, alphaTest, textureBlend = false; - - alphaBlend = TransparencyAttributesRetained.useAlpha(definingTransparency); - - if (texUnits != null) { - for (int i = 0; - textureBlend == false && i < texUnits.length; - i++) { - if (texUnits[i] != null && - texUnits[i].texAttrs != null) { - textureBlend = textureBlend || - (texUnits[i].texAttrs.textureMode == - TextureAttributes.BLEND); - } - } - } - - alphaTest = - renderAttrs != null && renderAttrs.alphaTestFunction != RenderingAttributes.ALWAYS; - - boolean oldUseAlpha = useAlpha; - useAlpha = alphaBlend || alphaTest || textureBlend; - - if( !oldUseAlpha && useAlpha) { - GeometryArrayRetained geo = null; - - if(vertexArrayRenderAtomList != null) - geo = (GeometryArrayRetained)vertexArrayRenderAtomList.geometry(); - - if(geo != null) { - if (!(geo instanceof IndexedGeometryArrayRetained) || - ((geo.vertexFormat & GeometryArray.USE_COORD_INDEX_ONLY) != 0)) { - renderBin.addGeometryToLockList(geo); - // Add the geometry to the dirty list only if the geometry is by - // reference and there is color and we need to use alpha - // Issue 113 - ignore multiScreen - if ((( geo.vertexFormat & GeometryArray.BY_REFERENCE)!=0) && - (geo.c4fAllocated == 0) && - ((geo.vertexFormat & GeometryArray.COLOR) != 0) && - useAlpha) { - renderBin.addDirtyReferenceGeometry(geo); - } - } - } - } - } - - final boolean isSwitchOn() { - // The switchOn status of the entire RM can be determined - // by the switchOn status of any renderAtoms below. - // This is possible because renderAtoms generated from a common - // switch branch are placed in the same renderMolecule - if (primaryRenderAtomList != null) { - return primaryRenderAtomList.renderAtom.geometryAtom. - source.switchState.lastSwitchOn; - - } - - if (vertexArrayRenderAtomList != null) { - return vertexArrayRenderAtomList.renderAtom.geometryAtom. - source.switchState.lastSwitchOn; - - } - - if (separateDlistRenderAtomList != null) { - return separateDlistRenderAtomList.renderAtom.geometryAtom. - source.switchState.lastSwitchOn; - } - return false; - } - - /** - * Renders this RenderMolecule - */ - boolean render(Canvas3D cv, int pass, int dirtyBits) { - assert pass < 0; - - boolean isVisible = isSwitchOn(); - - if (!isVisible) { - return false; - } - - isVisible = false; - - // include this LightBin to the to-be-updated list in Canvas - cv.setStateToUpdate(Canvas3D.RENDERMOLECULE_BIT, this); - - boolean modeSupportDL = true; - isNonUniformScale = !trans[localToVworldIndex[NodeRetained.LAST_LOCAL_TO_VWORLD]].isCongruent(); - // We have to dynamically switch between using displaymode - // mode or not instead of decide in canBeInDisplayList(), - // since polygonAttribute can be change by editable Appearance - // or editable polygonAttribute which mode we can't take - // advantage of display list mode in many cases just because - // there are three special cases to handle. - - // Another case for punting to vertex array is if pass specifies - // something other than -1. That means, we are in the - // multi-texturing multi-pass case. Then we'll use vertex array - // instead. Or the length of the texCoordSetMap is greater than - // the number of texture units supported by the Canvas, then - // we'll have to punt to vertex array as well. - - if ((pass != TextureBin.USE_DISPLAYLIST) || - (texCoordSetMapLen > cv.maxTexCoordSets)) { - modeSupportDL = false; - } - - /* - System.err.println("texCoord " + texCoordSetMapLen + " " + - cv.maxTexCoordSets + " " + modeSupportDL); - - System.err.println("primaryMoleculeType = "+primaryMoleculeType+" primaryRenderAtomList ="+primaryRenderAtomList+" separateDlistRenderAtomList ="+separateDlistRenderAtomList+" vertexArrayRenderAtomList ="+vertexArrayRenderAtomList); - */ - // Send down the model view only once, if its not of type text - if ((primaryMoleculeType & (TEXT3D_MOLECULE| ORIENTEDSHAPE3D_MOLECULE)) == 0) { - - if (primaryRenderAtomList != null) { - if ((primaryRenderMethod != VirtualUniverse.mc.getDisplayListRenderMethod()) || - modeSupportDL) { - if (primaryMoleculeType != SEPARATE_DLIST_PER_RINFO_MOLECULE) { - - if (primaryRenderMethod.render(this, cv, primaryRenderAtomList,dirtyBits)) - isVisible = true; - } - else { - if (renderBin.dlistRenderMethod.renderSeparateDlistPerRinfo(this, cv, primaryRenderAtomList,dirtyBits)) - isVisible = true; - - } - } else { - if(cachedVertexArrayRenderMethod.render(this, cv, - primaryRenderAtomList, - dirtyBits)) { - isVisible = true; - } - } - } - } - else { // TEXT3D or ORIENTEDSHAPE3D - - if (primaryRenderAtomList != null) { - if(primaryRenderMethod.render(this, cv, primaryRenderAtomList, - dirtyBits)) { - isVisible = true; - } - } - } - - if (separateDlistRenderAtomList != null) { - if (modeSupportDL) { - if(renderBin.dlistRenderMethod.renderSeparateDlists(this, cv, - separateDlistRenderAtomList, - dirtyBits)) { - isVisible = true; - } - - } else { - if(cachedVertexArrayRenderMethod.render(this, cv, - separateDlistRenderAtomList, - dirtyBits)) { - isVisible = true; - } - } - - } - - // XXXX: In the case of independent primitives such as quads, - // it would still be better to call multi draw arrays - if (vertexArrayRenderAtomList != null) { - if(cachedVertexArrayRenderMethod.render(this, cv, - vertexArrayRenderAtomList, - dirtyBits)) { - isVisible = true; - } - } - return isVisible; - } - - void updateAttributes(Canvas3D cv, int dirtyBits) { - - - boolean setTransparency = false; - - // If this is a beginning of a frame OR diff. geometryType - // then reload everything for the first rendermolecule - // System.err.println("updateAttributes"); - int bitMask = geometryType | Canvas3D.MATERIAL_DIRTY| - Canvas3D.COLORINGATTRS_DIRTY| - Canvas3D.TRANSPARENCYATTRS_DIRTY; - - // If beginning of a frame then reload all the attributes - if ((cv.canvasDirty & bitMask) != 0) { - if ((geometryType & SURFACE) != 0) { - if (definingPolygonAttributes == null) { - cv.resetPolygonAttributes(cv.ctx); - } else { - definingPolygonAttributes.updateNative(cv.ctx); - } - cv.polygonAttributes = polygonAttributes; - } - if ((geometryType & LINE) != 0) { - if (definingLineAttributes == null) { - cv.resetLineAttributes(cv.ctx); - } else { - definingLineAttributes.updateNative(cv.ctx); - } - cv.lineAttributes = lineAttributes; - } - if ((geometryType & POINT) != 0) { - if (definingPointAttributes == null) { - cv.resetPointAttributes(cv.ctx); - } else { - definingPointAttributes.updateNative(cv.ctx); - } - cv.pointAttributes = pointAttributes; - } - - if (definingTransparency == null) { - cv.resetTransparency(cv.ctx, geometryType, - polygonMode, lineAA, pointAA); - } else { - definingTransparency.updateNative(cv.ctx, - alpha, geometryType, - polygonMode, lineAA, - pointAA); - } - cv.transparency = transparency; - - if (definingMaterial == null) { - cv.updateMaterial(cv.ctx, red, green, blue, alpha); - } else { - definingMaterial.updateNative(cv.ctx, - red, green, blue, alpha, - enableLighting); - } - cv.material = material; - cv.enableLighting = enableLighting; - - if (definingColoringAttributes == null) { - cv.resetColoringAttributes(cv.ctx, red, green, blue, - alpha, enableLighting); - } else { - definingColoringAttributes.updateNative(cv.ctx, - dRed, - dBlue, - dGreen,alpha, - enableLighting); - } - cv.coloringAttributes = coloringAttributes; - - // Use Object instead of AppearanceRetained class for - // state caching optimation for memory performance - cv.appHandle = appHandle; - } - - // assuming neighbor dirty bits ORing is implemented - // note that we need to set it to ALL_DIRTY at the - // begining of textureBin first and only do the ORing - // whenever encounter a non-visible rm - - else if (cv.renderMolecule != this && (dirtyBits != 0)) { - - // no need to download states if appHandle is the same - if (cv.appHandle != appHandle) { - - // Check if the attribute bundle in the canvas is the same - // as the attribute bundle in this renderMolecule - - if (cv.transparency != transparency && - (dirtyBits & TRANSPARENCY_DIRTY) != 0) { - setTransparency = true; - if (definingTransparency == null) { - - cv.resetTransparency(cv.ctx, geometryType, - polygonMode, lineAA, pointAA); - } else { - definingTransparency.updateNative(cv.ctx, alpha, - geometryType, polygonMode, - lineAA, pointAA); - } - cv.transparency = transparency; - } - - if (setTransparency || ((cv.enableLighting != enableLighting) || - (cv.material != material) && - (dirtyBits & MATERIAL_DIRTY) != 0)){ - if (definingMaterial == null) { - cv.updateMaterial(cv.ctx, red, green, blue, alpha); - } else { - definingMaterial.updateNative(cv.ctx, red, green, - blue, alpha, - enableLighting); - } - cv.material = material; - cv.enableLighting = enableLighting; - } - - if (((geometryType & SURFACE) != 0) && - cv.polygonAttributes != polygonAttributes && - (dirtyBits & POLYGONATTRS_DIRTY) != 0) { - - if (definingPolygonAttributes == null) { - cv.resetPolygonAttributes(cv.ctx); - } else { - definingPolygonAttributes.updateNative(cv.ctx); - } - cv.polygonAttributes = polygonAttributes; - } - - if (((geometryType & LINE) != 0) && - cv.lineAttributes != lineAttributes && - (dirtyBits & LINEATTRS_DIRTY) != 0) { - - if (definingLineAttributes == null) { - cv.resetLineAttributes(cv.ctx); - } else { - definingLineAttributes.updateNative(cv.ctx); - } - cv.lineAttributes = lineAttributes; - } - - if (((geometryType & POINT) != 0) && - cv.pointAttributes != pointAttributes && - (dirtyBits & POINTATTRS_DIRTY) != 0) { - - if (definingPointAttributes == null) { - cv.resetPointAttributes(cv.ctx); - } else { - definingPointAttributes.updateNative(cv.ctx); - } - cv.pointAttributes = pointAttributes; - } - - // Use Object instead of AppearanceRetained class for - // state caching optimation for memory performance - cv.appHandle = appHandle; - } - // no state caching for color attrs, which can also be - // changed by primitive with colors - if(setTransparency || ((dirtyBits & COLORINGATTRS_DIRTY) != 0)) { - - if (definingColoringAttributes == null) { - cv.resetColoringAttributes(cv.ctx, - red, green, blue, alpha, - enableLighting); - } else { - definingColoringAttributes.updateNative(cv.ctx, - dRed, - dBlue, - dGreen,alpha, - enableLighting); - - } - cv.coloringAttributes = coloringAttributes; - } - - } - - if ((primaryMoleculeType & (TEXT3D_MOLECULE| ORIENTEDSHAPE3D_MOLECULE)) == 0) { - /* System.err.println("updateAttributes setModelViewMatrix (1)"); */ - - Transform3D modelMatrix = - trans[localToVworldIndex[NodeRetained.LAST_LOCAL_TO_VWORLD]]; - - if (cv.modelMatrix != modelMatrix) { - /* System.err.println("updateAttributes setModelViewMatrix (2)"); */ - - cv.setModelViewMatrix(cv.ctx, cv.vworldToEc.mat, - modelMatrix); - } - } - - cv.canvasDirty &= ~bitMask; - cv.renderMolecule = this; - } - - void transparentSortRender(Canvas3D cv, int pass, TransparentRenderingInfo tinfo) { - assert pass < 0; - - Transform3D modelMatrix = - trans[localToVworldIndex[NodeRetained.LAST_LOCAL_TO_VWORLD]]; - - // include this LightBin to the to-be-updated list in Canvas - cv.setStateToUpdate(Canvas3D.RENDERMOLECULE_BIT, this); - - - boolean modeSupportDL = true; - - // We have to dynamically switch between using displaymode - // mode or not instead of decide in canBeInDisplayList(), - // since polygonAttribute can be change by editable Appearance - // or editable polygonAttribute which mode we can't take - // advantage of display list mode in many cases just because - // there are three special cases to handle. - - // Another case for punting to vertex array is if pass specifies - // something other than -1. That means, we are in the - // multi-texturing multi-pass case. Then we'll use vertex array - // instead. - - if ((pass != TextureBin.USE_DISPLAYLIST) || - (texCoordSetMapLen > cv.maxTexCoordSets)) { - modeSupportDL = false; - } - - // System.err.println("r.isOpaque = "+isOpaque+" rinfo = "+tinfo.rInfo+" groupType = "+tinfo.rInfo.groupType); - // Only support individual dlist or varray - // If this rInfo is a part of a bigger dlist, render as VA - // XXXX: What to do with Text3D, Raster, CG? - if ((tinfo.rInfo.groupType & RenderAtom.SEPARATE_DLIST_PER_RINFO) != 0) { - RenderAtomListInfo save= tinfo.rInfo.next; - // Render only one geometry - tinfo.rInfo.next = null; - // System.err.println("cachedVertexArrayRenderMethod = "+cachedVertexArrayRenderMethod); - // System.err.println("tinfo.rInfo = "+tinfo.rInfo); - if (modeSupportDL) { - renderBin.dlistRenderMethod.renderSeparateDlistPerRinfo(this, cv, - tinfo.rInfo, - ALL_DIRTY_BITS); - } - else { - cachedVertexArrayRenderMethod.render(this, cv, tinfo.rInfo,ALL_DIRTY_BITS); - } - tinfo.rInfo.next = save; - } - else if ((tinfo.rInfo.groupType & (RenderAtom.VARRAY| RenderAtom.DLIST)) != 0) { - RenderAtomListInfo save= tinfo.rInfo.next; - // Render only one geometry - tinfo.rInfo.next = null; - // System.err.println("cachedVertexArrayRenderMethod = "+cachedVertexArrayRenderMethod); - // System.err.println("tinfo.rInfo = "+tinfo.rInfo); - cachedVertexArrayRenderMethod.render(this, cv, tinfo.rInfo, - ALL_DIRTY_BITS); - tinfo.rInfo.next = save; - } - - // Only support individual dlist or varray - else if ((tinfo.rInfo.groupType & RenderAtom.SEPARATE_DLIST_PER_GEO) != 0) { - RenderAtomListInfo save= tinfo.rInfo.next; - tinfo.rInfo.next = null; - if (modeSupportDL) { - renderBin.dlistRenderMethod.renderSeparateDlists(this, cv, - tinfo.rInfo, - ALL_DIRTY_BITS); - } - else { - cachedVertexArrayRenderMethod.render(this, cv, tinfo.rInfo, - ALL_DIRTY_BITS); - } - tinfo.rInfo.next = save; - } - else { - RenderAtomListInfo save= tinfo.rInfo.next; - primaryRenderMethod.render(this, cv, primaryRenderAtomList, - ALL_DIRTY_BITS); - tinfo.rInfo.next = save; - } - - } - - - /** - * This render method is used to render the transparency attributes. - * It is used in the multi-texture multi-pass case to reset the - * transparency attributes to what it was - */ - void updateTransparencyAttributes(Canvas3D cv) { - if (definingTransparency == null) { - cv.resetTransparency(cv.ctx, geometryType, polygonMode, - lineAA, pointAA); - } else { - definingTransparency.updateNative(cv.ctx, alpha, geometryType, - polygonMode, lineAA, pointAA); - } - } - - void updateDisplayList(Canvas3D cv) { - // This function only gets called when primaryRenderAtomsList are - if (primaryRenderAtomList != null) { - ((DisplayListRenderMethod)primaryRenderMethod).buildDisplayList(this, cv); - } - } - - void releaseAllPrimaryDisplayListID() { - - if (primaryRenderAtomList != null) { - if (primaryMoleculeType == SEPARATE_DLIST_PER_RINFO_MOLECULE) { - RenderAtomListInfo ra = primaryRenderAtomList; - int id; - - while (ra != null) { - id = ra.renderAtom.dlistIds[ra.index]; - - if (id > 0) { - VirtualUniverse.mc.freeDisplayListId(new Integer(id)); - ra.renderAtom.dlistIds[ra.index] = -1; - } - ra = ra.next; - } - } - else if (primaryMoleculeType == DLIST_MOLECULE) { - if (displayListIdObj != null) { - VirtualUniverse.mc.freeDisplayListId(displayListIdObj); - displayListIdObj = null; - displayListId = -1; - } - } - } - - } - - void releaseAllPrimaryDisplayListResources(Canvas3D cv, Context ctx) { - if (primaryRenderAtomList != null) { - if (primaryMoleculeType == SEPARATE_DLIST_PER_RINFO_MOLECULE) { - RenderAtomListInfo ra = primaryRenderAtomList; - int id; - while (ra != null) { - id = ra.renderAtom.dlistIds[ra.index]; - if (id > 0) { - Canvas3D.freeDisplayList(ctx, id); - } - ra = ra.next; - } - } - else if (primaryMoleculeType == DLIST_MOLECULE) { - if (displayListId > 0) { - Canvas3D.freeDisplayList(ctx, displayListId); - } - } - } - } - - void updateAllPrimaryDisplayLists(Canvas3D cv) { - // This function only gets called when primaryRenderAtomsList are - if (primaryRenderAtomList != null) { - if (primaryMoleculeType == SEPARATE_DLIST_PER_RINFO_MOLECULE) { - RenderAtomListInfo ra = primaryRenderAtomList; - while (ra != null) { - renderBin.dlistRenderMethod.buildDlistPerRinfo(ra, this, cv); - ra = ra.next; - } - } - else if(primaryMoleculeType == DLIST_MOLECULE) { - ((DisplayListRenderMethod)primaryRenderMethod).buildDisplayList(this, cv); - } - } - } - - void checkEquivalenceWithBothNeighbors(int dirtyBits) { - dirtyAttrsAcrossRms = ALL_DIRTY_BITS; - - if (prev != null) { - checkEquivalenceWithLeftNeighbor(prev, dirtyBits); - } - if (next != null) { - next.checkEquivalenceWithLeftNeighbor(this, dirtyBits); - } - } - - boolean reloadColor(RenderMolecule rm) { - if (((rm.vertexFormat & GeometryArray.COLOR) == 0) || - (((rm.vertexFormat & GeometryArray.COLOR) != 0) && - (vertexFormat & GeometryArray.COLOR) != 0)) { - return false; - } - return true; - } - - void checkEquivalenceWithLeftNeighbor(RenderMolecule rm, int dirtyBits) { - boolean reload_color = reloadColor(rm); - // XXXX : For now ignore the dirtyBits being sent in - dirtyAttrsAcrossRms = ALL_DIRTY_BITS ; - - - - // There is some interdepenency between the different components - // in the way it is sent down to the native code - // Material is affected by transparency and coloring attrs - // Transparency is affected by poly/line/pointAA - // ColoringAttrs is affected by material and transaparency - int materialColoringDirty = (MATERIAL_DIRTY | - TRANSPARENCY_DIRTY | - COLORINGATTRS_DIRTY); - - int transparencyDirty = (TRANSPARENCY_DIRTY| - POLYGONATTRS_DIRTY | - LINEATTRS_DIRTY | - POINTATTRS_DIRTY); - - if ((dirtyAttrsAcrossRms & POLYGONATTRS_DIRTY) != 0) { - if (rm.geometryType == geometryType && - (rm.polygonAttributes == polygonAttributes || - ((rm.definingPolygonAttributes != null) && - (rm.definingPolygonAttributes.equivalent(definingPolygonAttributes))))) - dirtyAttrsAcrossRms &= ~POLYGONATTRS_DIRTY; - - } - - if ((dirtyAttrsAcrossRms & POINTATTRS_DIRTY) != 0) { - if (rm.geometryType == geometryType && - ((rm.pointAttributes == pointAttributes) || - ((rm.definingPointAttributes != null) && - (rm.definingPointAttributes.equivalent(definingPointAttributes))))) - dirtyAttrsAcrossRms &= ~POINTATTRS_DIRTY; - - } - - if ((dirtyAttrsAcrossRms & LINEATTRS_DIRTY) != 0) { - if (rm.geometryType == geometryType && - ((rm.lineAttributes == lineAttributes) || - ((rm.definingLineAttributes != null) && - (rm.definingLineAttributes.equivalent(definingLineAttributes))))) - dirtyAttrsAcrossRms &= ~LINEATTRS_DIRTY; - } - - if ((dirtyAttrsAcrossRms & materialColoringDirty) != 0) { - if (materialEquivalent(rm, reload_color)) { - dirtyAttrsAcrossRms &= ~MATERIAL_DIRTY; - } - else { - dirtyAttrsAcrossRms |= MATERIAL_DIRTY; - } - } - - - - - if ((dirtyAttrsAcrossRms & materialColoringDirty) != 0) { - if (coloringEquivalent(rm, reload_color)) { - dirtyAttrsAcrossRms &= ~COLORINGATTRS_DIRTY; - } - else { - dirtyAttrsAcrossRms |= COLORINGATTRS_DIRTY; - } - } - - if ((dirtyAttrsAcrossRms & transparencyDirty) != 0) { - if (transparencyEquivalent(rm)) { - dirtyAttrsAcrossRms &= ~TRANSPARENCY_DIRTY; - } - else { - dirtyAttrsAcrossRms |= TRANSPARENCY_DIRTY; - } - } - } - void translate() { - // System.err.println("onUpdateList = "+onUpdateList+" renderBin.localeChanged = "+renderBin.localeChanged+" rm = "+this); - int i = localToVworldIndex[NodeRetained.LAST_LOCAL_TO_VWORLD]; - - localeLocalToVworld[i].mat[0] = localToVworld[i].mat[0]; - localeLocalToVworld[i].mat[1] = localToVworld[i].mat[1]; - localeLocalToVworld[i].mat[2] = localToVworld[i].mat[2]; - localeLocalToVworld[i].mat[3] = localToVworld[i].mat[3] + localeTranslation.x ; - localeLocalToVworld[i].mat[4] = localToVworld[i].mat[4]; - localeLocalToVworld[i].mat[5] = localToVworld[i].mat[5]; - localeLocalToVworld[i].mat[6] = localToVworld[i].mat[6]; - localeLocalToVworld[i].mat[7] = localToVworld[i].mat[7]+ localeTranslation.y; - localeLocalToVworld[i].mat[8] = localToVworld[i].mat[8]; - localeLocalToVworld[i].mat[9] = localToVworld[i].mat[9]; - localeLocalToVworld[i].mat[10] = localToVworld[i].mat[10]; - localeLocalToVworld[i].mat[11] = localToVworld[i].mat[11]+ localeTranslation.z; - localeLocalToVworld[i].mat[12] = localToVworld[i].mat[12]; - localeLocalToVworld[i].mat[13] = localToVworld[i].mat[13]; - localeLocalToVworld[i].mat[14] = localToVworld[i].mat[14]; - localeLocalToVworld[i].mat[15] = localToVworld[i].mat[15]; - // System.err.println("rm = "+this+" localTovworld = "+localeLocalToVworld[i]+" localeTranslation = "+localeTranslation); - } - - - boolean isOpaque() { - if ((geometryType & SURFACE) != 0) { - if (definingPolygonAttributes != null) { - if ((definingPolygonAttributes.polygonMode == - PolygonAttributes.POLYGON_POINT) && - (definingPointAttributes != null) && - definingPointAttributes.pointAntialiasing) { - return false; - } else if ((definingPolygonAttributes.polygonMode == - PolygonAttributes.POLYGON_LINE) && - (definingLineAttributes != null) && - definingLineAttributes.lineAntialiasing) { - return false; - } - } - } else if ((geometryType & POINT) != 0) { - if ((definingPointAttributes != null) && - definingPointAttributes.pointAntialiasing) { - return false; - } - } else if ((geometryType & LINE) != 0) { - if ((definingLineAttributes != null) && - definingLineAttributes.lineAntialiasing) { - return false; - } - } - return !TransparencyAttributesRetained.useAlpha(definingTransparency); - } - - - boolean updateNodeComponent() { - // System.err.println("soleUser = "+soleUser+" rm = "+this); - if ((soleUserCompDirty & MATERIAL_DIRTY) != 0) { - // Note: this RM is a soleUser(only then this function is called) - // and if definingMaterial == material, then the material is freq - // changed and therefore is not cloned, only other time it can be - // same is when an equivalent material is added in and this can - // never be true when a bin is a soleUser of a appearance - - // Evaluate before replacing the old Value - if (soleUser) { - boolean cloned = definingMaterial != null && definingMaterial != material; - // System.err.println("===>Rm = "+this); - - // System.err.println("===> updating node component, cloned = "+cloned+" material.changedFrequent = "+material.changedFrequent); - // System.err.println("===> definingMaterial ="+definingMaterial+" material = "+material); - - material = ((AppearanceRetained)appHandle).material; - if (material == null) - definingMaterial = null; - else { - if (material.changedFrequent != 0) { - definingMaterial = material; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingMaterial.set(material); - } - else { - definingMaterial = (MaterialRetained)material.clone(); - } - } - } - } - evalMaterialCachedState(); - } - if ((soleUserCompDirty & LINEATTRS_DIRTY) != 0) { - if (soleUser) { - // Evaluate before replacing the old Value - boolean cloned = definingLineAttributes != null && definingLineAttributes != lineAttributes; - - lineAttributes = ((AppearanceRetained)appHandle).lineAttributes; - if (lineAttributes == null) { - lineAA = false; - definingLineAttributes = null; - } else { - if (lineAttributes.changedFrequent != 0) { - definingLineAttributes = lineAttributes; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingLineAttributes.set(lineAttributes); - } - else { - definingLineAttributes = (LineAttributesRetained)lineAttributes.clone(); - } - } - lineAA = definingLineAttributes.lineAntialiasing; - } - } - else { - lineAA = definingLineAttributes.lineAntialiasing; - } - } - if ((soleUserCompDirty & POINTATTRS_DIRTY) != 0) { - if (soleUser) { - // Evaluate before replacing the old Value - boolean cloned = definingPointAttributes != null && definingPointAttributes != pointAttributes; - - pointAttributes = ((AppearanceRetained)appHandle).pointAttributes; - if (pointAttributes == null) { - pointAA = false; - definingPointAttributes = null; - } else { - if (pointAttributes.changedFrequent != 0) { - definingPointAttributes = pointAttributes; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingPointAttributes.set(pointAttributes); - } - else { - definingPointAttributes = (PointAttributesRetained)pointAttributes.clone(); - } - } - pointAA = definingPointAttributes.pointAntialiasing; - } - } - else { - pointAA = definingPointAttributes.pointAntialiasing; - } - - } - if ((soleUserCompDirty & POLYGONATTRS_DIRTY) != 0) { - if (soleUser) { - // Evaluate before replacing the old Value - boolean cloned = definingPolygonAttributes != null && definingPolygonAttributes != polygonAttributes; - - - polygonAttributes = ((AppearanceRetained)appHandle).polygonAttributes; - - if (polygonAttributes == null) { - polygonMode = PolygonAttributes.POLYGON_FILL; - definingPolygonAttributes = null; - } else { - if (polygonAttributes.changedFrequent != 0) { - definingPolygonAttributes = polygonAttributes; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingPolygonAttributes.set(polygonAttributes); - } - else { - definingPolygonAttributes = (PolygonAttributesRetained)polygonAttributes.clone(); - } - } - - polygonMode = definingPolygonAttributes.polygonMode; - } - } - else { - polygonMode = definingPolygonAttributes.polygonMode; - } - - if (polygonMode == PolygonAttributes.POLYGON_LINE) { - geometryType |= LINE; - } else if (polygonMode == PolygonAttributes.POLYGON_POINT) { - geometryType |= POINT; - } - } - - if ((soleUserCompDirty & TRANSPARENCY_DIRTY) != 0) { - if (soleUser) { - // Evaluate before replacing the old Value - boolean cloned = definingTransparency != null && definingTransparency != transparency; - transparency = ((AppearanceRetained)appHandle).transparencyAttributes; - - if (transparency == null) { - alpha = 1.0f ; - definingTransparency = null; - } else { - if (transparency.changedFrequent != 0) { - definingTransparency = transparency; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingTransparency.set(transparency); - } - else { - definingTransparency = (TransparencyAttributesRetained)transparency.clone(); - } - } - - alpha = 1.0f - definingTransparency.transparency; - } - } - else { - alpha = 1.0f - definingTransparency.transparency; - } - } - - if ((soleUserCompDirty & COLORINGATTRS_DIRTY) != 0) { - if (soleUser) { - // Evaluate before replacing the old Value - boolean cloned = definingColoringAttributes != null && definingColoringAttributes != coloringAttributes; - - coloringAttributes = ((AppearanceRetained)appHandle).coloringAttributes; - // System.err.println("coloringAttributes and soleUser"); - // System.err.println("coloringAttributes ="+coloringAttributes); - if (coloringAttributes == null) { - definingColoringAttributes = null; - red = 1.0f; - green = 1.0f; - blue = 1.0f; - } else { - // System.err.println("coloringAttributes.changedFrequent = "+coloringAttributes.changedFrequent ); - if (coloringAttributes.changedFrequent != 0) { - definingColoringAttributes = coloringAttributes; - } - else { - // If the one replaced is a cloned copy, then .. - if (cloned) { - definingColoringAttributes.set(coloringAttributes); - } - else { - definingColoringAttributes = (ColoringAttributesRetained)coloringAttributes.clone(); - } - } - red = definingColoringAttributes.color.x; - green = definingColoringAttributes.color.y; - blue = definingColoringAttributes.color.z; - } - } - else { - red = definingColoringAttributes.color.x; - green = definingColoringAttributes.color.y; - blue = definingColoringAttributes.color.z; - } - } - // System.err.println("rm = "+this+"red = "+red+" green = "+green+" blue = "+blue); - boolean newVal = isOpaque() || inOrderedGroup; - return (isOpaqueOrInOG != newVal); - - } - - // Issue 129: method to add or remove all rendering atoms in this - // RenderMolecule to or from the transparent info list when we are - // in depth sorted transparency mode and the RenderMolecule - // changes from opaque to transparent or vice versa. - void addRemoveTransparentObject(RenderBin renderBin, boolean add) { - addRemoveTransparentObject(renderBin, add, primaryRenderAtomList); - addRemoveTransparentObject(renderBin, add, separateDlistRenderAtomList); - addRemoveTransparentObject(renderBin, add, vertexArrayRenderAtomList); - } - - private void addRemoveTransparentObject(RenderBin renderBin, - boolean add, - RenderAtomListInfo rinfo) { - while (rinfo != null) { - if (add) { - renderBin.addTransparentObject(rinfo.renderAtom); - } - else { - renderBin.removeTransparentObject(rinfo.renderAtom); - } - rinfo = rinfo.next; - } - } - - void evalMaterialCachedState() { - if (definingMaterial == null) { - enableLighting = false;; - definingMaterial = null; - dRed = 1.0f; - dGreen = 1.0f; - dBlue = 1.0f; - } - else { - if ((geometryType & RASTER) != 0) { - enableLighting = false; - dRed = 1.0f; - dGreen = 1.0f; - dBlue = 1.0f; - } else { - if (normalPresent) - enableLighting = definingMaterial.lightingEnable; - else - enableLighting = false; - dRed = definingMaterial.diffuseColor.x; - dGreen = definingMaterial.diffuseColor.y; - dBlue = definingMaterial.diffuseColor.z; - } - } - } - - - void markBitsAsDirty(int leftBits, int rightBits) { - if (prev != null) { - checkEquivalenceWithLeftNeighbor(prev, leftBits); - prev.soleUserCompDirty &= ~ALL_DIRTY_BITS; - } - else if (prevMap != null) { - checkEquivalenceWithLeftNeighbor(prevMap, leftBits); - prevMap.soleUserCompDirty &= ~ALL_DIRTY_BITS; - } - if (next != null) { - if ((next.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - next.checkEquivalenceWithLeftNeighbor(this, rightBits); - } else { - next.soleUserCompDirty = rightBits; - } - } - else if (nextMap != null) { - if ((nextMap.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - nextMap.checkEquivalenceWithLeftNeighbor(this, rightBits); - } else { - nextMap.soleUserCompDirty = rightBits; - } - } - - } - - void handleMaterialEquivalence() { - // Check if it has equivalent material to any of the "non-dirty" - // renderMolecules before this one - RenderMolecule curPrevRm = null; - RenderMolecule curNextRm = null; - boolean found = false; - int leftBits = ALL_DIRTY_BITS; - int rightBits = ALL_DIRTY_BITS; - if (prev != null) { - curPrevRm = prev.prev; - if (materialEquivalent(prev, reloadColor(prev))) { - found = true; - leftBits = (((soleUserCompDirty | prev.soleUserCompDirty) &ALL_DIRTY_BITS) & ~MATERIAL_DIRTY); - rightBits = (soleUserCompDirty & ALL_DIRTY_BITS); - markBitsAsDirty(leftBits, rightBits); - } - } - else if (!found && next != null) { - curNextRm = next.next; - - if (materialEquivalent(next, reloadColor(next))) { - found = true; - int bits = 0; - if (prev != null) - bits = prev.soleUserCompDirty; - else if (prevMap != null) - bits = prevMap.soleUserCompDirty; - - leftBits = ((soleUserCompDirty |bits) &ALL_DIRTY_BITS); - rightBits = ((soleUserCompDirty & ALL_DIRTY_BITS) & ~MATERIAL_DIRTY); - markBitsAsDirty(leftBits, rightBits); - - } - } - // try place it next to a equivalent material on the left - while (!found && curPrevRm != null) { - if (materialEquivalent(curPrevRm, reloadColor(curPrevRm))) { - found = true; - // Remove the renderMolecule from it place - prev.next = next; - prev.nextMap = nextMap; - if (next != null) { - next.prev = prev; - if ((next.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - next.checkEquivalenceWithLeftNeighbor(prev, ALL_DIRTY_BITS); - } - else { - next.soleUserCompDirty = ALL_DIRTY_BITS; - } - } - else if (nextMap != null) { - nextMap.prevMap = prev; - if ((nextMap.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - nextMap.checkEquivalenceWithLeftNeighbor(prev,ALL_DIRTY_BITS); - } - else { - nextMap.soleUserCompDirty |= ALL_DIRTY_BITS; - } - } - - // Insert it after the equivalent RM - next = curPrevRm.next; - nextMap = curPrevRm.nextMap; - curPrevRm.nextMap = null; - if (next != null) { - next.prev = this; - } - else if (nextMap != null) { - nextMap.prevMap = this; - } - prev = curPrevRm; - curPrevRm.next = this; - leftBits = (ALL_DIRTY_BITS & ~MATERIAL_DIRTY); - markBitsAsDirty(leftBits, ALL_DIRTY_BITS); - } - curPrevRm = curPrevRm.prev; - } - - // Check if it has equivalent material to any of the renderMolecules after - // this one - while (!found && curNextRm != null) { - if (materialEquivalent(curNextRm, reloadColor(curNextRm))) { - found = true; - // switch the pointers - next.prev = prev; - next.prevMap = prevMap; - if (prev != null) { - prev.next = next; - if ((next.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - next.checkEquivalenceWithLeftNeighbor(prev, ALL_DIRTY_BITS); - } - else { - next.soleUserCompDirty = ALL_DIRTY_BITS; - } - } - else if (prevMap != null) { - prevMap.nextMap = next; - if ((next.soleUserCompDirty & ALL_DIRTY_BITS) == 0) { - next.checkEquivalenceWithLeftNeighbor(prevMap, ALL_DIRTY_BITS); - } - else { - next.soleUserCompDirty = ALL_DIRTY_BITS; - } - } - - // Insert it before the equivalent RM - prev = curNextRm.prev; - prevMap = curNextRm.prevMap; - curNextRm.prevMap = null; - if (curNextRm.prev != null) { - curNextRm.prev.next = this; - } - else if (prevMap != null) { - prevMap.nextMap = this; - } - next = curNextRm; - curNextRm.prev = this; - rightBits = (ALL_DIRTY_BITS & ~MATERIAL_DIRTY); - markBitsAsDirty(ALL_DIRTY_BITS, rightBits); - } - curNextRm = curNextRm.next; - } - // If there are no equivalent ones, evaluate the dirty bits in the current place - if (!found) { - if (prev != null) { - leftBits = ((soleUserCompDirty|prev.soleUserCompDirty) & ALL_DIRTY_BITS); - } - else if (prevMap != null) { - leftBits = ((soleUserCompDirty|prevMap.soleUserCompDirty) & ALL_DIRTY_BITS); - } - if (next != null) { - rightBits = ((soleUserCompDirty|next.soleUserCompDirty) & ALL_DIRTY_BITS); - } - else if (nextMap != null) { - rightBits = ((soleUserCompDirty|nextMap.soleUserCompDirty) & ALL_DIRTY_BITS); - } - markBitsAsDirty(leftBits, rightBits); - } - - } - - void reEvaluateEquivalence () { - // If Material changed, reInsert next to a equivalent material under - // the same transform group - // to prevent unnecessary material download - // This RM may have been evaluated due to an other RM is the same list - // If not, ... - if ((soleUserCompDirty & ALL_DIRTY_BITS) != 0) { - if ((soleUserCompDirty & MATERIAL_DIRTY) != 0) { - handleMaterialEquivalence(); - } - else { - int dirtyBits = (soleUserCompDirty & ALL_DIRTY_BITS); - if (prev != null) { - checkEquivalenceWithLeftNeighbor(prev, ((dirtyBits|prev.soleUserCompDirty) & ALL_DIRTY_BITS)); - prev.soleUserCompDirty = 0; - } else if (prevMap != null) { - checkEquivalenceWithLeftNeighbor(prevMap, ((dirtyBits|prevMap.soleUserCompDirty) & ALL_DIRTY_BITS)); - prevMap.soleUserCompDirty = 0; - } - if (next != null) { - next.checkEquivalenceWithLeftNeighbor(this,((next.soleUserCompDirty|soleUserCompDirty) & ALL_DIRTY_BITS)); - } else if (nextMap != null) { - nextMap.checkEquivalenceWithLeftNeighbor(this,((nextMap.soleUserCompDirty | soleUserCompDirty) & ALL_DIRTY_BITS)); - } - } - } - soleUserCompDirty &= ~ALL_DIRTY_BITS; - } - - - boolean materialEquivalent(RenderMolecule rm, boolean reloadColor) { - if (!reloadColor) { - if (((this.material == rm.material) || - ((rm.definingMaterial != null) && - (rm.definingMaterial.equivalent(definingMaterial)))) && - rm.alpha == alpha && - enableLighting == rm.enableLighting && - (enableLighting || - (!enableLighting && - rm.red ==red && - rm.green == green && - rm.blue == blue))) { - return true; - } - } - return false; - } - - boolean coloringEquivalent(RenderMolecule rm, boolean reload_color) { - if (!reload_color) { - if (((rm.coloringAttributes == coloringAttributes) || - ((rm.definingColoringAttributes != null) && - (rm.definingColoringAttributes.equivalent(definingColoringAttributes)))) && - (!enableLighting || (enableLighting && (dRed == rm.dRed && dBlue == rm.dBlue && dGreen == rm.dGreen)))) { - return true; - } - } - return false; - } - - boolean transparencyEquivalent(RenderMolecule rm) { - if (((rm.transparency == transparency) || - ((rm.definingTransparency != null) && - (rm.definingTransparency.equivalent(definingTransparency))) && - (rm.definingTransparency.transparencyMode < TransparencyAttributes.SCREEN_DOOR && - blendOn() == rm.blendOn()))) { - return true; - } - return false; - } - - boolean blendOn() { - if (lineAA && ((((geometryType & LINE) != 0) || - polygonMode == PolygonAttributes.POLYGON_LINE))) { - return true; - } - if (pointAA && ((((geometryType & POINT) != 0) || - polygonMode == PolygonAttributes.POLYGON_POINT))) { - return true; - } - return false; - } - - @Override - VirtualUniverse getVirtualUniverse() { - return null; - } - - - void handleLocaleChange() { - if (locale == renderBin.locale) { - if (localToVworld != localeLocalToVworld) { - localeLocalToVworld = localToVworld; - localeTranslation = null; - } - } - else { - // Using the localToVworl then, go back to making a new copy - if (localeTranslation == null) { - localeLocalToVworld = new Transform3D[2]; - localeLocalToVworld[0] = new Transform3D(); - localeLocalToVworld[1] = new Transform3D(); - - localeTranslation = new Vector3d(); - locale.hiRes.difference(renderBin.locale.hiRes, localeTranslation); - translate(); - int i = localToVworldIndex[NodeRetained.CURRENT_LOCAL_TO_VWORLD]; - - localeLocalToVworld[i].mat[0] = localToVworld[i].mat[0]; - localeLocalToVworld[i].mat[1] = localToVworld[i].mat[1]; - localeLocalToVworld[i].mat[2] = localToVworld[i].mat[2]; - localeLocalToVworld[i].mat[3] = localToVworld[i].mat[3] + localeTranslation.x ; - localeLocalToVworld[i].mat[4] = localToVworld[i].mat[4]; - localeLocalToVworld[i].mat[5] = localToVworld[i].mat[5]; - localeLocalToVworld[i].mat[6] = localToVworld[i].mat[6]; - localeLocalToVworld[i].mat[7] = localToVworld[i].mat[7]+ localeTranslation.y; - localeLocalToVworld[i].mat[8] = localToVworld[i].mat[8]; - localeLocalToVworld[i].mat[9] = localToVworld[i].mat[9]; - localeLocalToVworld[i].mat[10] = localToVworld[i].mat[10]; - localeLocalToVworld[i].mat[11] = localToVworld[i].mat[11]+ localeTranslation.z; - localeLocalToVworld[i].mat[12] = localToVworld[i].mat[12]; - localeLocalToVworld[i].mat[13] = localToVworld[i].mat[13]; - localeLocalToVworld[i].mat[14] = localToVworld[i].mat[14]; - localeLocalToVworld[i].mat[15] = localToVworld[i].mat[15]; - } - } - - trans = localeLocalToVworld; - } - - - /** - * updateNodeComponentCheck is called for each soleUser RenderMolecule - * into which new renderAtom has been added. This method is called before - * updateNodeComponent() to allow RenderMolecule to catch any node - * component changes that have been missed because the changes - * come when there is no active renderAtom associated with the - * TextureBin. See bug# 4503926 for details. - */ - @Override - public void updateNodeComponentCheck() { - - // If the renderMolecule has been removed, do nothing .. - if ((onUpdateList &ON_UPDATE_CHECK_LIST ) == 0) - return; - - onUpdateList &= ~ON_UPDATE_CHECK_LIST; - NodeComponentRetained nc = (NodeComponentRetained)appHandle; - if ((nc.compChanged & RM_COMPONENTS) != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= (nc.compChanged & RM_COMPONENTS); - } - if (definingPolygonAttributes != null && - definingPolygonAttributes == polygonAttributes) { - if (definingPolygonAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= POLYGONATTRS_DIRTY; - } - } - if (definingLineAttributes != null && - definingLineAttributes == lineAttributes) { - if (definingLineAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= LINEATTRS_DIRTY; - } - } - if (definingPointAttributes != null && - definingPointAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= POINTATTRS_DIRTY; - } - - if (definingMaterial != null && - definingMaterial == material) { - if (definingMaterial.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= MATERIAL_DIRTY; - } - } - - if (definingColoringAttributes != null && - definingColoringAttributes == coloringAttributes) { - if (definingColoringAttributes.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= COLORINGATTRS_DIRTY; - } - } - - if (definingTransparency != null && - definingTransparency == transparency) { - if (definingTransparency.compChanged != 0) { - if ((soleUserCompDirty& ALL_DIRTY_BITS) == 0 ) { - renderBin.rmUpdateList.add(this); - } - soleUserCompDirty |= TRANSPARENCY_DIRTY; - } - } - } -} |