159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.bullet.collision.shapes; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.InputCapsule; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.OutputCapsule; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.VertexBuffer.Type; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.BufferUtils; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.FloatBuffer; 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class HullCollisionShape extends CollisionShape { 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float[] points; 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// protected FloatBuffer fbuf; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public HullCollisionShape() { 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public HullCollisionShape(Mesh mesh) { 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.points = getPoints(mesh); 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createShape(); 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public HullCollisionShape(float[] points) { 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.points = points; 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createShape(); 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void write(JmeExporter ex) throws IOException { 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.write(ex); 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta OutputCapsule capsule = ex.getCapsule(this); 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta capsule.write(points, "points", null); 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void read(JmeImporter im) throws IOException { 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.read(im); 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta InputCapsule capsule = im.getCapsule(this); 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // for backwards compatability 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Mesh mesh = (Mesh) capsule.readSavable("hullMesh", null); 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh != null) { 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.points = getPoints(mesh); 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.points = capsule.readFloatArray("points", null); 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf = ByteBuffer.allocateDirect(points.length * 4).asFloatBuffer(); 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf.put(points); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf = FloatBuffer.wrap(points).order(ByteOrder.nativeOrder()).asFloatBuffer(); 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createShape(); 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void createShape() { 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// ObjectArrayList<Vector3f> pointList = new ObjectArrayList<Vector3f>(); 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// for (int i = 0; i < points.length; i += 3) { 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// pointList.add(new Vector3f(points[i], points[i + 1], points[i + 2])); 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// objectId = new ConvexHullShape(pointList); 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// objectId.setLocalScaling(Converter.convert(getScale())); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// objectId.setMargin(margin); 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ByteBuffer bbuf=BufferUtils.createByteBuffer(points.length * 4); 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf = bbuf.asFloatBuffer(); 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf.rewind(); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fbuf.put(points); 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < points.length; i++) { 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float f = points[i]; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bbuf.putFloat(f); 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bbuf.rewind(); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objectId = createShape(bbuf); 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Created Shape {0}", Long.toHexString(objectId)); 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setScale(scale); 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setMargin(margin); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private native long createShape(ByteBuffer points); 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float[] getPoints(Mesh mesh) { 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta FloatBuffer vertices = mesh.getFloatBuffer(Type.Position); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vertices.rewind(); 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int components = mesh.getVertexCount() * 3; 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] pointsArray = new float[components]; 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < components; i += 3) { 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointsArray[i] = vertices.get(); 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointsArray[i + 1] = vertices.get(); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pointsArray[i + 2] = vertices.get(); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pointsArray; 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 99