package automenta.spacenet.space.geom;
import com.ardor3d.bounding.BoundingSphere;
import com.ardor3d.math.Vector3;
import com.ardor3d.renderer.IndexMode;
import com.ardor3d.scenegraph.Mesh;
import com.ardor3d.scenegraph.MeshData;
import com.ardor3d.util.geom.BufferUtils;
import com.bulletphysics.linearmath.convexhull.HullDesc;
import com.bulletphysics.linearmath.convexhull.HullFlags;
import com.bulletphysics.linearmath.convexhull.HullLibrary;
import com.bulletphysics.linearmath.convexhull.HullResult;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.List;
import javax.vecmath.Vector3f;
public class ConvexHull extends Box {
Mesh mesh = new Mesh();
Vector3 center = new Vector3();
HullLibrary hl = new HullLibrary();
public ConvexHull(List<Vector3f> vertices) {
super(BoxShape.Empty);
mesh.setModelBound(new BoundingSphere());
add(mesh);
setPoints(vertices);
}
public void setPoints(List<Vector3f> vertices) {
center.set(0, 0, 0);
for (Vector3f v : vertices) {
center.addLocal(v.x, v.y, v.z);
}
center.multiplyLocal(1.0 / vertices.size());
HullDesc hullDesc = new HullDesc(HullFlags.TRIANGLES, vertices.size(), vertices);
HullResult result = new HullResult();
hl.createConvexHull(hullDesc, result);
MeshData meshData = new MeshData();
final int verts = result.numOutputVertices;
meshData.setVertexBuffer(BufferUtils.createVector3Buffer(verts));
meshData.setNormalBuffer(BufferUtils.createVector3Buffer(verts));
final FloatBuffer tbuf = BufferUtils.createVector2Buffer(verts);
meshData.setTextureBuffer(tbuf, 0);
final int tris = result.numFaces;
meshData.setIndexBuffer(BufferUtils.createIntBuffer(tris * 3));
meshData.getVertexBuffer().clear();
Vector3f n = new Vector3f();
for (Vector3f v : result.outputVertices) {
meshData.getVertexBuffer().put(v.x);
meshData.getVertexBuffer().put(v.y);
meshData.getVertexBuffer().put(v.z);
float dx = v.x - center.getXf();
float dy = v.y - center.getYf();
float dz = v.z - center.getZf();
n.set(dx, dy, dz);
n.normalize();
meshData.getNormalBuffer().put((float) n.x);
meshData.getNormalBuffer().put((float) n.y);
meshData.getNormalBuffer().put((float) n.z);
}
IntBuffer i = IntBuffer.allocate(result.numIndices);
for (int f = 0; f < result.numIndices; f++) {
i.put(result.indices.get(f));
}
meshData.setIndexBuffer(i);
meshData.setIndexMode(IndexMode.Triangles);
mesh.setMeshData(meshData);
hl.releaseResult(result);
}
}