1package com.jme3.bullet.collision.shapes;
2
3import com.jme3.export.InputCapsule;
4import com.jme3.export.JmeExporter;
5import com.jme3.export.JmeImporter;
6import com.jme3.export.OutputCapsule;
7import com.jme3.scene.Mesh;
8import com.jme3.scene.VertexBuffer.Type;
9import com.jme3.util.BufferUtils;
10import java.io.IOException;
11import java.nio.ByteBuffer;
12import java.nio.FloatBuffer;
13import java.util.logging.Level;
14import java.util.logging.Logger;
15
16public class HullCollisionShape extends CollisionShape {
17
18    private float[] points;
19//    protected FloatBuffer fbuf;
20
21    public HullCollisionShape() {
22    }
23
24    public HullCollisionShape(Mesh mesh) {
25        this.points = getPoints(mesh);
26        createShape();
27    }
28
29    public HullCollisionShape(float[] points) {
30        this.points = points;
31        createShape();
32    }
33
34    @Override
35    public void write(JmeExporter ex) throws IOException {
36        super.write(ex);
37
38        OutputCapsule capsule = ex.getCapsule(this);
39        capsule.write(points, "points", null);
40    }
41
42    @Override
43    public void read(JmeImporter im) throws IOException {
44        super.read(im);
45        InputCapsule capsule = im.getCapsule(this);
46
47        // for backwards compatability
48        Mesh mesh = (Mesh) capsule.readSavable("hullMesh", null);
49        if (mesh != null) {
50            this.points = getPoints(mesh);
51        } else {
52            this.points = capsule.readFloatArray("points", null);
53
54        }
55//        fbuf = ByteBuffer.allocateDirect(points.length * 4).asFloatBuffer();
56//        fbuf.put(points);
57//        fbuf = FloatBuffer.wrap(points).order(ByteOrder.nativeOrder()).asFloatBuffer();
58        createShape();
59    }
60
61    protected void createShape() {
62//        ObjectArrayList<Vector3f> pointList = new ObjectArrayList<Vector3f>();
63//        for (int i = 0; i < points.length; i += 3) {
64//            pointList.add(new Vector3f(points[i], points[i + 1], points[i + 2]));
65//        }
66//        objectId = new ConvexHullShape(pointList);
67//        objectId.setLocalScaling(Converter.convert(getScale()));
68//        objectId.setMargin(margin);
69        ByteBuffer bbuf=BufferUtils.createByteBuffer(points.length * 4);
70//        fbuf = bbuf.asFloatBuffer();
71//        fbuf.rewind();
72//        fbuf.put(points);
73        for (int i = 0; i < points.length; i++) {
74            float f = points[i];
75            bbuf.putFloat(f);
76        }
77        bbuf.rewind();
78        objectId = createShape(bbuf);
79        Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Created Shape {0}", Long.toHexString(objectId));
80        setScale(scale);
81        setMargin(margin);
82    }
83
84    private native long createShape(ByteBuffer points);
85
86    protected float[] getPoints(Mesh mesh) {
87        FloatBuffer vertices = mesh.getFloatBuffer(Type.Position);
88        vertices.rewind();
89        int components = mesh.getVertexCount() * 3;
90        float[] pointsArray = new float[components];
91        for (int i = 0; i < components; i += 3) {
92            pointsArray[i] = vertices.get();
93            pointsArray[i + 1] = vertices.get();
94            pointsArray[i + 2] = vertices.get();
95        }
96        return pointsArray;
97    }
98}
99