BasicTutorial6SourceOgre20        
#include "TestApp.h"

#include "OgreConfigFile.h"
#include "OgreTextureManager.h"
#include "OgreCamera.h"
#include "OgreRenderWindow.h"
#include "OgreViewport.h"
#include "OgreEntity.h"
#include "OgreWindowEventUtilities.h"
#include "OgreLight.h"

#include "Compositor/OgreCompositorManager2.h"

TestApp::TestApp(void)
  : mRoot(0)
{
}

TestApp::~TestApp(void)
{
  delete mRoot;
}

void TestApp::go(void)
{
#ifdef _DEBUG
  Ogre::String mPluginsCfg = "plugins_d.cfg";
  Ogre::String mResourceCfg = "resources_d.cfg";
#else
  Ogre::String mPluginsCfg = "plugins.cfg";
  Ogre::String mResourceCfg = "resources.cfg";
#endif

  mRoot = new Ogre::Root( mPluginsCfg );

  Ogre::ConfigFile cf;
  cf.load( mResourceCfg );

  Ogre::ConfigFile::SectionIterator secIter = cf.getSectionIterator();

  Ogre::String secName, typeName, archName;
  while( secIter.hasMoreElements() )
  {
    secName = secIter.peekNextKey();
    Ogre::ConfigFile::SettingsMultiMap * settings = secIter.getNext();
    Ogre::ConfigFile::SettingsMultiMap::iterator iter;
    for( iter = settings->begin(); iter != settings->end(); iter++ )
    {
      typeName = iter->first;
      archName = iter->second;
      Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
        archName, typeName, secName );
    }
  }

  if( !mRoot->showConfigDialog() )
  {
    return;
  }

  Ogre::RenderWindow * mWindow;
  mWindow = mRoot->initialise( true, "Ogre 2.0 Test" );

  Ogre::TextureManager::getSingleton().setDefaultNumMipmaps( Ogre::MIP_UNLIMITED );
  Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

  Ogre::SceneManager * mSceneMgr;
  mSceneMgr = mRoot->createSceneManager( "DefaultSceneManager", 3, Ogre::INSTANCING_CULLING_SINGLETHREAD );

  Ogre::Camera * mCamera;
  mCamera = mSceneMgr->createCamera( "Camera" );
  mCamera->setPosition( Ogre::Vector3( 0, 0, 80 ) );
  mCamera->lookAt( Ogre::Vector3( 0, 0, 0 ) );
  mCamera->setNearClipDistance( 5 );
  mCamera->setAutoAspectRatio( true );

  Ogre::CompositorManager2 *compositorManager = mRoot->getCompositorManager2();
  const Ogre::IdString workspaceName( "Workspace" );
  if( !compositorManager->hasWorkspaceDefinition( workspaceName ) )
  {
    compositorManager->createBasicWorkspaceDef( workspaceName, Ogre::ColourValue::Black );
  }
  compositorManager->addWorkspace( mSceneMgr, mWindow, mCamera, workspaceName, true );

  Ogre::Entity * ogreHead = mSceneMgr->createEntity( "ogrehead.mesh" );
  Ogre::SceneNode * headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
  headNode->attachObject( ogreHead );

  mSceneMgr->setAmbientLight( Ogre::ColourValue( 0.5, 0.5, 0.5 ) );

  Ogre::SceneNode * lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
  lightNode->setPosition( Ogre::Vector3( 20, 80, 50 ) );
  Ogre::Light * light = mSceneMgr->createLight();
  lightNode->attachObject( light );

  while( true )
  {
    Ogre::WindowEventUtilities::messagePump();

    if( mWindow->isClosed() )
    {
      break;
    }

    if( !mRoot->renderOneFrame() )
    {
      break;
    }
  }
}