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