Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 1, 2007, 1:34:34 PM (16 years ago)
Author:
nicolasc
Message:

intial trunk fix

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/orxonox.cc

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