Sometimes a programmer will create his own scenemanager instead of defaulting to the device->scenemanager, this was the case for me as I load multiple worlds simultaneously and then swap between which smgr I want to render. Each level creates it's own scenemanager and then only draws that one. It makes short work of loading and destroying menus and levels. Anyhow, the point to this rambling is that I modified the loader code to take a smgr as a parameter and then saved it in the C3DWScene class.
Code: Select all
class C3DWScene
{
public:
C3DWScene();
virtual ~C3DWScene();
< code removed for simplicity>
ISceneManager* m_Smgr;
C3DW_File *m_pSceneFile;
stringc m_strFileName;
stringc m_strTextureRoot;
stringc m_strModelRoot;
};
bool C3DWScene::load(IrrlichtDevice *pDevice, ISceneManager* Smgr, c8 *szFileName, bool bCreateMeshes, bool bCreateLights, c8 *szTextureRoot, c8 *szModelRoot)
{
m_Smgr = Smgr;
c8 *pData;
s32 nFileSize;
< code removed for simplicity>
it is then used something like this
Code: Select all
#pragma once
#include "ZApp.h"
#include "GlobalData.h"
#include "3DWLoader.h"
// a simple level to use
class ZLevel_Demo14 : public ZLevel
{
public:
ICameraSceneNode* m_Camera;
scene::IAnimatedMeshSceneNode* m_Node;
C3DWScene* m_c3dw;
ZLevel_Demo14(void) { Initialize(); };
virtual ~ZLevel_Demo14(void) { Cleanup(); };
virtual void Initialize() {
Z_INIT(m_Camera);
Z_INIT(m_Node);
Z_INIT(m_c3dw);
};
virtual bool Create(ZApp* App) {
ZLevel::Create(App);
m_Camera = m_Smgr->addCameraSceneNodeFPS();
m_Camera->setPosition(irr::core::vector3df(0,0,0));
ISceneNode *SkyBox = m_Smgr->addSkyBoxSceneNode(
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\pos_y.png"),
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\neg_y.png"),
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\neg_x.png"),
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\pos_x.png"),
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\neg_z.png"),
m_App->GetEngine()->m_Driver->getTexture("media\\textures\\skybox\\pos_z.png"));
m_c3dw = new C3DWScene();
m_c3dw->load(m_App->GetEngine()->m_Device, m_Smgr, "media\\testworld\\track.3dw", true, true);
return true;
};
virtual bool Cleanup() { Initialize(); Z_SAFE_DELETE(m_c3dw); return false; };
virtual void Frame() { ZLevel::Frame(); m_Smgr->drawAll(); };
virtual bool OnEvent(SEvent event)
{
if (m_Camera->OnEvent(event)) return true;
// do global application level message handling here
switch(event.EventType)
{
case EET_MOUSE_INPUT_EVENT :
{
switch (event.MouseInput.Event)
{
case EMIE_RMOUSE_PRESSED_DOWN :
{
m_Camera->setInputReceiverEnabled(!m_Camera->isInputReceiverEnabled());
m_App->m_Engine->m_Device->getCursorControl()->setVisible(!m_Camera->isInputReceiverEnabled());
}; break;
}
} break;
}
// we did not want this message
return false;
};
virtual void UnLoad() { ZLevel::UnLoad(); };
virtual void Load() {
m_App->m_Engine->m_Driver->setFog(SColor(0,0,0,0), true, 1400.0, 5600.0);
// stuff for the application to use
m_GUIElements[1] = m_App->m_Engine->m_Gui->addButton(rect<s32>(10,10,100,40), 0, ID_MAINMENU, L"MainMenu");
m_Camera->setInputReceiverEnabled(true);
m_App->m_Engine->m_Device->getCursorControl()->setVisible(true);
};
};