Wenn ich dich jetzt ganz richtig verstanden habe lädst du eine .irr-Datei und möchtest die Objekte daraus zur Kollisionskontrolle hinzufügen und andere Objekte nicht?
Das einzige was mir dann dazu einfallen würde, wäre entweder, die Datei zuerst zu laden, sämtliche Nodes daraus zur Kollision hinzuzufügen und dann erst alles andere zu laden.
Falls das aus irgendeinem Grund nicht möglich ist, wäre eine andere Möglichkeit, vor dem Laden der Datei alle bereits vorhanden Nodes in einer Liste bzw. einem Array zu speichern, dann die Datei zu laden, wieder und dann nur solche Nodes zu Kollision hinzuzufügen die neu hinzugekommen sind.
Also frei nach Tutorial 15:
Code:
// Alle Nodes vorher speichern
core::array<scene::ISceneNode *> nodesPrev;
smgr->getSceneNodesFromType(scene::ESNT_ANY, nodesPrev);
// Szene laden
smgr->loadScene("../../media/example.irr");
// Alle Nodes (mit geladener Szene) speichern
core::array<scene::ISceneNode *> nodesNew;
smgr->getSceneNodesFromType(scene::ESNT_ANY, nodesNew);
for (u32 i=0; i < nodesNew.size(); ++i)
{
scene::ISceneNode * node = nodesNew[i];
//Prüfen ob Node schon vorher existierte
bool equalsPrev = false;
for (u32 j=0; j < nodesPrev.size(); ++j)
{
if (node == nodesPrev[j])
{
equalsPrev = true;
break;
}
}
if (!equalsPrev)
{
scene::ITriangleSelector * selector = 0;
switch(node->getType())
{
case scene::ESNT_CUBE:
case scene::ESNT_ANIMATED_MESH:
// Because the selector won't animate with the mesh,
// and is only being used for camera collision, we'll just use an approximate
// bounding box instead of ((scene::IAnimatedMeshSceneNode*)node)->getMesh(0)
selector = smgr->createTriangleSelectorFromBoundingBox(node);
break;
case scene::ESNT_MESH:
case scene::ESNT_SPHERE: // Derived from IMeshSceneNode
selector = smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
case scene::ESNT_TERRAIN:
selector = smgr->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
break;
case scene::ESNT_OCT_TREE:
selector = smgr->createOctTreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
default:
// Don't create a selector for this node type
break;
}
if(selector)
{
// Add it to the meta selector, which will take a reference to it
meta->addTriangleSelector(selector);
// And drop my reference to it, so that the meta selector owns it.
selector->drop();
}
}
}
Mehr kann ich dazu jetzt nicht sagen, da ich mit .irr-Dateien bisher noch nicht gearbeitet habe. Das wäre halt jetzt was ich machen würde, ich kann mir aber vorstellen, dass das Performancemäßig nicht unbedingt das Beste ist, je nachdem wieviel Nodes in der Szene bestehen kann die Prüfung auf Neuheit ja mehrere Ewigkeiten dauern.... Für kleine Szenen sollte es aber durchaus praktikabel sein..