private static Map<Geometry, SceneGraphComponent> getGeometries_R(
     SceneGraphComponent root, SceneGraphPath p) {
   p.push(root);
   Map<Geometry, SceneGraphComponent> r = new HashMap<Geometry, SceneGraphComponent>();
   if (root.getGeometry() != null) {
     Geometry g = root.getGeometry();
     if (g instanceof PointSet) { // remove vertex normals if flat shading
       PointSet pSet = (PointSet) g;
       if (pSet.getVertexAttributes().containsAttribute(Attribute.NORMALS)) {
         EffectiveAppearance ea = EffectiveAppearance.create(p);
         DefaultGeometryShader dgs = ShaderUtility.createDefaultGeometryShader(ea);
         DefaultPolygonShader ps = (DefaultPolygonShader) dgs.getPolygonShader();
         if (!ps.getSmoothShading()) {
           pSet.setVertexAttributes(Attribute.NORMALS, null);
         }
       }
     }
     r.put(root.getGeometry(), root);
   }
   for (int i = 0; i < root.getChildComponentCount(); i++) {
     Map<Geometry, SceneGraphComponent> subList = getGeometries_R(root.getChildComponent(i), p);
     if (subList.size() != 0) {
       r.putAll(subList);
     }
   }
   p.pop();
   return r;
 }
 public void visit(PointSet p) {
   // Following code should only be activated if we have listeners installed to update
   // the bounding box when it goes out of date.
   if (checkForBoundingBox(p)) return;
   Object domain = p.getGeometryAttributes(GeometryUtility.HEIGHT_FIELD_SHAPE);
   if (domain != null && domain instanceof Rectangle2D) {
     Rectangle2D box = (Rectangle2D) domain;
     double[][] data = p.getVertexAttributes(Attribute.COORDINATES).toDoubleArrayArray(null);
     double[][] zbnds = new double[2][1];
     Rn.calculateBounds(zbnds, data);
     double[][] xyzbnds = new double[2][3];
     xyzbnds[0][0] = box.getMinX();
     xyzbnds[1][0] = box.getMaxX();
     xyzbnds[0][1] = box.getMinY();
     xyzbnds[1][1] = box.getMaxY();
     xyzbnds[0][2] = zbnds[0][0];
     xyzbnds[1][2] = zbnds[1][0];
     if (Double.isNaN(xyzbnds[0][0])) throw new IllegalStateException("Nan");
     Rectangle3D box3 = new Rectangle3D(xyzbnds);
     unionBox(box3);
     return;
   }
   DataList vv = p.getVertexAttributes(Attribute.COORDINATES);
   if (vv == null) {
     // signal error
     return;
   }
   unionVectors(vv);
 }