#include #include #include #include #include "main.h" class App : public OgreBites::ApplicationContext { Ogre::SceneNode *mCameraNode; Ogre::SceneManager *mScnMgr; std::unique_ptr mCharacter; KeyHandler mKeyHandler; MainWorld mWorld; public: App(); virtual ~App(); void setup(); void locateResources(); void initCamera(); Ogre::SceneManager *getSceneManager() { return mScnMgr; } void createContent(); void createCharacter(); void setupWorld(); }; App::App() : OgreBites::ApplicationContext("App") { } void App::setup() { OgreBites::ApplicationContext::setup(); Ogre::Root *root = getRoot(); Ogre::SceneManager *scnMgr = root->createSceneManager(); mScnMgr = scnMgr; } void App::locateResources() { OgreBites::ApplicationContext::locateResources(); } App::~App() { } void App::initCamera() { // also need to tell where we are mCameraNode = mScnMgr->getRootSceneNode()->createChildSceneNode(); mCameraNode->setPosition(0, 2, 3); mCameraNode->lookAt(Ogre::Vector3(0, 1, -1), Ogre::Node::TS_PARENT); // create the camera Ogre::Camera *cam = mScnMgr->createCamera("tps_camera"); cam->setNearClipDistance(0.1f); // specific to this sample cam->setAutoAspectRatio(true); mCameraNode->attachObject(cam); // and tell it to render into the main window getRenderWindow()->addViewport(cam); } void App::setupWorld() { addInputListener(&mKeyHandler); mWorld.setup(); getRoot()->addFrameListener(&mWorld); } void App::createCharacter() { Ogre::Camera *cam = static_cast( mCameraNode->getAttachedObject("tps_camera")); mCharacter = std::make_unique(mCameraNode, cam, mScnMgr, &mWorld); // mInputListenerChain = TouchAgnosticInputListenerChain(getRenderWindow(), {&mKeyHandler, mCharacter.get()}); addInputListener(mCharacter.get()); WorldData::get_singleton()->initPagedWorld(cam); } void App::createContent() { // without light we would just get a black screen Ogre::Light *light = mScnMgr->createLight("MainLight"); Ogre::SceneNode *lightNode = mScnMgr->getRootSceneNode()->createChildSceneNode(); // lightNode->setPosition(0, 10, 15); lightNode->setDirection( Ogre::Vector3(0.55, -0.3, 0.75).normalisedCopy()); lightNode->attachObject(light); light->setType(Ogre::Light::LT_DIRECTIONAL); light->setDiffuseColour(Ogre::ColourValue::White); light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4)); mScnMgr->setSkyBox(true, "Skybox", 490); } int main(int argc, char *argv[]) { App ctx; ctx.initApp(); // get a pointer to the already created root Ogre::Root *root = ctx.getRoot(); Ogre::SceneManager *scnMgr = ctx.getSceneManager(); // register our scene with the RTSS Ogre::RTShader::ShaderGenerator *shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr(); shadergen->addSceneManager(scnMgr); WorldData::init(root, scnMgr); ctx.setWindowGrab(true); ctx.createContent(); ctx.initCamera(); ctx.setupWorld(); ctx.createCharacter(); // register for input events // KeyHandler keyHandler; // ctx.addInputListener(&keyHandler); ctx.getRoot()->startRendering(); ctx.setWindowGrab(false); ctx.closeApp(); WorldData::cleanup(); return 0; }