All pastes #801174 Raw Edit

Miscellany

public text v1 · immutable
#801174 ·published 2007-11-29 01:29 UTC
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
 }

};