/**
  * Updates the position of vol so it is placed at orig. This method is used for fast repaints in
  * J3DScene
  */
 void updateVolumePosition(Volume3d vol, Volume3d orig) {
   switch (chainTree.volumeMode) {
     case OBB:
       Box3d box = (Box3d) vol;
       Box3d origBox = (Box3d) orig;
       box.setAnchor(origBox.getAnchor());
       box.setXDir(origBox.getXDir());
       box.setYDir(origBox.getYDir());
       box.setZDir(origBox.getZDir());
       return;
     case CAPSULE:
       Capsule3d caps = (Capsule3d) vol;
       Capsule3d origCaps = (Capsule3d) orig;
       caps.segment.setA(origCaps.segment.getA());
       caps.segment.setB(origCaps.segment.getB());
       caps.rad = origCaps.rad;
       return;
     case RSS:
       RSS3d rss = (RSS3d) vol;
       RSS3d origRSS = (RSS3d) orig;
       rss.rectangle.center.set(origRSS.rectangle.center);
       rss.rectangle.bases[0].set(origRSS.rectangle.bases[0]);
       rss.rectangle.bases[1].set(origRSS.rectangle.bases[1]);
       rss.radius = origRSS.radius;
       return;
     case PSS:
       Sphere3d sphere = (Sphere3d) vol;
       Sphere3d origSphere = (Sphere3d) orig;
       sphere.center.set(origSphere.center);
   }
   throw new Error("Unknown volume type chosen: " + chainTree.volumeMode);
 }
 public Volume3d transform(RotationMatrix4x4 m, Volume3d shape) {
   switch (chainTree.volumeMode) {
     case OBB:
       Box3d box = (Box3d) shape;
       Vector3d[] newBases = {
         chainTree.getDirection(m, box.getBases()[0]),
         chainTree.getDirection(m, box.getBases()[1]),
         chainTree.getDirection(m, box.getBases()[2])
       };
       return new Box3d(chainTree.getPosition(m, box.getAnchor()), newBases, box.extents);
     case CAPSULE:
       Capsule3d caps = (Capsule3d) shape;
       Capsule3d rotatedCaps =
           new Capsule3d(
               chainTree.getPosition(m, caps.segment.getA()),
               chainTree.getPosition(m, caps.segment.getB()),
               caps.rad);
       return rotatedCaps;
     case RSS:
       RSS3d rss = (RSS3d) shape;
       Point3d newCenter = chainTree.getPosition(m, rss.getCenter());
       newBases =
           new Vector3d[] {
             chainTree.getDirection(m, rss.rectangle.bases[0]),
             chainTree.getDirection(m, rss.rectangle.bases[1])
           };
       return new RSS3d(newCenter, newBases, rss.radius);
     case PSS:
       Sphere3d sphere = (Sphere3d) shape;
       newCenter = chainTree.getPosition(m, sphere.center);
       return new Sphere3d(newCenter, sphere.radius);
   }
   throw new Error("Unknown volume type chosen: " + chainTree.volumeMode);
 }
 public Volume3d createEnclosingVolume(Volume3d s1, Volume3d s2) {
   switch (chainTree.volumeMode) {
     case OBB:
       return Box3d.createBoundingBox_Covariance((Box3d) s1, (Box3d) s2);
     case CAPSULE:
       return Capsule3d.createBoundingCapsule_MaxDist((Capsule3d) s1, (Capsule3d) s2);
     case RSS:
       return RSS3d.createBoundingRSS_covariance((RSS3d) s1, (RSS3d) s2);
     case PSS:
       return Sphere3d.createBoundingSphere((Sphere3d) s1, (Sphere3d) s2);
   }
   throw new Error("Unknown volume type chosen: " + chainTree.volumeMode);
 }
  /** Create a volume bounding all the points. Also extend the radius appropriately */
  Volume3d createEnclosingExtendedVolume(PointSet3d points, double extension) {
    switch (chainTree.volumeMode) {
      case OBB:
        Box3d retBox = Box3d.createBoundingBox_Covariance(points);
        retBox.extents[0] += extension;
        retBox.extents[1] += extension;
        retBox.extents[2] += extension;
        return retBox;
      case CAPSULE:
        Capsule3d ret = Capsule3d.createBoundingCapsule_CovarianceFit(points);
        ret.rad += extension;
        return ret;
      case RSS:
        RSS3d rss = RSS3d.createBoundingRSS_covariance(points);
        rss.radius += extension;

        return rss;
      case PSS:
        Sphere3d sphere = Sphere3d.getMinSphere(points);
        sphere.radius += extension;
        return sphere;
    }
    throw new Error("Unknown volume type chosen: " + chainTree.volumeMode);
  }