like Vertical stair,portal,Jumping machine.
I can only get position of birth in 16 example.
quote example 16
here if I met vertical stair,how I can extracted useful information from the level?/*
so we need a good starting Position in the level.
we can ask the Quake3 Loader for all entities with class_name
"info_player_deathmatch"
we choose a random launch
*/
if ( mesh )
{
quake3::tQ3EntityList &entityList = mesh->getEntityList();
quake3::IEntity search;
search.name = "info_player_deathmatch";
s32 index = entityList.binary_search(search);
if (index >= 0)
{
s32 notEndList;
do
{
const quake3::SVarGroup *group = entityList[index].getGroup(1);
u32 parsepos = 0;
const core::vector3df pos =
quake3::getAsVector3df(group->get("origin"), parsepos);
parsepos = 0;
const f32 angle = quake3::getAsFloat(group->get("angle"), parsepos);
core::vector3df target(0.f, 0.f, 1.f);
target.rotateXZBy(angle);
camera->setPosition(pos);
camera->setTarget(pos + target);
++index;
/*
notEndList = ( index < (s32) entityList.size () &&
entityList[index].name == search.name &&
(device->getTimer()->getRealTime() >> 3 ) & 1
);
*/
notEndList = index == 2;
} while ( notEndList );
}
}
and my pk3 map has skybox,but can't display
this is my code
Code: Select all
...
int main()
{
...
Q3LevelLoadParameter loadParam;
loadParam.defaultLightMapMaterial = EMT_LIGHTMAP;
loadParam.defaultModulate = EMFN_MODULATE_1X;
loadParam.defaultFilter = EMF_ANISOTROPIC_FILTER;
loadParam.verbose = 2;
loadParam.mergeShaderBuffer = 1; // merge meshbuffers with same material
loadParam.cleanUnResolvedMeshes = 1; // should unresolved meshes be cleaned. otherwise blue texture
loadParam.loadAllShaders = 1; // load all scripts in the script directory
loadParam.loadSkyShader = 0; // load sky Shader
loadParam.alpharef = 1;
device->getFileSystem()->addFileArchive("mesh/sokar3dm5.pk3",true,false,EFAT_ZIP);
smgr->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true);
IFileSystem *fs = device->getFileSystem();
IReadFile* file = fs->createMemoryReadFile(&loadParam,sizeof(loadParam),L"levelparameter.cfg",false);
smgr->getMesh(file);
file->drop ();
scene::IQ3LevelMesh* mesh = (scene::IQ3LevelMesh*) smgr->getMesh("maps/sokar3dm5.bsp");
scene::ISceneNode* node = 0;
scene::ISceneNode* ShaderParent = 0;
scene::IMesh * geometry;
if (mesh)
{
geometry = mesh->getMesh(quake3::E_Q3_MESH_GEOMETRY);
node = smgr->addOctreeSceneNode(geometry, 0, -1, 2048);
node->setName("maps/sokar3dm5.bsp");
}
ShaderParent = smgr->addEmptySceneNode();
if ( ShaderParent )
ShaderParent->setName("Shader Container");
Meta = 0;
ITriangleSelector* selector = 0;
Meta = smgr->createMetaTriangleSelector();
if(Meta)
{
selector = smgr->createOctreeTriangleSelector(geometry,node,2048);
Meta->addTriangleSelector(selector);
selector->drop();
}
IMeshSceneNode* node2;
if (mesh)
{
SMesh * additional_mesh = (SMesh*)mesh->getMesh(quake3::E_Q3_MESH_ITEMS);
s32 sceneNodeID = 0;
for ( u32 i = 0; i!= additional_mesh->getMeshBufferCount(); ++i )
{
IMeshBuffer* meshBuffer = additional_mesh->getMeshBuffer(i);
const video::SMaterial& material = meshBuffer->getMaterial();
s32 shaderIndex = (s32) material.MaterialTypeParam2;
quake3::IShader *shader = (IShader*)mesh->getShader(shaderIndex);
if (0 == shader)
{
continue;
}
node2 = smgr->addQuake3SceneNode(meshBuffer,shader,ShaderParent,sceneNodeID);
node2->setAutomaticCulling ( scene::EAC_FRUSTUM_BOX );
sceneNodeID += 1;
u8 doCreate = Meta != 0;
if(shader)
{
const SVarGroup* group = shader->getGroup(1);
if(group->isDefined("surfaceparm","trans"))
{
if(!group->isDefined("surfaceparm","metalsteps"))
{
doCreate = 0;
}
}
}
if( doCreate )
{
IMesh *m = 0;
bool takeOriginal = true;
if(takeOriginal)
{
m = new SMesh();
((SMesh*)m)->addMeshBuffer(meshBuffer);
}
else
{
m = node2->getMesh();
}
selector = smgr->createTriangleSelector(m,0);
Meta->addTriangleSelector(selector);
selector->drop();
if(takeOriginal)
{
delete m;
}
}
}
}
...
return 0;
}