#1 

07-11-2011 16:15:37

AntiLoxy
Membres
Date d'inscription:
Messages: 17
IP: 90.60.201.140
Courriel

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


#2 

08-11-2011 08:14:41

Gehogor
Membres
Avatar de Gehogor
Date d'inscription:
Messages: 130
IP: 93.1.224.250
Courriel

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.


Et hop... wink

Hors ligne


#3 

09-11-2011 09:26:13

AntiLoxy
Membres
Date d'inscription:
Messages: 17
IP: 86.201.144.161
Courriel

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


#4 

10-11-2011 10:57:07

AntiLoxy
Membres
Date d'inscription:
Messages: 17
IP: 86.201.144.161
Courriel

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


#5 

10-11-2011 19:43:39

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 188.93.45.30
Courriel  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é
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
154 invités en ligne
membre en ligne: -
RSS Feed