#ifndef _LBBCBILLBOARDVIEWMODE_H #define _LBBCBILLBOARDVIEWMODE_H #include "OBAOgreFrameListenerMode.h" namespace LBBC { class BillboardViewMode : public OBA::OgreFrameListenerMode { public: BillboardViewMode(Ogre::RenderWindow* win, unsigned int ogreFrameListenerModeHandle, bool useBufferedInputKeys = false, bool useBufferedInputMouse = false): OBA::OgreFrameListenerMode(win, ogreFrameListenerModeHandle, useBufferedInputKeys, useBufferedInputMouse) { showDebugOverlay(false); epsilonX = 0.0; epsilonY = 0.0; factor = 0.125; } virtual ~BillboardViewMode() { } bool frameStarted(const Ogre::FrameEvent& evt, Ogre::InputReader *inputReader) { showDebugOverlay(true); mWindow->getViewport(0)->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0, 1.0)); mEpsilonText = Ogre::String("Epsilon:") + Ogre::StringConverter::toString(epsilonX) + Ogre::String(",") + Ogre::StringConverter::toString(epsilonY); mWindow->setDebugText(mEpsilonText); return OgreFrameListenerMode::frameStarted(evt, inputReader); } virtual bool processUnbufferedKeyInput(const Ogre::FrameEvent& evt) { if (mInputDevice->isKeyDown(Ogre::KC_RIGHT)) { epsilonX = epsilonX + (factor * evt.timeSinceLastFrame); } if (mInputDevice->isKeyDown(Ogre::KC_LEFT)) { epsilonX = epsilonX - (factor * evt.timeSinceLastFrame); } if (mInputDevice->isKeyDown(Ogre::KC_UP)) { epsilonY = epsilonY + (factor * evt.timeSinceLastFrame); } if (mInputDevice->isKeyDown(Ogre::KC_DOWN)) { epsilonY = epsilonY - (factor * evt.timeSinceLastFrame); } mFragParams = mBillboardCloudEntity->getSubEntity(0)->getMaterial()->getBestTechnique()->getPass(0)->getFragmentProgramParameters(); mFragParams->setNamedConstant("epsilonX", epsilonX); mFragParams->setNamedConstant("epsilonY", epsilonY); if (mInputDevice->isKeyDown(Ogre::KC_A)) { // Move camera left mTranslateVector.x = -mMoveScale; } if (mInputDevice->isKeyDown(Ogre::KC_D)) { // Move camera RIGHT mTranslateVector.x = mMoveScale; } ///* Move camera forward by keypress. */ //if (mInputDevice->isKeyDown(Ogre::KC_UP) || mInputDevice->isKeyDown(Ogre::KC_W) ) //{ // mTranslateVector.z = -mMoveScale; //} ///* Move camera backward by keypress. */ //if (mInputDevice->isKeyDown(Ogre::KC_DOWN) || mInputDevice->isKeyDown(Ogre::KC_S) ) //{ // mTranslateVector.z = mMoveScale; //} /* Move camera forward by keypress. */ if (mInputDevice->isKeyDown(Ogre::KC_W) ) { mTranslateVector.z = -mMoveScale; } /* Move camera backward by keypress. */ if (mInputDevice->isKeyDown(Ogre::KC_S) ) { mTranslateVector.z = mMoveScale; } if (mInputDevice->isKeyDown(Ogre::KC_PGUP)) { // Move camera up mTranslateVector.y = mMoveScale; } if (mInputDevice->isKeyDown(Ogre::KC_PGDOWN)) { // Move camera down mTranslateVector.y = -mMoveScale; } //if (mInputDevice->isKeyDown(Ogre::KC_RIGHT)) //{ // mCamera->yaw(-mRotScale); //} // //if (mInputDevice->isKeyDown(Ogre::KC_LEFT)) //{ // mCamera->yaw(mRotScale); //} // see if switching is on, and you want to toggle if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_M) && mTimeUntilNextToggle <= 0) { switchMouseMode(); mTimeUntilNextToggle = 1; } if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_K) && mTimeUntilNextToggle <= 0) { // must be going from immediate keyboard to buffered keyboard switchKeyMode(); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(Ogre::KC_F) && mTimeUntilNextToggle <= 0) { mStatsOn = !mStatsOn; showDebugOverlay(mStatsOn); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(Ogre::KC_T) && mTimeUntilNextToggle <= 0) { switch(mFiltering) { case Ogre::TFO_BILINEAR: mFiltering = Ogre::TFO_TRILINEAR; mAniso = 1; break; case Ogre::TFO_TRILINEAR: mFiltering = Ogre::TFO_ANISOTROPIC; mAniso = 8; break; case Ogre::TFO_ANISOTROPIC: mFiltering = Ogre::TFO_BILINEAR; mAniso = 1; break; default: break; } Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering); Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(mAniso); showDebugOverlay(mStatsOn); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(Ogre::KC_SYSRQ) && mTimeUntilNextToggle <= 0) { char tmp[20]; sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots); mWindow->writeContentsToFile(tmp); mTimeUntilNextToggle = 0.5; mWindow->setDebugText(Ogre::String("Wrote ") + tmp); } if (mInputDevice->isKeyDown(Ogre::KC_R) && mTimeUntilNextToggle <=0) { mSceneDetailIndex = (mSceneDetailIndex+1)%3 ; switch(mSceneDetailIndex) { case 0 : mCamera->setPolygonMode(Ogre::PM_SOLID) ; break ; case 1 : mCamera->setPolygonMode(Ogre::PM_WIREFRAME) ; break ; case 2 : mCamera->setPolygonMode(Ogre::PM_POINTS) ; break ; } mTimeUntilNextToggle = 0.5; } static bool displayCameraDetails = false; if (mInputDevice->isKeyDown(Ogre::KC_P) && mTimeUntilNextToggle <= 0) { displayCameraDetails = !displayCameraDetails; mTimeUntilNextToggle = 0.5; if (!displayCameraDetails) mWindow->setDebugText(""); } if (displayCameraDetails) { // Print camera details mWindow->setDebugText("P: " + Ogre::StringConverter::toString(mCamera->getDerivedPosition()) + " " + "O: " + Ogre::StringConverter::toString(mCamera->getDerivedOrientation())); } // Return true to continue rendering return true; } void setBillboardCloudMeshName(Ogre::String billboardCloudMeshName) { mBillboardCloudMeshName = billboardCloudMeshName; } virtual void createScene() { mWindow->getViewport(0)->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0, 1.0)); Ogre::SceneNode* sNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); mBillboardCloudEntity = mSceneMgr->createEntity(mBillboardCloudMeshName, mBillboardCloudMeshName); //mBillboardCloudEntity = mSceneMgr->createEntity("chestnutLeavesBillboardCloudGrouped.mesh", "chestnutLeavesBillboardCloudGrouped.mesh"); //mBillboardCloudEntity = mSceneMgr->createEntity("mapleLeavesBillboardCloudGrouped.mesh", "mapleLeavesBillboardCloudGrouped.mesh"); //mBillboardCloudEntity = mSceneMgr->createEntity("prunusLeavesBillboardCloudGrouped.mesh", "prunusLeavesBillboardCloudGrouped.mesh"); sNode->attachObject(mBillboardCloudEntity); //sNode->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Degree(-90.0))); } protected: Ogre::String mBillboardCloudMeshName; Ogre::Entity *mBillboardCloudEntity; Ogre::Real epsilonX; Ogre::Real epsilonY; Ogre::Real factor; Ogre::String mEpsilonText; Ogre::GpuProgramParametersSharedPtr mFragParams; }; } #endif