Files
ogre-jolt-prototype/main.cpp
2025-11-10 07:14:45 +03:00

125 lines
3.2 KiB
C++

#include <iostream>
#include <Ogre.h>
#include <OgreApplicationContext.h>
#include <OgrePageManager.h>
#include "main.h"
class App : public OgreBites::ApplicationContext {
Ogre::SceneNode *mCameraNode;
Ogre::SceneManager *mScnMgr;
std::unique_ptr<CharacterController> 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<Ogre::Camera *>(
mCameraNode->getAttachedObject("tps_camera"));
mCharacter = std::make_unique<CharacterController>(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;
}