voila :
creation de la physique :
TerrainPhysique::TerrainPhysique(Physique*World,GameEngine::TerrainEngine::CTerrainNode*geom)
{
user = NULL; Node = geom; phy = World;
btTransform Transform;
Transform.setIdentity();
Transform.setOrigin(btVector3(0,0,0));
btDefaultMotionState *MotionState = new btDefaultMotionState(Transform);
formCollide = new CollisionForm(phy->getDevice());
formCollide->makeTerrain(geom);
node = new btRigidBody(0.0f,MotionState,formCollide->getShape(),formCollide->getLocalInertia());
node->setUserPointer((void*)(this));
//setType(OTP_STATIC);// plante
phy->getWorldPhysic()->addRigidBody(node);
//setPosition(irr::core::vector3df(0,0,0));// plante aussi : |
Kst = NULL;
}
make terrain :
void CollisionForm::makeTerrain(GameEngine::TerrainEngine::CTerrainNode*terrain)
{
btTriangleMesh *CollisionMesh = new btTriangleMesh();
int j = 0;
for(int i=0; i<terrain->numQuad; i++)
meshBufferToPhysic(terrain->GetQuadNode(i)->mbuffer,CollisionMesh,terrain->getScale());
Shape = new btBvhTriangleMeshShape(CollisionMesh, true);
setOrigine(0.0f,terrain->getBoundingBox().getCenter());
}
trimesh :
void CollisionForm::meshBufferToPhysic(irr::scene::IMeshBuffer *TMeshBuffer, btTriangleMesh *TCollisionMesh, const irr::core::vector3df &TScale)
{
btVector3 TriangleVertices[3];
irr::u16 *Indices = TMeshBuffer->getIndices();
if(TMeshBuffer->getVertexType() == irr::video::EVT_STANDARD)
{
irr::video::S3DVertex *Vertices = (irr::video::S3DVertex*)TMeshBuffer->getVertices();
for(irr::u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3)
{
TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z);
TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z);
TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z);
TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2],true);
}
}
else
{
irr::video::S3DVertex2TCoords *Vertices = (irr::video::S3DVertex2TCoords*)TMeshBuffer->getVertices();
for(irr::u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3)
{
TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z);
TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z);
TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z);
TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2],true);
}
}
}