📄 morphretained.java
字号:
void updatePickable(HashKey keys[], boolean pick[]) { super.updatePickable(keys, pick); Shape3DRetained shape; if (!inSharedGroup) { shape = (Shape3DRetained) mirrorShape3D.get(0); shape.isPickable = pick[0]; } else { int size = mirrorShape3D.size(); for (int j=0; j< keys.length; j++) { for (int i=0; i < size; i++) { shape = (Shape3DRetained) mirrorShape3D.get(i); if (keys[j].equals(shape.key)) { shape.isPickable = pick[j]; break; } } } } } void updateCollidable(HashKey keys[], boolean collide[]) { super.updateCollidable(keys, collide); Shape3DRetained shape; if (!inSharedGroup) { shape = (Shape3DRetained) mirrorShape3D.get(0); shape.isCollidable = collide[0]; } else { int size = mirrorShape3D.size(); for (int j=0; j< keys.length; j++) { for (int i=0; i < size; i++) { shape = (Shape3DRetained) mirrorShape3D.get(i); if (keys[j].equals(shape.key)) { shape.isCollidable = collide[j]; break; } } } } } Shape3DRetained getMirrorShape(SceneGraphPath path) { if (!inSharedGroup) { return (Shape3DRetained) mirrorShape3D.get(0); } HashKey key = new HashKey(""); path.getHashKey(key); return getMirrorShape(key); } Shape3DRetained getMirrorShape(HashKey key) { int i = key.equals(localToVworldKeys, 0, localToVworldKeys.length); if (i>=0) { return (Shape3DRetained) mirrorShape3D.get(i); } // Not possible throw new RuntimeException("Shape3DRetained: MirrorShape Not found!"); } void getMirrorObjects(ArrayList leafList, HashKey key) { Shape3DRetained ms; if (inSharedGroup) { ms = getMirrorShape(key); } else { ms = (Shape3DRetained)mirrorShape3D.get(0); } GeometryAtom ga = Shape3DRetained.getGeomAtom(ms); leafList.add(ga); } void setBoundsAutoCompute(boolean autoCompute) { if (autoCompute != boundsAutoCompute) { if (autoCompute) { // localBounds may not have been set to bbox localBounds = new BoundingBox(); if (source.isLive() && morphedGeometryArray != null) { GeometryArrayRetained mga = (GeometryArrayRetained)morphedGeometryArray.retained; mga.incrComputeGeoBounds(); // This compute the bbox if dirty mga.decrComputeGeoBounds(); } } localBounds = getBounds(); super.setBoundsAutoCompute(autoCompute); if (source.isLive()) { J3dMessage message = new J3dMessage(); message.type = J3dMessage.BOUNDS_AUTO_COMPUTE_CHANGED; message.threads = J3dThread.UPDATE_TRANSFORM | J3dThread.UPDATE_GEOMETRY | J3dThread.UPDATE_RENDER; message.universe = universe; message.args[0] = Shape3DRetained.getGeomAtomsArray(mirrorShape3D); message.args[1] = localBounds; VirtualUniverse.mc.processMessage(message); } } } void updateBounds() { localBounds = getEffectiveBounds(); if (source.isLive()) { J3dMessage message = new J3dMessage(); message.type = J3dMessage.BOUNDS_AUTO_COMPUTE_CHANGED; message.threads = J3dThread.UPDATE_TRANSFORM | J3dThread.UPDATE_GEOMETRY | J3dThread.UPDATE_RENDER; message.universe = universe; message.args[0] = Shape3DRetained.getGeomAtomsArray(mirrorShape3D); message.args[1] = localBounds; VirtualUniverse.mc.processMessage(message); } } /** * Initialization of morphed geometry */ void initMorphedGeometry() { int vFormat, geoType, stripVCount[]; int iCount = 0; int numStrips = 0; int texCoordSetCount = 0; int texCoordSetMapLen = 0; int [] texCoordSetMap = null; int k; GeometryArrayRetained geo = geometryArrays[0]; vFormat = ((geo.getVertexFormat() | (GeometryArray.BY_REFERENCE)) & ~(GeometryArray.INTERLEAVED)) ; texCoordSetCount = geo.getTexCoordSetCount(); texCoordSetMapLen = geo.getTexCoordSetMapLength(); if (texCoordSetMapLen > 0) { texCoordSetMap = new int[texCoordSetMapLen]; geo.getTexCoordSetMap(texCoordSetMap); } geoType = geo.geoType; switch (geoType){ case GeometryRetained.GEO_TYPE_QUAD_SET: this.morphedGeometryArray = new QuadArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap); break; case GeometryRetained.GEO_TYPE_TRI_SET: this.morphedGeometryArray = new TriangleArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap); break; case GeometryRetained.GEO_TYPE_POINT_SET: this.morphedGeometryArray = new PointArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap); break; case GeometryRetained.GEO_TYPE_LINE_SET: this.morphedGeometryArray = new LineArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap); break; case GeometryRetained.GEO_TYPE_TRI_STRIP_SET: numStrips = ((TriangleStripArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((TriangleStripArrayRetained)geo).getStripVertexCounts(stripVCount); this.morphedGeometryArray = new TriangleStripArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap, stripVCount); break; case GeometryRetained.GEO_TYPE_TRI_FAN_SET: numStrips = ((TriangleFanArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((TriangleFanArrayRetained)geo).getStripVertexCounts(stripVCount); this.morphedGeometryArray = new TriangleFanArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap, stripVCount); break; case GeometryRetained.GEO_TYPE_LINE_STRIP_SET: numStrips = ((LineStripArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((LineStripArrayRetained)geo).getStripVertexCounts(stripVCount); this.morphedGeometryArray = new LineStripArray(geometryArrays[0].validVertexCount, vFormat, texCoordSetCount, texCoordSetMap, stripVCount); break; case GeometryRetained.GEO_TYPE_INDEXED_QUAD_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); this.morphedGeometryArray = new IndexedQuadArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount); break; case GeometryRetained.GEO_TYPE_INDEXED_TRI_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); this.morphedGeometryArray = new IndexedTriangleArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount); break; case GeometryRetained.GEO_TYPE_INDEXED_POINT_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); this.morphedGeometryArray = new IndexedPointArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount); break; case GeometryRetained.GEO_TYPE_INDEXED_LINE_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); this.morphedGeometryArray = new IndexedLineArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount); break; case GeometryRetained.GEO_TYPE_INDEXED_TRI_STRIP_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); numStrips = ((IndexedTriangleStripArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((IndexedTriangleStripArrayRetained)geo).getStripIndexCounts(stripVCount); this.morphedGeometryArray = new IndexedTriangleStripArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount, stripVCount);break; case GeometryRetained.GEO_TYPE_INDEXED_TRI_FAN_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); numStrips = ((IndexedTriangleFanArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((IndexedTriangleFanArrayRetained)geo).getStripIndexCounts(stripVCount); this.morphedGeometryArray = new IndexedTriangleFanArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount, stripVCount);break; case GeometryRetained.GEO_TYPE_INDEXED_LINE_STRIP_SET: iCount = ((IndexedGeometryArrayRetained)geo).getIndexCount(); numStrips = ((IndexedLineStripArrayRetained)geo).getNumStrips(); stripVCount = new int[numStrips]; ((IndexedLineStripArrayRetained)geo).getStripIndexCounts(stripVCount); this.morphedGeometryArray = new IndexedLineStripArray(geometryArrays[0].getNumCoordCount(), vFormat, texCoordSetCount, texCoordSetMap, iCount, stripVCount);break; } if (geometryArrays[0] instanceof IndexedGeometryArrayRetained) { IndexedGeometryArrayRetained igeo = (IndexedGeometryArrayRetained) geometryArrays[0]; IndexedGeometryArray morphedGeo = (IndexedGeometryArray) morphedGeometryArray; if ((vFormat & GeometryArray.COORDINATES) != 0) { morphedGeo.setCoordinateIndices(0, igeo.indexCoord); } if ((vFormat & GeometryArray.USE_COORD_INDEX_ONLY) == 0) { if ((vFormat & GeometryArray.NORMALS) != 0) { morphedGeo.setNormalIndices(0, igeo.indexNormal); } if ((vFormat & GeometryArray.COLOR) != 0) { morphedGeo.setColorIndices(0, igeo.indexColor); } if ((vFormat & GeometryArray.TEXTURE_COORDINATE) != 0) { for (k = 0; k < texCoordSetCount; k++) { morphedGeo.setTextureCoordinateIndices(k, 0, igeo.indexTexCoord[k]); } } } } this.morphedGeometryArray.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE); GeometryArrayRetained mga = (GeometryArrayRetained)morphedGeometryArray.retained; mga.updateData(this); } void getMirrorShape3D(ArrayList list, HashKey k) { Shape3DRetained ms; if (inSharedGroup) { ms = getMirrorShape(k); } else { ms = (Shape3DRetained)mirrorShape3D.get(0); } list.add(ms); } void compile(CompileState compState) { super.compile(compState); // XXXX: for now keep the static transform in the parent tg compState.keepTG = true; if (J3dDebug.devPhase && J3dDebug.debug) { compState.numMorphs++; } } void doErrorCheck(GeometryArrayRetained prevGeo, GeometryArrayRetained geo) { // If indexed Geometry array check the entire list instead of just the vcount if ((prevGeo.vertexFormat != geo.vertexFormat) || (prevGeo.validVertexCount != geo.validVertexCount) || (prevGeo.geoType != geo.geoType) || (prevGeo.texCoordSetCount != geo.texCoordSetCount)) { throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } if (geo.getTexCoordSetMapLength() != prevGeo.getTexCoordSetMapLength()){ throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } int texCoordSetMapLen = geo.getTexCoordSetMapLength(); int[] prevSvc= prevGeo.texCoordSetMap; int[] svc= geo.texCoordSetMap; for (int k = 0; k < texCoordSetMapLen; k++) { if (prevSvc[k] != svc[k]) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } if (geo instanceof GeometryStripArrayRetained) { prevSvc= ((GeometryStripArrayRetained)prevGeo).stripVertexCounts; svc= ((GeometryStripArrayRetained)geo).stripVertexCounts; if (prevSvc.length != svc.length) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); for (int k = 0; k < prevSvc.length; k++) { if (prevSvc[k] != svc[k]) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } } else if (geo instanceof IndexedGeometryArrayRetained) { if (((IndexedGeometryArrayRetained)prevGeo).validIndexCount != ((IndexedGeometryArrayRetained)geo).validIndexCount) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); // If by reference, then all array lengths should be same if (geo.getNumCoordCount() != prevGeo.getNumCoordCount() || geo.getNumColorCount() != prevGeo.getNumColorCount() || geo.getNumNormalCount() != prevGeo.getNumNormalCount()) { throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } int texCoordSetCount = geo.getTexCoordSetCount(); for (int k = 0; k < texCoordSetCount; k++) { if (geo.getNumTexCoordCount(k) != prevGeo.getNumTexCoordCount(k)) { throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } } if (geo instanceof IndexedGeometryStripArrayRetained) { prevSvc= ((IndexedGeometryStripArrayRetained)prevGeo).stripIndexCounts; svc= ((IndexedGeometryStripArrayRetained)geo).stripIndexCounts; if (prevSvc.length != svc.length) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); for (int k = 0; k < prevSvc.length; k++) { if (prevSvc[k] != svc[k]) throw new IllegalArgumentException(J3dI18N.getString("MorphRetained1")); } } } } void handleFrequencyChange(int bit) { int mask = 0; if (bit == Morph.ALLOW_GEOMETRY_ARRAY_WRITE) { mask = GEOMETRY_CHANGED; } else if (bit == Morph.ALLOW_APPEARANCE_WRITE) { mask = APPEARANCE_CHANGED; } else if (bit == Morph.ALLOW_APPEARANCE_OVERRIDE_WRITE) { mask = APPEARANCEOVERRIDE_CHANGED; } if (mask != 0) { if (source.getCapabilityIsFrequent(bit)) changedFrequent |= mask; else if (!source.isLive()) { changedFrequent &= ~mask; } } } void searchGeometryAtoms(UnorderList list) { list.add(Shape3DRetained.getGeomAtom( (Shape3DRetained) mirrorShape3D.get(0))); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -