rendered paste body/** IrrNewt object
* This is just an irrlicht object
* that has Newton properties. =)
* update newtonworld & irrlicht, then call CIrrNewt::Update().
*/
class CIrrNewt {
protected:
ISceneNode* irr;
NewtonBody* newt;
NewtonWorld* world;
ISceneManager* smgr;
NewtonCollision *CreateCollisionFromMesh(NewtonWorld *nWorld, IMesh *irr_mesh )
{
int nMeshBuffer = 0; //Mesh Buffer count
IMeshBuffer *mesh_buffer = NULL;
float *vertices; //Array to store vertices
u32 nVertices = 0;
//Get number of vertices
for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
{
nVertices += irr_mesh->getMeshBuffer(nMeshBuffer)->getVertexCount();
}
//Get (irr_)mesh buffers and copy face vertices
for( nMeshBuffer=0 ; nMeshBuffer < irr_mesh->getMeshBufferCount() ; nMeshBuffer++ )
{
mesh_buffer = irr_mesh->getMeshBuffer(nMeshBuffer);
//Get pointer to vertices and indices
S3DVertex *S3vertices = (S3DVertex*)mesh_buffer->getVertices();
//create buffer for vertices
vertices = new float[nVertices * 3];
u32 tmpCounter = 0;
//copy vertices from mesh to buffer
for(int i=0; i<mesh_buffer->getVertexCount(); i++)
{
vertices[tmpCounter++] = S3vertices[i].Pos.X;
vertices[tmpCounter++] = S3vertices[i].Pos.Y;
vertices[tmpCounter++] = S3vertices[i].Pos.Z;
}
}
//Create Newton collision object
NewtonCollision *collision_obj = NewtonCreateConvexHull(nWorld,nVertices,vertices,sizeof(float)*3,NULL);
//delete vertices
delete [] vertices;
return collision_obj;
}
public:
CIrrNewt(NewtonWorld* w, ISceneManager* mgr, IMesh* mesh) {
smgr=mgr; // Init scene manager
world = w; // Init newtonWorld
irr = smgr->addMeshSceneNode(mesh); // Init irrmesh
NewtonCollision *collision; // create a "collision" object.
collision = CreateCollisionFromMesh(world, mesh); // create a "collision" object
newt = NewtonCreateBody (world, collision); // add the actual newton body
NewtonReleaseCollision (world, collision); // delete the "collision" cube
}
void Update() {
float matrix[4][4];
NewtonBodyGetMatrix(newt, &matrix[0][0]); // get info about newton body
matrix4 mat;
memcpy(mat.M, matrix, sizeof(float)*16); // convert to irrlicht matrix
irr->setPosition(mat.getTranslation()); // set irrlicht position
irr->setRotation(mat.getRotationDegrees()); // set irrlicht rotation
}
};