/*
|
* Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz>
|
*
|
* Bullet Continuous Collision Detection and Physics Library
|
* Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/
|
*
|
* This software is provided 'as-is', without any express or implied warranty.
|
* In no event will the authors be held liable for any damages arising from
|
* the use of this software.
|
*
|
* Permission is granted to anyone to use this software for any purpose,
|
* including commercial applications, and to alter it and redistribute it
|
* freely, subject to the following restrictions:
|
*
|
* 1. The origin of this software must not be misrepresented; you must not
|
* claim that you wrote the original software. If you use this software
|
* in a product, an acknowledgment in the product documentation would be
|
* appreciated but is not required.
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
* misrepresented as being the original software.
|
* 3. This notice may not be removed or altered from any source distribution.
|
*/
|
|
package com.bulletphysics.collision.shapes;
|
|
import com.bulletphysics.util.ObjectArrayList;
|
import java.nio.ByteBuffer;
|
|
/**
|
* TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing
|
* triangle/index arrays. Additional meshes can be added using {@link #addIndexedMesh addIndexedMesh}.<p>
|
*
|
* No duplicate is made of the vertex/index data, it only indexes into external vertex/index
|
* arrays. So keep those arrays around during the lifetime of this TriangleIndexVertexArray.
|
*
|
* @author jezek2
|
*/
|
public class TriangleIndexVertexArray extends StridingMeshInterface {
|
|
protected ObjectArrayList<IndexedMesh> indexedMeshes = new ObjectArrayList<IndexedMesh>();
|
|
private ByteBufferVertexData data = new ByteBufferVertexData();
|
|
public TriangleIndexVertexArray() {
|
}
|
|
/**
|
* Just to be backwards compatible.
|
*/
|
public TriangleIndexVertexArray(int numTriangles, ByteBuffer triangleIndexBase, int triangleIndexStride, int numVertices, ByteBuffer vertexBase, int vertexStride) {
|
IndexedMesh mesh = new IndexedMesh();
|
|
mesh.numTriangles = numTriangles;
|
mesh.triangleIndexBase = triangleIndexBase;
|
mesh.triangleIndexStride = triangleIndexStride;
|
mesh.numVertices = numVertices;
|
mesh.vertexBase = vertexBase;
|
mesh.vertexStride = vertexStride;
|
|
addIndexedMesh(mesh);
|
}
|
|
public void addIndexedMesh(IndexedMesh mesh) {
|
addIndexedMesh(mesh, ScalarType.INTEGER);
|
}
|
|
public void addIndexedMesh(IndexedMesh mesh, ScalarType indexType) {
|
indexedMeshes.add(mesh);
|
indexedMeshes.getQuick(indexedMeshes.size() - 1).indexType = indexType;
|
}
|
|
@Override
|
public VertexData getLockedVertexIndexBase(int subpart) {
|
assert (subpart < getNumSubParts());
|
|
IndexedMesh mesh = indexedMeshes.getQuick(subpart);
|
|
data.vertexCount = mesh.numVertices;
|
data.vertexData = mesh.vertexBase;
|
//#ifdef BT_USE_DOUBLE_PRECISION
|
//type = PHY_DOUBLE;
|
//#else
|
data.vertexType = ScalarType.FLOAT;
|
//#endif
|
data.vertexStride = mesh.vertexStride;
|
|
data.indexCount = mesh.numTriangles*3;
|
|
data.indexData = mesh.triangleIndexBase;
|
data.indexStride = mesh.triangleIndexStride/3;
|
data.indexType = mesh.indexType;
|
return data;
|
}
|
|
@Override
|
public VertexData getLockedReadOnlyVertexIndexBase(int subpart) {
|
return getLockedVertexIndexBase(subpart);
|
}
|
|
/**
|
* unLockVertexBase finishes the access to a subpart of the triangle mesh.
|
* Make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished.
|
*/
|
@Override
|
public void unLockVertexBase(int subpart) {
|
data.vertexData = null;
|
data.indexData = null;
|
}
|
|
@Override
|
public void unLockReadOnlyVertexBase(int subpart) {
|
unLockVertexBase(subpart);
|
}
|
|
/**
|
* getNumSubParts returns the number of seperate subparts.
|
* Each subpart has a continuous array of vertices and indices.
|
*/
|
@Override
|
public int getNumSubParts() {
|
return indexedMeshes.size();
|
}
|
|
public ObjectArrayList<IndexedMesh> getIndexedMeshArray() {
|
return indexedMeshes;
|
}
|
|
@Override
|
public void preallocateVertices(int numverts) {
|
}
|
|
@Override
|
public void preallocateIndices(int numindices) {
|
}
|
|
}
|