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