Historique des modifications - Message

Message #10478

Sujet: Bug avec l'animation du mesh


Type Date Auteur Contenu
Dernière modification 29-04-2012 15:24:38 AntiLoxy
Oui ma scène est créer à la fois avec un loadScene (fichier .IRR) et des meshs charger normalement en c++.

Voilà mon main :

Code c++ :

#include <irrlicht.h>
#include <vector>
#include "eventDebugger.h"
#include "event.h"
#include "camera.h"

using namespace irr;
using namespace io;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

int transition_alpha = FADEINOUT;
f32 transition_time_start = -1;

void startTransitionFadeOut(IrrlichtDevice* device)
{
    transition_time_start = device->getTimer()->getTime();
}

void updateFadeOut(f32 speed, f32 current_time, video::IVideoDriver* driver)
{
    float difference = (current_time - transition_time_start)/1000;
 
    driver->draw2DRectangle(video::SColor(transition_alpha,0,0,0),
                                core::rect<s32>(0,0 ,driver->getScreenSize().Width, driver->getScreenSize().Height));
    if(difference >= speed/1000)
    {
        transition_alpha--;
        transition_time_start = current_time;
    }
}

int main(int argc, char* argv[])
{
    int NombreMeshs;
    int ref = CURRENTSCENE, NumScene = 1, init = 0;
    core::matrix4 IsoMatrix;
    core::array<scene::ISceneNode *> nodes;
    scene::IAnimatedMeshMD2** modele;
    scene::IAnimatedMeshSceneNode** Nmodele;
    video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
    Caractere personnages;

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

    gui::IGUIFont* font  = device->getGUIEnvironment()->getBuiltInFont();

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

    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();
    //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");

    smgr->loadScene("../../media/Save.irr");

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

    scene::ICameraSceneNode * camera;
    camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
    SetCamera(camera, 1);

    smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);

    personnages.Initfilecaracteres(1,driver, smgr, modele, Nmodele);
    CEventReceiver receiver(1,Nmodele);
    //CEventDebugger debug(camera,Nmodele);      // Initialisation des evenements de debugging
    device->setEventReceiver(&receiver);
    //device->setEventReceiver(&debug);          // Gestion des evenements de debugging
    receiver.Initfilecollide();
    receiver.InitEvenements();



    while (device->run())
    {
        if (device->isWindowActive())
        {

            driver->beginScene(true, true, video::SColor(0,200,200,200));
            //debug.majPosCam();
            device->getGUIEnvironment()->drawAll();
            smgr->drawAll();

	    if (ref == CURRENTSCENE)
	    {
              if(transition_alpha != 0)
                {
                    updateFadeOut(5, device->getTimer()->getTime(),driver);
                }
		receiver.MajEventMesh(driver,font,camera,init);
		init = 1;
		receiver.Collide(ref, nodes);
	    }

            /*if (ref != CURRENTSCENE)
            {
		init = 0;
                smgr->clear();
                //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");
                smgr->loadScene("../../media/Save.irr");

		personnages.Initfilecaracteres(ref,driver,smgr,modele,Nmodele);
                nodes = NULL;
                smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);
                camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
                SetCamera(camera, ref);

                receiver.Initfilecollide();
                receiver.InitEvenements();
		ref = CURRENTSCENE; startTransitionFadeOut(device); transition_alpha = FADEINOUT;
            }*/
        }
        driver->endScene();
    }

    device->drop();
    return 0;

}

Et voilà la fonction de chargement des meshs

Code c++ :

void Caractere::Initfilecaracteres(int NumScene, irr::video::IVideoDriver* driver, irr::scene::ISceneManager* smgr, irr::scene::IAnimatedMeshMD2** p_modeles, irr::scene::IAnimatedMeshSceneNode** p_Nmodeles)
{
    FILE *config = NULL;
    char lignes[BUFFER_MAX];
    char path[BUFFER_MAX];
    int position[3];
    int rotation[3];
    int signe[3];
    int i = 0, mesh = 0;
    int animate = 0;

    snprintf(path,BUFFER_MAX,"../../media/Config/models%i",NumScene);
    config = fopen(path,"r");
    if (!config) perror("Mesh file error");

    while (fgets(lignes,BUFFER_MAX,config) != NULL)
    {
        i++;
        if (lignes[strlen(lignes) - 1] == '\
') lignes[strlen(lignes) - 1] = '\\0';
        switch (i)
        {
        case 1:
            p_modeles[mesh] = (irr::scene::IAnimatedMeshMD2*)smgr->getMesh(lignes);
            p_Nmodeles[mesh] = smgr->addAnimatedMeshSceneNode(p_modeles[mesh]);
            p_Nmodeles[mesh]->setMaterialFlag(irr::video::EMF_LIGHTING, false);
            break;
        case 2:
            p_Nmodeles[mesh]->setMaterialTexture( 0, driver->getTexture(lignes));
            break;
        case 3:
            sscanf(lignes,"%i %i %i %i",&(signe[0]), &(signe[1]), &(signe[2]), &animate);
	    if(animate == 1)
	    {
		p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
		p_Nmodeles[mesh]->setFrameLoop(STAND_BAS, STAND_BAS);
	    }
	    else
	    {
		p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
		p_Nmodeles[mesh]->setFrameLoop(START_HAUT, END_HAUT);
	    }
            break;
        case 4:
            sscanf(lignes,"%i %i %i",&(position[0]), &(position[1]), &(position[2]));
	    if(signe[0] == 1) position[0] -= position[0] * 2;
	    if(signe[1] == 1) position[1] -= position[1] * 2;
	    if(signe[2] == 1) position[2] -= position[2] * 2;
            p_Nmodeles[mesh]->setPosition(irr::core::vector3df(position[0],position[1],position[2]));
            break;
        case 5:
            sscanf(lignes,"%i %i %i",&(rotation[0]), &(rotation[1]), &(rotation[2]));
            p_Nmodeles[mesh]->setRotation(irr::core::vector3df(rotation[0], rotation[1], rotation[2]));
            i = 0;
            mesh++;
            break;
        }

    }
    fclose(config);

}

Enfin même en commentant la fonction Collide et MajEventMesh le résultat est le même.

Je précise que même en ajoutant un mesh dans blender puis en exportant au format 3ds le problème reste le même...
Création du message 28-04-2012 22:19:56 AntiLoxy
Oui ma scène est créer à la fois avec un loadScene (fichier .IRR) et des meshs charger normalement en c++.

Voilà mon main :

Code c++ :

#include <irrlicht.h>
#include <vector>
#include "eventDebugger.h"
#include "event.h"
#include "camera.h"

using namespace irr;
using namespace io;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

int transition_alpha = FADEINOUT;
f32 transition_time_start = -1;

void startTransitionFadeOut(IrrlichtDevice* device)
{
    transition_time_start = device->getTimer()->getTime();
}

void updateFadeOut(f32 speed, f32 current_time, video::IVideoDriver* driver)
{
    float difference = (current_time - transition_time_start)/1000;
 
    driver->draw2DRectangle(video::SColor(transition_alpha,0,0,0),
                                core::rect<s32>(0,0 ,driver->getScreenSize().Width, driver->getScreenSize().Height));
    if(difference >= speed/1000)
    {
        transition_alpha--;
        transition_time_start = current_time;
    }
}

int main(int argc, char* argv[])
{
    int NombreMeshs;
    int ref = CURRENTSCENE, NumScene = 1, init = 0;
    core::matrix4 IsoMatrix;
    core::array<scene::ISceneNode *> nodes;
    scene::IAnimatedMeshMD2** modele;
    scene::IAnimatedMeshSceneNode** Nmodele;
    video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
    Caractere personnages;

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

    gui::IGUIFont* font  = device->getGUIEnvironment()->getBuiltInFont();

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

    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();
    //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");

    smgr->loadScene("../../media/Save.irr");

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

    scene::ICameraSceneNode * camera;
    camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
    SetCamera(camera, 1);

    smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);

    personnages.Initfilecaracteres(1,driver, smgr, modele, Nmodele);
    CEventReceiver receiver(1,Nmodele);
    //CEventDebugger debug(camera,Nmodele);      // Initialisation des evenements de debugging
    device->setEventReceiver(&receiver);
    //device->setEventReceiver(&debug);          // Gestion des evenements de debugging
    receiver.Initfilecollide();
    receiver.InitEvenements();



    while (device->run())
    {
        if (device->isWindowActive())
        {

            driver->beginScene(true, true, video::SColor(0,200,200,200));
            //debug.majPosCam();
            device->getGUIEnvironment()->drawAll();
            smgr->drawAll();

	    if (ref == CURRENTSCENE)
	    {
              if(transition_alpha != 0)
                {
                    updateFadeOut(5, device->getTimer()->getTime(),driver);
                }
		receiver.MajEventMesh(driver,font,camera,init);
		init = 1;
		receiver.Collide(ref, nodes);
	    }

            /*if (ref != CURRENTSCENE)
            {
		init = 0;
                smgr->clear();
                //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");
                smgr->loadScene("../../media/Save.irr");

		personnages.Initfilecaracteres(ref,driver,smgr,modele,Nmodele);
                nodes = NULL;
                smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);
                camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
                SetCamera(camera, ref);

                receiver.Initfilecollide();
                receiver.InitEvenements();
		ref = CURRENTSCENE; startTransitionFadeOut(device); transition_alpha = FADEINOUT;
            }*/
        }
        driver->endScene();
    }

    device->drop();
    return 0;

}

Et voilà la fonction de chargement des meshs

Code c++ :

void Caractere::Initfilecaracteres(int NumScene, irr::video::IVideoDriver* driver, irr::scene::ISceneManager* smgr, irr::scene::IAnimatedMeshMD2** p_modeles, irr::scene::IAnimatedMeshSceneNode** p_Nmodeles)
{
    FILE *config = NULL;
    char lignes[BUFFER_MAX];
    char path[BUFFER_MAX];
    int position[3];
    int rotation[3];
    int signe[3];
    int i = 0, mesh = 0;
    int animate = 0;

    snprintf(path,BUFFER_MAX,"../../media/Config/models%i",NumScene);
    config = fopen(path,"r");
    if (!config) perror("Mesh file error");

    while (fgets(lignes,BUFFER_MAX,config) != NULL)
    {
        i++;
        if (lignes[strlen(lignes) - 1] == '\
') lignes[strlen(lignes) - 1] = '\\0';
        switch (i)
        {
        case 1:
            p_modeles[mesh] = (irr::scene::IAnimatedMeshMD2*)smgr->getMesh(lignes);
            p_Nmodeles[mesh] = smgr->addAnimatedMeshSceneNode(p_modeles[mesh]);
            p_Nmodeles[mesh]->setMaterialFlag(irr::video::EMF_LIGHTING, false);
            break;
        case 2:
            p_Nmodeles[mesh]->setMaterialTexture( 0, driver->getTexture(lignes));
            break;
        case 3:
            sscanf(lignes,"%i %i %i %i",&(signe[0]), &(signe[1]), &(signe[2]), &animate);
	    if(animate == 1)
	    {
		p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
		p_Nmodeles[mesh]->setFrameLoop(STAND_BAS, STAND_BAS);
	    }
	    else
	    {
		p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
		p_Nmodeles[mesh]->setFrameLoop(START_HAUT, END_HAUT);
	    }
            break;
        case 4:
            sscanf(lignes,"%i %i %i",&(position[0]), &(position[1]), &(position[2]));
	    if(signe[0] == 1) position[0] -= position[0] * 2;
	    if(signe[1] == 1) position[1] -= position[1] * 2;
	    if(signe[2] == 1) position[2] -= position[2] * 2;
            p_Nmodeles[mesh]->setPosition(irr::core::vector3df(position[0],position[1],position[2]));
            break;
        case 5:
            sscanf(lignes,"%i %i %i",&(rotation[0]), &(rotation[1]), &(rotation[2]));
            p_Nmodeles[mesh]->setRotation(irr::core::vector3df(rotation[0], rotation[1], rotation[2]));
            i = 0;
            mesh++;
            break;
        }

    }
    fclose(config);

}

Enfin même en commentant la fonction Collide et MajEventMesh le résultat est le même.

Je précise que même en ajoutant un mesh dans blender puis en exportant au format 3ds le problème reste le même...

Retour

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
537 invités en ligne
membre en ligne: -
RSS Feed