1 // This is a Demo of the Irrlicht Engine (c) 2005-2009 by N.Gebhardt.
\r
2 // This file is not documented.
\r
4 #include "CMainMenu.h"
\r
6 #include "exampleHelper.h"
\r
10 CMainMenu::CMainMenu()
\r
11 : startButton(0), MenuDevice(0), selected(0), start(false), fullscreen(false),
\r
12 #if defined(USE_IRRKLANG) || defined(USE_SDL_MIXER)
\r
17 shadows(true), additive(false), transparent(true), vsync(true), aa(true),
\r
18 #ifndef _IRR_WINDOWS_
\r
19 driverType(video::EDT_OPENGL)
\r
21 driverType(video::EDT_DIRECT3D9)
\r
23 //driverType(video::EDT_BURNINGSVIDEO)
\r
28 bool CMainMenu::run()
\r
30 video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
\r
31 if (!IrrlichtDevice::isDriverSupported(video::EDT_OPENGL))
\r
32 driverType = video::EDT_BURNINGSVIDEO;
\r
34 MenuDevice = createDevice(driverType,
\r
35 core::dimension2d<u32>(512, 384), 16, false, false, false, this);
\r
37 const io::path mediaPath = getExampleMediaPath();
\r
39 if (MenuDevice->getFileSystem()->existFile("irrlicht.dat"))
\r
40 MenuDevice->getFileSystem()->addFileArchive("irrlicht.dat");
\r
42 MenuDevice->getFileSystem()->addFileArchive(mediaPath + "irrlicht.dat");
\r
44 video::IVideoDriver* driver = MenuDevice->getVideoDriver();
\r
45 scene::ISceneManager* smgr = MenuDevice->getSceneManager();
\r
46 gui::IGUIEnvironment* guienv = MenuDevice->getGUIEnvironment();
\r
48 core::stringw str = "Irrlicht Engine Demo v";
\r
49 str += MenuDevice->getVersion();
\r
50 MenuDevice->setWindowCaption(str.c_str());
\r
53 gui::IGUISkin* newskin = guienv->createSkin(gui::EGST_BURNING_SKIN);
\r
54 guienv->setSkin(newskin);
\r
58 gui::IGUIFont* font = guienv->getFont(mediaPath + "fonthaettenschweiler.bmp");
\r
60 guienv->getSkin()->setFont(font);
\r
64 const s32 leftX = 260;
\r
67 gui::IGUITabControl* tabctrl = guienv->addTabControl(core::rect<int>(leftX,10,512-10,384-10),
\r
69 gui::IGUITab* optTab = tabctrl->addTab(L"Demo");
\r
70 gui::IGUITab* aboutTab = tabctrl->addTab(L"About");
\r
74 gui::IGUIListBox* box = guienv->addListBox(core::rect<int>(10,10,220,120), optTab, 1);
\r
75 for (u32 i=1; i<video::EDT_COUNT; ++i)
\r
77 if (IrrlichtDevice::isDriverSupported(video::E_DRIVER_TYPE(i)))
\r
79 box->addItem(core::stringw(video::DRIVER_TYPE_NAMES[i]).c_str());
\r
80 if ( driverType == video::E_DRIVER_TYPE(i) )
\r
81 selected = box->getItemCount()-1;
\r
84 box->setSelected(selected);
\r
88 startButton = guienv->addButton(core::rect<int>(30,295,200,324), optTab, 2, L"Start Demo");
\r
94 guienv->addCheckBox(fullscreen, core::rect<int>(20,85+d,130,110+d),
\r
95 optTab, 3, L"Fullscreen");
\r
96 guienv->addCheckBox(music, core::rect<int>(135,85+d,245,110+d),
\r
97 optTab, 4, L"Music & Sfx");
\r
98 guienv->addCheckBox(shadows, core::rect<int>(20,110+d,135,135+d),
\r
99 optTab, 5, L"Realtime shadows");
\r
100 guienv->addCheckBox(additive, core::rect<int>(20,135+d,230,160+d),
\r
101 optTab, 6, L"Old HW compatible blending");
\r
102 guienv->addCheckBox(vsync, core::rect<int>(20,160+d,230,185+d),
\r
103 optTab, 7, L"Vertical synchronisation");
\r
104 guienv->addCheckBox(aa, core::rect<int>(20,185+d,230,210+d),
\r
105 optTab, 8, L"Antialiasing");
\r
109 const wchar_t* text2 = L"This is the tech demo of the Irrlicht engine. To start, "\
\r
110 L"select a video driver which works best with your hardware and press 'Start Demo'.\n"\
\r
111 L"What you currently see is displayed using the Burning Software Renderer (Thomas Alten).\n"\
\r
112 L"The Irrlicht Engine was written by me, Nikolaus Gebhardt. The models, "\
\r
113 L"maps and textures were placed at my disposal by B.Collins, M.Cook and J.Marton. The music was created by "\
\r
114 L"M.Rohde and is played back by irrKlang.\n"\
\r
115 L"For more information, please visit the homepage of the Irrlicht engine:\nhttp://irrlicht.sourceforge.net";
\r
117 guienv->addStaticText(text2, core::rect<int>(10, 10, 230, 320),
\r
118 true, true, aboutTab);
\r
122 scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "faerie.md2");
\r
123 scene::IAnimatedMeshSceneNode* modelNode = smgr->addAnimatedMeshSceneNode(mesh);
\r
126 modelNode->setPosition( core::vector3df(0.f, 0.f, -5.f) );
\r
127 modelNode->setMaterialTexture(0, driver->getTexture(mediaPath + "faerie2.bmp"));
\r
128 modelNode->setMaterialFlag(video::EMF_LIGHTING, true);
\r
129 modelNode->getMaterial(0).Shininess = 50.f;
\r
130 modelNode->getMaterial(0).NormalizeNormals = true;
\r
131 modelNode->setMD2Animation(scene::EMAT_STAND);
\r
134 // set ambient light (no sun light in the catacombs)
\r
135 smgr->setAmbientLight( video::SColorf(0.2f, 0.2f, 0.2f) );
\r
137 scene::ILightSceneNode *light;
\r
138 scene::ISceneNodeAnimator* anim;
\r
139 scene::ISceneNode* bill;
\r
141 enum eLightParticle
\r
148 core::vector3df lightDir[2] = {
\r
149 core::vector3df(0.f, 0.1f, 0.4f),
\r
150 core::vector3df(0.f, 0.1f, -0.4f),
\r
153 struct SLightParticle
\r
155 eLightParticle type;
\r
158 const SLightParticle lightParticle[] =
\r
168 const SLightParticle *l = lightParticle;
\r
169 while ( l->type != LIGHT_NONE )
\r
174 // add illumination from the background
\r
175 light = smgr->addLightSceneNode(0, core::vector3df(10.f,40.f,-5.f),
\r
176 video::SColorf(0.2f, 0.2f, 0.2f), 90.f);
\r
179 // add light nearly red
\r
180 light = smgr->addLightSceneNode(0, core::vector3df(0,1,0),
\r
181 video::SColorf(0.8f, 0.f, 0.f, 0.0f), 30.0f);
\r
182 // attach red billboard to the light
\r
183 bill = smgr->addBillboardSceneNode(light, core::dimension2d<f32>(10, 10));
\r
186 bill->setMaterialFlag(video::EMF_LIGHTING, false);
\r
187 bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
\r
188 bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
\r
189 bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlered.bmp"));
\r
191 // add fly circle animator to the light
\r
192 anim = smgr->createFlyCircleAnimator(core::vector3df(0.f,0.f,-5.f),20.f,
\r
193 0.002f, lightDir [l->dir] );
\r
194 light->addAnimator(anim);
\r
198 // add light nearly blue
\r
199 light = smgr->addLightSceneNode(0, core::vector3df(0,1,0),
\r
200 video::SColorf(0.f, 0.0f, 0.8f, 0.0f), 30.0f);
\r
201 // attach blue billboard to the light
\r
202 bill = smgr->addBillboardSceneNode(light, core::dimension2d<f32>(10, 10));
\r
205 bill->setMaterialFlag(video::EMF_LIGHTING, false);
\r
206 bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
\r
207 bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
\r
208 bill->setMaterialTexture(0, driver->getTexture(mediaPath + "portal1.bmp"));
\r
210 // add fly circle animator to the light
\r
211 anim = smgr->createFlyCircleAnimator(core::vector3df(0.f,0.f,-5.f),20.f,
\r
212 -0.002f, lightDir [l->dir], 0.5f);
\r
213 light->addAnimator(anim);
\r
222 // create a fixed camera
\r
223 smgr->addCameraSceneNode(0, core::vector3df(45,0,0), core::vector3df(0,0,10));
\r
226 // irrlicht logo and background
\r
227 // add irrlicht logo
\r
228 bool oldMipMapState = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS);
\r
229 driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
\r
231 guienv->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"),
\r
232 core::position2d<s32>(5,5));
\r
234 video::ITexture* irrlichtBack = driver->getTexture(mediaPath + "demoback.jpg");
\r
236 driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, oldMipMapState);
\r
238 // query original skin color
\r
239 getOriginalSkinColor();
\r
241 // set transparency
\r
246 while(MenuDevice->run())
\r
248 if (MenuDevice->isWindowActive())
\r
250 driver->beginScene(video::ECBF_DEPTH, video::SColor(0,0,0,0));
\r
253 driver->draw2DImage(irrlichtBack,
\r
254 core::position2d<int>(0,0));
\r
258 driver->endScene();
\r
262 MenuDevice->drop();
\r
264 for (u32 i=1; i<video::EDT_COUNT; ++i)
\r
266 if (IrrlichtDevice::isDriverSupported(video::E_DRIVER_TYPE(i)))
\r
270 driverType=video::E_DRIVER_TYPE(i);
\r
281 bool CMainMenu::OnEvent(const SEvent& event)
\r
283 if (event.EventType == EET_KEY_INPUT_EVENT &&
\r
284 event.KeyInput.Key == KEY_F9 &&
\r
285 event.KeyInput.PressedDown == false)
\r
287 video::IImage* image = MenuDevice->getVideoDriver()->createScreenShot();
\r
290 MenuDevice->getVideoDriver()->writeImageToFile(image, "screenshot_main.jpg");
\r
295 if (event.EventType == irr::EET_MOUSE_INPUT_EVENT &&
\r
296 event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP )
\r
298 core::rect<s32> r(event.MouseInput.X, event.MouseInput.Y, 0, 0);
\r
299 gui::IGUIContextMenu* menu = MenuDevice->getGUIEnvironment()->addContextMenu(r, 0, 45);
\r
300 menu->addItem(L"transparent menus", 666, transparent == false);
\r
301 menu->addItem(L"solid menus", 666, transparent == true);
\r
302 menu->addSeparator();
\r
303 menu->addItem(L"Cancel");
\r
306 if (event.EventType == EET_GUI_EVENT)
\r
308 s32 id = event.GUIEvent.Caller->getID();
\r
311 case 45: // context menu
\r
312 if (event.GUIEvent.EventType == gui::EGET_MENU_ITEM_SELECTED)
\r
314 s32 s = ((gui::IGUIContextMenu*)event.GUIEvent.Caller)->getSelectedItem();
\r
315 if (s == 0 || s == 1)
\r
317 transparent = !transparent;
\r
323 if (event.GUIEvent.EventType == gui::EGET_LISTBOX_CHANGED ||
\r
324 event.GUIEvent.EventType == gui::EGET_LISTBOX_SELECTED_AGAIN)
\r
326 selected = ((gui::IGUIListBox*)event.GUIEvent.Caller)->getSelected();
\r
327 //startButton->setEnabled(selected != 4);
\r
328 startButton->setEnabled(true);
\r
332 if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )
\r
334 MenuDevice->closeDevice();
\r
338 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
339 fullscreen = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
342 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
343 music = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
346 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
347 shadows = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
350 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
351 additive = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
354 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
355 vsync = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
358 if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )
\r
359 aa = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked();
\r
368 void CMainMenu::getOriginalSkinColor()
\r
370 irr::gui::IGUISkin * skin = MenuDevice->getGUIEnvironment()->getSkin();
\r
371 for (s32 i=0; i<gui::EGDC_COUNT ; ++i)
\r
373 SkinColor[i] = skin->getColor( (gui::EGUI_DEFAULT_COLOR)i );
\r
379 void CMainMenu::setTransparency()
\r
381 irr::gui::IGUISkin * skin = MenuDevice->getGUIEnvironment()->getSkin();
\r
383 for (u32 i=0; i<gui::EGDC_COUNT ; ++i)
\r
385 video::SColor col = SkinColor[i];
\r
387 if (false == transparent)
\r
390 skin->setColor((gui::EGUI_DEFAULT_COLOR)i, col);
\r