Salut,
Si tu veux gérer du trimesh, il te faut passer par une méthode qui lit les indices et vertices de ton SceneNode puis passer ça à Ode, comme tu as dû le faire pour ton terrain.
Je te file les méthodes codées pour mon jeu :
Je déclare une structure trimesh (pour delete le pointeur c'est nickel)
struct TriMesh
{
dGeomID GeomID;
dVector3* vertices;
s32* indices;
};
Ensuite la méthode du trimesh à proprement parler :
//Create a TriMesh
OdePhysic::TriMesh OdePhysic::CreateTriMesh(scene::IMesh* mesh,f32 ScaleX,f32 ScaleY,f32 ScaleZ)
{
TriMesh TriStruct;
s32 ci=0, cif=0, cv=0;
s32 indexcount = 0;
s32 vertexcount = 0;
scene::IMesh* omesh = mesh;//->getMesh(0);
for (u32 i=0;i<omesh->getMeshBufferCount();++i)
{
scene::IMeshBuffer* mb = omesh->getMeshBuffer(i);
indexcount += mb->getIndexCount();
vertexcount += mb->getVertexCount();
}
TriStruct.indices = new s32[indexcount];
TriStruct.vertices = new dVector3[vertexcount];
for (u32 i=0;i<omesh->getMeshBufferCount();++i)
{
scene::IMeshBuffer* mb = omesh->getMeshBuffer(i);
u16* mb_indices = mb->getIndices();
for(u32 j=0;j<mb->getIndexCount();++j)
{
TriStruct.indices[ci] = cif + mb_indices[j];
ci++;
}
cif += mb->getVertexCount();
if (mb->getVertexType() == video::EVT_STANDARD)
{
irr::video::S3DVertex* mb_vertices=(irr::video::S3DVertex*)mb->getVertices();
for(u32 j=0;j<mb->getVertexCount();++j)
{
TriStruct.vertices[cv][0]=mb_vertices[j].Pos.X*ScaleX;
TriStruct.vertices[cv][1]=mb_vertices[j].Pos.Y*ScaleY;
TriStruct.vertices[cv][2]=mb_vertices[j].Pos.Z*ScaleZ;
cv++;
}
}
else
{
if (mb->getVertexType() == video::EVT_2TCOORDS)
{
irr::video::S3DVertex2TCoords* mb_vertices=(irr::video::S3DVertex2TCoords*)mb->getVertices();
for(u32 j=0;j<mb->getVertexCount();j++)
{
TriStruct.vertices[cv][0]=mb_vertices[j].Pos.X*ScaleX;
TriStruct.vertices[cv][1]=mb_vertices[j].Pos.Y*ScaleY;
TriStruct.vertices[cv][2]=mb_vertices[j].Pos.Z*ScaleZ;
cv++;
}
}
}
}
dTriMeshDataID data = dGeomTriMeshDataCreate();
dGeomTriMeshDataBuildSimple(data,(dReal*)TriStruct.vertices, vertexcount,(dTriIndex*) TriStruct.indices, indexcount);
dGeomID geom=dCreateTriMesh(oSpace,data,0,0,0);
dGeomTriMeshSetData(geom,data);
dGeomSetBody(geom,0);
TriStruct.GeomID = geom;
return TriStruct;
}
Et la méthode pour delete proprement se trimesh afin d'éviter les memory leaks :
//Destroy the trimesh from memory
void OdePhysic::DestroyTriMesh(TriMesh TriStruct)
{
dTriMeshDataID data = dGeomTriMeshGetTriMeshDataID(TriStruct.GeomID);
dGeomTriMeshClearTCCache(TriStruct.GeomID);
dGeomTriMeshDataDestroy(data);
dGeomDestroy(TriStruct.GeomID);
TriStruct.GeomID = NULL;
delete [] TriStruct.indices;
delete [] TriStruct.vertices;
TriStruct.indices=NULL;
TriStruct.vertices=NULL;
}