|
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...
|