From a084ba5bb729e23d9a1dc9823982f632ea3da31e Mon Sep 17 00:00:00 2001
From: Anders Nilsson <anders.nilsson@cs.lth.se>
Date: Fri, 24 Aug 2007 16:46:07 +0200
Subject: [PATCH] Can compute OBB for simple x3d example. No idea if it's
 correct though.

---
 x3d/BoundingBox.jrag | 67 ++++++++++++++++++++++++++++++++++++++++++++
 x3d/OBB.java         | 13 +++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 x3d/BoundingBox.jrag
 create mode 100644 x3d/OBB.java

diff --git a/x3d/BoundingBox.jrag b/x3d/BoundingBox.jrag
new file mode 100644
index 0000000..43740c5
--- /dev/null
+++ b/x3d/BoundingBox.jrag
@@ -0,0 +1,67 @@
+/* -*-Java-*- */
+
+/*
+ * Copyright (C) 2007  Anders Nilsson <anders.nilsson@cs.lth.se>
+ *
+ * This file is part of XmlSchemaCompiler.
+ */
+
+import com.jme.bounding.*;
+import com.jme.util.geom.BufferUtils;
+
+aspect BoundingBox {
+
+    syn OrientedBoundingBox ASTNode.obb() = new OrientedBoundingBox();
+    eq Start.obb() = getSpecification().obb();
+    eq Specification.obb() = getElement(0).obb();
+    eq ComplexElement.obb() = getNumElement()>0 ? getElement(0).obb() : null;
+    eq X3D.obb() {
+        for (int i=0; i<getNumElement(); i++) {
+            ComplexElement e = (ComplexElement) getElement(i);
+            if (e instanceof Scene) {
+                return e.obb();
+            }
+        }
+        // Fallback, didn't suceed in finding a bounding box
+        return null;
+    }
+    eq Scene.obb() {
+        OrientedBoundingBox obb = new OrientedBoundingBox();
+        StringBuffer sb = getCoordinates();
+        String s = sb.toString().replace('\"',' ').replace(',',' ');
+//         String s = sb.toString().replace('\"',' ').replace(',',' ').replace("  "," ");
+        String[] sa = s.split(" ",0);
+        float[] fa = new float[sa.length];
+        for (int i=0,j=0; i<sa.length; i++) {
+            if (!sa[i].equals("")) {
+                fa[j++] = Float.parseFloat(sa[i]);
+            }
+        }
+        obb.computeFromPoints(BufferUtils.createFloatBuffer(fa));
+        obb.computeCorners();
+        System.out.println("Center: "+obb.getCenter());
+        System.out.println("Extent: "+obb.getExtent());
+        System.out.println("Volume: "+obb.getVolume());
+        return obb;
+    }
+}
+
+aspect Coordinates {
+    syn StringBuffer Element.getCoordinates() = new StringBuffer();
+    eq ComplexElement.getCoordinates() {
+        StringBuffer sb = new StringBuffer();
+        for (int i=0; i<getNumElement(); i++) {
+            sb.append(getElement(i).getCoordinates());
+        }
+        return sb;
+    }
+    eq Coordinate.getCoordinates() {
+        StringBuffer sb = new StringBuffer();
+        for (int i=0; i<getNumAttribute(); i++) {
+            sb.append(getAttribute(i).getCoordinates());
+        }        
+        return sb;
+    }
+    syn String Attribute.getCoordinates() = null;
+    eq point.getCoordinates() = getAttrValue().getSTRING_LITERAL();
+}
\ No newline at end of file
diff --git a/x3d/OBB.java b/x3d/OBB.java
new file mode 100644
index 0000000..a497d01
--- /dev/null
+++ b/x3d/OBB.java
@@ -0,0 +1,13 @@
+import AST.Start;
+import com.jme.bounding.*;
+
+public class OBB extends Parser {
+    public static void main(String args[]) {
+        Start ast = parse(args);
+        
+        OrientedBoundingBox obb = ast.obb();
+        System.out.println("X axis: "+obb.getXAxis());
+        System.out.println("Y axis: "+obb.getYAxis());
+        System.out.println("Z axis: "+obb.getZAxis());
+    }
+}
-- 
GitLab