#include <ogre.h> #include <OIS\OIS.h>
using namespace Ogre;
class ExitListener : public FrameListener { public: ExitListener(OIS::Keyboard*keyboard):mKeyboard(keyboard) { }
bool frameStarted(const FrameEvent& evt) { mKeyboard->capture(); return !mKeyboard->isKeyDown(OIS::KC_ESCAPE); }
private: OIS::Keyboard *mKeyboard; };
// La clase Application contendra los metodos para inicializar una aplicacion Ogre. class Application { public: // Al invocar al metodo go se realizaran las inicializaciones de los subsistemas en el orden indicado void go() { createRoot(); defineResources(); setupRenderSystem(); createRenderWindow(); initializeResourceGroups(); setupScene(); setupInputSystem(); createFrameListener(); startRenderLoop(); }
~Application() { mInputManager->destroyInputObject(mKeyboard); OIS::InputManager::destroyInputSystem(mInputManager); delete mListener; delete mRoot; }
private: Root*mRoot; OIS::Keyboard*mKeyboard; OIS::InputManager*mInputManager; ExitListener*mListener;
// El objeto root es el núcleo de Ogre, nada se puede hacer en ogre si previamente no se crea root void createRoot() { mRoot = new Root(); }
void 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); } } }
// En este paso se indica aspectos refernetes a la configuracion grafica con la que se va a mostrar la aplicacion //( OpenGL o DirectX, resolucion, anti aliasing y pantalla completa) void setupRenderSystem() { 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"); }
// Crear la ventana principal void createRenderWindow() { mRoot->initialise(true, "tutorial");
}
void initializeResourceGroups() { TextureManager::getSingleton().setDefaultNumMipmaps(5); ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); }
// En este apartado es donde se monta la escena: se colocab camaras, luces, objetos, efectos, etc... void setupScene() {// Creamos el SceneManager SceneManager* mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "default Smanager");
// Creamos y configuramos la camara Camera* cam; cam = mSceneMgr->createCamera("cámara"); cam->setNearClipDistance(1); cam->setFarClipDistance(500); cam->setPosition(150.0, 120.0, 0.0); cam->lookAt(0.0, 50.0, 0.0);
// Creamos la luz Light* light = mSceneMgr->createLight("luz1"); light->setType(Light::LT_POINT); light->setPosition(0, 100, 0); light->setDiffuseColour(0.4, 0.4, 0.4); light->setSpecularColour(0.2, 0.3, 0.2); Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam);
// Luz ambiente mSceneMgr->setAmbientLight(ColourValue(0.2,0.2,0.2));
// Creamos un objeto Entity* ent; ent = mSceneMgr->createEntity("Robot", "robot.mesh"); SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("RobotNode"); node->setPosition(0.0,0.0,0.0); node->attachObject(ent);
}
// Sistema de entrada void 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)); } catch (const OIS::Exception&e) { throw Exception(42, e.eText, "Application::setupInputSystem"); } }
void setupCEGUI() { }
// Gestiona los eventos de la ventana principal void createFrameListener() { mListener = new ExitListener(mKeyboard); mRoot->addFrameListener(mListener); }
// Bucle de repintdo void startRenderLoop() { mRoot->startRendering(); } };
int main(int argc, char **argv) { try { Application app; app.go(); }
catch(Exception&e) { fprintf(stderr, "An exception has ocurred %s\n", e.getFullDescription().c_str()); }
return 0; }
|