#0 

05-04-2012 14:57:02

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

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


#1 

05-04-2012 17:08:04

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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


#2 

05-04-2012 22:40:45

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Oui seulement à chaque fois j'ai un segmentation fault...

Voilà mon code :

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


#3 

05-04-2012 23:37:37

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Voilà l'erreur de mémoire à disparu grâce à cette modif :

Code:

    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(...).

Dernière modification par AntiLoxy (06-04-2012 00:27:57)

Hors ligne


#4 

06-04-2012 10:29:33

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Dans ce cas essai un truc du genre :

Code:

// 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.

Dernière modification par johnplayer (06-04-2012 10:34:10)


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


#5 

06-04-2012 17:05:52

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Pour vider mon scene manager sans fuite mémoire j'ai simplement rajouté cette ligne :

Code:

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


#6 

11-04-2012 23:03:03

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Petit up ! personne n'a une idée ?

Hors ligne


#7 

12-04-2012 00:13:59

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

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


#8 

12-04-2012 11:23:50

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Voilà la réponse, il faut recréer une caméra apres le clear().

Code:

    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


#9 

12-04-2012 22:52:09

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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é
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
879 membres
1424 sujets
11113 messages
Dernier membre inscrit: brendan87
19 invités en ligne
Aucun membre connecté
RSS Feed