Changeset 161 for code/branches/main_reto_vs05/src
- Timestamp:
- Nov 4, 2007, 5:00:41 PM (17 years ago)
- Location:
- code/branches/main_reto_vs05/src
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/main_reto_vs05/src/bullet.cc
r157 r161 26 26 */ 27 27 28 #include "OgreSceneNode.h" 29 #include "OgreEntity.h" 30 #include "OgreVector3.h" 31 28 32 #include "bullet.h" 29 33 30 34 31 Bullet::Bullet(SceneNode *mNode, Entity *mEntity, Vector3 mSpeed) 32 : mNode(mNode), mEntity(mEntity), mSpeed(mSpeed) 33 { 34 mNode->attachObject(mEntity); 35 } 35 namespace Orxonox { 36 using namespace Ogre; 37 38 Bullet::Bullet(SceneNode *mNode, Entity *mEntity, Vector3 mSpeed) 39 : mNode(mNode), mEntity(mEntity), mSpeed(mSpeed) 40 { 41 mNode->attachObject(mEntity); 42 } 36 43 37 44 38 Bullet::~Bullet() 39 { 45 Bullet::~Bullet() 46 { 47 } 48 40 49 } -
code/branches/main_reto_vs05/src/camera_manager.cc
r157 r161 26 26 */ 27 27 28 #include "OgreSceneManager.h" 29 #include "OgreCamera.h" 30 28 31 #include "camera_manager.h" 29 32 33 namespace Orxonox { 34 using namespace Ogre; 30 35 31 CameraManager::CameraManager(SceneManager *mScene) : mSceneMgr(mSceneMgr)32 {33 }36 CameraManager::CameraManager(SceneManager *mScene) : mSceneMgr(mSceneMgr) 37 { 38 } 34 39 35 40 36 CameraManager::~CameraManager()37 {38 }41 CameraManager::~CameraManager() 42 { 43 } 39 44 40 45 41 bool CameraManager::setCameraPosition(int n) 42 { 43 return true; 46 bool CameraManager::setCameraPosition(int n) 47 { 48 return true; 49 } 50 44 51 } -
code/branches/main_reto_vs05/src/main.cc
r157 r161 26 26 */ 27 27 28 28 #include "OgrePlatform.h" 29 #include "OgreException.h" 29 30 30 31 #include "orxonox.h" … … 44 45 try { 45 46 // create an orxonox aplication and run it 46 Orxonox myApp;47 Orxonox::Orxonox myApp; 47 48 48 49 myApp.go(); -
code/branches/main_reto_vs05/src/ogre_control.cc
r159 r161 26 26 */ 27 27 28 /** 29 * Ogre control class. 30 * This is merely a convenient way to handle Ogre. It only holds the Root 31 * object and the render Window. These are the objects, that are independant 32 * of the game state (playing, menu browsing, loading, etc.). 33 * This class could easily be merged into the Orxnox class. 34 */ 35 28 #include "OgrePlatform.h" 29 #include "OgreRoot.h" 30 #include "OgreRenderWindow.h" 31 #include "OgreString.h" 32 #include "OgreConfigFile.h" 33 34 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 35 #include <CoreFoundation/CoreFoundation.h> 36 #endif 36 37 37 38 #include "ogre_control.h" 38 39 39 40 40 /** 41 * Provide support for mac users. 42 */ 43 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 44 // This function will locate the path to our application on OS X, 45 // unlike windows you can not rely on the curent working directory 46 // for locating your configuration files and resources. 47 std::string macBundlePath() 48 { 49 char path[1024]; 50 CFBundleRef mainBundle = CFBundleGetMainBundle(); 51 assert(mainBundle); 52 53 CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle); 54 assert(mainBundleURL); 55 56 CFStringRef cfStringRef = 57 CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle); 58 assert(cfStringRef); 59 60 CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII); 61 62 CFRelease(mainBundleURL); 63 CFRelease(cfStringRef); 64 65 return std::string(path); 41 namespace Orxonox { 42 using namespace Ogre; 43 44 /** 45 * Ogre control class. 46 * This is merely a convenient way to handle Ogre. It only holds the Root 47 * object and the render Window. These are the objects, that are independant 48 * of the game state (playing, menu browsing, loading, etc.). 49 * This class could easily be merged into the Orxnox class. 50 */ 51 52 53 /** 54 * Provide support for mac users. 55 */ 56 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 57 // This function will locate the path to our application on OS X, 58 // unlike windows you can not rely on the curent working directory 59 // for locating your configuration files and resources. 60 std::string macBundlePath() 61 { 62 char path[1024]; 63 CFBundleRef mainBundle = CFBundleGetMainBundle(); 64 assert(mainBundle); 65 66 CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle); 67 assert(mainBundleURL); 68 69 CFStringRef cfStringRef = 70 CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle); 71 assert(cfStringRef); 72 73 CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII); 74 75 CFRelease(mainBundleURL); 76 CFRelease(cfStringRef); 77 78 return std::string(path); 79 } 80 #endif 81 82 83 /** 84 * Constructor that determines the resource path platform dependant. 85 */ 86 OgreControl::OgreControl() : root_(0) 87 { 88 // Provide a nice cross platform solution for locating the configuration 89 // files. On windows files are searched for in the current working 90 // directory, on OS X however you must provide the full path, the helper 91 // function macBundlePath does this for us. 92 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 93 resourcePath_ = macBundlePath() + "/Contents/Resources/"; 94 #else 95 resourcePath_ = ""; 96 #endif 97 } 98 99 100 /** 101 * Standard Destructor. 102 */ 103 OgreControl::~OgreControl() 104 { 105 if (root_) 106 delete root_; 107 } 108 109 110 /* Sets up Ogre. 111 * First, the Root object is being created, then the resources are defined 112 * (not loaded!). And last but not least, the render settings (like resolution 113 * or AA level) are prompted to the user. 114 */ 115 bool OgreControl::initialise(void) 116 { 117 String pluginsPath; 118 // only use plugins.cfg if not static 119 #ifndef OGRE_STATIC_LIB 120 pluginsPath = resourcePath_ + "plugins.cfg"; 121 #endif 122 123 root_ = new Root(pluginsPath, 124 resourcePath_ + "ogre.cfg", resourcePath_ + "Ogre.log"); 125 126 setupResources(); 127 128 if (!configure()) 129 return false; 130 131 return true; 132 } 133 134 135 /** 136 * Defines the source of the resources. 137 */ 138 void OgreControl::setupResources(void) 139 { 140 // Load resource paths from config file 141 ConfigFile cf; 142 cf.load(resourcePath_ + "resources.cfg"); 143 144 // Go through all sections & settings in the file 145 ConfigFile::SectionIterator seci = cf.getSectionIterator(); 146 147 String secName, typeName, archName; 148 while (seci.hasMoreElements()) 149 { 150 secName = seci.peekNextKey(); 151 ConfigFile::SettingsMultiMap *settings = seci.getNext(); 152 ConfigFile::SettingsMultiMap::iterator i; 153 for (i = settings->begin(); i != settings->end(); ++i) 154 { 155 typeName = i->first; 156 archName = i->second; 157 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 158 // OS X does not set the working directory relative to the app, 159 // In order to make things portable on OS X we need to provide 160 // the loading with it's own bundle path location 161 ResourceGroupManager::getSingleton().addResourceLocation( 162 String(macBundlePath() + "/" + archName), typeName, secName); 163 #else 164 ResourceGroupManager::getSingleton().addResourceLocation( 165 archName, typeName, secName); 166 #endif 167 } 168 } 169 } 170 171 172 /** 173 * Prompts a setting window for the render engine if that has not already 174 * been done. 175 * The method also calls the root initialiser in order to get a render window. 176 */ 177 bool OgreControl::configure(void) 178 { 179 // Show the configuration dialog and initialise the system 180 // You can skip this and use root.restoreConfig() to load configuration 181 // settings if you were sure there are valid ones saved in ogre.cfg 182 if(!root_->restoreConfig() && !root_->showConfigDialog()) 183 return false; 184 185 // user clicked OK so initialise 186 // Here we choose to let the system create a default 187 // rendering window by passing 'true' 188 root_->saveConfig(); 189 window_ = root_->initialise(true); 190 return true; 191 } 192 193 194 /** 195 * Returns the root object. 196 * @return Root object. 197 */ 198 Root* OgreControl::getRoot(void) 199 { 200 return root_; 201 } 202 203 204 /** 205 * Returns the render window. 206 * @return Render window. 207 */ 208 RenderWindow* OgreControl::getRenderWindow(void) 209 { 210 return window_; 211 } 212 213 214 /** 215 * Returns the resource path. 216 * @return Resource path. 217 */ 218 Ogre::String OgreControl::getResourcePath(void) 219 { 220 return resourcePath_; 221 } 222 66 223 } 67 #endif68 69 70 /**71 * Constructor that determines the resource path platform dependant.72 */73 OgreControl::OgreControl() : root_(0)74 {75 // Provide a nice cross platform solution for locating the configuration76 // files. On windows files are searched for in the current working77 // directory, on OS X however you must provide the full path, the helper78 // function macBundlePath does this for us.79 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE80 resourcePath_ = macBundlePath() + "/Contents/Resources/";81 #else82 resourcePath_ = "";83 #endif84 }85 86 87 /**88 * Standard Destructor.89 */90 OgreControl::~OgreControl()91 {92 if (root_)93 delete root_;94 }95 96 97 /* Sets up Ogre.98 * First, the Root object is being created, then the resources are defined99 * (not loaded!). And last but not least, the render settings (like resolution100 * or AA level) are prompted to the user.101 */102 bool OgreControl::initialise(void)103 {104 String pluginsPath;105 // only use plugins.cfg if not static106 #ifndef OGRE_STATIC_LIB107 pluginsPath = resourcePath_ + "plugins.cfg";108 #endif109 110 root_ = new Root(pluginsPath,111 resourcePath_ + "ogre.cfg", resourcePath_ + "Ogre.log");112 113 setupResources();114 115 if (!configure())116 return false;117 118 return true;119 }120 121 122 /**123 * Defines the source of the resources.124 */125 void OgreControl::setupResources(void)126 {127 // Load resource paths from config file128 ConfigFile cf;129 cf.load(resourcePath_ + "resources.cfg");130 131 // Go through all sections & settings in the file132 ConfigFile::SectionIterator seci = cf.getSectionIterator();133 134 String secName, typeName, archName;135 while (seci.hasMoreElements())136 {137 secName = seci.peekNextKey();138 ConfigFile::SettingsMultiMap *settings = seci.getNext();139 ConfigFile::SettingsMultiMap::iterator i;140 for (i = settings->begin(); i != settings->end(); ++i)141 {142 typeName = i->first;143 archName = i->second;144 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE145 // OS X does not set the working directory relative to the app,146 // In order to make things portable on OS X we need to provide147 // the loading with it's own bundle path location148 ResourceGroupManager::getSingleton().addResourceLocation(149 String(macBundlePath() + "/" + archName), typeName, secName);150 #else151 ResourceGroupManager::getSingleton().addResourceLocation(152 archName, typeName, secName);153 #endif154 }155 }156 }157 158 159 /**160 * Prompts a setting window for the render engine if that has not already161 * been done.162 * The method also calls the root initialiser in order to get a render window.163 */164 bool OgreControl::configure(void)165 {166 // Show the configuration dialog and initialise the system167 // You can skip this and use root.restoreConfig() to load configuration168 // settings if you were sure there are valid ones saved in ogre.cfg169 if(!root_->restoreConfig() && !root_->showConfigDialog())170 return false;171 172 // user clicked OK so initialise173 // Here we choose to let the system create a default174 // rendering window by passing 'true'175 root_->saveConfig();176 window_ = root_->initialise(true);177 return true;178 }179 180 181 /**182 * Returns the root object.183 * @return Root object.184 */185 Root* OgreControl::getRoot(void)186 {187 return root_;188 }189 190 191 /**192 * Returns the render window.193 * @return Render window.194 */195 RenderWindow* OgreControl::getRenderWindow(void)196 {197 return window_;198 }199 200 201 /**202 * Returns the resource path.203 * @return Resource path.204 */205 Ogre::String OgreControl::getResourcePath(void)206 {207 return resourcePath_;208 } -
code/branches/main_reto_vs05/src/orxonox.cc
r159 r161 32 32 */ 33 33 34 #include "OgreRoot.h" 35 #include "OgreTimer.h" 36 #include "OgreWindowEventUtilities.h" 34 37 38 #include "ogre_control.h" 39 #include "run_manager.h" 35 40 #include "orxonox.h" 36 41 37 42 38 /** 39 * Empty Constructor. 40 */ 41 Orxonox::Orxonox() 42 { 43 } 43 namespace Orxonox { 44 45 /** 46 * Empty Constructor. 47 */ 48 Orxonox::Orxonox() 49 { 50 } 44 51 45 52 46 /**47 * Empty Destructor.48 */49 Orxonox::~Orxonox()50 {51 }53 /** 54 * Empty Destructor. 55 */ 56 Orxonox::~Orxonox() 57 { 58 } 52 59 53 60 54 /**55 * Starts and runs the game56 */57 void Orxonox::go(void)58 {59 if (!setup())60 return;61 /** 62 * Starts and runs the game 63 */ 64 void Orxonox::go(void) 65 { 66 if (!setup()) 67 return; 61 68 62 timer_ = newTimer();69 timer_ = new Ogre::Timer(); 63 70 64 unsigned long lastTime = timer_->getMilliseconds();71 unsigned long lastTime = timer_->getMilliseconds(); 65 72 66 while (true)67 {68 //Pump messages in all registered RenderWindow windows69 73 while (true) 74 { 75 //Pump messages in all registered RenderWindow windows 76 Ogre::WindowEventUtilities::messagePump(); 70 77 71 ogre_->getRoot()->renderOneFrame();78 ogre_->getRoot()->renderOneFrame(); 72 79 73 if (!runMgr_->tick(timer_->getMilliseconds(),74 (timer_->getMilliseconds() - lastTime) / 1000.0))75 break;76 lastTime = timer_->getMilliseconds();77 }80 if (!runMgr_->tick(timer_->getMilliseconds(), 81 (timer_->getMilliseconds() - lastTime) / 1000.0)) 82 break; 83 lastTime = timer_->getMilliseconds(); 84 } 78 85 79 // clean up80 destroy();81 }86 // clean up 87 destroy(); 88 } 82 89 83 90 84 /**85 * Create render engine, render window and the Run manager.86 * @return False if failed.87 */88 bool Orxonox::setup(void)89 {90 // create new 3D ogre render engine91 ogre_ = new OgreControl();92 ogre_->initialise();91 /** 92 * Create render engine, render window and the Run manager. 93 * @return False if failed. 94 */ 95 bool Orxonox::setup(void) 96 { 97 // create new 3D ogre render engine 98 ogre_ = new OgreControl(); 99 ogre_->initialise(); 93 100 94 runMgr_ = new RunManager(ogre_);101 runMgr_ = new RunManager(ogre_); 95 102 96 return true;97 }103 return true; 104 } 98 105 99 106 100 /** 101 * Clean everything up. 102 */ 103 void Orxonox::destroy() 104 { 105 if (timer_) 106 delete timer_; 107 if (runMgr_) 108 delete runMgr_; 109 if (ogre_) 110 delete ogre_; 107 /** 108 * Clean everything up. 109 */ 110 void Orxonox::destroy() 111 { 112 if (timer_) 113 delete timer_; 114 if (runMgr_) 115 delete runMgr_; 116 if (ogre_) 117 delete ogre_; 118 } 119 111 120 } -
code/branches/main_reto_vs05/src/orxonox_scene.cc
r159 r161 26 26 */ 27 27 28 /** 29 * The orxonox scene includes everything running in the background like terrain, 30 * static figures, dangling lamp, etc. 31 */ 32 28 #include "OgreSceneManager.h" 29 #include "OgreSceneNode.h" 30 #include "OgreEntity.h" 31 #include "OgreLight.h" 32 #include "OgreBillboard.h" 33 #include "OgreBillboardSet.h" 34 #include "OgreVector3.h" 33 35 34 36 #include "orxonox_scene.h" 35 37 38 namespace Orxonox { 39 using namespace Ogre; 36 40 37 /** 38 * Empty Consructor except the initialiser list. 39 * @param sceneMgr The Scene Manager. 40 */ 41 OrxonoxScene::OrxonoxScene(SceneManager *sceneMgr) : sceneMgr_(sceneMgr) 42 { 43 } 44 45 /** 46 * Empty Destructor. 47 */ 48 OrxonoxScene::~OrxonoxScene() 49 { 50 } 51 52 /** 53 * Ogre initialisation method. 54 * This function is called by the Run Manager to load the neccessary recources 55 * and to create the scene. 56 * @return False if failed. 57 */ 58 bool OrxonoxScene::initialise() 59 { 60 // Load resources 61 loadResources(); 62 63 distance_ = 0; 64 radius_ = 100; 65 66 createScene(); 67 68 return true; 69 } 41 /** 42 * The orxonox scene includes everything running in the background like terrain, 43 * static figures, dangling lamp, etc. 44 */ 70 45 71 46 72 /** 73 * Resource loader. 74 * Currently, this method loads everything! TODO: If done this ugly, it should 75 * at least be in the Run Manager. 76 */ 77 void OrxonoxScene::loadResources() 78 { 79 // Initialise, parse scripts etc 80 ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 81 } 47 /** 48 * Empty Consructor except the initialiser list. 49 * @param sceneMgr The Scene Manager. 50 */ 51 OrxonoxScene::OrxonoxScene(SceneManager *sceneMgr) : sceneMgr_(sceneMgr) 52 { 53 } 54 55 /** 56 * Empty Destructor. 57 */ 58 OrxonoxScene::~OrxonoxScene() 59 { 60 } 61 62 /** 63 * Ogre initialisation method. 64 * This function is called by the Run Manager to load the neccessary recources 65 * and to create the scene. 66 * @return False if failed. 67 */ 68 bool OrxonoxScene::initialise() 69 { 70 // Load resources 71 loadResources(); 72 73 distance_ = 0; 74 radius_ = 100; 75 76 createScene(); 77 78 return true; 79 } 82 80 83 81 84 /** 85 * Scene creation. 86 * Currently just a test scene with an ogre head an a surrounding light. 87 */ 88 void OrxonoxScene::createScene() 89 { 90 sceneMgr_->setAmbientLight(ColourValue(0.3,0.3,0.3)); 91 92 //create first entity 93 Entity *head = sceneMgr_->createEntity("head", "ogrehead.mesh"); 94 95 //create a scene node to attach the head to 96 SceneNode *node = sceneMgr_->getRootSceneNode() 97 ->createChildSceneNode("OgreHeadNode", Vector3(0,0,0)); 98 //attach the ogre head 99 node->attachObject(head); 100 101 // set up skybox 102 sceneMgr_->setSkyBox(true, "Examples/SceneSkyBox2"); 103 104 // set up one light_ source 105 light_ = sceneMgr_->createLight("Light1"); 106 light_->setType(Light::LT_POINT); 107 light_->setPosition(Vector3(0, 0, 0)); 108 light_->setDiffuseColour(1.0, 1.0, 1.0); 109 light_->setSpecularColour(1.0, 1.0, 1.0); 110 111 //create billboard 112 bbs_ = sceneMgr_->createBillboardSet("bb", 1); 113 bbs_->createBillboard(Vector3::ZERO, ColourValue(1.0, 1.0, 1.0)); 114 bbs_->setMaterialName("Examples/Flare"); 115 116 lightNode_ = sceneMgr_->getRootSceneNode() 117 ->createChildSceneNode("lightNode_", Vector3(0, 100, 0)); 118 119 lightNode_->attachObject(bbs_); 120 lightNode_->attachObject(light_); 121 } 82 /** 83 * Resource loader. 84 * Currently, this method loads everything! TODO: If done this ugly, it should 85 * at least be in the Run Manager. 86 */ 87 void OrxonoxScene::loadResources() 88 { 89 // Initialise, parse scripts etc 90 ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 91 } 122 92 123 93 124 /** 125 * Compute something between frames if neccessary. 126 * @param time Absolute time. 127 * @param deltaTime Relative time. 128 * @return Return true to continue rendering. 129 */ 130 bool OrxonoxScene::tick(unsigned long time, Real deltaTime) 131 { 132 Real t = time/1000.0; 94 /** 95 * Scene creation. 96 * Currently just a test scene with an ogre head an a surrounding light. 97 */ 98 void OrxonoxScene::createScene() 99 { 100 sceneMgr_->setAmbientLight(ColourValue(0.3,0.3,0.3)); 133 101 134 lightNode_->setPosition(radius_*sin(5*t), radius_*cos(5*t), sin(1*t)*distance_); 135 136 light_->setDiffuseColour(sin(1*t), sin(1*t + 2.09), sin(1*t + 2.09*2)); 137 light_->setSpecularColour(sin(1*t), sin(1*t + 2.09), sin(1*t + 2.09*2)); 102 //create first entity 103 Entity *head = sceneMgr_->createEntity("head", "ogrehead.mesh"); 138 104 139 bbs_->getBillboard(0)->setColour(ColourValue(sin(1*t), 140 sin(1*t + 2.09), sin(1*t + 2.09*2))); 141 142 return true; 105 //create a scene node to attach the head to 106 SceneNode *node = sceneMgr_->getRootSceneNode() 107 ->createChildSceneNode("OgreHeadNode", Vector3(0,0,0)); 108 //attach the ogre head 109 node->attachObject(head); 110 111 // set up skybox 112 sceneMgr_->setSkyBox(true, "Examples/SceneSkyBox2"); 113 114 // set up one light_ source 115 light_ = sceneMgr_->createLight("Light1"); 116 light_->setType(Light::LT_POINT); 117 light_->setPosition(Vector3(0, 0, 0)); 118 light_->setDiffuseColour(1.0, 1.0, 1.0); 119 light_->setSpecularColour(1.0, 1.0, 1.0); 120 121 //create billboard 122 bbs_ = sceneMgr_->createBillboardSet("bb", 1); 123 bbs_->createBillboard(Vector3::ZERO, ColourValue(1.0, 1.0, 1.0)); 124 bbs_->setMaterialName("Examples/Flare"); 125 126 lightNode_ = sceneMgr_->getRootSceneNode() 127 ->createChildSceneNode("lightNode_", Vector3(0, 100, 0)); 128 129 lightNode_->attachObject(bbs_); 130 lightNode_->attachObject(light_); 131 } 132 133 134 /** 135 * Compute something between frames if neccessary. 136 * @param time Absolute time. 137 * @param deltaTime Relative time. 138 * @return Return true to continue rendering. 139 */ 140 bool OrxonoxScene::tick(unsigned long time, Real deltaTime) 141 { 142 Real t = time/1000.0; 143 144 lightNode_->setPosition(radius_*sin(5*t), radius_*cos(5*t), sin(1*t)*distance_); 145 146 light_->setDiffuseColour(sin(1*t), sin(1*t + 2.09), sin(1*t + 2.09*2)); 147 light_->setSpecularColour(sin(1*t), sin(1*t + 2.09), sin(1*t + 2.09*2)); 148 149 bbs_->getBillboard(0)->setColour(ColourValue(sin(1*t), 150 sin(1*t + 2.09), sin(1*t + 2.09*2))); 151 152 return true; 153 } 154 143 155 } -
code/branches/main_reto_vs05/src/orxonox_ship.cc
r159 r161 26 26 */ 27 27 28 /** 29 * Base class for any kind of flyable ship in Orxonox. 30 * 31 * The ship offers steering methods (like left, right, etc.) and translates 32 * them into movement. A ship can also hold more than one weapons (where each 33 * of these can be replaced during the game). This means that a ship can have 34 * many WeaponManagers but only one MunitionManager (independant object that 35 * is referenced in each WeaponManager). 36 * Furthermore a ship in Orxonox is responsible for its visualization, which is 37 * why it receives a pointer to the SceneManager. 38 */ 39 28 #include "OgreSceneManager.h" 29 #include "OgreSceneNode.h" 30 #include "OgreEntity.h" 31 #include "OgreVector3.h" 32 #include "OgreStringConverter.h" 33 34 #include "bullet.h" 40 35 41 36 #include "orxonox_ship.h" 42 37 43 44 /** 45 * Standard constructor, that only initalizes a few variables. Some of them 46 * could be made static, since any new ship would be derived from the BaseShip. 47 * Or even better: write config files for each ship so that manipulating 48 * its properties would be even easier. 49 * @param mSceneMgr The current main SceneManager 50 * @param mNode The scene node which the ship will be attached to later. 51 */ 52 OrxonoxShip::OrxonoxShip(SceneManager *sceneMgr, SceneNode *node) 53 : sceneMgr_(sceneMgr), rootNode_(node), currentSpeed_(Vector3(0, 0, 0)), 54 baseThrust_(1000), currentThrust_(Vector3::ZERO), 55 objectCounter_(0), bulletSpeed_(400) 56 { 38 namespace Orxonox { 39 using namespace Ogre; 40 41 /** 42 * Base class for any kind of flyable ship in Orxonox. 43 * 44 * The ship offers steering methods (like left, right, etc.) and translates 45 * them into movement. A ship can also hold more than one weapons (where each 46 * of these can be replaced during the game). This means that a ship can have 47 * many WeaponManagers but only one MunitionManager (independant object that 48 * is referenced in each WeaponManager). 49 * Furthermore a ship in Orxonox is responsible for its visualization, which is 50 * why it receives a pointer to the SceneManager. 51 */ 52 53 54 55 56 /** 57 * Standard constructor, that only initalizes a few variables. Some of them 58 * could be made static, since any new ship would be derived from the BaseShip. 59 * Or even better: write config files for each ship so that manipulating 60 * its properties would be even easier. 61 * @param mSceneMgr The current main SceneManager 62 * @param mNode The scene node which the ship will be attached to later. 63 */ 64 OrxonoxShip::OrxonoxShip(SceneManager *sceneMgr, SceneNode *node) 65 : sceneMgr_(sceneMgr), rootNode_(node), currentSpeed_(Vector3(0, 0, 0)), 66 baseThrust_(1000), currentThrust_(Vector3::ZERO), 67 objectCounter_(0), bulletSpeed_(400) 68 { 69 } 70 71 72 /** 73 * Standard destructor. 74 * Doesn't have any work to do yet. 75 */ 76 OrxonoxShip::~OrxonoxShip() 77 { 78 } 79 80 81 /** 82 * Initialises everything. 83 * Once that ResourceGroups are organised, this method loads them. 84 * It might be an idea to make this function static in order for the 85 * SceneManger to call the initialise method of every needed class (macros..) 86 * @return Returns false when failed. 87 */ 88 bool OrxonoxShip::initialise() 89 { 90 // load all the resources needed (no resource groups yet, 91 // so the allInit is not executed!) 92 // ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 93 94 // create the "space ship" (currently a fish..) 95 // TODO: names must be unique! use static variables.. 96 shipEntity_ = sceneMgr_->createEntity("Ship", "fish.mesh"); 97 SceneNode *fishNode = rootNode_->createChildSceneNode("fishNode"); 98 fishNode->yaw(Degree(-90)); 99 fishNode->attachObject(shipEntity_); 100 fishNode->setScale(Vector3(10, 10, 10)); 101 102 return true; 103 } 104 105 106 /** 107 * Gets the ship to accelerate in the current direction. 108 * The value should be between 0 and 1, with one beeing full thrust and 0 none. 109 * @param value Acceleration between 0 and 1 110 */ 111 void OrxonoxShip::setMainThrust(const Real value) 112 { 113 //currentThrust_ = value * baseThrust_; 114 currentThrust_.z = value * baseThrust_; 115 } 116 117 118 /** 119 * Gets the ship to accelerate sideways regarding the current direction. 120 * The value should be between 0 and 1, with one beeing full thrust and 0 none. 121 * @param value Acceleration between 0 and 1 122 */ 123 void OrxonoxShip::setSideThrust(const Real value) 124 { 125 //currentSideThrust_ = value * baseThrust_; 126 currentThrust_.x = value * baseThrust_; 127 } 128 129 130 /** 131 * Gets the ship to accelerate up and down. 132 * The value should be between 0 and 1, with one beeing full thrust and 0 none. 133 * @param value Acceleration between 0 and 1 134 */ 135 void OrxonoxShip::setYThrust(const Real value) 136 { 137 //currentYThrust_ = value * baseThrust_; 138 currentThrust_.y = value * baseThrust_; 139 } 140 141 142 /** 143 * Rotate the ship along with the camera up and down. 144 * @param angle Pitch value. 145 */ 146 void OrxonoxShip::turnUpAndDown(const Radian &angle) 147 { 148 rootNode_->pitch(-angle, Node::TS_LOCAL); 149 } 150 151 152 /** 153 * Rotate the ship along with the camera left and right. 154 * @param angle Yaw value. 155 */ 156 void OrxonoxShip::turnLeftAndRight(const Radian &angle) 157 { 158 rootNode_->yaw(-angle, Node::TS_PARENT); 159 } 160 161 162 /** 163 * Returns the current speed of the ship according to its parent node. 164 * @return The current speed. 165 */ 166 Vector3 OrxonoxShip::getSpeed() 167 { 168 return currentSpeed_; 169 } 170 171 /** 172 * Returns the ship's root SceneNode. 173 * @return The Root Node. 174 */ 175 SceneNode* OrxonoxShip::getRootNode() 176 { 177 return rootNode_; 178 } 179 180 181 /** 182 * Fire a bullet (Entity with SceneNode). 183 * This method creates a new Entity plus a SceneNode. But be sure not make 184 * the new Node a child of RootNode_! 185 * @return Bullet containing speed and entity. 186 */ 187 Bullet* OrxonoxShip::fire() 188 { 189 // TODO: Names must be unique! 190 SceneNode *temp = rootNode_->getParentSceneNode()->createChildSceneNode( 191 "BulletNode" + StringConverter::toString(objectCounter_)); 192 temp->setOrientation(rootNode_->getOrientation()); 193 temp->setPosition(rootNode_->getPosition()); 194 temp->setScale(Vector3(1, 1, 1) * 10); 195 temp->yaw(Degree(-90)); 196 return new Bullet(temp, sceneMgr_->createEntity("bullet" 197 + StringConverter::toString(objectCounter_++), "Barrel.mesh"), currentSpeed_ 198 + (rootNode_->getOrientation() * Vector3(0, 0, -1)).normalisedCopy() 199 * bulletSpeed_); 200 } 201 202 203 /** 204 * Standard tick() function. 205 * Currently, only the speed is applied according to the thrust values. 206 * @param time Absolute time. 207 * @param deltaTime Relative time. 208 * @return Return true to continue render 209 */ 210 bool OrxonoxShip::tick(unsigned long time, Real deltaTime) 211 { 212 Quaternion quad = rootNode_->getOrientation(); 213 quad.normalise(); 214 currentSpeed_ += quad * (Vector3(-1, -1, -1) * currentThrust_) * deltaTime; 215 //currentSpeed_ += quad * Vector3(0, 0, -1) * currentThrust_ * deltaTime; 216 //currentSpeed_ += quad * Vector3(-1, 0, 0) * currentSideThrust_ * deltaTime; 217 218 rootNode_->translate(currentSpeed_ * deltaTime); 219 220 return true; 221 } 222 57 223 } 58 59 60 /**61 * Standard destructor.62 * Doesn't have any work to do yet.63 */64 OrxonoxShip::~OrxonoxShip()65 {66 }67 68 69 /**70 * Initialises everything.71 * Once that ResourceGroups are organised, this method loads them.72 * It might be an idea to make this function static in order for the73 * SceneManger to call the initialise method of every needed class (macros..)74 * @return Returns false when failed.75 */76 bool OrxonoxShip::initialise()77 {78 // load all the resources needed (no resource groups yet,79 // so the allInit is not executed!)80 // ResourceGroupManager::getSingleton().initialiseAllResourceGroups();81 82 // create the "space ship" (currently a fish..)83 // TODO: names must be unique! use static variables..84 shipEntity_ = sceneMgr_->createEntity("Ship", "fish.mesh");85 SceneNode *fishNode = rootNode_->createChildSceneNode("fishNode");86 fishNode->yaw(Degree(-90));87 fishNode->attachObject(shipEntity_);88 fishNode->setScale(Vector3(10, 10, 10));89 90 return true;91 }92 93 94 /**95 * Gets the ship to accelerate in the current direction.96 * The value should be between 0 and 1, with one beeing full thrust and 0 none.97 * @param value Acceleration between 0 and 198 */99 void OrxonoxShip::setMainThrust(const Real value)100 {101 //currentThrust_ = value * baseThrust_;102 currentThrust_.z = value * baseThrust_;103 }104 105 106 /**107 * Gets the ship to accelerate sideways regarding the current direction.108 * The value should be between 0 and 1, with one beeing full thrust and 0 none.109 * @param value Acceleration between 0 and 1110 */111 void OrxonoxShip::setSideThrust(const Real value)112 {113 //currentSideThrust_ = value * baseThrust_;114 currentThrust_.x = value * baseThrust_;115 }116 117 118 /**119 * Gets the ship to accelerate up and down.120 * The value should be between 0 and 1, with one beeing full thrust and 0 none.121 * @param value Acceleration between 0 and 1122 */123 void OrxonoxShip::setYThrust(const Real value)124 {125 //currentYThrust_ = value * baseThrust_;126 currentThrust_.y = value * baseThrust_;127 }128 129 130 /**131 * Rotate the ship along with the camera up and down.132 * @param angle Pitch value.133 */134 void OrxonoxShip::turnUpAndDown(const Radian &angle)135 {136 rootNode_->pitch(-angle, Node::TS_LOCAL);137 }138 139 140 /**141 * Rotate the ship along with the camera left and right.142 * @param angle Yaw value.143 */144 void OrxonoxShip::turnLeftAndRight(const Radian &angle)145 {146 rootNode_->yaw(-angle, Node::TS_PARENT);147 }148 149 150 /**151 * Returns the current speed of the ship according to its parent node.152 * @return The current speed.153 */154 Vector3 OrxonoxShip::getSpeed()155 {156 return currentSpeed_;157 }158 159 /**160 * Returns the ship's root SceneNode.161 * @return The Root Node.162 */163 SceneNode* OrxonoxShip::getRootNode()164 {165 return rootNode_;166 }167 168 169 /**170 * Fire a bullet (Entity with SceneNode).171 * This method creates a new Entity plus a SceneNode. But be sure not make172 * the new Node a child of RootNode_!173 * @return Bullet containing speed and entity.174 */175 Bullet* OrxonoxShip::fire()176 {177 // TODO: Names must be unique!178 SceneNode *temp = rootNode_->getParentSceneNode()->createChildSceneNode(179 "BulletNode" + StringConverter::toString(objectCounter_));180 temp->setOrientation(rootNode_->getOrientation());181 temp->setPosition(rootNode_->getPosition());182 temp->setScale(Vector3(1, 1, 1) * 10);183 temp->yaw(Degree(-90));184 return new Bullet(temp, sceneMgr_->createEntity("bullet"185 + StringConverter::toString(objectCounter_++), "Barrel.mesh"), currentSpeed_186 + (rootNode_->getOrientation() * Vector3(0, 0, -1)).normalisedCopy()187 * bulletSpeed_);188 }189 190 191 /**192 * Standard tick() function.193 * Currently, only the speed is applied according to the thrust values.194 * @param time Absolute time.195 * @param deltaTime Relative time.196 * @return Return true to continue render197 */198 bool OrxonoxShip::tick(unsigned long time, Real deltaTime)199 {200 Quaternion quad = rootNode_->getOrientation();201 quad.normalise();202 currentSpeed_ += quad * (Vector3(-1, -1, -1) * currentThrust_) * deltaTime;203 //currentSpeed_ += quad * Vector3(0, 0, -1) * currentThrust_ * deltaTime;204 //currentSpeed_ += quad * Vector3(-1, 0, 0) * currentSideThrust_ * deltaTime;205 206 rootNode_->translate(currentSpeed_ * deltaTime);207 208 return true;209 } -
code/branches/main_reto_vs05/src/run_manager.cc
r160 r161 39 39 */ 40 40 41 #include "Ogre.h" 42 //#include "OgreRoot.h" 43 //#include "OgreSceneManager.h" 44 //#include "OgreSceneNode.h" 45 //#include "OgreCamera.h" 46 //#include "OgreViewport.h" 47 //#include "OgreRenderWindow.h" 48 //#include "OgreOverlay.h" 49 //#include "OgreOverlayManager.h" 50 //#include "OgreOverlayElement.h" 51 //#include "OgreTextureManager.h" 52 //#include "OgreMaterialManager.h" 53 //#include "OgreLogManager.h" 54 //#include "OgreVector3.h" 55 //#include "OgreStringConverter.h" 56 //#include "OgreWindowEventUtilities.h" 57 58 //Use this define to signify OIS will be used as a DLL 59 //(so that dll import/export macros are in effect) 60 #define OIS_DYNAMIC_LIB 61 #include <OIS/OIS.h> 62 63 #include "ogre_control.h" 64 #include "orxonox_scene.h" 65 #include "orxonox_ship.h" 66 #include "bullet.h" 67 #include "camera_manager.h" 68 41 69 #include "run_manager.h" 42 70 43 44 /** 45 * Contructor only needs the render window and the Root object which are both 46 * the OgreControl object. 47 * Right now the constructor does all the initialisation work. This could also 48 * be done in a new method "initialize()", for whatever purpose. 49 * 50 * 51 * @param ogre_ The OgreControl object holding the render window and the Root 52 */ 53 RunManager::RunManager(OgreControl * ogre) 54 : ogre_(ogre), window_(ogre->getRenderWindow()), leftButtonDown_(false), 55 statsOn_(true), screenShotCounter_(0), timeUntilNextToggle_(0), 56 filtering_(TFO_BILINEAR), aniso_(1), sceneDetailIndex_(0), 57 mouseSensitivity_(0.003), 58 debugOverlay_(0), inputManager_(0), mouse_(0), keyboard_(0), joystick_(0) 59 { 60 61 // SETTING UP THE SCENE 62 63 // create one new SceneManger 64 sceneMgr_ = ogre_->getRoot()->createSceneManager(ST_GENERIC, "backgroundScene_"); 65 66 // background scene (world objects, skybox, lights, etc.) 67 backgroundScene_ = new OrxonoxScene(sceneMgr_); 68 69 // PLAYER SPACESHIP 70 71 // Create a space ship object and its SceneNode. 72 // Some ideas about the steering: The ship should only receive events like 73 // up, down, left, right, roll left, roll right, move down, move up, etc). 74 // Multiple interpretations of these commands would make the game more 75 // but it also makes AI steering more difficult, since for every type of 76 // steering, new methods have to be written. 77 // --> clearly define how a space ship can fly (rolling?, conservation of 78 // impuls?, direct mouse sight steeering?, etc.) 79 // It should also be considered, that the ship should provide another Node 80 // for a camera to be attached (otherwise the spaceship in front of the 81 // would be very static, never moving at all). 82 83 // Construct a new spaceship and give it the node 84 playerShip_ = new OrxonoxShip(sceneMgr_, sceneMgr_->getRootSceneNode() 85 ->createChildSceneNode("ShipNode", Vector3(20, 20, 20))); 86 87 88 // RESOURCE LOADING (using ResourceGroups if implemented) 89 90 // load all resources and create the entities by calling the initialise() 91 // methods for each object (don't initialise in the constructor!). 92 backgroundScene_->initialise(); 93 playerShip_->initialise(); 94 95 96 // CAMERA AND VIEWPORT 97 // TODO: create a camera manager. It should be able to change its position 98 // around the space ship (predefined states would be nice too). And it should 99 // also be able to switch between different locations (like ship, spactator, 100 // certain fixed positions (e.g. finish line, etc.)). These are just ideas. 101 102 // create camera and viewport 103 createCamera(); 104 createViewports(); 105 106 107 // Set default mipmap level (NB some APIs ignore this) 108 TextureManager::getSingleton().setDefaultNumMipmaps(5); 109 110 111 // BULLET LIST FOR THE TEST APPLICATION 112 113 // TODO: Use STL to make life easier. But it works this way too.. 114 bullets_ = new Bullet*[10]; 115 bulletsIndex_ = 0; 116 bulletsSize_ = 10; 117 118 119 // HUMAN INTERFACE 120 121 using namespace OIS; 122 123 debugOverlay_ = OverlayManager::getSingleton() 124 .getByName("Core/DebugOverlay"); 125 126 LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***"); 127 ParamList pl; 128 size_t windowHnd = 0; 129 std::ostringstream windowHndStr; 130 131 window_->getCustomAttribute("WINDOW", &windowHnd); 132 windowHndStr << windowHnd; 133 pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 134 135 inputManager_ = InputManager::createInputSystem( pl ); 136 137 // Create all devices (We only catch joystick exceptions here, 138 // as, most people have Key/Mouse) 139 keyboard_ = static_cast<Keyboard*>(inputManager_ 140 ->createInputObject( OISKeyboard, false )); 141 mouse_ = static_cast<Mouse*>(inputManager_ 142 ->createInputObject( OISMouse, false )); 143 try { 144 joystick_ = static_cast<JoyStick*>(inputManager_ 145 ->createInputObject( OISJoyStick, false )); 146 } 147 catch(...) { 148 joystick_ = 0; 149 } 150 151 //Set initial mouse clipping size 152 windowResized(window_); 153 154 showDebugOverlay(true); 155 156 // REGISTER THIS OBJECT AS A WINDOW EVENT LISTENER IN OGRE 157 // It will then receive events liek windowClosed, windowResized, etc. 158 WindowEventUtilities::addWindowEventListener(window_, this); 71 namespace Orxonox { 72 using namespace Ogre; 73 74 /** 75 * Contructor only needs the render window and the Root object which are both 76 * the OgreControl object. 77 * Right now the constructor does all the initialisation work. This could also 78 * be done in a new method "initialize()", for whatever purpose. 79 * 80 * 81 * @param ogre_ The OgreControl object holding the render window and the Root 82 */ 83 RunManager::RunManager(OgreControl * ogre) 84 : ogre_(ogre), window_(ogre->getRenderWindow()), leftButtonDown_(false), 85 statsOn_(true), screenShotCounter_(0), timeUntilNextToggle_(0), 86 filtering_(TFO_BILINEAR), aniso_(1), sceneDetailIndex_(0), 87 mouseSensitivity_(0.003), 88 debugOverlay_(0), inputManager_(0), mouse_(0), keyboard_(0), joystick_(0) 89 { 90 91 // SETTING UP THE SCENE 92 93 // create one new SceneManger 94 sceneMgr_ = ogre_->getRoot()->createSceneManager(ST_GENERIC, "backgroundScene_"); 95 96 // background scene (world objects, skybox, lights, etc.) 97 backgroundScene_ = new OrxonoxScene(sceneMgr_); 98 99 // PLAYER SPACESHIP 100 101 // Create a space ship object and its SceneNode. 102 // Some ideas about the steering: The ship should only receive events like 103 // up, down, left, right, roll left, roll right, move down, move up, etc). 104 // Multiple interpretations of these commands would make the game more 105 // but it also makes AI steering more difficult, since for every type of 106 // steering, new methods have to be written. 107 // --> clearly define how a space ship can fly (rolling?, conservation of 108 // impuls?, direct mouse sight steeering?, etc.) 109 // It should also be considered, that the ship should provide another Node 110 // for a camera to be attached (otherwise the spaceship in front of the 111 // would be very static, never moving at all). 112 113 // Construct a new spaceship and give it the node 114 playerShip_ = new OrxonoxShip(sceneMgr_, sceneMgr_->getRootSceneNode() 115 ->createChildSceneNode("ShipNode", Vector3(20, 20, 20))); 116 117 118 // RESOURCE LOADING (using ResourceGroups if implemented) 119 120 // load all resources and create the entities by calling the initialise() 121 // methods for each object (don't initialise in the constructor!). 122 backgroundScene_->initialise(); 123 playerShip_->initialise(); 124 125 126 // CAMERA AND VIEWPORT 127 // TODO: create a camera manager. It should be able to change its position 128 // around the space ship (predefined states would be nice too). And it should 129 // also be able to switch between different locations (like ship, spactator, 130 // certain fixed positions (e.g. finish line, etc.)). These are just ideas. 131 132 // create camera and viewport 133 createCamera(); 134 createViewports(); 135 136 137 // Set default mipmap level (NB some APIs ignore this) 138 TextureManager::getSingleton().setDefaultNumMipmaps(5); 139 140 141 // BULLET LIST FOR THE TEST APPLICATION 142 143 // TODO: Use STL to make life easier. But it works this way too.. 144 bullets_ = new Bullet*[10]; 145 bulletsIndex_ = 0; 146 bulletsSize_ = 10; 147 148 149 // HUMAN INTERFACE 150 151 using namespace OIS; 152 153 debugOverlay_ = OverlayManager::getSingleton() 154 .getByName("Core/DebugOverlay"); 155 156 LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***"); 157 ParamList pl; 158 size_t windowHnd = 0; 159 std::ostringstream windowHndStr; 160 161 window_->getCustomAttribute("WINDOW", &windowHnd); 162 windowHndStr << windowHnd; 163 pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 164 165 inputManager_ = InputManager::createInputSystem( pl ); 166 167 // Create all devices (We only catch joystick exceptions here, 168 // as, most people have Key/Mouse) 169 keyboard_ = static_cast<Keyboard*>(inputManager_ 170 ->createInputObject( OISKeyboard, false )); 171 mouse_ = static_cast<Mouse*>(inputManager_ 172 ->createInputObject( OISMouse, false )); 173 try { 174 joystick_ = static_cast<JoyStick*>(inputManager_ 175 ->createInputObject( OISJoyStick, false )); 176 } 177 catch(...) { 178 joystick_ = 0; 179 } 180 181 //Set initial mouse clipping size 182 windowResized(window_); 183 184 showDebugOverlay(true); 185 186 // REGISTER THIS OBJECT AS A WINDOW EVENT LISTENER IN OGRE 187 // It will then receive events liek windowClosed, windowResized, etc. 188 WindowEventUtilities::addWindowEventListener(window_, this); 189 } 190 191 /** 192 * Standard destructor. 193 * Removes this object as a window event listener and deletes all created 194 * variables. 195 */ 196 RunManager::~RunManager() 197 { 198 //Remove ourself as a Window listener 199 WindowEventUtilities::removeWindowEventListener(window_, this); 200 windowClosed(window_); 201 202 if (backgroundScene_) 203 delete backgroundScene_; 204 if (playerShip_) 205 delete playerShip_; 206 207 // clean up the bullet list 208 for (int i = 0; i < bulletsIndex_; i++) 209 delete bullets_[i]; 210 delete bullets_; 211 } 212 213 214 /** 215 * Method to compute anyting between 2 frames. 216 * 217 * Everything that needs to be computed during the games happens right here. 218 * The only exception are the listeners (which should only set variables, 219 * not actually do something). 220 * 221 * @param time Absolute play time 222 * @param deltaTime Time passed since last frame 223 * @return Return false to end rendering 224 */ 225 bool RunManager::tick(unsigned long time, float deltaTime) 226 { 227 // synchronize with internal class timer 228 totalTime_ = time; 229 230 // Call tick() for every object 231 // This could be done by registering (needs a factory..) 232 backgroundScene_->tick(time, deltaTime); 233 playerShip_->tick(time, deltaTime); 234 235 236 // Update the 'HUD' 237 updateStats(); 238 239 // update the bullet positions 240 for (int i = 0; i < bulletsIndex_; i++) 241 { 242 bullets_[i]->mNode->translate(bullets_[i]->mSpeed*deltaTime); 243 bullets_[i]->mNode->yaw(Degree(deltaTime*100)); 244 bullets_[i]->mNode->roll(Degree(deltaTime*300)); 245 } 246 247 // HUMAN INTERFACE 248 249 using namespace OIS; 250 251 if(window_->isClosed()) return false; 252 253 //Need to capture/update each device 254 keyboard_->capture(); 255 mouse_->capture(); 256 if( joystick_ ) joystick_->capture(); 257 258 bool buffJ = (joystick_) ? joystick_->buffered() : true; 259 260 //Check if one of the devices is not buffered 261 if( !mouse_->buffered() || !keyboard_->buffered() || !buffJ ) 262 { 263 // one of the input modes is immediate, so setup what 264 // is needed for immediate movement 265 if (timeUntilNextToggle_ >= 0) 266 timeUntilNextToggle_ -= deltaTime; 267 } 268 269 // handle HID devices 270 if( processUnbufferedKeyInput() == false ) 271 return false; 272 if( processUnbufferedMouseInput() == false ) 273 return false; 274 275 // keep rendering 276 return true; 277 } 278 279 280 /** 281 * Adjust mouse clipping area. 282 * This method is called by Ogre without regards of tick()! 283 * Avoid doing too much in this call. 284 * @param rw render window 285 */ 286 void RunManager::windowResized(RenderWindow* rw) 287 { 288 unsigned int width, height, depth; 289 int left, top; 290 rw->getMetrics(width, height, depth, left, top); 291 292 const OIS::MouseState &ms = mouse_->getMouseState(); 293 ms.width = width; 294 ms.height = height; 295 } 296 297 298 /** 299 * Unattach OIS before window shutdown (very important under Linux). 300 * Again, avoid computing a lot in this function. 301 * @param rw Render Window 302 */ 303 void RunManager::windowClosed(RenderWindow* rw) 304 { 305 //Only close for window that created OIS (the main window in these demos) 306 if( rw == window_ ) 307 { 308 if( inputManager_ ) 309 { 310 inputManager_->destroyInputObject( mouse_ ); 311 inputManager_->destroyInputObject( keyboard_ ); 312 inputManager_->destroyInputObject( joystick_ ); 313 314 OIS::InputManager::destroyInputSystem(inputManager_); 315 inputManager_ = 0; 316 } 317 } 318 } 319 320 /** 321 * Processes the Keyboard input. 322 * TODO: Use listeners to improve performance. 323 * A lookup table should be implemented to bind any key to a specific action. 324 * @return Return true to keep rendering 325 */ 326 bool RunManager::processUnbufferedKeyInput() 327 { 328 using namespace OIS; 329 330 if(keyboard_->isKeyDown(KC_A) || keyboard_->isKeyDown(KC_LEFT)) 331 playerShip_->setSideThrust(1); 332 else if(keyboard_->isKeyDown(KC_D) || keyboard_->isKeyDown(KC_RIGHT)) 333 playerShip_->setSideThrust(-1); 334 else 335 playerShip_->setSideThrust(0); 336 337 if(keyboard_->isKeyDown(KC_UP) || keyboard_->isKeyDown(KC_W) ) 338 playerShip_->setMainThrust(1); 339 else if(keyboard_->isKeyDown(KC_DOWN) || keyboard_->isKeyDown(KC_S) ) 340 playerShip_->setMainThrust(-1); 341 else 342 playerShip_->setMainThrust(0); 343 344 if (keyboard_->isKeyDown(KC_C)) 345 playerShip_->setYThrust(1); 346 else if (keyboard_->isKeyDown(KC_SPACE)) 347 playerShip_->setYThrust(-1); 348 else 349 playerShip_->setYThrust(0); 350 351 if( keyboard_->isKeyDown(KC_ESCAPE) || keyboard_->isKeyDown(KC_Q) ) 352 return false; 353 354 if( keyboard_->isKeyDown(KC_F) && timeUntilNextToggle_ <= 0 ) 355 { 356 statsOn_ = !statsOn_; 357 showDebugOverlay(statsOn_); 358 timeUntilNextToggle_ = 1; 359 } 360 361 if( keyboard_->isKeyDown(KC_T) && timeUntilNextToggle_ <= 0 ) 362 { 363 switch(filtering_) 364 { 365 case TFO_BILINEAR: 366 filtering_ = TFO_TRILINEAR; 367 aniso_ = 1; 368 break; 369 case TFO_TRILINEAR: 370 filtering_ = TFO_ANISOTROPIC; 371 aniso_ = 8; 372 break; 373 case TFO_ANISOTROPIC: 374 filtering_ = TFO_BILINEAR; 375 aniso_ = 1; 376 break; 377 default: break; 378 } 379 MaterialManager::getSingleton().setDefaultTextureFiltering(filtering_); 380 MaterialManager::getSingleton().setDefaultAnisotropy(aniso_); 381 382 showDebugOverlay(statsOn_); 383 timeUntilNextToggle_ = 1; 384 } 385 386 if(keyboard_->isKeyDown(KC_SYSRQ) && timeUntilNextToggle_ <= 0) 387 { 388 std::ostringstream ss; 389 ss << "screenshot_" << ++screenShotCounter_ << ".png"; 390 window_->writeContentsToFile(ss.str()); 391 timeUntilNextToggle_ = 0.5; 392 debugText_ = "Saved: " + ss.str(); 393 } 394 395 if(keyboard_->isKeyDown(KC_R) && timeUntilNextToggle_ <=0) 396 { 397 sceneDetailIndex_ = (sceneDetailIndex_+1)%3 ; 398 switch(sceneDetailIndex_) { 399 case 0 : camera_->setPolygonMode(PM_SOLID); break; 400 case 1 : camera_->setPolygonMode(PM_WIREFRAME); break; 401 case 2 : camera_->setPolygonMode(PM_POINTS); break; 402 } 403 timeUntilNextToggle_ = 0.5; 404 } 405 406 static bool displayCameraDetails = false; 407 if(keyboard_->isKeyDown(KC_P) && timeUntilNextToggle_ <= 0) 408 { 409 displayCameraDetails = !displayCameraDetails; 410 timeUntilNextToggle_ = 0.5; 411 if (!displayCameraDetails) 412 debugText_ = ""; 413 } 414 415 // Print camera details 416 if(displayCameraDetails) 417 debugText_ = " | Speed = " 418 + StringConverter::toString(playerShip_->getSpeed()); 419 // debugText_ = "P: " + StringConverter::toString(camera_ 420 // ->getDerivedPosition()) + " " + "O: " 421 // + StringConverter::toString(camera_->getDerivedOrientation()); 422 423 // Return true to continue rendering 424 return true; 425 } 426 427 428 /** 429 * Processes the Mouse input. 430 * TODO: Use listeners to improve performance. 431 * A lookup table should be implemented to bind ANY button or movement 432 * to a specific action. 433 * @return Return true to keep rendering 434 */ 435 bool RunManager::processUnbufferedMouseInput() 436 { 437 using namespace OIS; 438 439 const MouseState &ms = mouse_->getMouseState(); 440 441 // This is a 'hack' to show some flying barrels.. 442 // Usually, the Bullet created by the ship should be managed 443 // by the physics engine.. 444 if (ms.buttonDown(MB_Left) && !leftButtonDown_) 445 { 446 // Prevent continuous fire for the moment. 447 leftButtonDown_ = true; 448 449 // let ship fire one shot with its only weapon (Barrels..) 450 Bullet *tempBullet = playerShip_->fire(); 451 452 // resize array if neccessary (double the size then) 453 if (bulletsIndex_ >= bulletsSize_) 454 { 455 // redimension the array 456 Bullet **tempArray = new Bullet*[2*bulletsSize_]; 457 for (int i = 0; i < bulletsSize_; i++) 458 tempArray[i] = bullets_[i]; 459 bulletsSize_ *= 2; 460 delete bullets_; 461 bullets_ = tempArray; 462 } 463 464 // add the bullet to the list 465 bullets_[bulletsIndex_++] = tempBullet; 466 467 } 468 else if (!ms.buttons) 469 leftButtonDown_ = false; 470 471 // space ship steering. This should definitely be done in the steering object 472 // Simply give it the mouse movements. 473 playerShip_->turnUpAndDown(Radian(ms.Y.rel * mouseSensitivity_)); 474 playerShip_->turnLeftAndRight(Radian(ms.X.rel * mouseSensitivity_)); 475 //playerShip_->mRootNode->pitch(Degree(-ms.Y.rel * 0.13), Ogre::Node::TransformSpace::TS_LOCAL); 476 //playerShip_->mRootNode->yaw(Degree(-ms.X.rel * 0.13), Ogre::Node::TransformSpace::TS_PARENT); 477 478 // keep rendering 479 return true; 480 } 481 482 /** 483 * Show the debug overlay of desired. 484 * @param show Whether or not to show the debug overlay 485 */ 486 void RunManager::showDebugOverlay(bool show) 487 { 488 if (debugOverlay_) 489 { 490 if (show) 491 debugOverlay_->show(); 492 else 493 debugOverlay_->hide(); 494 } 495 } 496 497 498 /** 499 * Show stats (e.g. FPS) in the left lower corner of the screen. 500 * Copied from the ExampleFrameListener.h in the Ogre SDK 501 */ 502 void RunManager::updateStats(void) 503 { 504 static String currFps = "Current FPS: "; 505 static String avgFps = "Average FPS: "; 506 static String bestFps = "Best FPS: "; 507 static String worstFps = "Worst FPS: "; 508 static String tris = "Triangle Count: "; 509 static String batches = "Batch Count: "; 510 511 // update stats when necessary 512 try { 513 OverlayElement* guiAvg = OverlayManager::getSingleton() 514 .getOverlayElement("Core/AverageFps"); 515 OverlayElement* guiCurr = OverlayManager::getSingleton() 516 .getOverlayElement("Core/CurrFps"); 517 OverlayElement* guiBest = OverlayManager::getSingleton() 518 .getOverlayElement("Core/BestFps"); 519 OverlayElement* guiWorst = OverlayManager::getSingleton() 520 .getOverlayElement("Core/WorstFps"); 521 522 const RenderTarget::FrameStats& stats = window_->getStatistics(); 523 guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS)); 524 guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS)); 525 guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS) 526 +" "+StringConverter::toString(stats.bestFrameTime)+" ms"); 527 guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS) 528 +" "+StringConverter::toString(stats.worstFrameTime)+" ms"); 529 530 OverlayElement* guiTris = OverlayManager::getSingleton() 531 .getOverlayElement("Core/NumTris"); 532 guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount)); 533 534 OverlayElement* guiBatches = OverlayManager::getSingleton() 535 .getOverlayElement("Core/NumBatches"); 536 guiBatches->setCaption(batches 537 + StringConverter::toString(stats.batchCount)); 538 539 OverlayElement* guiDbg = OverlayManager::getSingleton() 540 .getOverlayElement("Core/DebugText"); 541 guiDbg->setCaption(debugText_); 542 } 543 catch(...) { /* ignore */ } 544 } 545 546 547 548 /** 549 * Simple camera creator. 550 * playerShip_Node->attachObject(camera_) should no be here! This is what the camera 551 * manager is for. Right now, this method should do just fine, setting the 552 * cam behind the ship. 553 */ 554 void RunManager::createCamera(void) 555 { 556 camera_ = sceneMgr_->createCamera("PlayerCam"); 557 playerShip_->getRootNode()->attachObject(camera_); 558 camera_->setNearClipDistance(5); 559 camera_->setPosition(Vector3(0,10,500)); 560 camera_->lookAt(Vector3(0,0,0)); 561 } 562 563 /** 564 * Simple viewport creator. 565 * TODO: fully understand the concept of viewports concerning orxnox. 566 * E.g. do we need splitscreen mode? 567 * For now the viewport uses the entire render window and is based on the one 568 * camera created so far. 569 */ 570 void RunManager::createViewports(void) 571 { 572 // Create one viewport, entire window 573 Viewport* vp = window_->addViewport(camera_); 574 vp->setBackgroundColour(ColourValue(0,0,0)); 575 576 // Alter the camera aspect ratio to match the viewport 577 camera_->setAspectRatio( 578 Real(vp->getActualWidth()) / Real(vp->getActualHeight())); 579 } 580 159 581 } 160 161 /**162 * Standard destructor.163 * Removes this object as a window event listener and deletes all created164 * variables.165 */166 RunManager::~RunManager()167 {168 //Remove ourself as a Window listener169 WindowEventUtilities::removeWindowEventListener(window_, this);170 windowClosed(window_);171 172 if (backgroundScene_)173 delete backgroundScene_;174 if (playerShip_)175 delete playerShip_;176 177 // clean up the bullet list178 for (int i = 0; i < bulletsIndex_; i++)179 delete bullets_[i];180 delete bullets_;181 }182 183 184 /**185 * Method to compute anyting between 2 frames.186 *187 * Everything that needs to be computed during the games happens right here.188 * The only exception are the listeners (which should only set variables,189 * not actually do something).190 *191 * @param time Absolute play time192 * @param deltaTime Time passed since last frame193 * @return Return false to end rendering194 */195 bool RunManager::tick(unsigned long time, float deltaTime)196 {197 // synchronize with internal class timer198 totalTime_ = time;199 200 // Call tick() for every object201 // This could be done by registering (needs a factory..)202 backgroundScene_->tick(time, deltaTime);203 playerShip_->tick(time, deltaTime);204 205 206 // Update the 'HUD'207 updateStats();208 209 // update the bullet positions210 for (int i = 0; i < bulletsIndex_; i++)211 {212 bullets_[i]->mNode->translate(bullets_[i]->mSpeed*deltaTime);213 bullets_[i]->mNode->yaw(Degree(deltaTime*100));214 bullets_[i]->mNode->roll(Degree(deltaTime*300));215 }216 217 // HUMAN INTERFACE218 219 using namespace OIS;220 221 if(window_->isClosed()) return false;222 223 //Need to capture/update each device224 keyboard_->capture();225 mouse_->capture();226 if( joystick_ ) joystick_->capture();227 228 bool buffJ = (joystick_) ? joystick_->buffered() : true;229 230 //Check if one of the devices is not buffered231 if( !mouse_->buffered() || !keyboard_->buffered() || !buffJ )232 {233 // one of the input modes is immediate, so setup what234 // is needed for immediate movement235 if (timeUntilNextToggle_ >= 0)236 timeUntilNextToggle_ -= deltaTime;237 }238 239 // handle HID devices240 if( processUnbufferedKeyInput() == false )241 return false;242 if( processUnbufferedMouseInput() == false )243 return false;244 245 // keep rendering246 return true;247 }248 249 250 /**251 * Adjust mouse clipping area.252 * This method is called by Ogre without regards of tick()!253 * Avoid doing too much in this call.254 * @param rw render window255 */256 void RunManager::windowResized(RenderWindow* rw)257 {258 unsigned int width, height, depth;259 int left, top;260 rw->getMetrics(width, height, depth, left, top);261 262 const OIS::MouseState &ms = mouse_->getMouseState();263 ms.width = width;264 ms.height = height;265 }266 267 268 /**269 * Unattach OIS before window shutdown (very important under Linux).270 * Again, avoid computing a lot in this function.271 * @param rw Render Window272 */273 void RunManager::windowClosed(RenderWindow* rw)274 {275 //Only close for window that created OIS (the main window in these demos)276 if( rw == window_ )277 {278 if( inputManager_ )279 {280 inputManager_->destroyInputObject( mouse_ );281 inputManager_->destroyInputObject( keyboard_ );282 inputManager_->destroyInputObject( joystick_ );283 284 OIS::InputManager::destroyInputSystem(inputManager_);285 inputManager_ = 0;286 }287 }288 }289 290 /**291 * Processes the Keyboard input.292 * TODO: Use listeners to improve performance.293 * A lookup table should be implemented to bind any key to a specific action.294 * @return Return true to keep rendering295 */296 bool RunManager::processUnbufferedKeyInput()297 {298 using namespace OIS;299 300 if(keyboard_->isKeyDown(KC_A) || keyboard_->isKeyDown(KC_LEFT))301 playerShip_->setSideThrust(1);302 else if(keyboard_->isKeyDown(KC_D) || keyboard_->isKeyDown(KC_RIGHT))303 playerShip_->setSideThrust(-1);304 else305 playerShip_->setSideThrust(0);306 307 if(keyboard_->isKeyDown(KC_UP) || keyboard_->isKeyDown(KC_W) )308 playerShip_->setMainThrust(1);309 else if(keyboard_->isKeyDown(KC_DOWN) || keyboard_->isKeyDown(KC_S) )310 playerShip_->setMainThrust(-1);311 else312 playerShip_->setMainThrust(0);313 314 if (keyboard_->isKeyDown(KC_C))315 playerShip_->setYThrust(1);316 else if (keyboard_->isKeyDown(KC_SPACE))317 playerShip_->setYThrust(-1);318 else319 playerShip_->setYThrust(0);320 321 if( keyboard_->isKeyDown(KC_ESCAPE) || keyboard_->isKeyDown(KC_Q) )322 return false;323 324 if( keyboard_->isKeyDown(KC_F) && timeUntilNextToggle_ <= 0 )325 {326 statsOn_ = !statsOn_;327 showDebugOverlay(statsOn_);328 timeUntilNextToggle_ = 1;329 }330 331 if( keyboard_->isKeyDown(KC_T) && timeUntilNextToggle_ <= 0 )332 {333 switch(filtering_)334 {335 case TFO_BILINEAR:336 filtering_ = TFO_TRILINEAR;337 aniso_ = 1;338 break;339 case TFO_TRILINEAR:340 filtering_ = TFO_ANISOTROPIC;341 aniso_ = 8;342 break;343 case TFO_ANISOTROPIC:344 filtering_ = TFO_BILINEAR;345 aniso_ = 1;346 break;347 default: break;348 }349 MaterialManager::getSingleton().setDefaultTextureFiltering(filtering_);350 MaterialManager::getSingleton().setDefaultAnisotropy(aniso_);351 352 showDebugOverlay(statsOn_);353 timeUntilNextToggle_ = 1;354 }355 356 if(keyboard_->isKeyDown(KC_SYSRQ) && timeUntilNextToggle_ <= 0)357 {358 std::ostringstream ss;359 ss << "screenshot_" << ++screenShotCounter_ << ".png";360 window_->writeContentsToFile(ss.str());361 timeUntilNextToggle_ = 0.5;362 debugText_ = "Saved: " + ss.str();363 }364 365 if(keyboard_->isKeyDown(KC_R) && timeUntilNextToggle_ <=0)366 {367 sceneDetailIndex_ = (sceneDetailIndex_+1)%3 ;368 switch(sceneDetailIndex_) {369 case 0 : camera_->setPolygonMode(PM_SOLID); break;370 case 1 : camera_->setPolygonMode(PM_WIREFRAME); break;371 case 2 : camera_->setPolygonMode(PM_POINTS); break;372 }373 timeUntilNextToggle_ = 0.5;374 }375 376 static bool displayCameraDetails = false;377 if(keyboard_->isKeyDown(KC_P) && timeUntilNextToggle_ <= 0)378 {379 displayCameraDetails = !displayCameraDetails;380 timeUntilNextToggle_ = 0.5;381 if (!displayCameraDetails)382 debugText_ = "";383 }384 385 // Print camera details386 if(displayCameraDetails)387 debugText_ = " | Speed = "388 + StringConverter::toString(playerShip_->getSpeed());389 // debugText_ = "P: " + StringConverter::toString(camera_390 // ->getDerivedPosition()) + " " + "O: "391 // + StringConverter::toString(camera_->getDerivedOrientation());392 393 // Return true to continue rendering394 return true;395 }396 397 398 /**399 * Processes the Mouse input.400 * TODO: Use listeners to improve performance.401 * A lookup table should be implemented to bind ANY button or movement402 * to a specific action.403 * @return Return true to keep rendering404 */405 bool RunManager::processUnbufferedMouseInput()406 {407 using namespace OIS;408 409 const MouseState &ms = mouse_->getMouseState();410 411 // This is a 'hack' to show some flying barrels..412 // Usually, the Bullet created by the ship should be managed413 // by the physics engine..414 if (ms.buttonDown(MB_Left) && !leftButtonDown_)415 {416 // Prevent continuous fire for the moment.417 leftButtonDown_ = true;418 419 // let ship fire one shot with its only weapon (Barrels..)420 Bullet *tempBullet = playerShip_->fire();421 422 // resize array if neccessary (double the size then)423 if (bulletsIndex_ >= bulletsSize_)424 {425 // redimension the array426 Bullet **tempArray = new Bullet*[2*bulletsSize_];427 for (int i = 0; i < bulletsSize_; i++)428 tempArray[i] = bullets_[i];429 bulletsSize_ *= 2;430 delete bullets_;431 bullets_ = tempArray;432 }433 434 // add the bullet to the list435 bullets_[bulletsIndex_++] = tempBullet;436 437 }438 else if (!ms.buttons)439 leftButtonDown_ = false;440 441 // space ship steering. This should definitely be done in the steering object442 // Simply give it the mouse movements.443 playerShip_->turnUpAndDown(Radian(ms.Y.rel * mouseSensitivity_));444 playerShip_->turnLeftAndRight(Radian(ms.X.rel * mouseSensitivity_));445 //playerShip_->mRootNode->pitch(Degree(-ms.Y.rel * 0.13), Ogre::Node::TransformSpace::TS_LOCAL);446 //playerShip_->mRootNode->yaw(Degree(-ms.X.rel * 0.13), Ogre::Node::TransformSpace::TS_PARENT);447 448 // keep rendering449 return true;450 }451 452 /**453 * Show the debug overlay of desired.454 * @param show Whether or not to show the debug overlay455 */456 void RunManager::showDebugOverlay(bool show)457 {458 if (debugOverlay_)459 {460 if (show)461 debugOverlay_->show();462 else463 debugOverlay_->hide();464 }465 }466 467 468 /**469 * Show stats (e.g. FPS) in the left lower corner of the screen.470 * Copied from the ExampleFrameListener.h in the Ogre SDK471 */472 void RunManager::updateStats(void)473 {474 static String currFps = "Current FPS: ";475 static String avgFps = "Average FPS: ";476 static String bestFps = "Best FPS: ";477 static String worstFps = "Worst FPS: ";478 static String tris = "Triangle Count: ";479 static String batches = "Batch Count: ";480 481 // update stats when necessary482 try {483 OverlayElement* guiAvg = OverlayManager::getSingleton()484 .getOverlayElement("Core/AverageFps");485 OverlayElement* guiCurr = OverlayManager::getSingleton()486 .getOverlayElement("Core/CurrFps");487 OverlayElement* guiBest = OverlayManager::getSingleton()488 .getOverlayElement("Core/BestFps");489 OverlayElement* guiWorst = OverlayManager::getSingleton()490 .getOverlayElement("Core/WorstFps");491 492 const RenderTarget::FrameStats& stats = window_->getStatistics();493 guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS));494 guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS));495 guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS)496 +" "+StringConverter::toString(stats.bestFrameTime)+" ms");497 guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS)498 +" "+StringConverter::toString(stats.worstFrameTime)+" ms");499 500 OverlayElement* guiTris = OverlayManager::getSingleton()501 .getOverlayElement("Core/NumTris");502 guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount));503 504 OverlayElement* guiBatches = OverlayManager::getSingleton()505 .getOverlayElement("Core/NumBatches");506 guiBatches->setCaption(batches507 + StringConverter::toString(stats.batchCount));508 509 OverlayElement* guiDbg = OverlayManager::getSingleton()510 .getOverlayElement("Core/DebugText");511 guiDbg->setCaption(debugText_);512 }513 catch(...) { /* ignore */ }514 }515 516 517 518 /**519 * Simple camera creator.520 * playerShip_Node->attachObject(camera_) should no be here! This is what the camera521 * manager is for. Right now, this method should do just fine, setting the522 * cam behind the ship.523 */524 void RunManager::createCamera(void)525 {526 camera_ = sceneMgr_->createCamera("PlayerCam");527 playerShip_->getRootNode()->attachObject(camera_);528 camera_->setNearClipDistance(5);529 camera_->setPosition(Vector3(0,10,500));530 camera_->lookAt(Vector3(0,0,0));531 }532 533 /**534 * Simple viewport creator.535 * TODO: fully understand the concept of viewports concerning orxnox.536 * E.g. do we need splitscreen mode?537 * For now the viewport uses the entire render window and is based on the one538 * camera created so far.539 */540 void RunManager::createViewports(void)541 {542 // Create one viewport, entire window543 Viewport* vp = window_->addViewport(camera_);544 vp->setBackgroundColour(ColourValue(0,0,0));545 546 // Alter the camera aspect ratio to match the viewport547 camera_->setAspectRatio(548 Real(vp->getActualWidth()) / Real(vp->getActualHeight()));549 } -
code/branches/main_reto_vs05/src/weapon_manager.cc
r157 r161 26 26 */ 27 27 28 #include "OgreSceneManager.h" 29 28 30 #include "weapon_manager.h" 29 31 30 WeaponManager::WeaponManager(SceneManager *mSceneMgr) 31 { 32 33 } 32 33 namespace Orxonox { 34 using namespace Ogre; 35 36 WeaponManager::WeaponManager(SceneManager *mSceneMgr) 37 { 38 39 } 34 40 35 41 36 WeaponManager::~WeaponManager() 37 { 42 WeaponManager::~WeaponManager() 43 { 44 } 45 38 46 }
Note: See TracChangeset
for help on using the changeset viewer.