History: BasicTutorial8Source
Source of version: 3
Copy to clipboard
This is the full source for ((Basic Tutorial 8))
{CODE(wrap="1",colors="c++")}#include "ExampleApplication.h"
#define CAMERA_NAME "SceneCamera"
void setupViewport(RenderWindow *win, SceneManager *curr)
{
win->removeAllViewports();
Camera *cam = curr->getCamera(CAMERA_NAME);
Viewport *vp = win->addViewport(cam);
vp->setBackgroundColour(ColourValue(0,0,0));
cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
vp->setOverlaysEnabled(true);
}
void dualViewport(RenderWindow *win, SceneManager *primary, SceneManager *secondary)
{
win->removeAllViewports();
Viewport *vp = 0;
Camera *cam = primary->getCamera(CAMERA_NAME);
vp = win->addViewport(cam, 0, 0, 0, 0.5, 1);
vp->setBackgroundColour(ColourValue(0,0,0));
vp->setOverlaysEnabled(true);
cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
cam = secondary->getCamera(CAMERA_NAME);
vp = win->addViewport(cam, 1, 0.5, 0, 0.5, 1);
vp->setBackgroundColour(ColourValue(0,0,0));
cam->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
vp->setOverlaysEnabled(false);
}
class SMTutorialListener : public ExampleFrameListener, public OIS::KeyListener
{
public:
SMTutorialListener(RenderWindow* win, SceneManager *primary, SceneManager *secondary)
: ExampleFrameListener(win, primary->getCamera(CAMERA_NAME), true, false),
mPrimary(primary), mSecondary(secondary), mDual(false), mContinue(true)
{
mKeyboard->setEventCallback(this);
}
bool frameStarted(const FrameEvent& evt)
{
mKeyboard->capture();
return mContinue;
}
bool keyPressed(const OIS::KeyEvent &arg)
{
switch (arg.key)
{
case OIS::KC_C:
swap(mPrimary, mSecondary);
if (mDual)
dualViewport(mWindow, mPrimary, mSecondary);
else
setupViewport(mWindow, mPrimary);
break;
case OIS::KC_V:
mDual = !mDual;
if (mDual)
dualViewport(mWindow, mPrimary, mSecondary);
else
setupViewport(mWindow, mPrimary);
break;
case OIS::KC_ESCAPE:
mContinue = false;
break;
default :
break;
}
return true;
}
bool keyReleased(const OIS::KeyEvent &) {return true;}
private:
SceneManager *mPrimary, *mSecondary;
bool mDual, mContinue;
static void swap(SceneManager *&first, SceneManager *&second)
{
SceneManager *tmp = first;
first = second;
second = tmp;
}
};
class SMTutorialApplication : public ExampleApplication
{
public:
SMTutorialApplication()
{
}
~SMTutorialApplication()
{
}
protected:
SceneManager *mPrimary, *mSecondary;
void chooseSceneManager(void)
{
mPrimary = mRoot->createSceneManager(ST_GENERIC, "primary");
mSecondary = mRoot->createSceneManager(ST_GENERIC, "secondary");
}
void createCamera()
{
mPrimary->createCamera(CAMERA_NAME);
mSecondary->createCamera(CAMERA_NAME);
}
void createViewports()
{
setupViewport(mWindow, mPrimary);
}
void createScene(void)
{
// Setup the TerrainSceneManager
mPrimary->setSkyBox(true, "Examples/SpaceSkyBox");
// Setup the Generic SceneManager
mSecondary->setSkyDome(true, "Examples/CloudySky", 5, 8);
}
void createFrameListener(void)
{
mFrameListener = new SMTutorialListener(mWindow, mPrimary, mSecondary);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
#else
int main(int argc, char **argv)
#endif
{
// Create application object
SMTutorialApplication app;
try {
app.go();
} catch(Exception& e) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occurred: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
}{CODE}