-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathGeneratorFrameListener.h
210 lines (172 loc) · 6.99 KB
/
GeneratorFrameListener.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/* The MIT License (MIT)
*
* Copyright (c) 2015 Giovanni Ortolani, Taneli Mikkonen, Pingjiang Li, Tommi Puolamaa, Mitra Vahida
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. */
/*
-----------------------------------------------------------------------------
Filename: GeneratorFrameListener.h
Description: Defines an Generator frame listener which responds to frame events.
This frame listener just moves a specified camera around based on
keyboard and mouse movements.
Esc: Quit.
Mouse: Freelook
W or Up: Forward
S or Down: Backward
A: Step left
D: Step right
R: Render mode
X: Look at the planet
F: Toggle frame rate stats on/off
U: Choose previous object
O: Choose next object
I: Move selected object up
J: Move selected object down
K: Move selected object to left
L: Move selected object to right
******************************************************************************
Not used yet
PgUp: Move upwards
PgDown: Move downwards
T: Cycle texture filtering
Bilinear, Trilinear, Anisotropic(8)
P: Toggle on/off display of camera position / orientation
//if INCLUDE_RTSHADER_SYSTEM
F2: Set the main viewport material scheme to default material manager scheme.
F3: Set the main viewport material scheme to shader generator default scheme.
F4: Toggle default shader generator lighting model from per vertex to per pixel.
-----------------------------------------------------------------------------
*/
#ifndef __GeneratorFrameListener_H__
#define __GeneratorFrameListener_H__
#include "Ogre.h"
#include "OgreStringConverter.h"
#include "OgreException.h"
#include "OgreStringConverter.h"
#include "OgreException.h"
#include "OgreOverlaySystem.h"
#include "OgreTextAreaOverlayElement.h"
#include "OgreFontManager.h"
#include "PSphere.h"
#include "CollisionManager.h"
//Use this define to signify OIS will be used as a DLL
//(so that dll import/export macros are in effect)
#define OIS_DYNAMIC_LIB
#include <OIS/OIS.h>
#ifdef INCLUDE_RTSHADER_SYSTEM
#include "OgreRTShaderSystem.h"
#endif
/*
------------------------------------------------------------------------------------------
The Lifcycle of the frame listener:
After call Root->startRendering() function in initOgre's setSceneAndRun() function,
The Root begin to call renderOneFrame() function over and over again.
In renderOneFrame(void):
bool Root::renderOneFrame(void)
{
if(!_fireFrameStarted()) //call the FrameStarted() function from all listeners
return false;
if (!_updateAllRenderTargets())
return false;
return _fireFrameEnded();//call the FrameEnded() function from all listeners
}
In _updateAllRenderTargets() function:
bool Root::_updateAllRenderTargets(void)
{
// update all targets but don't swap buffers
mActiveRenderer->_updateAllRenderTargets(false);
// give client app opportunity to use queued GPU time
bool ret = _fireFrameRenderingQueued(); //call the frameRenderingQueued() function from all listeners
// block for final swap
mActiveRenderer->_swapAllRenderTargetBuffers(mActiveRenderer->getWaitForVerticalBlank());
return ret;
}
In a nutshell, The three principle function work like that:
frameStarted()
|
updateAllRenderTargets()
| |
render(Using GPU) frameRenderingQueued(Using CPU)
| |
frameEnded()
Although frameStarted() and frameRenderingQueued() start before frameEnded,
render by GPU need some time, at the mean while, frameRenderingQueued() can work,
so it is better to put pre-processing in this function rather than frameStarted()
------------------------------------------------------------------------------------------
*/
class GeneratorFrameListener: public Ogre::FrameListener, public Ogre::WindowEventListener
{
protected:
virtual void updateStats(void); //overlay update
public:
GeneratorFrameListener();
// Constructor takes a RenderWindow because it uses that to determine input context
GeneratorFrameListener(Ogre::RenderWindow* win, Ogre::Camera* cam, PSphere *ps, Ogre::SceneManager *Sc,Ogre::SceneNode *RSN,CollisionManager *CDM ,bool bufferedKeys = false, bool bufferedMouse = false,
bool bufferedJoy = false );
#ifdef INCLUDE_RTSHADER_SYSTEM
virtual void processShaderGeneratorInput();
#endif
//Adjust mouse clipping area
virtual void windowResized(Ogre::RenderWindow* rw);
//Unattach OIS before window shutdown (very important under Linux)
virtual void windowClosed(Ogre::RenderWindow* rw);
virtual ~GeneratorFrameListener();
virtual bool processUnbufferedKeyInput(const Ogre::FrameEvent& evt);
virtual bool processUnbufferedMouseInput(const Ogre::FrameEvent& evt);
virtual void moveCamera();
virtual void showDebugOverlay(bool show);
// Start before each frame war generated
virtual bool frameStarted(const Ogre::FrameEvent& evt);
// Start after frameStarted() and before frameEnded(),Override frameRenderingQueued event to process that (don't care about frameEnded)
bool frameRenderingQueued(const Ogre::FrameEvent& evt);
// Recall after each frame was ended
bool frameEnded(const Ogre::FrameEvent& evt);
protected:
Ogre::SceneManager *Scene;
Ogre::SceneNode *RootSceneNode;//use to find the entity
PSphere *pSphere;
CollisionManager *CollisionDetectionManager;
Ogre::Camera *mCamera;
Ogre::Vector3 mTranslateVector;
Ogre::Real mCurrentSpeed;
Ogre::RenderWindow *mWindow;
bool mStatsOn;
Ogre::String mDebugText;
unsigned int mNumScreenShots;
float mMoveScale;
float mSpeedLimit;
Ogre::Degree mRotScale;
// just to stop toggles flipping too fast
Ogre::Real mTimeUntilNextToggle ;
Ogre::Radian mRotX, mRotY;
Ogre::TextureFilterOptions mFiltering;
int mAniso;
int mSceneDetailIndex ;
Ogre::Real mMoveSpeed;
Ogre::Degree mRotateSpeed;
Ogre::Overlay* mDebugOverlay;
Ogre::Overlay* mInformationOverlay;//show information
ObjectInfo* selectedObject;
//OIS Input devices
OIS::InputManager* mInputManager;
OIS::Mouse* mMouse;
OIS::Keyboard* mKeyboard;
OIS::JoyStick* mJoy;
};
#endif