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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
/************************************************************************************
Filename : OculusWorldDemo.h
Content : First-person view test application for Oculus Rift - Header file
Created : October 4, 2012
Authors : Michael Antonov, Andrew Reisse, Steve LaValle, Dov Katz
Peter Hoff, Dan Goodman, Bryan Croteau
Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*************************************************************************************/
#ifndef INC_OculusWorldDemo_h
#define INC_OculusWorldDemo_h
#include "OVR_Kernel.h"
#include "../CommonSrc/Platform/Platform_Default.h"
#include "../CommonSrc/Render/Render_Device.h"
#include "../CommonSrc/Render/Render_XmlSceneLoader.h"
#include "../CommonSrc/Platform/Gamepad.h"
#include "../CommonSrc/Util/OptionMenu.h"
#include "../CommonSrc/Util/RenderProfiler.h"
#include "Util/Util_Render_Stereo.h"
using namespace OVR::Util::Render;
#include "Player.h"
#include "Sensors/OVR_DeviceConstants.h"
// Filename to be loaded by default, searching specified paths.
#define WORLDDEMO_ASSET_FILE "Tuscany.xml"
#define WORLDDEMO_ASSET_PATH1 "Assets/Tuscany/"
#define WORLDDEMO_ASSET_PATH2 "../../../Assets/Tuscany/"
// This path allows the shortcut to work.
#define WORLDDEMO_ASSET_PATH3 "Samples/OculusWorldDemo/Assets/Tuscany/"
#define WORLDDEMO_ASSET_PATH4 "../Assets/Tuscany/"
using namespace OVR;
using namespace OVR::OvrPlatform;
using namespace OVR::Render;
//-------------------------------------------------------------------------------------
// ***** OculusWorldDemo Description
// This app renders a loaded scene allowing the user to move along the
// floor and look around with an HMD, mouse and keyboard. The following keys work:
//
// 'W', 'S', 'A', 'D' and Arrow Keys - Move forward, back; strafe left/right.
//
// Space - Bring up status and help display.
// Tab - Bring up/hide menu with editable options.
// F4 - Toggle MSAA.
// F9 - Cycle through fullscreen and windowed modes.
// Necessary for previewing content with Rift.
//
// Important Oculus-specific logic can be found at following locations:
//
// OculusWorldDemoApp::OnStartup - This function will initialize the SDK, creating the Hmd
// and delegating to CalculateHmdValues to initialize it.
//
// OculusWorldDemoApp::OnIdle - Here we poll SensorFusion for orientation, apply it
// to the scene and handle movement.
// Stereo rendering is also done here, by delegating to
// to the RenderEyeView() function for each eye.
//
//-------------------------------------------------------------------------------------
// ***** OculusWorldDemo Application class
// An instance of this class is created on application startup (main/WinMain).
// It then works as follows:
// - Graphics and HMD setup is done OculusWorldDemoApp::OnStartup(). Much of
// HMD configuration here is moved to CalculateHmdValues.
// OnStartup also creates the room model from Slab declarations.
//
// - Per-frame processing is done in OnIdle(). This function processes
// sensor and movement input and then renders the frame.
//
// - Additional input processing is done in OnMouse, OnKey.
class OculusWorldDemoApp : public Application
{
public:
OculusWorldDemoApp();
~OculusWorldDemoApp();
virtual int OnStartup(int argc, const char** argv);
virtual void OnIdle();
virtual void OnMouseMove(int x, int y, int modifiers);
virtual void OnKey(OVR::KeyCode key, int chr, bool down, int modifiers);
virtual void OnResize(int width, int height);
bool SetupWindowAndRendering(int argc, const char** argv);
// Adds room model to scene.
void InitMainFilePath();
void PopulateScene(const char* fileName);
void PopulatePreloadScene();
void ClearScene();
void PopulateOptionMenu();
// Computes all of the Hmd values and configures render targets.
void CalculateHmdValues();
// Returns the actual size present.
Sizei EnsureRendertargetAtLeastThisBig (int rtNum, Sizei size);
// Renders full stereo scene for one eye.
void RenderEyeView(ovrEyeType eye);
// Renderes HUD overlay brough up by spacebar; 2D viewport must be set before call.
void RenderTextInfoHud(float textHeight);
void RenderAnimatedBlocks(ovrEyeType eye, double appTime);
void RenderGrid(ovrEyeType eye);
Matrix4f CalculateViewFromPose(const Posef& pose);
// Determine whether this frame needs rendering based on timewarp timing and flags.
bool FrameNeedsRendering(double curtime);
void ApplyDynamicResolutionScaling();
void UpdateFrameRateCounter(double curtime);
// Model creation and misc functions.
Model* CreateModel(Vector3f pos, struct SlabModel* sm);
Model* CreateBoundingModel(CollisionModel &cm);
void ChangeDisplay ( bool bBackToWindowed, bool bNextFullscreen, bool bFullWindowDebugging );
void GamepadStateChanged(const GamepadState& pad);
// Processes DeviceNotificationStatus queue to handles plug/unplug.
void ProcessDeviceNotificationQueue();
// ***** Callbacks for Menu option changes
// These contain extra actions to be taken in addition to switching the state.
void HmdSettingChange(OptionVar* = 0) { HmdSettingsChanged = true; }
void MirrorSettingChange(OptionVar* = 0)
{ HmdSettingsChanged = true; NotificationTimeout = ovr_GetTimeInSeconds() + 10.0f;}
void BlockShowChange(OptionVar* = 0) { BlocksCenter = ThePlayer.BodyPos; }
void EyeHeightChange(OptionVar* = 0) { ThePlayer.BodyPos.y = ThePlayer.UserEyeHeight; }
void HmdSensorToggle(OptionVar* = 0);
void HmdSettingChangeFreeRTs(OptionVar* = 0);
void MultisampleChange(OptionVar* = 0);
void CenterPupilDepthChange(OptionVar* = 0);
void DistortionClearColorChange(OptionVar* = 0);
void ResetHmdPose(OptionVar* = 0);
protected:
RenderDevice* pRender;
RendererParams RenderParams;
Sizei WindowSize;
int ScreenNumber;
int FirstScreenInCycle;
bool SupportsSrgb;
struct RenderTarget
{
Ptr<Texture> pTex;
ovrTexture Tex;
};
enum RendertargetsEnum
{
Rendertarget_Left,
Rendertarget_Right,
Rendertarget_BothEyes, // Used when both eyes are rendered to the same target.
Rendertarget_LAST
};
RenderTarget RenderTargets[Rendertarget_LAST];
// ***** Oculus HMD Variables
ovrHmd Hmd;
ovrEyeRenderDesc EyeRenderDesc[2];
Matrix4f Projection[2]; // Projection matrix for eye.
Matrix4f OrthoProjection[2]; // Projection for 2D.
ovrPosef EyeRenderPose[2]; // Poses we used for rendering.
ovrTexture EyeTexture[2];
Sizei EyeRenderSize[2]; // Saved render eye sizes; base for dynamic sizing.
// Sensor caps applied.
unsigned StartTrackingCaps;
bool UsingDebugHmd;
// Frame timing logic.
enum { SecondsOfFpsMeasurement = 1 };
int FrameCounter;
int TotalFrameCounter;
double NextFPSUpdate;
float SecondsPerFrame;
float FPS;
double LastFpsUpdate;
// Times a single frame.
double LastUpdate;
// Loaded data.
String MainFilePath;
Array<Ptr<CollisionModel> > CollisionModels;
Array<Ptr<CollisionModel> > GroundCollisionModels;
// Loading process displays screenshot in first frame
// and then proceeds to load until finished.
enum LoadingStateType
{
LoadingState_Frame0,
LoadingState_DoLoad,
LoadingState_Finished
} LoadingState;
// Current status flags so that edges can be reported
bool HaveVisionTracking;
bool HavePositionTracker;
bool HaveHMDConnected;
GamepadState LastGamepadState;
Player ThePlayer;
Matrix4f View;
Scene MainScene;
Scene LoadingScene;
Scene SmallGreenCube;
Scene OculusCubesScene;
Scene RedCubesScene;
Scene BlueCubesScene;
// Last frame asn sensor data reported by BeginFrame().
ovrFrameTiming HmdFrameTiming;
unsigned HmdStatus;
// Overlay notifications time out in
double NotificationTimeout;
// ***** Modifiable Menu Options
// This flag is set when HMD settings change, causing HMD to be re-initialized.
bool HmdSettingsChanged;
// Render Target - affecting state.
bool RendertargetIsSharedByBothEyes;
bool DynamicRezScalingEnabled;
bool EnableSensor;
bool ForceZeroIpd;
float DesiredPixelDensity;
float FovSideTanMax;
float FovSideTanLimit; // Limit value for Fov.
// Time-warp.
bool TimewarpEnabled;
bool TimewarpNoJitEnabled;
float TimewarpRenderIntervalInSeconds;
bool FreezeEyeUpdate;
bool FreezeEyeOneFrameRendered;
// Other global settings.
float CenterPupilDepthMeters;
// float IPD;
bool ForceZeroHeadMovement;
bool VsyncEnabled;
bool MultisampleEnabled;
// DK2 only
bool IsLowPersistence;
bool DynamicPrediction;
bool DisplaySleep;
bool PositionTrackingEnabled;
bool PixelLuminanceOverdrive;
bool MirrorToWindow;
// Support toggling background color for distortion so that we can see
// the effect on the periphery.
int DistortionClearBlue;
// Stereo settings adjustment state.
bool ShiftDown;
bool CtrlDown;
// ***** Scene Rendering Modes
enum SceneRenderMode
{
Scene_World,
Scene_Cubes,
Scene_OculusCubes
};
SceneRenderMode SceneMode;
enum GridDispayModeType
{
GridDisplay_None,
GridDisplay_GridOnly,
GridDisplay_GridAndScene
};
GridDispayModeType GridDisplayMode;
// What type of grid to display.
enum GridModeType
{
Grid_Rendertarget4,
Grid_Rendertarget16,
Grid_Lens,
Grid_Last
};
GridModeType GridMode;
// What help screen we display, brought up by 'Spacebar'.
enum TextScreen
{
Text_None,
Text_Info,
Text_Timing,
Text_Help1,
Text_Help2,
Text_Count
};
TextScreen TextScreen;
// Whether we are displaying animated blocks and what type.
int BlocksShowType;
Vector3f BlocksCenter;
// User configurable options, brought up by 'Tab' key.
// Also handles shortcuts and pop-up overlay messages.
OptionSelectionMenu Menu;
// Profiler for rendering - displays timing stats.
RenderProfiler Profiler;
};
#endif // INC_OculusWorldDemo_h
|