From 1ebb1f009bee1279bcf870cf97d3496bdf0b262f Mon Sep 17 00:00:00 2001 From: shlainn Date: Fri, 2 Apr 2010 21:24:00 +0000 Subject: [PATCH] * Added new tool: Mesh Viewer. Can open M2 and WMO files to view them outside the client. ** This is Irrlicht Example 9, modified to fit my purpose. ** all graphics taken from Irrlicht examples --- bin/data/misc/fonthaettenschweiler.bmp | Bin 0 -> 196662 bytes bin/data/misc/open.png | Bin 0 -> 904 bytes bin/data/misc/tools.png | Bin 0 -> 845 bytes bin/data/misc/zip.png | Bin 0 -> 833 bytes configure.ac | 8 +- src/tools/Makefile.am | 2 +- src/tools/viewer/Makefile.am | 11 + src/tools/viewer/main.cpp | 902 +++++++++++++++++++++++++ 8 files changed, 919 insertions(+), 4 deletions(-) create mode 100755 bin/data/misc/fonthaettenschweiler.bmp create mode 100755 bin/data/misc/open.png create mode 100755 bin/data/misc/tools.png create mode 100755 bin/data/misc/zip.png create mode 100644 src/tools/viewer/Makefile.am create mode 100755 src/tools/viewer/main.cpp diff --git a/bin/data/misc/fonthaettenschweiler.bmp b/bin/data/misc/fonthaettenschweiler.bmp new file mode 100755 index 0000000000000000000000000000000000000000..ca301da4b1163c4a8949d790db341fe119950ed5 GIT binary patch literal 196662 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/bin/data/misc/open.png b/bin/data/misc/open.png new file mode 100755 index 0000000000000000000000000000000000000000..b85229d24239105e083b9938773ed08162ded28a GIT binary patch literal 904 zcmV;319$w1P)XA}VlDVGj~`>PYM^KLAJ&A`Al&_yGtVud~b_^9?jTL&1`m837`pI54K55GFC1}!O}2|5GAt&qDUl4AhWa_;Y%TR0c5P=?VhK06B43Wq2iEi zCLyE8C}S95O`@ku7-j)$^c5WAb?i>Cu(Yyj184&F++Om~4@A}Ng$My?c~p7?UC$!5 zEa~zYh)nMPKF{3EIXjG^Pmc1Vt!{2Hke!`(J$cCw6tNO$x{eYi=7~44J8fL)%WrwKFyB7(gX`;!#`Qzb zw}GV3B|t0yius)W^2`hMkFUO6^{tn<_1!N#xc}#V*X`ZdXzqL;hM^1e`qKqGAOh4; znT)Aw<-KCwx}g$iwGZxXZZ~hmN^JsrfD7yc4sh6aPmZ@S1?V|zpb~~r(er(`zwGrL e10X(vj_Y5|DsO6fXt1IH0000X| zKLY<_rZzY&lC^Aib#>K7Q4}ZWdh+`4NanZTfKn8{2Tz;aP`_e%>-~K{?e%7}Y0_z( zkfLn3^T&g;!2#vC>3agsTF2=l$BufFx{9tRNa{)M-+T00)6;(fd{tm(qg!6&o!cgt z+c#4*2n77dvc%(uPl&3CbA>`dUNF1)gzzQknd%bdGV{(=ZOeYHmWnf)m#v}qy$?YU zX!Lk^^Xe^{o}s0s37@Y!_*n+C8r^FbFZ7-{uxsT4k3CFEjSxr%dEe7RZCxFiu5O%D zTzF<$357zu^>uZK0L{}qWwIn)+_P=f{`R&>XuX~E1vGRm#RN%bVub^#dK!W;MmlRy z5Y70y`aY=f_$k3rQE6VcV)3m*Tjp)9w}u!9#>k9}kjocIr80zdGn2e4vCLXcJQ^mU zX}oy)DAMEiZ+O?+_flwIz5L>lO`e0JdOsb{`{{fWW&1iWnUsnk+AuXNVboU3?++ec zR+P{s!!Yt@i!~G+P=)|RuS?qT_+BUOraH2MH4+~Ysxr38)?rmea?QY0<>s$DcmMA8 z2M-VGdhW~6#j&B3X)tSJ_@jlTP36u?sRg^3gW2mbDyQ(v?O*Rk)Y#Vlf&s*En(V~N z8WM&BpYa3Exi*}0T6yj77Xb%g0n)%2P#6~wDr8x#t*JR}FR$2Ngc>cT2BNXpwS1xQ4$w+% z%>!0o5QqcAfDRPLn^+IHf%$+P_)t1XmEaVR0Y*!E6379J3kW691Y}EgjgsB`x1Q}2 X=^rnMvEp9F00000NkvXXu0mjfC9R87 literal 0 HcmV?d00001 diff --git a/bin/data/misc/zip.png b/bin/data/misc/zip.png new file mode 100755 index 0000000000000000000000000000000000000000..c4f9dde54e121b3119eec275f7cae8b84360ac52 GIT binary patch literal 833 zcmV-H1HSx;P)Xqfr__6?*zgBp*MoywRq*F z2tr|cA>u_vC~c9J8HU=9rjxca%_QBK>}0YJYcDU{(OK}Z77Mx6=BOn2g3xRgC{^gaAu6+L9yYDda z$Gp6Co}v@s_jkE*=aARlc$;3Y#}{9H^Yu6gJ_CFpm4E@bN~JG#JDdFW%XQYB3FgXx z2YYw$M**CcN#a+zaK6o@i(4NLegDUiKmG|gH30#5HP8Fx%@-RRmp27E7;yX6eQw^| z!?JT!3ke7NJB&lg3*D}9`;U9x&>vp|W=1C90%jEWJpOZ!Aeghe^AIOjWcl0%&qo2_ zaKP@Z-w{G!Th=Pz0YYX1QiFWZdq)3s4Dp<|E_JYM8#Np7=)@(Q$7mTbo}Pj*Odt;! zMh4N;I!(27xwr45O&2Lm=JSZ1CxTqgVG_oayef9ChyV?kfLK^C0b{MvpuAdVoaEVm z27$G~`jVtt6vVM&xweAs9`-ktpJy)%*l% +#include +#include "common.h" +#include "CM2MeshFileLoader.h" +#include "CWMOMeshFileLoader.h" +#include "CImageLoaderBLP.h" + + +using namespace irr; +using namespace gui; + +#ifdef _MSC_VER +#pragma comment(lib, "Irrlicht.lib") +#endif + + +/* +Some global variables used later on +*/ +IrrlichtDevice *Device = 0; +core::stringc StartUpModelFile = "../../../bin/data/model/draeneifemale.m2"; +core::stringw MessageText; +core::stringw Caption; +scene::ISceneNode* Model = 0; +scene::ISceneNode* SkyBox = 0; +bool Octree=false; + +scene::ICameraSceneNode* Camera[2] = {0, 0}; + +// Values used to identify individual GUI elements +enum +{ + GUI_ID_DIALOG_ROOT_WINDOW = 0x10000, + + GUI_ID_X_SCALE, + GUI_ID_Y_SCALE, + GUI_ID_Z_SCALE, + + GUI_ID_LIGHT_BOX, + GUI_ID_LIGHT_X_SCALE, + GUI_ID_LIGHT_Y_SCALE, + GUI_ID_LIGHT_Z_SCALE, + GUI_ID_LIGHT_VISIBLE, + GUI_ID_LIGHT_SET, + + GUI_ID_OPEN_MODEL, + GUI_ID_SET_MODEL_ARCHIVE, + GUI_ID_LOAD_AS_OCTREE, + + GUI_ID_SKY_BOX_VISIBLE, + GUI_ID_TOGGLE_DEBUG_INFO, + + GUI_ID_DEBUG_OFF, + GUI_ID_DEBUG_BOUNDING_BOX, + GUI_ID_DEBUG_NORMALS, + GUI_ID_DEBUG_SKELETON, + GUI_ID_DEBUG_WIRE_OVERLAY, + GUI_ID_DEBUG_HALF_TRANSPARENT, + GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES, + GUI_ID_DEBUG_ALL, + + GUI_ID_MODEL_MATERIAL_SOLID, + GUI_ID_MODEL_MATERIAL_TRANSPARENT, + GUI_ID_MODEL_MATERIAL_REFLECTION, + + GUI_ID_CAMERA_MAYA, + GUI_ID_CAMERA_FIRST_PERSON, + + GUI_ID_POSITION_TEXT, + + GUI_ID_ABOUT, + GUI_ID_QUIT, + + GUI_ID_TREE_VIEW, + // And some magic numbers + MAX_FRAMERATE = 1000, + DEFAULT_FRAMERATE = 30, + + + + LIGHT_ID_0, + LIGHT_ID_1, + LIGHT_ID_2, + LIGHT_ID_3 + +}; + +/* +Toggle between various cameras +*/ +void setActiveCamera(scene::ICameraSceneNode* newActive) +{ + if (0 == Device) + return; + + scene::ICameraSceneNode * active = Device->getSceneManager()->getActiveCamera(); + active->setInputReceiverEnabled(false); + + newActive->setInputReceiverEnabled(true); + Device->getSceneManager()->setActiveCamera(newActive); +} + +/* +The second function loadModel() loads a model and displays it using an +addAnimatedMeshSceneNode and the scene manager. Nothing difficult. It also +displays a short message box, if the model could not be loaded. +*/ +void loadModel(const c8* fn) +{ + // modify the name if it a .pk3 file + + core::stringc filename(fn); + + core::stringc extension; + core::getFileNameExtension(extension, filename); + extension.make_lower(); + + // if a texture is loaded apply it to the current model.. + if (extension == ".jpg" || extension == ".pcx" || + extension == ".png" || extension == ".ppm" || + extension == ".pgm" || extension == ".pbm" || + extension == ".psd" || extension == ".tga" || + extension == ".bmp" || extension == ".wal" || extension == ".blp") + { + video::ITexture * texture = + Device->getVideoDriver()->getTexture( filename.c_str() ); + if ( texture && Model ) + { + // always reload texture + Device->getVideoDriver()->removeTexture(texture); + texture = Device->getVideoDriver()->getTexture( filename.c_str() ); + + Model->setMaterialTexture(0, texture); + } + return; + } + // if a archive is loaded add it to the FileSystems.. + else if (extension == ".pk3" || extension == ".zip") + { + Device->getFileSystem()->addZipFileArchive(filename.c_str()); + return; + } + else if (extension == ".pak") + { + Device->getFileSystem()->addPakFileArchive(filename.c_str()); + return; + } + + // load a model into the engine + + if (Model) + Model->remove(); + + Model = 0; + + scene::IAnimatedMesh* m = Device->getSceneManager()->getMesh( filename.c_str() ); + + if (!m) + { + // model could not be loaded + + if (StartUpModelFile != filename) + Device->getGUIEnvironment()->addMessageBox( + Caption.c_str(), L"The model could not be loaded. " \ + L"Maybe it is not a supported file format."); + return; + } + IGUIElement* root = Device->getGUIEnvironment()->getRootGUIElement(); + IGUIElement* e = root->getElementFromId(GUI_ID_TREE_VIEW, true); + core::stringw str(L""); + str += L"Submeshes: "; + str.append(core::stringw(m->getMeshBufferCount())); + e->setText(str.c_str()); + // set default material properties + + if (Octree) + Model = Device->getSceneManager()->addOctTreeSceneNode(m->getMesh(0)); + else + { + scene::IAnimatedMeshSceneNode* animModel = Device->getSceneManager()->addAnimatedMeshSceneNode(m); + animModel->setAnimationSpeed(30); + Model = animModel; + } + Model->setMaterialFlag(video::EMF_LIGHTING, true); +// Model->setMaterialFlag(video::EMF_BACK_FACE_CULLING, false); + Model->setDebugDataVisible(scene::EDS_OFF); + + // we need to uncheck the menu entries. would be cool to fake a menu event, but + // that's not so simple. so we do it brute force + gui::IGUIContextMenu* menu = (gui::IGUIContextMenu*)Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_TOGGLE_DEBUG_INFO, true); + if (menu) + for(int item = 1; item < 6; ++item) + menu->setItemChecked(item, false); + IGUIElement* toolboxWnd = Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); + if ( toolboxWnd ) + { + toolboxWnd->getElementFromId(GUI_ID_X_SCALE, true)->setText(L"1.0"); + toolboxWnd->getElementFromId(GUI_ID_Y_SCALE, true)->setText(L"1.0"); + toolboxWnd->getElementFromId(GUI_ID_Z_SCALE, true)->setText(L"1.0"); + } +} + + +/* +Finally, the third function creates a toolbox window. In this simple mesh +viewer, this toolbox only contains a tab control with three edit boxes for +changing the scale of the displayed model. +*/ +void createToolBox() +{ + // remove tool box if already there + IGUIEnvironment* env = Device->getGUIEnvironment(); + IGUIElement* root = env->getRootGUIElement(); + IGUIElement* e = root->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); + if (e) + e->remove(); + + // create the toolbox window + IGUIWindow* wnd = env->addWindow(core::rect(600,45,800,480), + false, L"Toolset", 0, GUI_ID_DIALOG_ROOT_WINDOW); + + // create tab control and tabs + IGUITabControl* tab = env->addTabControl( + core::rect(2,20,800-602,480-7), wnd, true, true); + + IGUITab* t1 = tab->addTab(L"Config"); + + // add some edit boxes and a button to tab one + env->addStaticText(L"Scale:", + core::rect(10,20,150,45), false, false, t1); + env->addStaticText(L"X:", core::rect(22,48,40,66), false, false, t1); + env->addEditBox(L"1.0", core::rect(40,46,130,66), true, t1, GUI_ID_X_SCALE); + env->addStaticText(L"Y:", core::rect(22,82,40,96), false, false, t1); + env->addEditBox(L"1.0", core::rect(40,76,130,96), true, t1, GUI_ID_Y_SCALE); + env->addStaticText(L"Z:", core::rect(22,108,40,126), false, false, t1); + env->addEditBox(L"1.0", core::rect(40,106,130,126), true, t1, GUI_ID_Z_SCALE); + + env->addButton(core::rect(10,134,85,165), t1, 1101, L"Set"); + + // add transparency control + env->addStaticText(L"GUI Transparency Control:", + core::rect(10,200,150,225), true, false, t1); + IGUIScrollBar* scrollbar = env->addScrollBar(true, + core::rect(10,225,150,240), t1, 104); + scrollbar->setMax(255); + scrollbar->setPos(255); + + // add framerate control + env->addStaticText(L"Framerate:", + core::rect(10,240,150,265), true, false, t1); + scrollbar = env->addScrollBar(true, + core::rect(10,265,150,280), t1, 105); + scrollbar->setMax(MAX_FRAMERATE); + scrollbar->setPos(DEFAULT_FRAMERATE); + + IGUITab* t2 = tab->addTab(L"Info"); + // add some edit boxes and a button to tab one + env->addStaticText(L"Submeshes:", + core::rect(10,20,150,45), false, false, t2); + env->addStaticText(L"",core::rect(10,48,150,280),true,true, t2, GUI_ID_TREE_VIEW); + + + IGUITab* t3 = tab->addTab(L"Lights"); + // add some edit boxes and a button to tab one + IGUIComboBox* box =env->addComboBox(core::rect(10,20,150,45), t3, GUI_ID_LIGHT_BOX); + box->addItem(L"Light 0"); + box->addItem(L"Light 1"); + box->addItem(L"Light 2"); + box->addItem(L"Light 3"); + + env->addStaticText(L"X:", core::rect(22,48,40,66), false, false, t3); + env->addEditBox(L"50.0", core::rect(40,46,130,66), true, t3, GUI_ID_LIGHT_X_SCALE); + env->addStaticText(L"Y:", core::rect(22,82,40,96), false, false, t3); + env->addEditBox(L"0.0", core::rect(40,76,130,96), true, t3, GUI_ID_LIGHT_Y_SCALE); + env->addStaticText(L"Z:", core::rect(22,108,40,126), false, false, t3); + env->addEditBox(L"0.0", core::rect(40,106,130,126), true, t3, GUI_ID_LIGHT_Z_SCALE); + env->addCheckBox(true, core::rect(22,142,130,156),t3,GUI_ID_LIGHT_VISIBLE,L"Visible"); + env->addButton(core::rect(10,164,85,185), t3, GUI_ID_LIGHT_SET, L"Set"); + + // bring irrlicht engine logo to front, because it + // now may be below the newly created toolbox + root->bringToFront(root->getElementFromId(666, true)); +} + + +/* +To get all the events sent by the GUI Elements, we need to create an event +receiver. This one is really simple. If an event occurs, it checks the id of +the caller and the event type, and starts an action based on these values. For +example, if a menu item with id GUI_ID_OPEN_MODEL was selected, if opens a file-open-dialog. +*/ +class MyEventReceiver : public IEventReceiver +{ +public: + virtual bool OnEvent(const SEvent& event) + { + // Escape swaps Camera Input + if (event.EventType == EET_KEY_INPUT_EVENT && + event.KeyInput.PressedDown == false) + { + if (event.KeyInput.Key == irr::KEY_ESCAPE) + { + if (Device) + { + scene::ICameraSceneNode * camera = + Device->getSceneManager()->getActiveCamera(); + if (camera) + { + camera->setInputReceiverEnabled( !camera->isInputReceiverEnabled() ); + } + return true; + } + } + else if (event.KeyInput.Key == irr::KEY_F1) + { + if (Device) + { + IGUIElement* elem = Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_POSITION_TEXT); + if (elem) + elem->setVisible(!elem->isVisible()); + } + } + } + + if (event.EventType == EET_GUI_EVENT) + { + s32 id = event.GUIEvent.Caller->getID(); + IGUIEnvironment* env = Device->getGUIEnvironment(); + scene::ISceneManager* smgr = Device->getSceneManager(); + switch(event.GUIEvent.EventType) + { + case EGET_MENU_ITEM_SELECTED: + { + // a menu item was clicked + + IGUIContextMenu* menu = (IGUIContextMenu*)event.GUIEvent.Caller; + s32 id = menu->getItemCommandId(menu->getSelectedItem()); + + switch(id) + { + case GUI_ID_OPEN_MODEL: // File -> Open Model + env->addFileOpenDialog(L"Please select a model file to open"); + break; + case GUI_ID_SET_MODEL_ARCHIVE: // File -> Set Model Archive + env->addFileOpenDialog(L"Please select your game archive/directory"); + break; + case GUI_ID_LOAD_AS_OCTREE: // File -> LoadAsOctree + Octree = !Octree; + menu->setItemChecked(menu->getSelectedItem(), Octree); + break; + case GUI_ID_QUIT: // File -> Quit + Device->closeDevice(); + break; + case GUI_ID_SKY_BOX_VISIBLE: // View -> Skybox + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + SkyBox->setVisible(!SkyBox->isVisible()); + break; + case GUI_ID_DEBUG_OFF: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem()+1, false); + menu->setItemChecked(menu->getSelectedItem()+2, false); + menu->setItemChecked(menu->getSelectedItem()+3, false); + menu->setItemChecked(menu->getSelectedItem()+4, false); + menu->setItemChecked(menu->getSelectedItem()+5, false); + menu->setItemChecked(menu->getSelectedItem()+6, false); + if (Model) + Model->setDebugDataVisible(scene::EDS_OFF); + break; + case GUI_ID_DEBUG_BOUNDING_BOX: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_BBOX)); + break; + case GUI_ID_DEBUG_NORMALS: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_NORMALS)); + break; + case GUI_ID_DEBUG_SKELETON: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_SKELETON)); + break; + case GUI_ID_DEBUG_WIRE_OVERLAY: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY)); + break; + case GUI_ID_DEBUG_HALF_TRANSPARENT: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_HALF_TRANSPARENCY)); + break; + case GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); + if (Model) + Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_BBOX_BUFFERS)); + break; + case GUI_ID_DEBUG_ALL: // View -> Debug Information + menu->setItemChecked(menu->getSelectedItem()-1, true); + menu->setItemChecked(menu->getSelectedItem()-2, true); + menu->setItemChecked(menu->getSelectedItem()-3, true); + menu->setItemChecked(menu->getSelectedItem()-4, true); + menu->setItemChecked(menu->getSelectedItem()-5, true); + menu->setItemChecked(menu->getSelectedItem()-6, true); + if (Model) + Model->setDebugDataVisible(scene::EDS_FULL); + break; + case GUI_ID_MODEL_MATERIAL_SOLID: // View -> Material -> Solid + if (Model) + Model->setMaterialType(video::EMT_SOLID); + break; + case GUI_ID_MODEL_MATERIAL_TRANSPARENT: // View -> Material -> Transparent + if (Model) + Model->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); + break; + case GUI_ID_MODEL_MATERIAL_REFLECTION: // View -> Material -> Reflection + if (Model) + Model->setMaterialType(video::EMT_SPHERE_MAP); + break; + + case GUI_ID_CAMERA_MAYA: + setActiveCamera(Camera[0]); + break; + case GUI_ID_CAMERA_FIRST_PERSON: + setActiveCamera(Camera[1]); + break; + + } + break; + } + + case EGET_FILE_SELECTED: + { + // load the model file, selected in the file open dialog + IGUIFileOpenDialog* dialog = + (IGUIFileOpenDialog*)event.GUIEvent.Caller; + loadModel(core::stringc(dialog->getFileName()).c_str()); + } + break; + + case EGET_SCROLL_BAR_CHANGED: + + // control skin transparency + if (id == 104) + { + const s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); + for (s32 i=0; igetSkin()->getColor((EGUI_DEFAULT_COLOR)i); + col.setAlpha(pos); + env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col); + } + } + else if (id == 105) + { + const s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); + if (scene::ESNT_ANIMATED_MESH == Model->getType()) + ((scene::IAnimatedMeshSceneNode*)Model)->setAnimationSpeed((f32)pos); + } + break; + + case EGET_COMBO_BOX_CHANGED: + // control anti-aliasing/filtering + if (id == 108) + { + s32 pos = ((IGUIComboBox*)event.GUIEvent.Caller)->getSelected(); + switch (pos) + { + case 0: + if (Model) + { + Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); + Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false); + Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, false); + } + break; + case 1: + if (Model) + { + Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, true); + Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false); + } + break; + case 2: + if (Model) + { + Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); + Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, true); + } + break; + case 3: + if (Model) + { + Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, true); + } + break; + case 4: + if (Model) + { + Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, false); + } + break; + } + } + else if(id == GUI_ID_LIGHT_BOX) + { + s32 pos = ((IGUIComboBox*)event.GUIEvent.Caller)->getSelected(); + scene::ISceneNode* light; + switch (pos) + { + case 0: + light=smgr->getSceneNodeFromId(LIGHT_ID_0); + break; + case 1: + light=smgr->getSceneNodeFromId(LIGHT_ID_1); + break; + case 2: + light=smgr->getSceneNodeFromId(LIGHT_ID_2); + break; + case 3: + light=smgr->getSceneNodeFromId(LIGHT_ID_3); + break; + } + core::vector3df lpos = light->getPosition(); + env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_X_SCALE,true)->setText(core::stringw(lpos.X).c_str()); + env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_Y_SCALE,true)->setText(core::stringw(lpos.Y).c_str()); + env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_Z_SCALE,true)->setText(core::stringw(lpos.Z).c_str()); + IGUICheckBox* box =(IGUICheckBox*)(env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_VISIBLE,true)); + box->setChecked(light->isVisible()); + } + break; + + case EGET_BUTTON_CLICKED: + + switch(id) + { + case 1101: + { + // set scale + gui::IGUIElement* root = env->getRootGUIElement(); + core::vector3df scale; + core::stringc s; + + s = root->getElementFromId(GUI_ID_X_SCALE, true)->getText(); + scale.X = (f32)atof(s.c_str()); + s = root->getElementFromId(GUI_ID_Y_SCALE, true)->getText(); + scale.Y = (f32)atof(s.c_str()); + s = root->getElementFromId(GUI_ID_Z_SCALE, true)->getText(); + scale.Z = (f32)atof(s.c_str()); + + if (Model) + Model->setScale(scale); + } + break; + case 1102: + env->addFileOpenDialog(L"Please select a model file to open"); + break; + case 1104: + createToolBox(); + break; + case 1105: + env->addFileOpenDialog(L"Please select your game archive/directory"); + break; + case GUI_ID_LIGHT_SET: + scene::ISceneNode* light; + + s32 pos=((IGUIComboBox*)env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_BOX,true))->getSelected(); + switch (pos) + { + case 0: + light=smgr->getSceneNodeFromId(LIGHT_ID_0); + break; + case 1: + light=smgr->getSceneNodeFromId(LIGHT_ID_1); + break; + case 2: + light=smgr->getSceneNodeFromId(LIGHT_ID_2); + break; + case 3: + light=smgr->getSceneNodeFromId(LIGHT_ID_3); + break; + } + core::vector3df lpos = core::vector3df(atof(core::stringc(env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_X_SCALE,true)->getText()).c_str()), + atof(core::stringc(env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_Y_SCALE,true)->getText()).c_str()), + atof(core::stringc(env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_Z_SCALE,true)->getText()).c_str())); + light->setPosition(lpos); + light->setVisible(((IGUICheckBox*)(env->getRootGUIElement()->getElementFromId(GUI_ID_LIGHT_VISIBLE,true)))->isChecked()); + + break; + + } + + break; + default: + break; + } + } + + return false; + } +}; + + +/* +Most of the hard work is done. We only need to create the Irrlicht Engine +device and all the buttons, menus and toolbars. We start up the engine as +usual, using createDevice(). To make our application catch events, we set our +eventreceiver as parameter. The #ifdef WIN32 preprocessor commands are not +necessary, but I included them to make the tutorial use DirectX on Windows and +OpenGL on all other platforms like Linux. As you can see, there is also a +unusual call to IrrlichtDevice::setResizeAble(). This makes the render window +resizeable, which is quite useful for a mesh viewer. +*/ +int main(int argc, char* argv[]) +{ + // ask user for driver + + video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D8; + + printf("Please select the driver you want for this example:\n"\ + " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\ + " (d) Software Renderer\n (e) Burning's Software Renderer\n"\ + " (f) NullDevice\n (otherKey) exit\n\n"); + + char key; + std::cin >> key; + + switch(key) + { + case 'a': driverType = video::EDT_DIRECT3D9;break; + case 'b': driverType = video::EDT_DIRECT3D8;break; + case 'c': driverType = video::EDT_OPENGL; break; + case 'd': driverType = video::EDT_SOFTWARE; break; + case 'e': driverType = video::EDT_BURNINGSVIDEO;break; + case 'f': driverType = video::EDT_NULL; break; + default: return 1; + } + + // create device and exit if creation failed + + MyEventReceiver receiver; + Device = createDevice(driverType, core::dimension2d(800, 600), + 16, false, false, false, &receiver); + + if (Device == 0) + return 1; // could not create selected driver. + + Device->setResizeAble(true); + + Device->setWindowCaption(L"Irrlicht Engine - Loading..."); + + video::IVideoDriver* driver = Device->getVideoDriver(); + IGUIEnvironment* env = Device->getGUIEnvironment(); + scene::ISceneManager* smgr = Device->getSceneManager(); + smgr->getParameters()->setAttribute(scene::COLLADA_CREATE_SCENE_INSTANCES, true); + + // register external loaders for not supported filetypes + video::CImageLoaderBLP* BLPloader = new video::CImageLoaderBLP(); + driver->addExternalImageLoader(BLPloader); + scene::CM2MeshFileLoader* m2loader = new scene::CM2MeshFileLoader(Device, "../../../bin/data/texture"); + smgr->addExternalMeshLoader(m2loader); + scene::CWMOMeshFileLoader* wmoloader = new scene::CWMOMeshFileLoader(Device, "../../../bin/data/texture"); + smgr->addExternalMeshLoader(wmoloader); + driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true); + +// smgr->addLightSceneNode(); + smgr->addLightSceneNode(0, core::vector3df(50,0,0), + video::SColorf(1.0f,1.0f,1.0f),100, LIGHT_ID_0); + smgr->addLightSceneNode(0, core::vector3df(0,50,0), + video::SColorf(1.0f,1.0f,1.0f),100, LIGHT_ID_1); + smgr->addLightSceneNode(0, core::vector3df(0,0,50), + video::SColorf(1.0f,1.0f,1.0f),100, LIGHT_ID_2); + smgr->addLightSceneNode(0, core::vector3df(0,0,-50), + video::SColorf(1.0f,1.0f,1.0f),100, LIGHT_ID_3); + + smgr->getSceneNodeFromId(LIGHT_ID_1)->setVisible(false); + smgr->getSceneNodeFromId(LIGHT_ID_2)->setVisible(false); + smgr->getSceneNodeFromId(LIGHT_ID_3)->setVisible(false); + + + // set a nicer font + + IGUISkin* skin = env->getSkin(); + IGUIFont* font = env->getFont("./data/misc/fonthaettenschweiler.bmp"); + if (font) + skin->setFont(font); + + // create menu + gui::IGUIContextMenu* menu = env->addMenu(); + menu->addItem(L"File", -1, true, true); + menu->addItem(L"View", -1, true, true); + menu->addItem(L"Camera", -1, true, true); + + gui::IGUIContextMenu* submenu; + submenu = menu->getSubMenu(0); + submenu->addItem(L"Open Model File & Texture...", GUI_ID_OPEN_MODEL); + submenu->addItem(L"Set Model Archive...", GUI_ID_SET_MODEL_ARCHIVE); + submenu->addItem(L"Load as Octree", GUI_ID_LOAD_AS_OCTREE); + submenu->addSeparator(); + submenu->addItem(L"Quit", GUI_ID_QUIT); + + submenu = menu->getSubMenu(1); + submenu->addItem(L"sky box visible", GUI_ID_SKY_BOX_VISIBLE, true, false, true); + submenu->addItem(L"toggle model debug information", GUI_ID_TOGGLE_DEBUG_INFO, true, true); + submenu->addItem(L"model material", -1, true, true ); + + submenu = submenu->getSubMenu(1); + submenu->addItem(L"Off", GUI_ID_DEBUG_OFF); + submenu->addItem(L"Bounding Box", GUI_ID_DEBUG_BOUNDING_BOX); + submenu->addItem(L"Normals", GUI_ID_DEBUG_NORMALS); + submenu->addItem(L"Skeleton", GUI_ID_DEBUG_SKELETON); + submenu->addItem(L"Wire overlay", GUI_ID_DEBUG_WIRE_OVERLAY); + submenu->addItem(L"Half-Transparent", GUI_ID_DEBUG_HALF_TRANSPARENT); + submenu->addItem(L"Buffers bounding boxes", GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES); + submenu->addItem(L"All", GUI_ID_DEBUG_ALL); + + submenu = menu->getSubMenu(1)->getSubMenu(2); + submenu->addItem(L"Solid", GUI_ID_MODEL_MATERIAL_SOLID); + submenu->addItem(L"Transparent", GUI_ID_MODEL_MATERIAL_TRANSPARENT); + submenu->addItem(L"Reflection", GUI_ID_MODEL_MATERIAL_REFLECTION); + + submenu = menu->getSubMenu(2); + submenu->addItem(L"Maya Style", GUI_ID_CAMERA_MAYA); + submenu->addItem(L"First Person", GUI_ID_CAMERA_FIRST_PERSON); + + + /* + Below the menu we want a toolbar, onto which we can place colored + buttons and important looking stuff like a senseless combobox. + */ + + // create toolbar + + gui::IGUIToolBar* bar = env->addToolBar(); + + video::ITexture* image = driver->getTexture("./data/misc/open.png"); + bar->addButton(1102, 0, L"Open a model",image, 0, false, true); + + image = driver->getTexture("./data/misc/tools.png"); + bar->addButton(1104, 0, L"Open Toolset",image, 0, false, true); + + image = driver->getTexture("./data/misc/zip.png"); + bar->addButton(1105, 0, L"Set Model Archive",image, 0, false, true); + + // create a combobox with some senseless texts + + gui::IGUIComboBox* box = env->addComboBox(core::rect(250,4,350,23), bar, 108); + box->addItem(L"No filtering"); + box->addItem(L"Bilinear"); + box->addItem(L"Trilinear"); + box->addItem(L"Anisotropic"); + box->addItem(L"Isotropic"); + + /* + To make the editor look a little bit better, we disable transparent gui + elements, and add an Irrlicht Engine logo. In addition, a text showing + the current frames per second value is created and the window caption is + changed. + */ + + // disable alpha + + for (s32 i=0; igetSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); + col.setAlpha(255); + env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col); + } + + // add a tabcontrol + + createToolBox(); + + // create fps text + + IGUIStaticText* fpstext = env->addStaticText(L"", + core::rect(400,4,570,23), true, false, bar); + + IGUIStaticText* postext = env->addStaticText(L"", + core::rect(10,50,470,80),false, false, 0, GUI_ID_POSITION_TEXT); + postext->setVisible(false); + + // set window caption + + Caption += " - ["; + Caption += driver->getName(); + Caption += "]"; + Device->setWindowCaption(Caption.c_str()); + + /* + That's nearly the whole application. We simply show the about message + box at start up, and load the first model. To make everything look + better, a skybox is created and a user controled camera, to make the + application a little bit more interactive. Finally, everything is drawn + in a standard drawing loop. + */ + + // show about message box and load default model +// if (argc==1) +// showAboutText(); + loadModel(StartUpModelFile.c_str()); + + // add skybox + + SkyBox = smgr->addSkyBoxSceneNode( + driver->getTexture("./data/misc/sky.jpg"), + driver->getTexture("./data/misc/sky.jpg"), + driver->getTexture("./data/misc/sky.jpg"), + driver->getTexture("./data/misc/sky.jpg"), + driver->getTexture("./data/misc/sky.jpg"), + driver->getTexture("./data/misc/sky.jpg")); + + // add a camera scene node + Camera[0] = smgr->addCameraSceneNodeMaya(); + Camera[0]->setFarValue(20000.f); + // Maya cameras reposition themselves relative to their target, so target the location + // where the mesh scene node is placed. + Camera[0]->setTarget(core::vector3df(0,0,0)); + + Camera[1] = smgr->addCameraSceneNodeFPS(); + Camera[1]->setFarValue(20000.f); + Camera[1]->setPosition(core::vector3df(0,0,-70)); + Camera[1]->setTarget(core::vector3df(0,0,0)); + + setActiveCamera(Camera[0]); + + // load the irrlicht engine logo + IGUIImage *img = + env->addImage(driver->getTexture("./data/misc/irrlichtlogo.png"), + core::position2d(10, driver->getScreenSize().Height - 128)); + + // lock the logo's edges to the bottom left corner of the screen + img->setAlignment(EGUIA_UPPERLEFT, EGUIA_UPPERLEFT, + EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT); + + // draw everything + + while(Device->run() && driver) + { + if (Device->isWindowActive()) + { + driver->beginScene(true, true, video::SColor(150,50,50,50)); + + + smgr->drawAll(); + video::SMaterial m2; + m2.Lighting = false; + driver->setMaterial(m2); + driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(100,0,0),video::SColor(255,255,0,0)); + driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0,100,0),video::SColor(255,0,255,0)); + driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0,0,100),video::SColor(255,0,0,255)); + env->drawAll(); + + driver->endScene(); + + core::stringw str(L"FPS: "); + str.append(core::stringw(driver->getFPS())); + str += L" Tris: "; + str.append(core::stringw(driver->getPrimitiveCountDrawn())); + fpstext->setText(str.c_str()); + + scene::ICameraSceneNode* cam = Device->getSceneManager()->getActiveCamera(); + str = L"Pos: "; + str.append(core::stringw(cam->getPosition().X)); + str += L" "; + str.append(core::stringw(cam->getPosition().Y)); + str += L" "; + str.append(core::stringw(cam->getPosition().Z)); + str += L" Tgt: "; + str.append(core::stringw(cam->getTarget().X)); + str += L" "; + str.append(core::stringw(cam->getTarget().Y)); + str += L" "; + str.append(core::stringw(cam->getTarget().Z)); + postext->setText(str.c_str()); + + } + else + Device->yield(); + } + + Device->drop(); + return 0; +} + +/* +**/