Przejdź do zawartości

OGRE/kody/MyApp2.ccp

Z Wikibooks, biblioteki wolnych podręczników.
#define OGRE_CHANGE1 ((1 << 16) | (1 << 8)) /* Przeznaczone do wykrywania wersji Ogre */

#include "Ogre.h"     /* Wszystkie nagłówki OGRE */
#include "ExampleApplication.h"

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32   /* W zależności od systemu operacyjnego */
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#else
#include <iostream>
#endif

// Dziedziczymy ExampleApplication
class MyApp : public ExampleApplication
{
 protected:
 public:
   MyApp()
   {
   }

   ~MyApp() 
   {
   }
 protected:
   virtual void createCamera(void)
   {
      // 1.1 tworzenie kamery
      mCamera = mSceneMgr->createCamera("PlayerCam"); 
      // 1.2 ustawianie pozycji i kierunku
      mCamera->setPosition(Vector3(0,10,500));
      mCamera->lookAt(Vector3(0,0,0));
      // 1.3 Ustawienie najbliższej możliwej widoczności
      mCamera->setNearClipDistance(5);
   }

   virtual void createViewports(void)
   {
      // 2.1 Tworzenie jednego viewport, na całe okno
      Viewport* vp = mWindow->addViewport(mCamera);
      // 2.2 Ustawienia koloru tła na czarny
      vp->setBackgroundColour(ColourValue(0,0,0));
      // 2.3 Zmieniamy proporcje widoku kamery na zgodny z naszym viewportem
      mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
   }

   void createScene(void)
   {
       Entity *ent;
       Light *light;

      // 3.1 Tworzymy światło otoczenia i ustawiamy styl cieni
      mSceneMgr->setAmbientLight( ColourValue( 0, 0, 0 ) );
      mSceneMgr->setShadowTechnique( SHADOWTYPE_STENCIL_ADDITIVE );
      // 3.2 Wstawiamy jednostkę która będzie rzucała cień
      ent = mSceneMgr->createEntity( "Ninja", "ninja.mesh" );
      ent->setCastShadows( true );
      mSceneMgr->getRootSceneNode()->createChildSceneNode( )->attachObject( ent );
      // 3.3 Wstawienie podłoża
      Plane plane( Vector3::UNIT_Y, 0 );
      MeshManager::getSingleton().createPlane("ground",
         ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
         1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);
      ent = mSceneMgr->createEntity( "GroundEntity", "ground" );
      mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
      ent->setMaterialName( "Examples/Rockwall" );
      ent->setCastShadows( false );

      // 4.1 Tworzenie światła
      light = mSceneMgr->createLight( "Light1" );
      light->setType( Light::LT_POINT );
      light->setPosition( Vector3(0, 150, 250) );
      // 4.2 Kolor dyfuzji i odbicia
      light->setDiffuseColour( 1.0, 0.0, 0.0 );
      light->setSpecularColour( 1.0, 0.0, 0.0 );
      // 4.3 Tworzenie drugiego światła
      light = mSceneMgr->createLight( "Light2" );
      light->setType( Light::LT_DIRECTIONAL );
      light->setDiffuseColour( ColourValue( .25, .25, 0 ) );
      light->setSpecularColour( ColourValue( .25, .25, 0 ) );
      light->setDirection( Vector3( 0, -1, 1 ) );
      // 4.4 Tworzenie trzeciego światła
      light = mSceneMgr->createLight( "Light3" );
      light->setType( Light::LT_SPOTLIGHT );
      light->setDiffuseColour( 0, 0, 1.0 );
      light->setSpecularColour( 0, 0, 1.0 );
      light->setDirection( -1, -1, 0 );
      light->setPosition( Vector3( 300, 300, 0 ) );
      light->setSpotlightRange( Degree(35), Degree(50) );
   }
};

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32   /* W zalezności od systemu operacyjnego */
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
 MyApp App;     // Tworzymy instancję naszej klasy
  try
  {
    App.go();       // ExampleApplication dostarcza metodę go, która rozpoczyna rendering
    return 0;   // Zwraca 0 w przypadku powodzenia
  }
  catch (Ogre::Exception& e)  // Przechwytuje wyjątki (błędy)
  {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32   // W zależności od systemu operacyjnego
    MessageBox( NULL, e.getFullDescription().c_str(), "Wyjątek!",
          MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
    std::cerr <<"Wyjątek:\n";
    std::cerr <<e.getFullDescription().c_str() <<"\n";
#endif
    return 1;   // Zwrócenie liczby różnej od zera oznacza niepowodzenie
  }
}

#ifdef __cplusplus
}
#endif