GUI II. Ogre3D GUI with MyGUI Project initialization http://cg.iit.bme.hu/gamedev/KIC/06_GUI/ 06_02_Ogre3D_MyGui_Base.zip Extract Run: OgreMyGui.sln Set include and library paths (if not correct) Set working directory (if not $(SolutionDir)/bin) Compile Run Play !! Ghost Game with Overlays MyGUI • free, open source library • targeted at Ogre3D • relatively simple and flexible • visual tools for GUI editing • dismal documentation for coding 2012. 11. 8. MyGUI compilation • there is no downloadable SDK – but included in guibase.zip for you • if code had to be compiled – requires Ogre3D SDK – requires FreeType library • for Windows, install FreeType for Windows from gnuwin32.sourceforge.net – requires CMake build tool 2012. 11. 8. MyGUI configuration • in CMake specify Ogre and FreeType directories as dependencies • click “Generate” • open generated MyGUI.sln in Visual Studio – verify that boost version of the Ogre SDK is included (addition include dirs) • compile MyGUIEngine and OgrePlatform 2012. 11. 8. MyGUI includes • include directories – ..\..\..\MyGUI_3.2.0\MyGUIEngine\include – ..\..\..\MyGUI_3.2.0\Platforms\Ogre\OgrePlatfo rm\include main.cpp #include "MyGUI.h" #include "MyGUI_OgrePlatform.h" 2012. 11. 8. Channeling events to the GUI class GuiInputHandler : public OIS::MouseListener , public OIS::KeyListener { public: bool mouseMoved( const OIS::MouseEvent &arg ) { return MyGUI::InputManager::getInstance().injectMouseMove( arg.state.X.abs, arg.state.Y.abs, arg.state.Z.abs); } bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id ){ return MyGUI::InputManager::getInstance().injectMousePress( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); } bool mouseReleased( const OIS::MouseEvent &arg,OIS::MouseButtonID id ) { return MyGUI::InputManager::getInstance().injectMouseRelease( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); } bool keyPressed( const OIS::KeyEvent &arg ) { return MyGUI::InputManager::getInstance().injectKeyPress( MyGUI::KeyCode::Enum(arg.key), arg.text); } bool keyReleased( const OIS::KeyEvent &arg ) { return MyGUI::InputManager::getInstance().injectKeyRelease( MyGUI::KeyCode::Enum(arg.key)); } }; 2012. 11. 8. InputManager modification (inputs.h) public: OIS::Keyboard* mKeyboard; OIS::Mouse* mMouse; mKeyboard = static_cast<OIS::Keyboard*>( OISInputManager->createInputObject( OIS::OISKeyboard, true )); mMouse = static_cast<OIS::Mouse*>( OISInputManager->createInputObject( OIS::OISMouse, true )); 2012. 11. 8. Listener registration in main.cpp: setupListeners GuiInputHandler* guiInputHander = new GuiInputHandler(); inputManager->mMouse-> setEventCallback(guiInputHander); inputManager->mKeyboard-> setEventCallback(guiInputHander); 2012. 11. 8. GUI initialization main.cpp: setupScene platform = new MyGUI::OgrePlatform(); platform->initialise(renderWindow, sceneManager); gui = new MyGUI::Gui(); gui->initialise(); // GUI element creation may commence here 2012. 11. 8. Let us create a progress bar! //global MyGUI::ProgressPtr progressBar; // in setupScene() // GUI element creation may commence here progressBar = gui->createWidget<MyGUI::ProgressBar> ("ProgressBar",100,10,500,30,MyGUI::Align::Center,"Main"); // skin^ position^ progressBar->setEnabled(true); progressBar->setProgressRange(stopTimes[numStops-1]); progressBar->setProgressPosition(0); 2012. 11. 8. Indicate progress in every frame! progressBar->setProgressPosition(animTime); 2012. 11. 8. Result 2012. 11. 8. Add checkbox to toggle music on/off! MyGUI::ButtonPtr button = gui->createWidget<MyGUI::Button> ("CheckBox", 10, 40, 300, 26, MyGUI::Align::Default, "Main"); button->setCaption("Music"); 2012. 11. 8. Result 2012. 11. 8. GameAudio.h: new method void setMusicVolume(float musicVolume) { this->musicVolume = musicVolume; AL_SAFE_CALL( alSourcef (ambientSource, AL_GAIN, musicVolume), "unable to set ambient volume"); } 2012. 11. 8. Global function void guiToggleMusic(MyGUI::Widget* _sender) { MyGUI::ButtonPtr checkbox = _sender->castType<MyGUI::Button>(); if(checkbox->getStateSelected()) { checkbox->setStateSelected(false); gameAudio->setMusicVolume(0); } else { checkbox->setStateSelected(true); gameAudio->setMusicVolume(10); } } 2012. 11. 8. Add event listener button->eventMouseButtonClick += MyGUI::newDelegate( guiToggleMusic); 2012. 11. 8. Result 2012. 11. 8. The End 2012. 11. 8.