Changeset 116 for code/trunk/src
- Timestamp:
- Oct 29, 2007, 12:00:43 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/orxonox.cc
r112 r116 26 26 */ 27 27 28 // TODO: Change this to orxonox.h and include all necessary functions there 29 #include "ExampleApplication.h"28 #include <Ogre.h> 29 #include <OIS/OIS.h> 30 30 #include <CEGUI/CEGUI.h> 31 32 // TODO: Put creation of SceneNode and implementation of FrameListener into an extern file 33 SceneNode *lightNode; 34 35 class OrxFrameListener : public ExampleFrameListener 31 #include <OgreCEGUIRenderer.h> 32 33 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 34 #include <CoreFoundation/CoreFoundation.h> 35 36 // This function will locate the path to our application on OS X, 37 // unlike windows you can not rely on the curent working directory 38 // for locating your configuration files and resources. 39 std::string macBundlePath() 40 { 41 char path[1024]; 42 CFBundleRef mainBundle = CFBundleGetMainBundle(); 43 assert(mainBundle); 44 45 CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle); 46 assert(mainBundleURL); 47 48 CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle); 49 assert(cfStringRef); 50 51 CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII); 52 53 CFRelease(mainBundleURL); 54 CFRelease(cfStringRef); 55 56 return std::string(path); 57 } 58 #endif 59 60 using namespace Ogre; 61 62 class OrxExitListener : public FrameListener 36 63 { 37 64 public: 38 OrxFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr) 39 : ExampleFrameListener(win, cam, false, false) 40 { 41 } 42 43 bool frameStarted(const FrameEvent &evt) 44 { 45 // add tutorial code here: 46 // ... 47 lightNode->translate(Vector3(0, -10 * evt.timeSinceLastFrame, 0)); 48 49 return ExampleFrameListener::frameStarted(evt); 50 } 65 OrxExitListener(OIS::Keyboard *keyboard) 66 : mKeyboard(keyboard) 67 { 68 } 69 70 bool frameStarted(const FrameEvent& evt) 71 { 72 mKeyboard->capture(); 73 return !mKeyboard->isKeyDown(OIS::KC_ESCAPE); 74 } 75 51 76 private: 77 OIS::Keyboard *mKeyboard; 52 78 }; 53 79 54 // TODO: Make Doxygen tags work and create scene AFTER loading in an extern file 55 //! This is the application class of Orxonox 56 /** 57 Application class. The starting point of Orxonox. 58 Loading of ressources should start in here. 59 ... 60 */ 61 class Orxonox : public ExampleApplication 62 { 63 protected: 80 class OrxApplication 81 { 64 82 public: 65 Orxonox() 66 { 67 } 68 69 ~Orxonox() 70 { 71 } 72 protected: 73 void createCamera(void) 74 { 75 // create camera 76 mCamera = mSceneMgr->createCamera("PlayerCam"); 77 mCamera->setNearClipDistance(5); 78 mCamera->setPosition(Vector3(0,10,500)); 79 mCamera->lookAt(Vector3(0,0,0)); 80 } 81 82 void createScene(void) 83 { 84 // add tutorial code here: 85 // ... 86 //mSceneMgr->setAmbientLight( ColourValue( 0.3, 0.3, 0.3 ) ); 87 //Entity* head = mSceneMgr->createEntity("head", "ogrehead.mesh"); 88 89 //Entity* head2 = mSceneMgr->createEntity("head2", "ogrehead.mesh"); 90 91 //ceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "OgreHeadNode", Vector3( 0, 0, 0 ) ); 92 //node->attachObject( head ); 93 94 //SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "OgreHeadNode2", Vector3( 50, 0, 0 ) ); 95 //node2->attachObject( head2 ); 96 97 98 //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox"); 99 100 Light *light = mSceneMgr->createLight("Light1"); 101 light->setType(Light::LT_POINT); 102 light->setPosition(Vector3(0, 100, 0)); 103 light->setDiffuseColour(0.5, 0.5, 0.0); 104 light->setSpecularColour(0.5, 0.5, 0.0); 105 106 BillboardSet *bbs = mSceneMgr->createBillboardSet("bb", 1); 107 bbs->createBillboard(Vector3::ZERO, ColourValue(1.0, 0.0, 0.0)); 108 //bbs->setMaterialName("Examples/Flare"); 109 110 lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("LightNode", Vector3(0, 100, 0)); 111 lightNode->attachObject(bbs); 112 lightNode->attachObject(light); 113 light->setPosition(0.0, 0.0, 0.0); 114 } 115 116 void createFrameListener(void) 117 { 118 // create frame listener 119 mFrameListener = new OrxFrameListener(mWindow, mCamera, mSceneMgr); 120 mRoot->addFrameListener(mFrameListener); 83 void go() 84 { 85 createRoot(); 86 defineResources(); 87 setupRenderSystem(); 88 createRenderWindow(); 89 initializeResourceGroups(); 90 setupScene(); 91 setupInputSystem(); 92 setupCEGUI(); 93 createFrameListener(); 94 startRenderLoop(); 95 } 96 97 ~OrxApplication() 98 { 99 mInputManager->destroyInputObject(mKeyboard); 100 OIS::InputManager::destroyInputSystem(mInputManager); 101 102 delete mRenderer; 103 delete mSystem; 104 105 delete mListener; 106 delete mRoot; 107 } 108 109 private: 110 Root *mRoot; 111 OIS::Keyboard *mKeyboard; 112 OIS::Mouse *mMouse; 113 OIS::InputManager *mInputManager; 114 CEGUI::OgreCEGUIRenderer *mRenderer; 115 CEGUI::System *mSystem; 116 OrxExitListener *mListener; 117 118 void createRoot() 119 { 120 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 121 mRoot = new Root(macBundlePath() + "/Contents/Resources/plugins.cfg"); 122 #else 123 mRoot = new Root(); 124 #endif 125 } 126 127 void defineResources() 128 { 129 String secName, typeName, archName; 130 ConfigFile cf; 131 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 132 cf.load(macBundlePath() + "/Contents/Resources/resources.cfg"); 133 #else 134 cf.load("resources.cfg"); 135 #endif 136 137 ConfigFile::SectionIterator seci = cf.getSectionIterator(); 138 while (seci.hasMoreElements()) 139 { 140 secName = seci.peekNextKey(); 141 ConfigFile::SettingsMultiMap *settings = seci.getNext(); 142 ConfigFile::SettingsMultiMap::iterator i; 143 for (i = settings->begin(); i != settings->end(); ++i) 144 { 145 typeName = i->first; 146 archName = i->second; 147 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 148 ResourceGroupManager::getSingleton().addResourceLocation( String(macBundlePath() + "/" + archName), typeName, secName); 149 #else 150 ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName); 151 #endif 152 } 153 } 154 } 155 156 void setupRenderSystem() 157 { 158 if (!mRoot->restoreConfig() && !mRoot->showConfigDialog()) 159 throw Exception(52, "User canceled the config dialog!", "OrxApplication::setupRenderSystem()"); 160 } 161 162 void createRenderWindow() 163 { 164 mRoot->initialise(true, "Ogre Render Window"); 165 } 166 167 void initializeResourceGroups() 168 { 169 TextureManager::getSingleton().setDefaultNumMipmaps(5); 170 ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 171 } 172 173 void setupScene() 174 { 175 SceneManager *mgr = mRoot->createSceneManager(ST_GENERIC, "Default SceneManager"); 176 Camera *cam = mgr->createCamera("Camera"); 177 Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam); 178 } 179 180 void setupInputSystem() 181 { 182 size_t windowHnd = 0; 183 std::ostringstream windowHndStr; 184 OIS::ParamList pl; 185 RenderWindow *win = mRoot->getAutoCreatedWindow(); 186 187 win->getCustomAttribute("WINDOW", &windowHnd); 188 windowHndStr << windowHnd; 189 pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 190 mInputManager = OIS::InputManager::createInputSystem(pl); 191 192 try 193 { 194 mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false)); 195 mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false)); 196 } 197 catch (const OIS::Exception &e) 198 { 199 throw new Exception(42, e.eText, "OrxApplication::setupInputSystem"); 200 } 201 } 202 203 void setupCEGUI() 204 { 205 SceneManager *mgr = mRoot->getSceneManager("Default SceneManager"); 206 RenderWindow *win = mRoot->getAutoCreatedWindow(); 207 208 // CEGUI setup 209 mRenderer = new CEGUI::OgreCEGUIRenderer(win, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mgr); 210 mSystem = new CEGUI::System(mRenderer); 211 212 // Other CEGUI setup here. 213 } 214 215 void createFrameListener() 216 { 217 mListener = new OrxExitListener(mKeyboard); 218 mRoot->addFrameListener(mListener); 219 } 220 221 void startRenderLoop() 222 { 223 mRoot->startRendering(); 121 224 } 122 225 }; 123 226 124 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32227 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 125 228 #define WIN32_LEAN_AND_MEAN 126 229 #include "windows.h" 127 230 128 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) 129 #else 130 131 int main(int argc, char **argv) 132 #endif 133 { 134 // Create application object 135 Orxonox orxonox; 136 137 try { 231 INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT) 232 #else 233 int main(int argc, char **argv) 234 #endif 235 { 236 try 237 { 238 OrxApplication orxonox; 138 239 orxonox.go(); 139 } catch( Exception& e ) { 140 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 141 MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL); 240 } 241 catch(Exception& e) 242 { 243 #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 244 MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL); 142 245 #else 143 246 fprintf(stderr, "An exception has occurred: %s\n", … … 148 251 return 0; 149 252 } 253
Note: See TracChangeset
for help on using the changeset viewer.