Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 4, 2007, 5:00:41 PM (17 years ago)
Author:
rgrieder
Message:
  • added namespace Orxonox to every file
    • removed all the "using namespace Ogre" in the header files
  • cleaned up with the includes: attempt to include as little as possible to reduce compile time.
    • created a header file: orxonox_prerequisites.h
    • used OgrePrerequisites in the header files
    • avoided including "Ogre.h", using separate files instead
  • created empty class: AmmunitionDump
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  
    2626 */
    2727
     28#include "OgreSceneNode.h"
     29#include "OgreEntity.h"
     30#include "OgreVector3.h"
     31
    2832#include "bullet.h"
    2933
    3034
    31 Bullet::Bullet(SceneNode *mNode, Entity *mEntity, Vector3 mSpeed)
    32       : mNode(mNode), mEntity(mEntity), mSpeed(mSpeed)
    33 {
    34         mNode->attachObject(mEntity);
    35 }
     35namespace 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  }
    3643
    3744
    38 Bullet::~Bullet()
    39 {
     45  Bullet::~Bullet()
     46  {
     47  }
     48
    4049}
  • code/branches/main_reto_vs05/src/camera_manager.cc

    r157 r161  
    2626 */
    2727
     28#include "OgreSceneManager.h"
     29#include "OgreCamera.h"
     30
    2831#include "camera_manager.h"
    2932
     33namespace Orxonox {
     34  using namespace Ogre;
    3035
    31 CameraManager::CameraManager(SceneManager *mScene) : mSceneMgr(mSceneMgr)
    32 {
    33 }
     36  CameraManager::CameraManager(SceneManager *mScene) : mSceneMgr(mSceneMgr)
     37  {
     38  }
    3439
    3540
    36 CameraManager::~CameraManager()
    37 {
    38 }
     41  CameraManager::~CameraManager()
     42  {
     43  }
    3944
    4045
    41 bool CameraManager::setCameraPosition(int n)
    42 {
    43         return true;
     46  bool CameraManager::setCameraPosition(int n)
     47  {
     48          return true;
     49  }
     50
    4451}
  • code/branches/main_reto_vs05/src/main.cc

    r157 r161  
    2626 */
    2727
    28 
     28#include "OgrePlatform.h"
     29#include "OgreException.h"
    2930
    3031#include "orxonox.h"
     
    4445    try {
    4546      // create an orxonox aplication and run it
    46       Orxonox myApp;
     47      Orxonox::Orxonox myApp;
    4748
    4849      myApp.go();
  • code/branches/main_reto_vs05/src/ogre_control.cc

    r159 r161  
    2626 */
    2727
    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
    3637
    3738#include "ogre_control.h"
    3839
    3940
    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);
     41namespace 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
    66223}
    67 #endif
    68 
    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 configuration
    76         // files. On windows files are searched for in the current working
    77   // directory, on OS X however you must provide the full path, the helper
    78   // function macBundlePath does this for us.
    79 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    80         resourcePath_ = macBundlePath() + "/Contents/Resources/";
    81 #else
    82         resourcePath_ = "";
    83 #endif
    84 }
    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 defined
    99 * (not loaded!). And last but not least, the render settings (like resolution
    100 * 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 static
    106 #ifndef OGRE_STATIC_LIB
    107         pluginsPath = resourcePath_ + "plugins.cfg";
    108 #endif
    109 
    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 file
    128         ConfigFile cf;
    129         cf.load(resourcePath_ + "resources.cfg");
    130 
    131         // Go through all sections & settings in the file
    132         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_APPLE
    145                         // 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 provide
    147                         // the loading with it's own bundle path location
    148                         ResourceGroupManager::getSingleton().addResourceLocation(
    149                                 String(macBundlePath() + "/" + archName), typeName, secName);
    150 #else
    151                         ResourceGroupManager::getSingleton().addResourceLocation(
    152                                 archName, typeName, secName);
    153 #endif
    154                 }
    155         }
    156 }
    157 
    158 
    159 /**
    160 * Prompts a setting window for the render engine if that has not already
    161 * 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 system
    167         // You can skip this and use root.restoreConfig() to load configuration
    168         // settings if you were sure there are valid ones saved in ogre.cfg
    169         if(!root_->restoreConfig() && !root_->showConfigDialog())
    170                 return false;
    171 
    172         // user clicked OK so initialise
    173         // Here we choose to let the system create a default
    174   // 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  
    3232*/
    3333
     34#include "OgreRoot.h"
     35#include "OgreTimer.h"
     36#include "OgreWindowEventUtilities.h"
    3437
     38#include "ogre_control.h"
     39#include "run_manager.h"
    3540#include "orxonox.h"
    3641
    3742
    38 /**
    39 * Empty Constructor.
    40 */
    41 Orxonox::Orxonox()
    42 {
    43 }
     43namespace Orxonox {
     44
     45  /**
     46  * Empty Constructor.
     47  */
     48  Orxonox::Orxonox()
     49  {
     50  }
    4451
    4552
    46 /**
    47 * Empty Destructor.
    48 */
    49 Orxonox::~Orxonox()
    50 {
    51 }
     53  /**
     54  * Empty Destructor.
     55  */
     56  Orxonox::~Orxonox()
     57  {
     58  }
    5259
    5360
    54 /**
    55 * Starts and runs the game
    56 */
    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;
    6168
    62         timer_ = new Timer();
     69    timer_ = new Ogre::Timer();
    6370
    64         unsigned long lastTime = timer_->getMilliseconds();
     71          unsigned long lastTime = timer_->getMilliseconds();
    6572
    66         while (true)
    67         {
    68                 //Pump messages in all registered RenderWindow windows
    69                 WindowEventUtilities::messagePump();
     73          while (true)
     74          {
     75                  //Pump messages in all registered RenderWindow windows
     76      Ogre::WindowEventUtilities::messagePump();
    7077
    71                 ogre_->getRoot()->renderOneFrame();
     78                  ogre_->getRoot()->renderOneFrame();
    7279
    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          }
    7885
    79         // clean up
    80         destroy();
    81 }
     86          // clean up
     87          destroy();
     88  }
    8289
    8390
    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 engine
    91         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();
    93100
    94         runMgr_ = new RunManager(ogre_);
     101          runMgr_ = new RunManager(ogre_);
    95102
    96         return true;
    97 }
     103          return true;
     104  }
    98105
    99106
    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
    111120}
  • code/branches/main_reto_vs05/src/orxonox_scene.cc

    r159 r161  
    2626 */
    2727
    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"
    3335
    3436#include "orxonox_scene.h"
    3537
     38namespace Orxonox {
     39  using namespace Ogre;
    3640
    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  */
    7045
    7146
    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  }
    8280
    8381
    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  }
    12292
    12393
    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));
    133101
    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");
    138104
    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
    143155}
  • code/branches/main_reto_vs05/src/orxonox_ship.cc

    r159 r161  
    2626 */
    2727
    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"
    4035
    4136#include "orxonox_ship.h"
    4237
    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 {
     38namespace 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
    57223}
    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 the
    73 * 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 1
    98 */
    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 1
    110 */
    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 1
    122 */
    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 make
    172 * 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 render
    197 */
    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  
    3939*/
    4040
     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
    4169#include "run_manager.h"
    4270
    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);
     71namespace 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
    159581}
    160 
    161 /**
    162 * Standard destructor.
    163 * Removes this object as a window event listener and deletes all created
    164 * variables.
    165 */
    166 RunManager::~RunManager()
    167 {
    168   //Remove ourself as a Window listener
    169   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 list
    178   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 time
    192 * @param deltaTime Time passed since last frame
    193 * @return Return false to end rendering
    194 */
    195 bool RunManager::tick(unsigned long time, float deltaTime)
    196 {
    197   // synchronize with internal class timer
    198   totalTime_ = time;
    199 
    200   // Call tick() for every object
    201   // 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 positions
    210   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 INTERFACE
    218 
    219   using namespace OIS;
    220 
    221   if(window_->isClosed())       return false;
    222 
    223   //Need to capture/update each device
    224   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 buffered
    231   if( !mouse_->buffered() || !keyboard_->buffered() || !buffJ )
    232   {
    233     // one of the input modes is immediate, so setup what
    234     // is needed for immediate movement
    235     if (timeUntilNextToggle_ >= 0)
    236       timeUntilNextToggle_ -= deltaTime;
    237   }
    238 
    239   // handle HID devices
    240   if( processUnbufferedKeyInput() == false )
    241       return false;
    242   if( processUnbufferedMouseInput() == false )
    243       return false;
    244 
    245   // keep rendering
    246   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 window
    255 */
    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 Window
    272 */
    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 rendering
    295 */
    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   else
    305     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   else
    312     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   else
    319     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 details
    386   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 rendering
    394   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 movement
    402 * to a specific action.
    403 * @return Return true to keep rendering
    404 */
    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 managed
    413   // 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 array
    426       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 list
    435     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 object
    442   // 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 rendering
    449   return true;
    450 }
    451 
    452 /**
    453 * Show the debug overlay of desired.
    454 * @param show Whether or not to show the debug overlay
    455 */
    456 void RunManager::showDebugOverlay(bool show)
    457 {
    458   if (debugOverlay_)
    459   {
    460     if (show)
    461       debugOverlay_->show();
    462     else
    463       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 SDK
    471 */
    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 necessary
    482   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(batches
    507       + 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 camera
    521 * manager is for. Right now, this method should do just fine, setting the
    522 * 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 one
    538 * camera created so far.
    539 */
    540 void RunManager::createViewports(void)
    541 {
    542   // Create one viewport, entire window
    543   Viewport* vp = window_->addViewport(camera_);
    544   vp->setBackgroundColour(ColourValue(0,0,0));
    545 
    546   // Alter the camera aspect ratio to match the viewport
    547   camera_->setAspectRatio(
    548     Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
    549 }
  • code/branches/main_reto_vs05/src/weapon_manager.cc

    r157 r161  
    2626 */
    2727
     28#include "OgreSceneManager.h"
     29
    2830#include "weapon_manager.h"
    2931
    30 WeaponManager::WeaponManager(SceneManager *mSceneMgr)
    31 {
    32        
    33 }
     32
     33namespace Orxonox {
     34  using namespace Ogre;
     35
     36  WeaponManager::WeaponManager(SceneManager *mSceneMgr)
     37  {
     38       
     39  }
    3440
    3541
    36 WeaponManager::~WeaponManager()
    37 {
     42  WeaponManager::~WeaponManager()
     43  {
     44  }
     45
    3846}
Note: See TracChangeset for help on using the changeset viewer.