[C++, DX9] new btBvhTriangleMeshShape() crashes

Ripiz
Posts: 47
Joined: Mon Aug 16, 2010 10:43 am

[C++, DX9] new btBvhTriangleMeshShape() crashes

Post by Ripiz »

First I create collision mesh out of triangles:

Code: Select all

		LPDIRECT3DVERTEXBUFFER9 pVertices;
		Mesh->GetVertexBuffer( &pVertices );
		DWORD dwVertexSize = Mesh->GetNumBytesPerVertex();
		BYTE* pVertexData;
		pVertices->Lock(0, 0, (void**)&pVertexData, 0);

		LPDIRECT3DINDEXBUFFER9 pIndices;
		Mesh->GetIndexBuffer(&pIndices);
		BYTE* pIndexData;
		pIndices->Lock(0, 0, (void**)&pIndexData, 0);

		btTriangleIndexVertexArray *trimesh = new btTriangleIndexVertexArray(Mesh->GetNumFaces(), (int*)pIndexData, 3 * sizeof(int), Mesh->GetNumVertices(), (btScalar*)pVertexData, dwVertexSize);
		pIndices->Unlock();
		pIndices->Release();
		pVertices->Unlock();
		pVertices->Release();
Then I try to create body so I can assign my model to it:

Code: Select all

		Vector3 min, max;
		model->GetAABB(&min, &max);
		btVector3 bMin(-1000, -1000, -1000), bMax(1000, 1000, 1000);
		btBvhTriangleMeshShape *trimeshShape  = new btBvhTriangleMeshShape(trimesh, true, bMin, bMax);

		extern btDynamicsWorld *m_dynamicsWorld;
		float mass = 1;
		btCollisionShape *collision = trimeshShape;
		btVector3 inertia;
		collision->calculateLocalInertia(mass, inertia);

		btTransform startTransform;
		startTransform.setIdentity();
		startTransform.setOrigin(btVector3(loc.x, loc.y, loc.z));

		btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
		btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, collision, inertia);
		btRigidBody *body = new btRigidBody(rbInfo);
		m_dynamicsWorld->addRigidBody(body);
But it crashes when I call 'new btBvhTriangleMeshShape(model->GetTrimesh(), true, bMin, bMax);'
Debugger points at this line:
triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
Inside BulletCollision\CollisionShapes\btStridingMeshInterface.cpp

Anyone have idea what's wrong?
Let me know if I forgot to post any details.

Thanks in advance.
Ripiz
Posts: 47
Joined: Mon Aug 16, 2010 10:43 am

Re: [C++, DX9] new btBvhTriangleMeshShape() crashes

Post by Ripiz »

Any help? :(
SteveSegreto
Posts: 32
Joined: Sun Sep 12, 2010 10:25 am

Re: [C++, DX9] new btBvhTriangleMeshShape() crashes

Post by SteveSegreto »

You need to either change your index format to INT in DirectX or change it to PHY_SHORT in Bullet.

To do this on Bullet's end requires basically rewriting the constructor for btTriangleIndexVertexArray to allow you to specify an m_indexType of PHY_SHORT for the btIndexedMesh that is pushed back to m_indexedMeshes.

Something like this:

[source]
btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride, PHY_ScalarType indexType )
: m_hasAabb(0)
{
btIndexedMesh mesh;

mesh.m_numTriangles = numTriangles;
mesh.m_triangleIndexBase = (const unsigned char *)triangleIndexBase;
mesh.m_triangleIndexStride = triangleIndexStride;
mesh.m_numVertices = numVertices;
mesh.m_vertexBase = (const unsigned char *)vertexBase;
mesh.m_vertexStride = vertexStride;

addIndexedMesh(mesh, indexType);

}
[/source]