📄 shape3dcompileretained.java
字号:
} break; case GeometryArrayRetained.GEO_TYPE_INDEXED_POINT_SET: if (mergedList[i] != null) { cgeo = new IndexedPointArrayRetained(); 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_LINE_SET: if (mergedList[i] != null) { cgeo = new IndexedLineArrayRetained(); 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_STRIP_SET: if (mergedList[i] != null) { cgeo = new IndexedTriangleStripArrayRetained(); 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_FAN_SET: if (mergedList[i] != null) { cgeo = new IndexedTriangleFanArrayRetained(); 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_LINE_STRIP_SET: if (mergedList[i] != null) { cgeo = new IndexedLineStripArrayRetained(); 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; } } } Bounds getCollisionBounds(int childIndex) { return collisionBound; } int numGeometries(int childIndex) { ArrayList geo = (ArrayList) geometryInfo.get(childIndex); return geo.size(); } Geometry getGeometry(int i, int childIndex) { ArrayList geoInfo = (ArrayList) geometryInfo.get(childIndex); return (Geometry)geoInfo.get(i); } Enumeration getAllGeometries(int childIndex) { ArrayList geoInfo = (ArrayList) geometryInfo.get(childIndex); Vector geomList = new Vector(); for(int i=0; i<geoInfo.size(); i++) { geomList.add(geoInfo.get(i)); } return geomList.elements(); } Bounds getBounds(int childIndex) { if(boundsAutoCompute) { ArrayList glist = (ArrayList) geometryInfo.get(childIndex); if(glist != null) { BoundingBox bbox = new BoundingBox((Bounds) null); for(int i=0; i<glist.size(); i++) { Geometry g = (Geometry) glist.get(i); if (g != null) { GeometryRetained geometry = (GeometryRetained)g.retained; if (geometry.geoType != GeometryRetained.GEO_TYPE_NONE) { geometry.computeBoundingBox(); synchronized(geometry.geoBounds) { bbox.combine(geometry.geoBounds); } } } } return (Bounds) bbox; } else { return null; } } else { return super.getBounds(); } } /** * Check if the geometry component of this shape node under path * intersects with the pickRay. * @return true if intersected else false. If return is true, dist * contains the closest * distance of intersection. * @exception IllegalArgumentException if <code>path</code> is * invalid. */ boolean intersect(SceneGraphPath path, PickShape pickShape, double[] dist) { int flags; PickInfo pickInfo = new PickInfo(); Transform3D localToVworld = path.getTransform(); if (localToVworld == null) { throw new IllegalArgumentException(J3dI18N.getString("Shape3DRetained3")); } pickInfo.setLocalToVWorldRef( localToVworld); Shape3D shape = (Shape3D) path.getObject(); // Get the geometries for this shape only, since the compiled // geomtryList contains several shapes ArrayList glist = (ArrayList) geometryInfo.get(shape.id); // System.err.println("Shape3DCompileRetained.intersect() : "); if (dist == null) { // System.err.println(" no dist request ...."); return intersect(pickInfo, pickShape, 0, glist); } flags = PickInfo.CLOSEST_DISTANCE; if (intersect(pickInfo, pickShape, flags, glist)) { dist[0] = pickInfo.getClosestDistance(); return true; } return false; } boolean intersect(PickInfo pickInfo, PickShape pickShape, int flags, ArrayList geometryList) { Transform3D localToVworld = pickInfo.getLocalToVWorldRef(); Transform3D t3d = new Transform3D(); t3d.invert(localToVworld); PickShape newPS = pickShape.transform(t3d); int geomListSize = geometryList.size(); GeometryRetained geometry; if (((flags & PickInfo.CLOSEST_INTERSECTION_POINT) == 0) && ((flags & PickInfo.CLOSEST_DISTANCE) == 0) && ((flags & PickInfo.CLOSEST_GEOM_INFO) == 0) && ((flags & PickInfo.ALL_GEOM_INFO) == 0)) { for (int i=0; i < geomListSize; i++) { geometry = (GeometryRetained) geometryList.get(i); if (geometry != null) { if (geometry.mirrorGeometry != null) { geometry = geometry.mirrorGeometry; } // Need to modify this method // if (geometry.intersect(newPS, null, null)) { if (geometry.intersect(newPS, null, 0, null, null, 0)) { return true; } } } } else { double distance; double minDist = Double.POSITIVE_INFINITY; Point3d closestIPnt = new Point3d(); Point3d iPnt = new Point3d(); Point3d iPntVW = new Point3d(); for (int i=0; i < geomListSize; i++) { geometry = (GeometryRetained) geometryList.get(i); if (geometry != null) { if (geometry.mirrorGeometry != null) { geometry = geometry.mirrorGeometry; } if (geometry.intersect(newPS, pickInfo, flags, iPnt, geometry, i)) { iPntVW.set(iPnt); localToVworld.transform(iPntVW); distance = pickShape.distance(iPntVW); if (minDist > distance) { minDist = distance; closestIPnt.set(iPnt); } } } } if (minDist < Double.POSITIVE_INFINITY) { if ((flags & PickInfo.CLOSEST_DISTANCE) != 0) { pickInfo.setClosestDistance(minDist); } if((flags & PickInfo.CLOSEST_INTERSECTION_POINT) != 0) { pickInfo.setClosestIntersectionPoint(closestIPnt); } return true; } } return false; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -