#0 

07-11-2011 17:15:37

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

Salut à tous, j'ai un problème pour supprimer les nodes de ma scene irrlicht, (j'ai essayé avec remove, removeAll, drop, etc...) rien ne marche.
Je pense que le problème vient du fait que j'alloue une zone mémoire comme ceci pour mes meshs :

    scene::IAnimatedMeshMD2** modele;
    scene::IAnimatedMeshSceneNode** Nmodele;

    modele = (scene::IAnimatedMeshMD2**) calloc(sizeof(modele),NombreMeshs);
    Nmodele = (scene::IAnimatedMeshSceneNode** ) calloc(sizeof(Nmodele),NombreMeshs);

(j'ai gardé des vieilles habitudes du C ^^)

Pour la suppression voilà comment je m'y prend.

Dans la boucle du device->run() :

if(ref == 1) { Nmodele[1]->remove(); Nmodele[1] = 0;  ref = 0; }

À ce niveau là j'ai un jolie segmentation fault, je précise que ce mesh n'est pas utilisé dans le programme à part sa déclaration et initialisation...

Merci de m'éclairer de vos lumieres !

Hors ligne


#1 

08-11-2011 09:14:41

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

Salut,

Je ne voudrais pas dire de bêtise, mais lorsqu'on regarde la doc, on ne voit pas de constructeur, soit, cet objet ne peut être alloué que par Irrlicht et personne d'autre. Si tu le fais toi même, alors tu ne peux pas appeler un "remove" qui fait appelle a des mécanismes de suppression interne comme la gestion de référence, notification d'évènements...

Pour l'utiliser, je pense notamment à "getMesh" de la classe ISceneManager.

Proposition:

Code c++ :

scene::IAnimatedMeshMD2** modele = new scene::IAnimatedMeshMD2*[NombreMeshs];
scene::IAnimatedMeshSceneNode** Nmodele = new scene::IAnimatedMeshSceneNode*[NombreMeshs];

for(int i=0;i<NombreMeshs;i++)
{
    modele[i] = sceneManager->getMesh(...);
    Nmodele[i] = sceneManager->getMesh(...);
}

//-----------------------------------------//
//-------------- le reste -----------------//
//-----------------------------------------//

for(int i=0;i<NombreMeshs;i++)
{
    modele[i]->remove();
    Nmodele[i]->remove();
}

delete []modele;
delete []Nmodele;



                 Bonne journée.

Dernière modification par Gehogor (08-11-2011 09:16:20)


Et hop... wink

Hors ligne


#2 

09-11-2011 10:26:13

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

Toujours le même problème :S je pense que la solution est dans l'utilisation de la template array d'irrlicht, je vais tester ça quant j'aurais le temps.

Hors ligne


#3 

10-11-2011 11:57:07

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

Code c++ :

#include <irrlicht.h>
#include <iostream>
#include <vector>
#include "eventDebugger.h"

#define HEIGHT 300
#define WEIGHT 300

using namespace irr;

int main(int argc, char* argv[])
{
    int ref = 1;
    int NombreMeshs = 2;
    video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
    scene::ICameraSceneNode * camera;
    scene::IAnimatedMeshMD2** modele;
    scene::IAnimatedMeshSceneNode** Nmodele;

IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(WEIGHT, HEIGHT),32,false);
if (device == 0)    return 1;

device->setWindowCaption(L"Orion Engine");

video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();

modele = new scene::IAnimatedMeshMD2*[NombreMeshs];
Nmodele = new scene::IAnimatedMeshSceneNode*[NombreMeshs];

for(int i=0;i<=NombreMeshs;i++)
{
  modele[i] = (irr::scene::IAnimatedMeshMD2*)smgr->getMesh("../../media/Models/cloud/cloud.md2");
  if (!modele[i])
  {
    device->drop();
    return 1;
  }

  Nmodele[i] = smgr->addAnimatedMeshSceneNode( modele[i] );
}

camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));

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 :"); Nmodele[1]->removeAll(); modele[1] = NULL; Nmodele[1] = NULL;  ref = 0; }
        }

        driver->endScene();
    }
device->drop();

    return 0;

}


Voilà le main.cpp en entier, je n'ai pas de messages d'erreurs (segmentation fault) mais le mesh ne se supprime pas... c'est vraiment une fonction bizare remove !

Hors ligne


#4 

10-11-2011 20:43:39

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

tout est dans la doc <<removeAll () Removes all children of this scene node.>>
aucun node n'est parent de nModele[1] donc aucun node n'est suprimmer
essaye donc smgr->clear()

il n'est pas nécéssaire de charger un même mesh pour plusieur nodes, tu gagneras en memoire et temp de chargement

ps: j'ai éditer ton message afin d'utiliser la balise 'Code=cpp' pour la colorisation syntaxique
bonne soiré wink

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
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
85 invités en ligne
Aucun membre connecté
RSS Feed