/** 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; igetVertexCount(); 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 } };