#1 

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


#2 

05-04-2012 15:08:04

johnplayer
Membres
Avatar de johnplayer
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


#3 

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


#4 

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


#5 

06-04-2012 08:29:33

johnplayer
Membres
Avatar de johnplayer
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


#6 

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


#7 

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


#8 

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


#9 

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


#10 

12-04-2012 20:52:09

johnplayer
Membres
Avatar de johnplayer
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 lol. 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


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
176 invités en ligne
membre en ligne: -
RSS Feed