Pages: 1
- Accueil forums
- » Mesh
- » Problème d'allocation mémoire d'un tableau de nodes !
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
08-11-2011 08:14:41
- Gehogor
- Membres

- 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...
Hors ligne
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
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
10-11-2011 19:43:39
- Magun
- Administrateurs

- 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é ![]()
Hors ligne



