/** \file TestCullingApplication.h */ #include "CEGUIForwardRefs.h" #include "ExampleApplication.h" #include "OgreOcclusionCullingSceneManager.h" Real timeDelay = 0; #define KEY_PRESSED(_key,_timeDelay, _macro) \ { \ if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \ { \ timeDelay = _timeDelay; \ _macro ; \ } \ } String mAlgorithmTypeCaptions[OcclusionCullingSceneManager::NUM_RENDERMODES] = { "Cull Frustum", "Stop and Wait", "Coherent Occlusion Culling" }; class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener { public: MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, SceneNode* shipNode) : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShipNode(shipNode)//, mShutdownRequested(false) { // Setup default variables mCurrentObject = NULL; mLMouseDown = false; mRMouseDown = false; mSceneMgr = sceneManager; // Reduce move speed mMoveSpeed = 50; mRotateSpeed *= 2; mAlgorithmType = OcclusionCullingSceneManager::RENDER_COHERENT; // Register this so that we get mouse events. mEventProcessor->addMouseListener(this); mEventProcessor->addMouseMotionListener(this); mEventProcessor->addKeyListener(this); // show overlay Overlay* pOver = OverlayManager::getSingleton().getByName("Example/ShadowsOverlay"); mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Shadows/ShadowTechniqueInfo"); //mMaterialInfo = OverlayManager::getSingleton().getOverlayElement("Example/Shadows/MaterialInfo"); //mInfo = OverlayManager::getSingleton().getOverlayElement("Example/Shadows/Info"); mAlgorithmInfo->setCaption("Algorithm: " + mAlgorithmTypeCaptions[mAlgorithmType]); //mMaterialInfo->setCaption("Current: " + mAtheneMaterials[mCurrentAtheneMaterial]); pOver->show(); } // MouseQueryListener ~MouseQueryListener( ) { } bool frameEnded(const FrameEvent& evt) { if (timeDelay >= 0) timeDelay -= evt.timeSinceLastFrame; KEY_PRESSED(KC_O, 1, changeAlgorithm()); return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt); } /* MouseListener callbacks. */ virtual void mouseClicked(MouseEvent* e) { } virtual void mouseEntered(MouseEvent* e) { } virtual void mouseExited(MouseEvent* e) { } // This is when the mouse button goes DOWN. virtual void mousePressed(MouseEvent* e); // This is when the mouse button is let UP. virtual void mouseReleased(MouseEvent* e); /* MouseMotionListener callbacks */ virtual void mouseMoved (MouseEvent *e); // This is when the mouse is clicked, held and dragged. virtual void mouseDragged (MouseEvent *e); /* void keyPressed(KeyEvent* e) { if(e->getKey() == KC_ESCAPE) { mShutdownRequested = true; e->consume(); return; } CEGUI::System::getSingleton().injectKeyDown(e->getKey()); CEGUI::System::getSingleton().injectChar(e->getKeyChar()); e->consume(); } void keyReleased(KeyEvent* e) { CEGUI::System::getSingleton().injectKeyUp(e->getKey()); e->consume(); } void keyClicked(KeyEvent* e) { // Do nothing e->consume(); } bool frameEnded(const FrameEvent& evt) { if (mShutdownRequested) return false; else return ExampleFrameListener::frameEnded(evt); } */ void changeAlgorithm() { mAlgorithmType = ++mAlgorithmType % OcclusionCullingSceneManager::NUM_RENDERMODES; mAlgorithmInfo->setCaption("Algorithm: " + mAlgorithmTypeCaptions[mAlgorithmType]); } protected: bool mLMouseDown, mRMouseDown; // True if the mouse buttons are down SceneManager *mSceneMgr; // A pointer to the scene manager SceneNode *mCurrentObject; // The newly created object CEGUI::Renderer *mGUIRenderer; // cegui renderer SceneNode* mShipNode; // bool mShutdownRequested; int mAlgorithmType; OverlayElement *mAlgorithmInfo; }; class TestCullingApplication : public ExampleApplication { public: /*TestCullingApplication() { }*/ protected: void createScene(void); void createFrameListener(void) { mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer, mShipNode); mFrameListener->showDebugOverlay(true); mRoot->addFrameListener(mFrameListener); } CEGUI::OgreCEGUIRenderer *mGUIRenderer; CEGUI::System *mGUISystem; private: Entity* mShip; SceneNode* mShipNode; /* String mQuakePk3; String mQuakeLevel; // Override resource sources (include Quake3 archives) void setupResources(void) { // Load Quake3 locations from a file ConfigFile cf; cf.load("quake3settings.cfg"); mQuakePk3 = cf.getSetting("Pak0Location"); mQuakeLevel = cf.getSetting("Map"); ExampleApplication::setupResources(); ResourceManager::addCommonArchiveEx(mQuakePk3, "Zip"); }*/ // Override scene manager (use indoor instead of generic) void chooseSceneManager(void) { mSceneMgr = mRoot->getSceneManager(ST_GENERIC); } };