Handle missing 3d models in example 07

No more crashing if some models are not found


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6435 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2022-10-07 18:10:50 +00:00
parent 41f2f8654f
commit b3fff12423

View File

@ -200,19 +200,20 @@ int main()
selection is being performed. */ selection is being performed. */
scene::IAnimatedMeshSceneNode* node = 0; scene::IAnimatedMeshSceneNode* node = 0;
video::SMaterial material;
// Add an MD2 node, which uses vertex-based animation. // Add an MD2 node, which uses vertex-based animation.
node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "faerie.md2"), node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "faerie.md2"),
0, IDFlag_IsPickable | IDFlag_IsHighlightable); 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
node->setPosition(core::vector3df(-90,-15,-140)); // Put its feet on the floor. if ( node )
node->setScale(core::vector3df(1.6f)); // Make it appear realistically scaled {
node->setMD2Animation(scene::EMAT_POINT); node->setPosition(core::vector3df(-90,-15,-140)); // Put its feet on the floor.
node->setAnimationSpeed(20.f); node->setScale(core::vector3df(1.6f)); // Make it appear realistically scaled
material.setTexture(0, driver->getTexture(mediaPath + "faerie2.bmp")); node->setMD2Animation(scene::EMAT_POINT);
material.Lighting = true; node->setAnimationSpeed(20.f);
material.NormalizeNormals = true; video::SMaterial& material = node->getMaterial(0);
node->getMaterial(0) = material; material.setTexture(0, driver->getTexture(mediaPath + "faerie2.bmp"));
material.Lighting = true;
material.NormalizeNormals = true;
}
// Now create a triangle selector for it. The selector will know that it // Now create a triangle selector for it. The selector will know that it
// is associated with an animated node, and will update itself as necessary. // is associated with an animated node, and will update itself as necessary.
@ -223,43 +224,49 @@ int main()
// And this B3D file uses skinned skeletal animation. // And this B3D file uses skinned skeletal animation.
node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "ninja.b3d"), node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "ninja.b3d"),
0, IDFlag_IsPickable | IDFlag_IsHighlightable); 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
node->setScale(core::vector3df(10)); if ( node )
node->setPosition(core::vector3df(-75,-66,-80)); {
node->setRotation(core::vector3df(0,90,0)); node->setScale(core::vector3df(10));
node->setAnimationSpeed(8.f); node->setPosition(core::vector3df(-75,-66,-80));
node->getMaterial(0).NormalizeNormals = true; node->setRotation(core::vector3df(0,90,0));
node->getMaterial(0).Lighting = true; node->setAnimationSpeed(8.f);
// Just do the same as we did above. node->getMaterial(0).NormalizeNormals = true;
selector = smgr->createTriangleSelector(node, separateMeshBuffers); node->getMaterial(0).Lighting = true;
node->setTriangleSelector(selector); // Just do the same as we did above.
selector->drop(); selector = smgr->createTriangleSelector(node, separateMeshBuffers);
node->setTriangleSelector(selector);
selector->drop();
}
// This X files uses skeletal animation, but without skinning. // This X files uses skeletal animation, but without skinning.
node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "dwarf.x"), node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "dwarf.x"),
0, IDFlag_IsPickable | IDFlag_IsHighlightable); 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
node->setPosition(core::vector3df(-70,-66,-30)); // Put its feet on the floor. if ( node )
node->setRotation(core::vector3df(0,-90,0)); // And turn it towards the camera. {
node->setAnimationSpeed(20.f); node->setPosition(core::vector3df(-70,-66,-30)); // Put its feet on the floor.
node->getMaterial(0).Lighting = true; node->setRotation(core::vector3df(0,-90,0)); // And turn it towards the camera.
selector = smgr->createTriangleSelector(node, separateMeshBuffers); node->setAnimationSpeed(20.f);
node->setTriangleSelector(selector); node->getMaterial(0).Lighting = true;
selector->drop(); selector = smgr->createTriangleSelector(node, separateMeshBuffers);
node->setTriangleSelector(selector);
selector->drop();
}
// And this mdl file uses skinned skeletal animation. // And this mdl file uses skinned skeletal animation.
node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "yodan.mdl"), node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "yodan.mdl"),
0, IDFlag_IsPickable | IDFlag_IsHighlightable); 0, IDFlag_IsPickable | IDFlag_IsHighlightable);
node->setPosition(core::vector3df(-90,-25,20)); if ( node )
node->setScale(core::vector3df(0.8f)); {
node->getMaterial(0).Lighting = true; node->setPosition(core::vector3df(-90,-25,20));
node->setAnimationSpeed(20.f); node->setScale(core::vector3df(0.8f));
node->getMaterial(0).Lighting = true;
node->setAnimationSpeed(20.f);
// Just do the same as we did above. // Just do the same as we did above.
selector = smgr->createTriangleSelector(node, separateMeshBuffers); selector = smgr->createTriangleSelector(node, separateMeshBuffers);
node->setTriangleSelector(selector); node->setTriangleSelector(selector);
selector->drop(); selector->drop();
}
material.setTexture(0, 0);
material.Lighting = false;
// Add a light, so that the unselected nodes aren't completely dark. // Add a light, so that the unselected nodes aren't completely dark.
scene::ILightSceneNode * light = smgr->addLightSceneNode(0, core::vector3df(-60,100,400), scene::ILightSceneNode * light = smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
@ -271,7 +278,9 @@ int main()
scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager(); scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager();
// draw the selection triangle only as wireframe // draw the selection triangle only as wireframe
material.Wireframe=true; irr::video::SMaterial materialWireframe;
materialWireframe.Lighting = false;
materialWireframe.Wireframe=true;
while(device->run()) while(device->run())
if (device->isWindowActive()) if (device->isWindowActive())
@ -320,7 +329,7 @@ int main()
// We need to reset the transform before doing our own rendering. // We need to reset the transform before doing our own rendering.
driver->setTransform(video::ETS_WORLD, core::matrix4()); driver->setTransform(video::ETS_WORLD, core::matrix4());
driver->setMaterial(material); driver->setMaterial(materialWireframe);
driver->draw3DTriangle(hitResult.Triangle, video::SColor(0,255,0,0)); // Show which triangle has been hit driver->draw3DTriangle(hitResult.Triangle, video::SColor(0,255,0,0)); // Show which triangle has been hit
// We can check the flags for the scene node that was hit to see if it should be // We can check the flags for the scene node that was hit to see if it should be