?? application.cpp
字號:
#include <Ogre.h>
#include <OIS/OIS.h>
#include <CEGUI/CEGUI.h>
#include <OgreCEGUIRenderer.h>
#include "NxOgre.h"
#include "Application.h"
Application::Application():
mRoot(0),mKeyboard(0),mInputManager(0),mRenderer(0),mSystem(0),
mInputHandler(0),mWindow(0),mCamera(0),mWorld(0),mScene(0)
{
}
Application::~Application()
{
if(mInputManager)
{
if(mKeyboard)
mInputManager->destroyInputObject(mKeyboard);
OIS::InputManager::destroyInputSystem(mInputManager);
}
if(mWorld)
delete mWorld;
delete mRenderer;
delete mSystem;
delete mInputHandler;
delete mRoot;
}
void Application::createRoot()
{
mRoot = new Root();
}
void Application::defineResources()
{
String secName, typeName, archName;
ConfigFile cf;
cf.load("resources.cfg");
ConfigFile::SectionIterator seci = cf.getSectionIterator();
while (seci.hasMoreElements())
{
secName = seci.peekNextKey();
ConfigFile::SettingsMultiMap *settings = seci.getNext();
ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
}
}
}
void Application::setupRenderSystem()
{
if (!mRoot->restoreConfig() && !mRoot->showConfigDialog())
throw Exception(52, "User canceled the config dialog!", "Application::setupRenderSystem()");
//// Do not add this to the application
//RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem");
//mRoot->setRenderSystem(rs);
//rs->setConfigOption("Full Screen", "No");
//rs->setConfigOption("Video Mode", "800 x 600 @ 32-bit colour");
}
void Application::createRenderWindow()
{
mRoot->initialise(true, "My Game -- Crazy Tank");
//// Do not add this to the application
//mRoot->initialise(false);
//HWND hWnd = 0; // Get the hWnd of the application!
//NameValuePairList misc;
//misc["externalWindowHandle"] = StringConverter::toString((int)hWnd);
//RenderWindow *win = mRoot->createRenderWindow("Main RenderWindow", 800, 600, false, &misc);
}
void Application::initializeResourceGroups()
{
TextureManager::getSingleton().setDefaultNumMipmaps(5);
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
void Application::createScene()
{
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE, "ST_EXTERIOR_CLOSE");
mCamera = mSceneMgr->createCamera("Camera");
mCamera->setNearClipDistance(5);
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CameraFree", Vector3(0, 0, 0));
node->setPosition(-200,800,-200);
node->pitch(Degree(-60));
node->yaw(Degree(-120),Node::TS_WORLD);
node->attachObject(mCamera);
mViewType = FREE;
mSceneMgr->getRootSceneNode()->createChildSceneNode("CameraFlyBy");
mWindow = mRoot->getAutoCreatedWindow();
Viewport *vp = mWindow->addViewport(mCamera);
ColourValue fadeColour(0.9, 0.9, 0.9);
//mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.0, 80, 130);
mWindow->getViewport(0)->setBackgroundColour(fadeColour);
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
// Create a light
Light* l = mSceneMgr->createLight("MainLight");
l->setPosition(200,200,50);
//Plane plane;
//plane.d = 100;
//plane.normal = Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setWorldGeometry("terrain.cfg");
//mSceneMgr->setSkyPlane(true, plane, "Examples/CloudySky", 500, 20, true, 0.5, 150, 150);
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8, 500);
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE);
mWorld = new World("log: html, time-controller: ogre");
mScene = mWorld->createScene("Main", mSceneMgr, "gravity: 0 -9.8 0, floor: no, renderer: ogre");
mWorld->getSDK()->getFoundationSDK().getRemoteDebugger()->connect("localhost");
Resources::ResourceSystem::getSingleton()->addHeightfieldAs("file://terrain.xhf", "wave");
Resources::Heightfield* hf = Resources::ResourceSystem::getSingleton()->getHeightfield("wave");
mScene->createActor("Terrain", new Terrain(hf, float3(1500.0f, 50.0f, 1500.0f), "", "centering: xz-above, hole-material: 65535"), Ogre::Vector3(750, 0, 750), "static: yes");
/*for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
Body* body = mScene->createBody("cube", new Cube(5), Vector3(0, 0, 0), "model: cube.1m.mesh, scale: 5 5 5", "mass: 10");
body->setGlobalPosition(Ogre::Vector3(150*i, 300, 150*j));
}
}*/
/*
Resources::ResourceSystem::getSingleton()->addMeshAs("file://tankBB1.nxs", "tankBB1");
Resources::ResourceSystem::getSingleton()->addMeshAs("file://tankBB2.nxs", "tankBB2");
Resources::ResourceSystem::getSingleton()->addMeshAs("file://tankBB3.nxs", "tankBB3");
Resources::ResourceSystem::getSingleton()->addMeshAs("file://tankBB4.nxs", "tankBB4");
Body* tank = mScene->createBody("tank", new Convex("tankBB1"), Vector3(100, 100, 100), "model: tank.mesh", "mass: 1000");
tank->addShape(new Convex("tankBB2"));
tank->addShape(new Convex("tankBB3"));
tank->addShape(new Convex("tankBB4"));*/
//Resources::ResourceSystem::getSingleton()->addMesh("file://tankBB1.nxs");
//Body* tank = mScene->createBody("tank", new Convex(Resources::ResourceSystem::getSingleton()->getMesh("tankBB1.nxs")), Vector3(100, 100, 100), "model: tank.mesh", "mass: 1000");
NxOgre::Material* mat = mScene->createMaterial("tank_mat");
mat->setRestitution(0.1);
mat->setDynamicFriction(0.5);
mat->setDynamicFrictionV(0.9);
mat->setStaticFriction(0.6);
mat->setStaticFrictionV(1.0);
mat->setDirOfAnisotropy(Ogre::Vector3(1,0,0));
mat->setFlags(NX_MF_ANISOTROPIC);
mat->setFrictionCombineMode(NxCombineMode::NX_CM_AVERAGE);
ShapeParams sp;
sp.setToDefault();
sp.mMaterial = mat->getMaterialIndex();
Body* tank = mScene->createBody("player", new Cube(13,4,5,sp), Vector3(350, 50, 350), "model: tank.mesh", "mass: 300");
tank->setCMassOffsetLocalPosition(Ogre::Vector3(0,-1.5,0));
SceneNode* playerNode = static_cast<OgreNodeRenderable*>(static_cast<Body*>(mScene->getActor("player"))->getRenderable())->getNode();
playerNode->createChildSceneNode("CameraTrace", Vector3(30, 15, 0));
}
void Application::setupInputSystem()
{
size_t windowHnd = 0;
std::ostringstream windowHndStr;
OIS::ParamList pl;
RenderWindow *win = mRoot->getAutoCreatedWindow();
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
mInputManager = OIS::InputManager::createInputSystem(pl);
try
{
mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false));
mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false));
//mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject(OIS::OISJoyStick, false));
mInputHandler = new InputHandler(mKeyboard,mMouse,this);
mRoot->addFrameListener(mInputHandler);
}
catch (const OIS::Exception &e)
{
throw new Exception(42, e.eText, "Application::setupInputSystem");
}
}
void Application::setupCEGUI()
{
SceneManager *mSceneMgr = mRoot->getSceneManager("ST_EXTERIOR_CLOSE");
// CEGUI setup
mRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
mSystem = new CEGUI::System(mRenderer);
// Other CEGUI setup here.
}
void Application::createFrameListener()
{
}
void Application::startRenderLoop()
{
mRoot->startRendering();
//// Do not add this to the application
//while (mRoot->renderOneFrame())
//{
// // Do some things here, like sleep for x milliseconds or perform other actions.
//}
}
void Application::go()
{
createRoot();
defineResources();
setupRenderSystem();
createRenderWindow();
initializeResourceGroups();
createScene();
setupInputSystem();
setupCEGUI();
createFrameListener();
startRenderLoop();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -