source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/include/LBBC/LBBCBillboardViewMode.h @ 900

Revision 900, 6.7 KB checked in by igarcia, 18 years ago (diff)
Line 
1#ifndef _LBBCBILLBOARDVIEWMODE_H
2#define _LBBCBILLBOARDVIEWMODE_H
3
4
5#include "OBAOgreFrameListenerMode.h"
6
7namespace LBBC {
8
9class BillboardViewMode : public OBA::OgreFrameListenerMode
10{
11        public:
12                BillboardViewMode(Ogre::RenderWindow* win, unsigned int ogreFrameListenerModeHandle, bool useBufferedInputKeys = false, bool useBufferedInputMouse = false):
13                  OBA::OgreFrameListenerMode(win, ogreFrameListenerModeHandle, useBufferedInputKeys, useBufferedInputMouse)
14                {
15                        showDebugOverlay(false);
16                        epsilonX = 0.0;
17                        epsilonY = 0.0;
18                        factor = 0.125;
19                }
20
21                virtual ~BillboardViewMode()
22                {
23                }
24
25                bool frameStarted(const Ogre::FrameEvent& evt, Ogre::InputReader *inputReader)
26                {
27                        showDebugOverlay(true);
28                        mWindow->getViewport(0)->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0, 1.0));                   
29                        mEpsilonText = Ogre::String("Epsilon:") + Ogre::StringConverter::toString(epsilonX) + Ogre::String(",") + Ogre::StringConverter::toString(epsilonY);
30                        mWindow->setDebugText(mEpsilonText);
31
32                        return OgreFrameListenerMode::frameStarted(evt, inputReader);   
33                }
34
35                virtual bool processUnbufferedKeyInput(const Ogre::FrameEvent& evt)
36                {                       
37                        if (mInputDevice->isKeyDown(Ogre::KC_RIGHT))
38                        {
39                                epsilonX = epsilonX + (factor * evt.timeSinceLastFrame);                               
40                        }
41
42                        if (mInputDevice->isKeyDown(Ogre::KC_LEFT))
43                        {
44                                epsilonX = epsilonX - (factor * evt.timeSinceLastFrame);
45                        }
46
47                        if (mInputDevice->isKeyDown(Ogre::KC_UP))
48                        {
49                                epsilonY = epsilonY + (factor * evt.timeSinceLastFrame);
50                        }
51                       
52                        if (mInputDevice->isKeyDown(Ogre::KC_DOWN))
53                        {
54                                epsilonY = epsilonY - (factor * evt.timeSinceLastFrame);
55                        }
56
57                        if (mBillboardCloudEntity->getSubEntity(0)->getMaterial()->getBestTechnique()->getPass(0)->hasFragmentProgram())
58                        {
59                                mFragParams = mBillboardCloudEntity->getSubEntity(0)->getMaterial()->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
60                                if (mFragParams->getNumConstantDefinitions() > 0)
61                                {
62                                        mFragParams->setNamedConstant("epsilonX", epsilonX);
63                                        mFragParams->setNamedConstant("epsilonY", epsilonY);
64                                }
65                        }
66
67                        if (mInputDevice->isKeyDown(Ogre::KC_A))
68                        {
69                                // Move camera left
70                                mTranslateVector.x = -mMoveScale;
71                        }
72
73                        if (mInputDevice->isKeyDown(Ogre::KC_D))
74                        {
75                                // Move camera RIGHT
76                                mTranslateVector.x = mMoveScale;
77                        }
78
79                        ///* Move camera forward by keypress. */
80                        //if (mInputDevice->isKeyDown(Ogre::KC_UP) || mInputDevice->isKeyDown(Ogre::KC_W) )
81                        //{
82                        //      mTranslateVector.z = -mMoveScale;
83                        //}
84
85                        ///* Move camera backward by keypress. */
86                        //if (mInputDevice->isKeyDown(Ogre::KC_DOWN) || mInputDevice->isKeyDown(Ogre::KC_S) )
87                        //{
88                        //      mTranslateVector.z = mMoveScale;
89                        //}
90
91                        /* Move camera forward by keypress. */
92                        if (mInputDevice->isKeyDown(Ogre::KC_W) )
93                        {
94                                mTranslateVector.z = -mMoveScale;
95                        }
96
97                        /* Move camera backward by keypress. */
98                        if (mInputDevice->isKeyDown(Ogre::KC_S) )
99                        {
100                                mTranslateVector.z = mMoveScale;
101                        }
102
103                        if (mInputDevice->isKeyDown(Ogre::KC_PGUP))
104                        {
105                                // Move camera up
106                                mTranslateVector.y = mMoveScale;
107                        }
108
109                        if (mInputDevice->isKeyDown(Ogre::KC_PGDOWN))
110                        {
111                                // Move camera down
112                                mTranslateVector.y = -mMoveScale;
113                        }
114
115                        //if (mInputDevice->isKeyDown(Ogre::KC_RIGHT))
116                        //{
117                        //      mCamera->yaw(-mRotScale);
118                        //}
119                        //
120                        //if (mInputDevice->isKeyDown(Ogre::KC_LEFT))
121                        //{
122                        //      mCamera->yaw(mRotScale);
123                        //}
124
125                        // see if switching is on, and you want to toggle
126                        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_M) && mTimeUntilNextToggle <= 0)
127                        {
128                                switchMouseMode();
129                                mTimeUntilNextToggle = 1;
130                        }
131
132                        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_K) && mTimeUntilNextToggle <= 0)
133                        {
134                                // must be going from immediate keyboard to buffered keyboard
135                                switchKeyMode();
136                                mTimeUntilNextToggle = 1;
137                        }
138                        if (mInputDevice->isKeyDown(Ogre::KC_F) && mTimeUntilNextToggle <= 0)
139                        {
140                                mStatsOn = !mStatsOn;
141                                showDebugOverlay(mStatsOn);
142
143                                mTimeUntilNextToggle = 1;
144                        }
145                        if (mInputDevice->isKeyDown(Ogre::KC_T) && mTimeUntilNextToggle <= 0)
146                        {
147                                switch(mFiltering)
148                                {
149                                case Ogre::TFO_BILINEAR:
150                                        mFiltering = Ogre::TFO_TRILINEAR;
151                                        mAniso = 1;
152                                        break;
153                                case Ogre::TFO_TRILINEAR:
154                                        mFiltering = Ogre::TFO_ANISOTROPIC;
155                                        mAniso = 8;
156                                        break;
157                                case Ogre::TFO_ANISOTROPIC:
158                                        mFiltering = Ogre::TFO_BILINEAR;
159                                        mAniso = 1;
160                                        break;
161                                default:
162                                        break;
163                                }
164                                Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
165                                Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
166
167
168                                showDebugOverlay(mStatsOn);
169
170                                mTimeUntilNextToggle = 1;
171                        }
172
173                        if (mInputDevice->isKeyDown(Ogre::KC_SYSRQ) && mTimeUntilNextToggle <= 0)
174                        {
175                                char tmp[20];
176                                sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots);
177                                mWindow->writeContentsToFile(tmp);
178                                mTimeUntilNextToggle = 0.5;
179                                mWindow->setDebugText(Ogre::String("Wrote ") + tmp);
180                        }
181                       
182                        if (mInputDevice->isKeyDown(Ogre::KC_R) && mTimeUntilNextToggle <=0)
183                        {
184                                mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;
185                                switch(mSceneDetailIndex) {
186                                        case 0 : mCamera->setPolygonMode(Ogre::PM_SOLID) ; break ;
187                                        case 1 : mCamera->setPolygonMode(Ogre::PM_WIREFRAME) ; break ;
188                                        case 2 : mCamera->setPolygonMode(Ogre::PM_POINTS) ; break ;
189                                }
190                                mTimeUntilNextToggle = 0.5;
191                        }
192
193                        static bool displayCameraDetails = false;
194                        if (mInputDevice->isKeyDown(Ogre::KC_P) && mTimeUntilNextToggle <= 0)
195                        {
196                                displayCameraDetails = !displayCameraDetails;
197                                mTimeUntilNextToggle = 0.5;
198                                if (!displayCameraDetails)
199                                        mWindow->setDebugText("");
200                        }
201                        if (displayCameraDetails)
202                        {
203                                // Print camera details
204                                mWindow->setDebugText("P: " + Ogre::StringConverter::toString(mCamera->getDerivedPosition()) + " " +
205                                        "O: " + Ogre::StringConverter::toString(mCamera->getDerivedOrientation()));
206                        }                       
207
208                        // Return true to continue rendering
209                        return true;
210                }
211                void setBillboardCloudMeshName(Ogre::String billboardCloudMeshName)
212                {
213                        mBillboardCloudMeshName = billboardCloudMeshName;
214                }
215
216                virtual void createScene()
217                {
218                        mWindow->getViewport(0)->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0, 1.0));
219
220                        Ogre::SceneNode* sNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
221                        mBillboardCloudEntity = mSceneMgr->createEntity(mBillboardCloudMeshName, mBillboardCloudMeshName);     
222                        sNode->attachObject(mBillboardCloudEntity);
223                }
224
225        protected:
226                Ogre::String mBillboardCloudMeshName;
227
228                Ogre::Entity *mBillboardCloudEntity;
229
230                Ogre::Real epsilonX;
231
232                Ogre::Real epsilonY;
233               
234                Ogre::Real factor;
235
236                Ogre::String mEpsilonText;
237
238                Ogre::GpuProgramParametersSharedPtr mFragParams;
239};
240
241}
242#endif
Note: See TracBrowser for help on using the repository browser.