/* ----------------------------------------------------------------------------- This source file is part of OGRE (Object-oriented Graphics Rendering Engine) For the latest info, see http://www.ogre3d.org/ Copyright (c) 2000-2005 The OGRE Team Also see acknowledgements in Readme.html This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt. ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- Filename: ExampleApplication.h Description: Base class for all the OGRE examples ----------------------------------------------------------------------------- */ #ifndef __ExampleApplication_H__ #define __ExampleApplication_H__ #include "Ogre.h" #include "OgreConfigFile.h" #include "ExampleFrameListener.h" using namespace Ogre; /** Base class which manages the standard startup of an Ogre application. Designed to be subclassed for specific examples if required. */ class ExampleApplication { public: /// Standard constructor ExampleApplication() { mFrameListener = 0; mRoot = 0; } /// Standard destructor virtual ~ExampleApplication() { if (mFrameListener) delete mFrameListener; if (mRoot) delete mRoot; } /// Start the example virtual void go(void) { if (!setup()) return; mRoot->startRendering(); } protected: Root *mRoot; Camera* mCamera; SceneManager* mSceneMgr; FrameListener* mFrameListener; RenderWindow* mWindow; // These internal methods package up the stages in the startup process /** Sets up the application - returns false if the user chooses to abandon configuration. */ virtual bool setup(void) { mRoot = new Root(); setupResources(); // We choose only the OpenGL rendering subsystem // If it does not exist, the initialise call will exit with the // #2 "Cannot initialise - no render system has been selected.." error Ogre::RenderSystemList::iterator pRend = mRoot->getAvailableRenderers()->begin(); while (pRend != mRoot->getAvailableRenderers()->end()) { if ((*pRend)->getName() == "OpenGL Rendering Subsystem") mRoot->setRenderSystem(*pRend); pRend++; } mRoot->initialise(false); setupGTKWindow(); chooseSceneManager(); createCamera(); createViewports(); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); // Create the scene createScene(); createFrameListener(); return true; } virtual void chooseSceneManager(void) { // Get the SceneManager, in this case a generic one mSceneMgr = mRoot->getSceneManager(ST_GENERIC); } virtual void createCamera(void) { // Create the camera mCamera = mSceneMgr->createCamera("PlayerCam"); // Position it at 500 in Z direction mCamera->setPosition(Vector3(0,0,500)); // Look back along -Z mCamera->lookAt(Vector3(0,0,-300)); mCamera->setNearClipDistance(5); } virtual void createFrameListener(void) = 0; virtual void createScene(void) = 0; // pure virtual - this has to be overridden virtual void createViewports(void) { // Create one viewport, entire window Viewport* vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(ColourValue(0,0,0)); } /// Method which will define the source of resources (other than current folder) virtual void setupResources(void) { // Load resource paths from config file ConfigFile cf; cf.load("resources.cfg"); // Go through all settings in the file ConfigFile::SettingsIterator i = cf.getSettingsIterator(); String typeName, archName; while (i.hasMoreElements()) { typeName = i.peekNextKey(); archName = i.getNext(); ResourceManager::addCommonArchiveEx( archName, typeName ); } } virtual void setupGTKWindow(void) = 0; }; #endif