
Q3 collision improved
http://myfreefilehosting.com/f/fdf53b9428_5.69MB
......
Code: Select all
typedef struct
{
scene::IMesh *geometry;
scene::ISceneNode *node;
} Quake3_Tp;
/*
Load a QUAKE3 Map with internal objects (Lamps, Lights, etc) + Collisions
By Colombian Developers
*/
Quake3_Tp LOAD_Q3SHADERS(char *ruta, IMetaTriangleSelector * plistacol,scene::ISceneManager* smgr)
{
scene::IQ3LevelMesh *mesh = (scene::IQ3LevelMesh*) smgr->getMesh(ruta);
scene::ISceneNode *node= 0;
scene::IMesh *geometry= 0;
if ( mesh )
{
geometry = mesh->getMesh(quake3::E_Q3_MESH_GEOMETRY );
node = smgr->addMeshSceneNode ( geometry );
if (plistacol)
plistacol->addTriangleSelector(smgr->createOctTreeTriangleSelector( geometry,node));
}
/*
now construct SceneNodes for each Shader
The Objects are stored in the quake mesh scene::E_Q3_MESH_ITEMS
and the Shader ID is stored in the MaterialParameters
mostly dark looking skulls and moving lava.. or green flashing tubes?
*/
if ( mesh )
{
// the additional mesh can be quite huge and is unoptimized
scene::IMesh * additional_mesh = mesh->getMesh ( quake3::E_Q3_MESH_ITEMS );
for ( u32 i = 0; i!= additional_mesh->getMeshBufferCount (); ++i )
{
IMeshBuffer *meshBuffer = additional_mesh->getMeshBuffer ( i );
const video::SMaterial &material = meshBuffer->getMaterial();
//! The ShaderIndex is stored in the material parameter
s32 shaderIndex = (s32) material.MaterialTypeParam2;
// the meshbuffer can be rendered without additional support, or it has no shader
const quake3::SShader *shader = mesh->getShader ( shaderIndex );
if ( 0 == shader )
{
continue;
}
// we can dump the shader to the console in it's original but already parsed layout
// in a pretty printers way.. commented out, because the console would be full...
// quake3::dumpShader ( Shader );
// Now add the MeshBuffer(s) with the current Shader to the Manager
scene::ISceneNode *modelo= smgr->addQuake3SceneNode ( meshBuffer, shader );
if (plistacol) //collisions with Q3items?
{
scene::SMesh *modelom= new scene::SMesh;
modelom->addMeshBuffer (meshBuffer);
plistacol->addTriangleSelector (smgr->createOctTreeTriangleSelector(modelom,modelo));
delete modelom;
}
}
// original mesh is not needed anymore
mesh->releaseMesh ( quake3::E_Q3_MESH_ITEMS );
}
Quake3_Tp ret;
ret.geometry = geometry;
ret.node = node;
return ret;
}
.....