There is no any problems in my3d loader, if you want to load my3d scene from *.zip archieve, you must slightly change you code.
Code: Select all
#include <irrlicht.h>
#include <iostream>
#include <stdio.h>
using namespace irr;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
#pragma comment(lib, "Irrlicht.lib")
int main()
{
//-----------------------------------------------------
// ask user for driver
//-----------------------------------------------------
video::E_DRIVER_TYPE driverType;
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.2\n"\
" (d) Software Renderer\n (e) NullDevice\n (otherKey) exit\n\n");
char i;
std::cin >> i;
switch(i)
{
case 'a': driverType = video::EDT_DIRECTX9; break;
case 'b': driverType = video::EDT_DIRECTX8; break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_NULL; break;
default: return 1;
}
//-----------------------------------------------------
// create device and exit if creation failed
//-----------------------------------------------------
IrrlichtDevice *device =
createDevice(driverType, core::dimension2d<s32>(640, 480),
32, false, true, false, 0
);
if (device == 0)
return 1; // could not create selected driver.
//-----------------------------------------------------
// pointers
//-----------------------------------------------------
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* env = device->getGUIEnvironment();
io::IFileSystem *fs = device->getFileSystem();
//----------------------------------------------------------------------
// some features
//-----------------------------------------------------
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
driver->setFog(SColor(0,20,20,120),true, 0,12500);
fs->addZipFileArchive("my3ddata.zip", true, false);
//----------------------------------------------------------------------
//load my3d temple scene
//-----------------------------------------------------
smgr->getParameters()->setParameter(scene::MY3D_TEXTURE_PATH, "");
scene::IAnimatedMesh* mesh;
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
mesh = smgr->getMesh("data/temple01.my3d");
scene::ISceneNode* test_scene = smgr->addOctTreeSceneNode(mesh->getMesh(0));
test_scene->setPosition( irr::core::vector3df(0,0,0) );
test_scene->setScale( irr::core::vector3df(1,1,1) );
test_scene->setRotation( irr::core::vector3df(0,0,0) );
test_scene->setMaterialFlag(video::EMF_LIGHTING, true);
test_scene->setMaterialFlag(EMF_FOG_ENABLE,true); //enables fog
//-----------------------------------------------------
// my3d skydome
//-----------------------------------------------------
scene::IAnimatedMesh* dome;
dome = smgr->getMesh("data/skydome.my3d");
scene::ISceneNode* domenode = smgr->addOctTreeSceneNode(dome->getMesh(0));
domenode->setPosition( irr::core::vector3df(0,0,0) );
domenode->setScale( irr::core::vector3df(1,1,1) );
domenode->setRotation( irr::core::vector3df(0,0,0) );
domenode->setMaterialFlag(video::EMF_LIGHTING, false);
domenode->getMaterial(0).EmissiveColor.set(0,150,150,255); //makes it emissive
domenode->setMaterialFlag(EMF_FOG_ENABLE,false);
//adding a rotate animator for the dome
scene::ISceneNodeAnimator *domeanim = 0;
domeanim = smgr->createRotationAnimator(core::vector3df(0, 0.05, 0));
domenode->addAnimator(domeanim);
domeanim->drop();
//-----------------------------------------------------
//create sky box
//-----------------------------------------------------
scene::ISceneNode* skyboxNode = 0;
skyboxNode = smgr->addSkyBoxSceneNode(
driver->getTexture("data/rocky_up.jpg"),
driver->getTexture("data/rocky_dn.jpg"),
driver->getTexture("data/rocky_lf.jpg"),
driver->getTexture("data/rocky_rt.jpg"),
driver->getTexture("data/rocky_ft.jpg"),
driver->getTexture("data/rocky_bk.jpg"));
//-----------------------------------------------------
//particle system
//-----------------------------------------------------
scene::IParticleSystemSceneNode* ps;
ps = smgr->addParticleSystemSceneNode(false);
ps->setMaterialFlag(video::EMF_LIGHTING, false);
ps->setPosition(core::vector3df(-5200,850,2000));
ps->setScale(core::vector3df(50,50,50));
ps->setParticleSize(core::dimension2d<f32>(300, 300));
ps->setMaterialTexture(0, driver->getTexture("sprites/particle_white.bmp"));
ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
scene::IParticleEmitter* emb = ps->createBoxEmitter(
core::aabbox3d<f32>(-7.00f,0.00f,-7.00f,7.00f,1.00f,7.00f),
core::vector3df(0.00f,0.03f,0.00f),
60,200,
video::SColor(0,255,255,100), video::SColor(0,0,255,0),
100,3400,108);
ps->setEmitter(emb);
emb->drop();
scene::IParticleAffector* paf = ps->createFadeOutParticleAffector(video::SColor(0,0,0,0),1000);
ps->addAffector(paf);
paf->drop();
scene::IParticleAffector* pgaf = ps->createGravityAffector(core::vector3df(0.00f,0.30f,0.00f),2400); ps->addAffector(pgaf);
pgaf->drop();
//-----------------------------------------------------------------------------------------------//
// create sun-light
//-----------------------------------------------------
ILightSceneNode *light = smgr->addLightSceneNode(
0, core::vector3df(25000,15000,0),
video::SColorf(1.0f, 1.0f, 1.0f, 1.0f), 30000.0f
);
light->getLightData().AmbientColor = video::SColorf(0.5f, 0.5f, 0.5f, 1.0f);
// attach billboard to light
IBillboardSceneNode* bill = smgr->addBillboardSceneNode(
light, core::dimension2d<f32>(30000, 30000)
);
bill->setMaterialFlag(video::EMF_LIGHTING, false);
bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
bill->setMaterialTexture(0, driver->getTexture("sprites/particle_white.bmp"));
//-----------------------------------------------------------------------------------------------//
//wasd navigation
//-----------------------------------------------------
SKeyMap keyMap[8];
keyMap[1].Action = EKA_MOVE_FORWARD;
keyMap[1].KeyCode = KEY_KEY_W;
keyMap[3].Action = EKA_MOVE_BACKWARD;
keyMap[3].KeyCode = KEY_KEY_S;
keyMap[5].Action = EKA_STRAFE_LEFT;
keyMap[5].KeyCode = KEY_KEY_A;
keyMap[7].Action = EKA_STRAFE_RIGHT;
keyMap[7].KeyCode = KEY_KEY_D;
// add and setup camera
scene::ICameraSceneNode* camera = 0;
camera = smgr->addCameraSceneNodeFPS(0,80.0f,300.0f,-1, keyMap, 8);
camera->setFarValue (50000.0f) ;
camera->setFOV(1.1f);
camera->setPosition(core::vector3df(1000,1000,0));
camera->setTarget( core::vector3df(0,0,0));
camera->setRotation(core::vector3df(0,0,0));
//-----------------------------------------------------
// some features
//-----------------------------------------------------
device->getCursorControl()->setVisible(false);
smgr->setShadowColor(video::SColor(150,0,0,0));
//-----------------------------------------------------
// starting main render loop
//-----------------------------------------------------
f32 text_rot=0;
int lastFPS = -1;
while(device->run())
{
driver->beginScene(true, true, video::SColor(255,0,0,0));
smgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
wchar_t tmp[1024];
swprintf(tmp, 1024, L"MY3D Mesh Loader Example 2 - Irrlicht Engine v.0.10.0 (fps:%d) Triangles:%d",
fps, driver->getPrimitiveCountDrawn());
device->setWindowCaption(tmp);
lastFPS = fps;
}
}
//-----------------------------------------------------
// kill device
//-----------------------------------------------------
device->drop();
return 0;
}
5) all lightmaps must be in 'Lightmaps/' directory in the same dir as *.my3d file
Thats all.
I test it with Irrlicht 0.12.0 an everything was just fine.
Check this more carefully.
Good luck.