Pages: 1
- Accueil forums
- » Discussions générales
- » Comment supprimer une scene irrlicht ?
05-04-2012 12:57:02
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 2.6.123.86
- Courriel
Bonjour, je vous présente mon problème.
J'ai une Scene irrlicht (faites avec IrrEdit au format *.irr) que je charge dans mon programme irrlicht, seulement je n'arrive pas à la décharger.
Lorsque je remplace le SceneNode par une autre scene l'ancienne reste.
Le but c'est de pouvoir recharger une nouvelle Scene irrlicht en supprimant l'ancienne.
Je ne vois pas dutout comment faire, la fonction remove fonctionne pour mes meshs mais pas pour la Scene.
Merci de votre aide.
Hors ligne
05-04-2012 15:08:04
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.227.52
- Courriel
Il suffit de vider le scenemanager grâce à smgr->clear().
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
05-04-2012 20:40:45
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
Oui seulement à chaque fois j'ai un segmentation fault...
Voilà mon code :
CEventDebugger debug(camera,Nmodele);
device->setEventReceiver(&debug);
while (device->run())
{
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
device->getGUIEnvironment()->drawAll();
smgr->drawAll();
debug.majPosCam();
if(ref == 1){ fprintf(stderr,"yoyo :"); smgr->clear(); ref = 0; }
}
driver->endScene();
}
device->drop();
return 0;Hors ligne
05-04-2012 21:37:37
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
Voilà l'erreur de mémoire à disparu grâce à cette modif :
while (device->run())
{
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
driver->draw2DImage(fond, core::position2d<s32>(0,0), core::rect<s32>(0,0,WEIGHT,HEIGHT), 0, video::SColor(255, 255, 255, 255), true);
if(ref == 0) receiver.MajEventMesh(driver,font);
//debug.majPosCam();
device->getGUIEnvironment()->drawAll();
smgr->drawAll();
if(ref == 0) receiver.Collide(ref);
if(ref == 1){ smgr->clear(); smgr->getMeshCache()->clear(); smgr->loadScene("NG-map0.irr"); ref = 2; }
}
driver->endScene();
}Le soucis maintenant c'est que je ne peux pas recharger une autre scene avec loadScene(...).
Hors ligne
06-04-2012 08:29:33
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.227.52
- Courriel
Dans ce cas essai un truc du genre :
// créé un nouveau scenemanager
newsmgr = smgr->createNewSceneManager();
// detruit l'ancien scenemanager
smgr->drop();
// indique au device l'emplacement mémoire utilisé par le nouveau scenemanager
Device->setInputReceivingSceneManager(newsmgr);Je n'ai pas tester le code donc pour la création du nouveau scenemanager je ne suis pas sur...
Mais bon le principe y est. Si tu as du corriger quelque chose fais part de la rectification dans ton prochain post, ça aidera certainement quelqu'un d'autre.
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
06-04-2012 15:05:52
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 86.201.23.169
- Courriel
Pour vider mon scene manager sans fuite mémoire j'ai simplement rajouté cette ligne :
if(ref == 0) receiver.MajEventMesh(driver,font);J'ai essayé ta méthode mais j'ai une erreur mémoire encore une fois.
Je voudrais simplement pouvoir recharger un mesh ou une scene apres avoir fait un smgr->clear() mais ca n'a pas l'air simple ^^.
Hors ligne
11-04-2012 21:03:03
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
Petit up ! personne n'a une idée ?
Hors ligne
11-04-2012 22:13:59
- RVM
- Membres
- Date d'inscription:
- Messages: 20
- IP: 81.50.206.60
- Courriel
Faudrait tester de : créer une scenenode (vide), et charger le contenu de la scene irr dans celle-ci. Puis supprimer la node.
En théorie sa devrait fonctionner...
Hors ligne
12-04-2012 09:23:50
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 86.201.20.157
- Courriel
Voilà la réponse, il faut recréer une caméra apres le clear().
if(ref == 1){ sceneManager->clear(); sceneManager->addCameraSceneNodeFPS(0, 100.0f, 0.1f, -1, keyMap, 5); sceneManager->loadScene("../../media/NG-map0.irr"); ref = 0; }Hors ligne
12-04-2012 20:52:09
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.219.124
- Courriel
C'est le genre de problème qui prend 15 jours à résoudre alors que c'est tout con
. Mais bon, tu as résolu ton problème, c'est le plus important.
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne



