📄 shape3dcompileretained.java
字号:
/* * $RCSfile: Shape3DCompileRetained.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.7 $ * $Date: 2007/04/12 17:34:06 $ * $State: Exp $ */package javax.media.j3d;import javax.vecmath.*;import java.util.*;/** * A leaf node that holds a merged shapes in compile mode */class Shape3DCompileRetained extends Shape3DRetained { int numShapes = 0; // Each element in the arraylist is an array of geometries for a // particular merged shape ArrayList geometryInfo = null; Object[] srcList = null; Shape3DCompileRetained(Shape3DRetained[] shapes, int nShapes, int compileFlags) { int i, j; Shape3DRetained shape; GeometryArrayRetained geo; Vector list; // Merged list, only merged if geometry is mergeable Object[] mergedList = new Object[GeometryRetained.GEO_TYPE_GEOMETRYARRAY+1]; // Sorted list of separate geometry by geoType Object[] separateList = new Object[GeometryRetained.GEO_TYPE_GEOMETRYARRAY+1]; // Assign the num of shapes numShapes = nShapes; Bounds shapeBounds; srcList = new Object[nShapes]; if (nShapes > 0) { boundsAutoCompute = shapes[0].boundsAutoCompute; source = shapes[0].source; } // Remove the null that was added by Shape3DRetained constructor geometryList.remove(0); int geoIndex = 0; // Assign the fields for this compile shape boundsAutoCompute = shapes[0].boundsAutoCompute; isPickable = shapes[0].isPickable; isCollidable = shapes[0].isCollidable; appearanceOverrideEnable = shapes[0].appearanceOverrideEnable; appearance = shapes[0].appearance; collisionBound = shapes[0].collisionBound; localBounds = shapes[0].localBounds; if ((compileFlags & CompileState.GEOMETRY_READ) != 0) geometryInfo = new ArrayList(); for (i = 0; i < nShapes; i++) { shape = shapes[i]; ((Shape3D)shape.source).id = i; shape.source.retained = this; srcList[i] = shape.source; // If the transform has been pushd down // to the shape, don't merge its geometry with other shapes // geometry // Put it in a separate list sorted by geo_type // Have to handle shape.isPickable for (j = 0; j < shape.geometryList.size(); j++) { geo = (GeometryArrayRetained)shape.geometryList.get(j); if (geo != null) { if (shape.willRemainOpaque(geo.geoType) && geo.isMergeable()) { if (mergedList[geo.geoType] == null) { mergedList[geo.geoType] = new ArrayList(); } ((ArrayList)mergedList[geo.geoType]).add(geo); } else { // Keep a sorted list based on geoType; if (separateList[geo.geoType] == null) { separateList[geo.geoType] = new ArrayList(); } // add it to the geometryList separately ((ArrayList)separateList[geo.geoType]).add(geo); } } } // Point to the geometryList's source, so the // retained side will be garbage collected if ((compileFlags & CompileState.GEOMETRY_READ) != 0) { ArrayList sList = new ArrayList(); for (j = 0; j < shape.geometryList.size(); j++) { GeometryRetained g = (GeometryRetained)shape.geometryList.get(j); if (g != null) sList.add(g.source); else sList.add(null); } geometryInfo.add(sList); } } // Now, merged the mergelist and separate list based on geoType, // this enables dlist optmization for (i = 1; i <= GeometryRetained.GEO_TYPE_GEOMETRYARRAY; i++) { GeometryArrayRetained cgeo = null; ArrayList curList; switch (i) { case GeometryArrayRetained.GEO_TYPE_QUAD_SET: if (mergedList[i] != null) { cgeo = new QuadArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_TRI_SET: if (mergedList[i] != null) { cgeo = new TriangleArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_POINT_SET: if (mergedList[i] != null) { cgeo = new PointArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_LINE_SET: if (mergedList[i] != null) { cgeo = new LineArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_TRI_STRIP_SET: if (mergedList[i] != null) { cgeo = new TriangleStripArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_TRI_FAN_SET: if (mergedList[i] != null) { cgeo = new TriangleFanArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_LINE_STRIP_SET: if (mergedList[i] != null) { cgeo = new LineStripArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_INDEXED_QUAD_SET: if (mergedList[i] != null) { cgeo = new IndexedQuadArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); } } break; case GeometryArrayRetained.GEO_TYPE_INDEXED_TRI_SET: if (mergedList[i] != null) { cgeo = new IndexedTriangleArrayRetained(); curList = (ArrayList)mergedList[i]; cgeo.setCompiled(curList); geometryList.add(cgeo); cgeo.setSource(((SceneGraphObjectRetained)curList.get(0)).source); } if (separateList[i] != null) { ArrayList glist = (ArrayList)separateList[i]; for (int k = 0; k < glist.size(); k++) { geometryList.add(glist.get(k)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -