#0 

22-11-2009 13:52:34

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

Salut, j'utilise irrlicht 1.6 et j'ai décidé il y a pas longtemps d'y mettre de la physique, pour cela j'ai newton 1.53 et le wrapper IrrNewt. Je fait world = createWorld(device); tout va bien ça compile nickel et quand le programme démarre, ça ferme ferme en disant windows doit fermer le programme... A coups de débugger j'ai vu que le pointeur sur le monde newton (world->getNewtonWorld()) est égal à NULL et le pointeur du device contenu dans le monde est aussi NULL (world->getIrrlichtDevice() ).

PS: J'ai vu qu'il ya avait un sujet sur le même problème mais même en le lisant et relisant j'ai pas réussi à le régler. sad

Hors ligne


#1 

22-11-2009 14:34:58

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Je ne connais pas vraiment le wrap IrrNewt. Mais quand tu fais world = createWorld(device), ton paramètre device est-il valide ?


Force et sagesse...

Hors ligne


#2 

22-11-2009 18:00:16

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

ben oui (en tout cas le pointeur et pas nul), avant ça marchait et j'ai pas touché au device depuis

Hors ligne


#3 

22-11-2009 20:06:40

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Il faut être méfiant quant un débug affiche NULL ou éronné. Seules les variables utilisées au moment du crash et les constantes sont valides. Sinon sans plus de code on pourra pas trop te dire ...


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#4 

22-11-2009 20:14:22

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

T6D98U :

... avant ça marchait et j'ai pas touché au device depuis


bizarre quand même, tu as bien du modifier quelque chose qui fait que cela plante aujourd'hui.
Pour que la creation du world Newton, c'est super simple:
NewtonWorld *nWorld = NewtonCreate(NULL, NULL);  c'est tout, ce que doit faire l'instruction 'create' du wrapper. A toi de traquer
le bug, ou efectivement, fournis un bout de code, cela aidera à trouver avec toi le soucis wink


Force et sagesse...

Hors ligne


#5 

22-11-2009 23:25:47

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

J'ai vu que newton dans irrnewt ne tien pas à grand chose dans l'initialisation (j'ai fouiné dans les sources) le code est on ne peut plus simple:

Code c++ :

device = irr::createDevice(irr::video::EDT_OPENGL,irr::core::dimension2d<irr::u32>(800,600),32,false,true,false,0);
driver = data.device->getVideoDriver();
sceneManager = data.device->getSceneManager();

world = irr::newton::createWorld(data.device);
materials = *initMaterials(); //ici ça plante



les noms sont assez explicites je suppose sauf pour "materials = *initMaterials();" qui est en fait juste une fonctions qui me créée des materiels: c'est la première utilisation du monde newton par irrnewt et ça plante.

PS: le NULL je l'ai vu avec un débuggage à "cout << " parce que le débugger de code::blocks ne permet effectivement pas de voir sa valeur (mais très utile pour trouver où ça plante wink )

Hors ligne


#6 

23-11-2009 09:09:25

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Ca ne vient donc surement pas de Newton .... Je ne vois pas le rapport entre un material et la physique. Sinon quel est le type de materials? tu as l'air d'y stocker plusieurs materials ... c'est un tableau de SMaterials ?


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#7 

23-11-2009 17:29:35

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

Les materials sont des materiels newton (enfin pas exactement, une classe à moi), en effet j'en stocke plein. Le prog plante au moment où je créé le IMaterial avec IMaterial(data.world->getNewtonWorld()) dans ma classe (une utilisation du world c'est tout), le problème vient du fait que mon pointeur est nul mais je ne sais pas pourquoi. Et même si je vire cette ligne ça plante quand même quand j'essaye d'utiliser le world plus tard.

PS:les matériaux ont un rapport direct avec la physique, c'est les propriétés de l'objet comme l'élasticité et tout le reste

Hors ligne


#8 

23-11-2009 17:58:20

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

dacord ! je pige mieu ! mais ta variable "materials" n'est pas une class !! Sinon comment tu l'initialise avec un opérateur "=" ??
désolé je ne connais pas Newton mais je ne demande qu'a comprendre. Ceci-dit ça reste restrein au niveau du code que tu nous donne. j'aimerai au moin voire initMaterials() en détails wink

Dernière modification par TUpac (23-11-2009 17:58:58)


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#9 

23-11-2009 18:36:07

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

bon je débale le source de materials je sais pas si tu comprendras (pour l'op "=" ya un constructeur de copie généré auto wink ):

.h:

Code c++ :


    class Material : public irr::newton::IMaterial
    {
        public:
        Material(bool colid = true,double soft = 0.0,double elast = 0.0,float staticf = 0.f,float kineticf = 0.f);
        ~Material();

        bool colidable;
        double softness;
        double elasticity;
        float staticFriction;
        float kineticFriction;
    };

    class Materials
    {
        public:
        Materials();
        ~Materials();

        void add(string name,Material* mat);
        Material operator[](string name);

        protected:
        map<string,Material*> mats;
    };

    Materials *initMaterials();



.cpp:

Code c++ :


    Material::Material(bool colid,double soft,double elast,float staticf,float kineticf) : IMaterial(data.world->getNewtonWorld())
    {
        colidable = colid;
        softness = soft;
        elasticity = elast;
        staticFriction = staticf;
        kineticFriction = kineticf;
    }

    Material::~Material()
    {
    }




    Materials::Materials()
    {
    }

    Materials::~Materials()
    {
        for(map<string,Material*>::iterator it = mats.begin() ; it != mats.end() ; it++)
            delete it->second;
    }

    void Materials::add(string name,Material* mat)
    {
        mats[name] = mat;

        irr::newton::IMaterial *defaul = new irr::newton::IMaterial(data.world->getNewtonWorld());
        mat->setCollidable(defaul,mat->colidable);
        mat->setContinuousCollisionMode(defaul,false);
        mat->setSoftness(defaul,mat->softness);
        mat->setElasticity(defaul,mat->elasticity);
        mat->setFriction(defaul,mat->staticFriction,mat->kineticFriction);
        for(map<string,Material*>::iterator it = mats.begin() ; it != mats.end() ; it++)
        {
            mat->setCollidable(it->second,mat->colidable && it->second->colidable);
            mat->setContinuousCollisionMode(it->second,false);

            mat->setSoftness(it->second,
                            (mat->softness + it->second->softness)/2);
            mat->setElasticity(it->second,
                              (mat->elasticity + it->second->elasticity)/2 > 1 ? 1 : (mat->elasticity + it->second->elasticity)/2);
            mat->setFriction(it->second,
                            (mat->staticFriction + it->second->staticFriction)/2,
                            (mat->kineticFriction + it->second->kineticFriction)/2);
        }
    }
    Material Materials::operator[](string name)
    {
        return *mats[name];
    }

    Materials *initMaterials()
    {
        Materials *mat = new Materials();
        mat->add("sphere",new Material(true,0.0,1.0));
        return mat;
    }



mais ce code n'a aucun rapport avec mon problème: ce n'est qu'une utilisation du monde newton

Hors ligne


#10 

23-11-2009 18:52:09

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Je vais peut-être dire une bêtise, n'ayant pas le reste de ton code, mais tu écris

Code c++ :

device = irr::createDevice(irr::video::EDT_OPENGL,irr::core::dimension2d<irr::u32>(800,600),32,false,true,false,0);



et plus loin on retrouve

Code c++ :

data.device...



La première ligne ne devrait-elle pas être plutôt ?

Code c++ :

data.device = irr::createDevice(irr::video::EDT_OPENGL,irr::core::dimension2d<irr::u32>(800,600),32,false,true,false,0);



non ?


Force et sagesse...

Hors ligne


#11 

23-11-2009 18:59:46

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

Salut, en fait la première ligne se trouve dans le constructeur de la classe Data (dont je créé un objet data), j'aurais pu écrire "this->device" mais ça revient au même. C'est vrai que en ne sachant pas ça ça pourrait sembler être une erreur smile

Hors ligne


#12 

23-11-2009 19:17:26

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

ok c'est vrai que ça parrait bizard quant on est pas prévenu wink
sinon je ne vois pas. Ton debug ne te donne pas la ligne précise du plantage dans initMaterials?
est-ce une erreur de lecture mémoire? d'écriture? autre?


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#13 

23-11-2009 20:36:39

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

La ligne c'est

Code c++ :

Material::Material(bool colid,double soft,double elast,float staticf,float kineticf) : IMaterial(data.world->getNewtonWorld())


et je voterai pour l'erreur de mémoire étant donné que on passe un pointeur sur newtonWorld à IMaterial qui vaut NULL
Je rappelle que le problème de vien pas de cette fonction mais de la valeur du pointeur wink aussi il faudrait voir si le problème vient de la compilation ou autre de irrNewt.

Hors ligne


#14 

23-11-2009 21:00:45

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Ok je pense comprendre. Tu utilise data dans le constructeur parent

Code:

 IMaterial(data.world->getNewtonWorld())

hors le constructeur parent repique ses paramètres sur le constructeur fils et non sur les variables courantes.
essaye ça:

Code:

Material::Material(bool colid,double soft,double elast,float staticf,float kineticf, LeTypeDedata *data) : IMaterial(data->world->getNewtonWorld())

ou carrément::

Code:

Material::Material(bool colid,double soft,double elast,float staticf,float kineticf, NewtonWorld *world) : IMaterial(world)

modifie ton appel du contructeur en conséquence.
a+


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#15 

23-11-2009 21:11:25

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

Mouais sauf que data est global et le data.world vaut NULL même avant l'appel à initMaterial et tout ce qui se trouve dedans, j'ai quand même essayé ton code et ça marche toujours pas (je vois pas pourquoi ça marcherait car on passe un pointeur sur NULL au constructeur): c'est le pointeur qui est nul je sais pas comment faire pour qu'il ne le soit plus, je tourne en rond c'est horrible sad

Hors ligne


#16 

23-11-2009 23:08:37

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

t'as pas un moyen de tester ton NewtonWorld un peu avant le crash pour voir si il est bien en place? genre utiliser une methode du world pour voir si ton debuger s'arete dessus... Au moin tu serai fixé wink


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#17 

24-11-2009 17:34:43

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

J'ai testé ce que tu m'as dit, j'ai utilisé "NewtonDestroy" qui est censée certes détruire le monde mais elle plante au débuggage, encore une fois parce que le pointeur est nul.

Hors ligne


#18 

24-11-2009 17:41:09

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

J'y connais rien en NEwton mais ça veut dire que le world n'est pas initialisé correctement ...


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#19 

24-11-2009 17:57:17

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

C'est ce que je me suis dit mais même le device qu'il COPIE(car il ne fait que copier) est NULL alors qu'il part d'un IrrlichtDevice normal. J'arrive vraiment pas à comprendre ce qu'il f..., on dirait que les variables retent uniquement dans le constructeur. (le constructeur arrive à utiliser la device car il lui fait écrire des choses dans la console)

Dernière modification par T6D98U (24-11-2009 17:58:41)

Hors ligne


#20 

24-11-2009 18:33:32

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Il va falloire y passer !! big_smile nous filer ton code tongue


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#21 

24-11-2009 18:54:16

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

la question n'est pas le mien (j'ai quand même vérifié en créant une app avec juste l'initialisation même pas la boucle de rendu ni rien ça plante toujours). mais bon voilà:

data.h

Code c++ :


    class Data
    {
        public:
        Data()
        {
            device = irr::createDevice(irr::video::EDT_OPENGL,irr::core::dimension2d<irr::u32>(800,600),32,false,true,false,0);
            driver = device->getVideoDriver();
            sceneManager = device->getSceneManager();
            gui = device->getGUIEnvironment();

            irr::SKeyMap keyMap[5];
            //forward
            keyMap[0].Action = irr::EKA_MOVE_FORWARD;
            keyMap[0].KeyCode = irr::KEY_KEY_Z;
            //backward
            keyMap[1].Action = irr::EKA_MOVE_BACKWARD;
            keyMap[1].KeyCode = irr::KEY_KEY_S;
            //left
            keyMap[2].Action = irr::EKA_STRAFE_LEFT;
            keyMap[2].KeyCode = irr::KEY_KEY_Q;
            //right
            keyMap[3].Action = irr::EKA_STRAFE_RIGHT;
            keyMap[3].KeyCode = irr::KEY_KEY_D;
            //jump
            keyMap[4].Action = irr::EKA_JUMP_UP;
            keyMap[4].KeyCode = irr::KEY_SPACE;
            camera = sceneManager->addCameraSceneNodeFPS(0, 100.0f, 0.5f, -1, keyMap, 5, true,  2.0);
            camera->setPosition(irr::core::vector3df(0.f,196.f,0.f));
            curseur = device->getCursorControl();
            worldUp = irr::core::vector3df(0,1,0);

            world = irr::newton::createWorld(data.device);

            sounds = irrklang::createIrrKlangDevice();
        }
        virtual ~Data()
        {
            device->drop();
            sounds->removeAllSoundSources();
            sounds->drop();
            delete world;
        }
       
        irr::IrrlichtDevice *device;
        irr::video::IVideoDriver* driver;
        irr::scene::ISceneManager *sceneManager;
        irr::scene::ICameraSceneNode *camera;
        irr::gui::IGUIEnvironment *gui;
        irr::gui::ICursorControl *curseur;
        irr::newton::IWorld *world;
        irrklang::ISoundEngine *sounds;
        irr::core::vector3df worldUp;
        DLGUIManager *guiManager;
    };



window.h

Code c++ :


#ifndef WINDOW_H_INCLUDED
#define WINDOW_H_INCLUDED

#include "3D\mesh.h"
#include "3D\datas.h"
#include "3D\actions.h"
#include "gui\dgui.h"

    class Window : public irr::IEventReceiver
    {
        public:
        Window();
        ~Window();
        virtual bool OnEvent(const irr::SEvent &event);
        void run();

        protected:
        void init();

        enum{AMBIENT = 443, DIFFUSE, SPECULAR};
        enum{BOX = 215,CYLINDER,MESH,POINT,RING,SPHERE};
        void draw2D(string src,unsigned int x,unsigned int y,unsigned int w = 0,unsigned int h = 0,
                    unsigned int ccr = 255,unsigned int ccg = 255,unsigned int ccb = 255,
                    unsigned int r = 255,unsigned int g = 255,unsigned int b = 255,unsigned int a = 255);

        void light(float r,float g,float b,float a,int flags = AMBIENT,
        irr::core::vector3df v = irr::core::vector3df(0,0,0),float radius = 100.f,
        irr::video::E_LIGHT_TYPE type = irr::video::ELT_POINT,irr::core::vector3df dir = irr::core::vector3df(0,-1,0),
        float sr = 0.0,float sg = 0.0,float sb = 0.0,float sa = 0.0);

        protected:
        bool boucle;
        vector<Mesh*>   objects;
        vector<Action>  actions;

        Materials materials;
    };



window.cpp

Code c++ :


#include "window.h"

    extern Data data;

    Window::Window() : boucle(true)
    {
        materials = *initMaterials();
        init();
    }
    void Window::init()
    {
        data.curseur->setVisible(false);

        Particle::Ball fire(irr::core::vector3df(0.f,128.f,0.f),irr::core::vector3df(0.f,0.05f,0.f));
        fire.setRadius(2.f);
        fire.setLife(100,500);
        fire.setSize(irr::core::dimension2df(4.f,4.f),irr::core::dimension2df(5.f,5.f));
        fire.setTexture("sphere");
        fire.setPartPerSec(300,400);
        fire.setAttractAffector(true,irr::core::vector3df(0.f,256.f,0.f),1.f,true,false,true);
        fire.setFadeOutAffector(irr::video::SColor(0,0,0,0));
        fire.setAngle(0);

        objects.push_back(new Mesh(true,"media/fire.bmp",irr::core::vector3df(0,0,0)));
        objects[0]->setTex("media/room.3ds",true,0.004f);
        actions.push_back(Action());
        actions[0].setActive(false);

        objects.push_back(new Mesh(false,"media/rockwall.jpg",irr::core::vector3df(0,256,0),10,&materials["media/sphere.3ds"]));
        actions.push_back(Action());
        actions[1].setActive(false);

        objects.push_back(new Mesh(false,"sphere",irr::core::vector3df(0,256,0),9999,&materials["media/sphere.3ds"]));
        actions.push_back(Action());
        actions[2].setActive(false);

        light(0.2,0.2,0.2,1.0,AMBIENT);

        irr::core::stringw titre(data.driver->getFPS());
        data.device->setWindowCaption(titre.c_str());
    }

    Window::~Window()
    {
    }

    bool Window::OnEvent(const irr::SEvent &event)
    {
        if(objects.size() > 0 && objects[0] != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT)
        {
            switch(event.KeyInput.Key)
            {
                case irr::KEY_ESCAPE:
                boucle = false;
                return true;
                break;
            }
        }
        return false;
    }
    void Window::run()
    {
        irr::core::stringw titre(data.driver->getFPS());
        data.device->setWindowCaption(titre.c_str());

        data.device->setEventReceiver(this);
        while(data.device->run() && boucle)
        {
            data.world->update();

            data.driver->beginScene(true, true, irr::video::SColor(0,0,0,0));

            data.sceneManager->drawAll();
            data.gui->drawAll();
            data.driver->endScene();
        }
    }



window2.cpp

Code c++ :


#include "window.h"

    extern Data data;

    void Window::draw2D(string src,unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int ccr,unsigned int ccg,unsigned int ccb,unsigned int r,unsigned int g,unsigned int b,unsigned int a)
    {
        irr::video::ITexture *image = data.driver->getTexture(src.c_str());
        data.driver->makeColorKeyTexture (image, irr::video::SColor(ccr,ccg,ccb,255));
        w = w == 0 ? image->getSize().Width : w;
        h = h == 0 ? image->getSize().Height : h;
        data.driver->draw2DImage(image, irr::core::position2d<irr::s32>(x,y),
                                   irr::core::rect<irr::s32>(0,0,w,h), 0,
                                   irr::video::SColor(r, g, b, a), true);
    }

    void Window::light(float r,float g,float b,float a,int flags,irr::core::vector3df v,float radius,irr::video::E_LIGHT_TYPE type,irr::core::vector3df dir,float sr,float sg,float sb,float sa)
    {
        switch(flags)
        {
            case AMBIENT:
            data.sceneManager->setAmbientLight(irr::video::SColorf(r,g,b,a));
            break;
            case DIFFUSE:
            irr::scene::ILightSceneNode* lumiere = data.sceneManager->addLightSceneNode(0,v,irr::video::SColorf(0.0,0.0,0.0,0.0),radius);
            lumiere->getLightData().DiffuseColor = irr::video::SColorf(r,g,b,a);
            lumiere->getLightData().SpecularColor = irr::video::SColorf(sr,sg,sb,sa);
            break;
        }
    }



et le main:

Code c++ :


#include "3D\window.h"

int main()
{
    Window window;
    window.run();
    return 0;
}



Il y a pas mal de types indéfinis ici mais si je mettais toutes les sources je me retrouverai à devoir vous copier au moins 50 fichiers.

Dernière modification par T6D98U (24-11-2009 19:02:04)

Hors ligne


#22 

25-11-2009 12:58:39

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Ouai mais ce serait plus simple avec un zip qui contient tout. C'est plus facile de débuger avec un IDE que visuellement sur un forum. En plus j'ai déjà téléchargé les lib de newton pour un autre post wink


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#23 

25-11-2009 17:40:05

T6D98U
Membre
Date d'inscription: 22-11-2009
Messages: 12

voilà http://www.megaupload.com/?d=IFGL5SFI j'espère que j'ai rien oublié 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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
98 invités en ligne
Aucun membre connecté
RSS Feed