Bike-X  0.8
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
OVR_Stereo.h
Go to the documentation of this file.
1 /************************************************************************************
2 
3 PublicHeader: OVR.h
4 Filename : OVR_Stereo.h
5 Content : Stereo rendering functions
6 Created : November 30, 2013
7 Authors : Tom Fosyth
8 
9 Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
10 
11 Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
12 you may not use the Oculus VR Rift SDK except in compliance with the License,
13 which is provided at the time of installation or download, or which
14 otherwise accompanies this software in either electronic or hard copy form.
15 
16 You may obtain a copy of the License at
17 
18 http://www.oculusvr.com/licenses/LICENSE-3.1
19 
20 Unless required by applicable law or agreed to in writing, the Oculus VR SDK
21 distributed under the License is distributed on an "AS IS" BASIS,
22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 See the License for the specific language governing permissions and
24 limitations under the License.
25 
26 *************************************************************************************/
27 
28 #ifndef OVR_Stereo_h
29 #define OVR_Stereo_h
30 
31 #include "OVR_Device.h"
32 
33 // CAPI Forward declaration.
34 typedef struct ovrFovPort_ ovrFovPort;
35 typedef struct ovrRecti_ ovrRecti;
36 
37 namespace OVR {
38 
39 //-----------------------------------------------------------------------------------
40 // ***** Stereo Enumerations
41 
42 // StereoEye specifies which eye we are rendering for; it is used to
43 // retrieve StereoEyeParams.
45 {
49 };
50 
51 
52 //-----------------------------------------------------------------------------------
53 // ***** FovPort
54 
55 // FovPort describes Field Of View (FOV) of a viewport.
56 // This class has values for up, down, left and right, stored in
57 // tangent of the angle units to simplify calculations.
58 //
59 // As an example, for a standard 90 degree vertical FOV, we would
60 // have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
61 //
62 // CreateFromRadians/Degrees helper functions can be used to
63 // access FOV in different units.
64 
65 struct FovPort
66 {
67  float UpTan;
68  float DownTan;
69  float LeftTan;
70  float RightTan;
71 
72  FovPort ( float sideTan = 0.0f ) :
73  UpTan(sideTan), DownTan(sideTan), LeftTan(sideTan), RightTan(sideTan) { }
74  FovPort ( float u, float d, float l, float r ) :
75  UpTan(u), DownTan(d), LeftTan(l), RightTan(r) { }
76 
77  // C-interop support: FovPort <-> ovrFovPort (implementation in OVR_CAPI.cpp).
78  FovPort(const ovrFovPort& src);
79  operator ovrFovPort () const;
80 
81 
82  static FovPort CreateFromRadians(float horizontalFov, float verticalFov)
83  {
84  FovPort result;
85  result.UpTan = tanf ( verticalFov * 0.5f );
86  result.DownTan = tanf ( verticalFov * 0.5f );
87  result.LeftTan = tanf ( horizontalFov * 0.5f );
88  result.RightTan = tanf ( horizontalFov * 0.5f );
89  return result;
90  }
91 
92  static FovPort CreateFromDegrees(float horizontalFovDegrees,
93  float verticalFovDegrees)
94  {
95  return CreateFromRadians(DegreeToRad(horizontalFovDegrees),
96  DegreeToRad(verticalFovDegrees));
97  }
98 
99  // Get Horizontal/Vertical components of Fov in radians.
100  float GetVerticalFovRadians() const { return atanf(UpTan) + atanf(DownTan); }
101  float GetHorizontalFovRadians() const { return atanf(LeftTan) + atanf(RightTan); }
102  // Get Horizontal/Vertical components of Fov in degrees.
105 
106  // Compute maximum tangent value among all four sides.
107  float GetMaxSideTan() const
108  {
110  }
111 
112  // Converts Fov Tan angle units to [-1,1] render target NDC space
113  Vector2f TanAngleToRendertargetNDC(Vector2f const &tanEyeAngle);
114 
115 
116  // Compute per-channel minimum and maximum of Fov.
117  static FovPort Min(const FovPort& a, const FovPort& b)
118  {
119  FovPort fov( Alg::Min( a.UpTan , b.UpTan ),
120  Alg::Min( a.DownTan , b.DownTan ),
121  Alg::Min( a.LeftTan , b.LeftTan ),
122  Alg::Min( a.RightTan, b.RightTan ) );
123  return fov;
124  }
125 
126  static FovPort Max(const FovPort& a, const FovPort& b)
127  {
128  FovPort fov( Alg::Max( a.UpTan , b.UpTan ),
129  Alg::Max( a.DownTan , b.DownTan ),
130  Alg::Max( a.LeftTan , b.LeftTan ),
131  Alg::Max( a.RightTan, b.RightTan ) );
132  return fov;
133  }
134 };
135 
136 
137 
138 //-----------------------------------------------------------------------------------
139 // ***** ScaleAndOffset
140 
142 {
145 
146  ScaleAndOffset2D(float sx = 0.0f, float sy = 0.0f, float ox = 0.0f, float oy = 0.0f)
147  : Scale(sx, sy), Offset(ox, oy)
148  { }
149 };
150 
151 
152 //-----------------------------------------------------------------------------------
153 // ***** Misc. utility functions.
154 
155 // Inputs are 4 points (pFitX[0],pFitY[0]) through (pFitX[3],pFitY[3])
156 // Result is four coefficients in pResults[0] through pResults[3] such that
157 // y = pResult[0] + x * ( pResult[1] + x * ( pResult[2] + x * ( pResult[3] ) ) );
158 // passes through all four input points.
159 // Return is true if it succeeded, false if it failed (because two control points
160 // have the same pFitX value).
161 bool FitCubicPolynomial ( float *pResult, const float *pFitX, const float *pFitY );
162 
163 //-----------------------------------------------------------------------------------
164 // ***** LensConfig
165 
166 // LensConfig describes the configuration of a single lens in an HMD.
167 // - Eqn and K[] describe a distortion function.
168 // - MetersPerTanAngleAtCenter is the relationship between distance on a
169 // screen (at the center of the lens), and the angle variance of the light after it
170 // has passed through the lens.
171 // - ChromaticAberration is an array of parameters for controlling
172 // additional Red and Blue scaling in order to reduce chromatic aberration
173 // caused by the Rift lenses.
175 {
176  // The result is a scaling applied to the distance from the center of the lens.
177  float DistortionFnScaleRadiusSquared (float rsq) const;
178  // x,y,z components map to r,g,b scales.
180 
181  // DistortionFn applies distortion to the argument.
182  // Input: the distance in TanAngle/NIC space from the optical center to the input pixel.
183  // Output: the resulting distance after distortion.
184  float DistortionFn(float r) const
185  {
186  return r * DistortionFnScaleRadiusSquared ( r * r );
187  }
188 
189  // DistortionFnInverse computes the inverse of the distortion function on an argument.
190  float DistortionFnInverse(float r) const;
191 
192  // Also computes the inverse, but using a polynomial approximation. Warning - it's just an approximation!
193  float DistortionFnInverseApprox(float r) const;
194  // Sets up InvK[].
195  void SetUpInverseApprox();
196 
197  // Sets a bunch of sensible defaults.
198  void SetToIdentity();
199 
200 
201 
202  enum { NumCoefficients = 11 };
203 
206  float MaxR; // The highest R you're going to query for - the curve is unpredictable beyond it.
207 
209 
210  // Additional per-channel scaling is applied after distortion:
211  // Index [0] - Red channel constant coefficient.
212  // Index [1] - Red channel r^2 coefficient.
213  // Index [2] - Blue channel constant coefficient.
214  // Index [3] - Blue channel r^2 coefficient.
216 
218  float MaxInvR;
219 };
220 
221 
222 // For internal use - storing and loading lens config data
223 
224 // Returns true on success.
225 bool LoadLensConfig ( LensConfig *presult, UByte const *pbuffer, int bufferSizeInBytes );
226 
227 // Returns number of bytes needed.
228 int SaveLensConfigSizeInBytes ( LensConfig const &config );
229 // Returns true on success.
230 bool SaveLensConfig ( UByte *pbuffer, int bufferSizeInBytes, LensConfig const &config );
231 
232 
233 //-----------------------------------------------------------------------------------
234 // ***** DistortionRenderDesc
235 
236 // This describes distortion for a single eye in an HMD with a display, not just the lens by itself.
238 {
239  // The raw lens values.
241 
242  // These map from [-1,1] across the eye being rendered into TanEyeAngle space (but still distorted)
245  // Computed from device characteristics, IPD and eye-relief.
246  // (not directly used for rendering, but very useful)
248 };
249 
250 
251 
252 //-----------------------------------------------------------------------------------
253 // ***** HmdRenderInfo
254 
255 // All the parts of the HMD info that are needed to set up the rendering system.
256 
258 {
259  // The start of this sturucture is intentionally very similar to HMDInfo in OVER_Device.h
260  // However to reduce interdependencies, one does not simply #include the other.
261 
263 
264  // Size of the entire screen
268 
269  // Characteristics of the lenses.
275 
276  // Timing & shutter data. All values in seconds.
277  struct ShutterInfo
278  {
280  float VsyncToNextVsync; // 1/framerate
281  float VsyncToFirstScanline; // for global shutter, vsync->shutter open.
282  float FirstScanlineToLastScanline; // for global shutter, will be zero.
283  float PixelSettleTime; // estimated.
284  float PixelPersistence; // Full persistence = 1/framerate.
285  } Shutter;
286 
287 
288  // These are all set from the user's profile.
289  struct EyeConfig
290  {
291  // Distance from center of eyeball to front plane of lens.
293  // Distance from nose (technically, center of Rift) to the middle of the eye.
295 
297  } EyeLeft, EyeRight;
298 
299 
301  {
303  ResolutionInPixels.w = 0;
304  ResolutionInPixels.h = 0;
305  ScreenSizeInMeters.w = 0.0f;
306  ScreenSizeInMeters.h = 0.0f;
307  ScreenGapSizeInMeters = 0.0f;
308  CenterFromTopInMeters = 0.0f;
309  LensSeparationInMeters = 0.0f;
310  LensDiameterInMeters = 0.0f;
313  Shutter.VsyncToNextVsync = 0.0f;
316  Shutter.PixelSettleTime = 0.0f;
317  Shutter.PixelPersistence = 0.0f;
319  EyeLeft.ReliefInMeters = 0.0f;
322  EyeRight = EyeLeft;
323  }
324 
325  // The "center eye" is the position the HMD tracking returns,
326  // and games will also usually use it for audio, aiming reticles, some line-of-sight tests, etc.
328  {
329  EyeConfig result;
331  result.NoseToPupilInMeters = 0.0f;
332  result.Distortion.SetToIdentity();
333  return result;
334  }
335 
336 };
337 
338 
339 
340 
341 //-----------------------------------------------------------------------------------
342 
343 // Stateless computation functions, in somewhat recommended execution order.
344 // For examples on how to use many of them, see the StereoConfig::UpdateComputedState function.
345 
347 
348 // Creates a dummy debug HMDInfo matching a particular HMD model.
349 // Useful for development without an actual HMD attached.
351 
352 
353 // profile may be NULL, in which case it uses the hard-coded defaults.
354 // distortionType should be left at the default unless you require something specific for your distortion shaders.
355 // eyeCupOverride can be EyeCup_LAST, in which case it uses the one in the profile.
357  Profile const *profile = NULL,
359  EyeCupType eyeCupOverride = EyeCup_LAST );
360 
361 LensConfig GenerateLensConfigFromEyeRelief ( float eyeReliefInMeters, HmdRenderInfo const &hmd,
362  DistortionEqnType distortionType = Distortion_CatmullRom10 );
363 
365  LensConfig const *pLensOverride = NULL );
366 
367 FovPort CalculateFovFromEyePosition ( float eyeReliefInMeters,
368  float offsetToRightInMeters,
369  float offsetDownwardsInMeters,
370  float lensDiameterInMeters,
371  float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION);
372 
374  DistortionRenderDesc const &distortion,
375  HmdRenderInfo const &hmd,
376  float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION );
377 
378 FovPort GetPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion );
379 
381  FovPort inputFovPort );
382 
383 Sizei CalculateIdealPixelSize ( StereoEye eyeType, DistortionRenderDesc const &distortion,
384  FovPort fov, float pixelsPerDisplayPixel );
385 
386 Recti GetFramebufferViewport ( StereoEye eyeType, HmdRenderInfo const &hmd );
387 
388 Matrix4f CreateProjection ( bool rightHanded, FovPort fov,
389  float zNear = 0.01f, float zFar = 10000.0f );
390 
391 Matrix4f CreateOrthoSubProjection ( bool rightHanded, StereoEye eyeType,
392  float tanHalfFovX, float tanHalfFovY,
393  float unitsX, float unitsY, float distanceFromCamera,
394  float interpupillaryDistance, Matrix4f const &projection,
395  float zNear = 0.0f, float zFar = 0.0f );
396 
398 
400  Recti renderedViewport,
401  Sizei renderTargetSize );
402 
403 
404 //-----------------------------------------------------------------------------------
405 // ***** StereoEyeParams
406 
407 // StereoEyeParams describes RenderDevice configuration needed to render
408 // the scene for one eye.
410 {
412  Matrix4f ViewAdjust; // Translation to be applied to view matrix.
413 
414  // Distortion and the VP on the physical display - the thing to run the distortion shader on.
417 
418  // Projection and VP of a particular view (you could have multiple of these).
419  Recti RenderedViewport; // Viewport that we render the standard scene to.
420  FovPort Fov; // The FOVs of this scene.
421  Matrix4f RenderedProjection; // Projection matrix used with this eye.
422  ScaleAndOffset2D EyeToSourceNDC; // Mapping from TanEyeAngle space to [-1,+1] on the rendered image.
423  ScaleAndOffset2D EyeToSourceUV; // Mapping from TanEyeAngle space to actual texture UV coords.
424 };
425 
426 
427 //-----------------------------------------------------------------------------------
428 // A set of "forward-mapping" functions, mapping from framebuffer space to real-world and/or texture space.
430  const Vector2f &framebufferNDC );
431 void TransformScreenNDCToTanFovSpaceChroma ( Vector2f *resultR, Vector2f *resultG, Vector2f *resultB,
432  DistortionRenderDesc const &distortion,
433  const Vector2f &framebufferNDC );
435  Vector2f const &tanEyeAngle );
437  Vector2f const &tanEyeAngle );
438 Vector2f TransformScreenPixelToScreenNDC( Recti const &distortionViewport,
439  Vector2f const &pixel );
440 Vector2f TransformScreenPixelToTanFovSpace ( Recti const &distortionViewport,
441  DistortionRenderDesc const &distortion,
442  Vector2f const &pixel );
444  StereoEyeParams const &eyeParams,
445  Vector2f const &pixel );
446 Vector2f TransformScreenPixelToRendertargetTexUV( Recti const &distortionViewport,
447  DistortionRenderDesc const &distortion,
448  StereoEyeParams const &eyeParams,
449  Vector2f const &pixel );
450 
451 // A set of "reverse-mapping" functions, mapping from real-world and/or texture space back to the framebuffer.
452 // Be aware that many of these are significantly slower than their forward-mapping counterparts.
454  const Vector2f &tanEyeAngle, bool usePolyApprox = false );
456  const Vector2f &textureNDC );
457 
458 } //namespace OVR
459 
460 #endif // OVR_Stereo_h
float RightTan
Definition: OVR_Stereo.h:70
struct OVR::HmdRenderInfo::ShutterInfo Shutter
float DistortionFnInverse(float r) const
Definition: OVR_Stereo.cpp:214
Vector2f TransformScreenPixelToScreenNDC(Recti const &distortionViewport, Vector2f const &pixel)
HmdTypeEnum HmdType
Definition: OVR_Stereo.h:262
const float OVR_DEFAULT_EXTRA_EYE_ROTATION
Definition: OVR_Stereo.h:346
T RadToDegree(T rads)
Definition: OVR_Math.h:226
Vector2f TransformTanFovSpaceToScreenNDC(DistortionRenderDesc const &distortion, const Vector2f &tanEyeAngle, bool usePolyApprox)
float K[NumCoefficients]
Definition: OVR_Stereo.h:205
Recti GetFramebufferViewport(StereoEye eyeType, HmdRenderInfo const &hmd)
Vector2f TransformScreenPixelToTanFovSpace(Recti const &distortionViewport, DistortionRenderDesc const &distortion, Vector2f const &pixel)
OVR_FORCE_INLINE const T Max(const T a, const T b)
Definition: OVR_Alg.h:49
struct OVR::HmdRenderInfo::EyeConfig EyeLeft
float GetMaxSideTan() const
Definition: OVR_Stereo.h:107
#define NULL
ScaleAndOffset2D CreateUVScaleAndOffsetfromNDCScaleandOffset(ScaleAndOffset2D scaleAndOffsetNDC, Recti renderedViewport, Sizei renderTargetSize)
float LensSeparationInMeters
Definition: OVR_Stereo.h:271
struct OVR::HmdRenderInfo::EyeConfig EyeRight
float DistortionFn(float r) const
Definition: OVR_Stereo.h:184
DistortionRenderDesc Distortion
Definition: OVR_Stereo.h:415
FovPort CalculateFovFromHmdInfo(StereoEye eyeType, DistortionRenderDesc const &distortion, HmdRenderInfo const &hmd, float extraEyeRotationInRadians)
Vector3f DistortionFnScaleRadiusSquaredChroma(float rsq) const
Definition: OVR_Stereo.cpp:203
T DegreeToRad(T rads)
Definition: OVR_Math.h:228
void TransformScreenNDCToTanFovSpaceChroma(Vector2f *resultR, Vector2f *resultG, Vector2f *resultB, DistortionRenderDesc const &distortion, const Vector2f &framebufferNDC)
static FovPort CreateFromRadians(float horizontalFov, float verticalFov)
Definition: OVR_Stereo.h:82
FovPort CalculateFovFromEyePosition(float eyeReliefInMeters, float offsetToRightInMeters, float offsetDownwardsInMeters, float lensDiameterInMeters, float extraEyeRotationInRadians)
uint8_t UByte
Definition: OVR_Types.h:249
Sizei CalculateIdealPixelSize(StereoEye eyeType, DistortionRenderDesc const &distortion, FovPort tanHalfFov, float pixelsPerDisplayPixel)
float MetersPerTanAngleAtCenter
Definition: OVR_Stereo.h:208
float DistortionFnInverseApprox(float r) const
Definition: OVR_Stereo.cpp:254
Matrix4f RenderedProjection
Definition: OVR_Stereo.h:421
float DistortionFnScaleRadiusSquared(float rsq) const
Definition: OVR_Stereo.cpp:166
FovPort(float u, float d, float l, float r)
Definition: OVR_Stereo.h:74
float ScreenGapSizeInMeters
Definition: OVR_Stereo.h:267
Vector2f TanAngleToRendertargetNDC(Vector2f const &tanEyeAngle)
Definition: OVR_CAPI.cpp:65
FovPort ClampToPhysicalScreenFov(StereoEye eyeType, DistortionRenderDesc const &distortion, FovPort inputFovPort)
LensConfig GenerateLensConfigFromEyeRelief(float eyeReliefInMeters, HmdRenderInfo const &hmd, DistortionEqnType distortionType)
Definition: OVR_Stereo.cpp:860
DistortionRenderDesc CalculateDistortionRenderDesc(StereoEye eyeType, HmdRenderInfo const &hmd, const LensConfig *pLensOverride)
FovPort GetPhysicalScreenFov(StereoEye eyeType, DistortionRenderDesc const &distortion)
Vector2f TransformTanFovSpaceToRendertargetNDC(StereoEyeParams const &eyeParams, Vector2f const &tanEyeAngle)
Size< int > ResolutionInPixels
Definition: OVR_Stereo.h:265
bool SaveLensConfig(UByte *pbuffer, int bufferSizeInBytes, LensConfig const &config)
Definition: OVR_Stereo.cpp:507
int SaveLensConfigSizeInBytes(LensConfig const &config)
Definition: OVR_Stereo.cpp:500
Matrix4f CreateProjection(bool rightHanded, FovPort tanHalfFov, float zNear, float zFar)
static FovPort Min(const FovPort &a, const FovPort &b)
Definition: OVR_Stereo.h:117
ScaleAndOffset2D EyeToSourceUV
Definition: OVR_Stereo.h:423
HMDInfo CreateDebugHMDInfo(HmdTypeEnum hmdType)
Definition: OVR_Stereo.cpp:588
float GetVerticalFovRadians() const
Definition: OVR_Stereo.h:100
float LensDiameterInMeters
Definition: OVR_Stereo.h:272
float InvK[NumCoefficients]
Definition: OVR_Stereo.h:217
FovPort(float sideTan=0.0f)
Definition: OVR_Stereo.h:72
void SetUpInverseApprox()
Definition: OVR_Stereo.cpp:290
float UpTan
Definition: OVR_Stereo.h:67
float GetHorizontalFovRadians() const
Definition: OVR_Stereo.h:101
struct ovrFovPort_ ovrFovPort
Definition: OVR_Stereo.h:34
Vector2f TransformTanFovSpaceToRendertargetTexUV(StereoEyeParams const &eyeParams, Vector2f const &tanEyeAngle)
void SetToIdentity()
Definition: OVR_Stereo.cpp:374
bool FitCubicPolynomial(float *pResult, const float *pFitX, const float *pFitY)
Definition: OVR_Stereo.cpp:50
ScaleAndOffset2D(float sx=0.0f, float sy=0.0f, float ox=0.0f, float oy=0.0f)
Definition: OVR_Stereo.h:146
ScaleAndOffset2D CreateNDCScaleAndOffsetFromFov(FovPort tanHalfFov)
static FovPort CreateFromDegrees(float horizontalFovDegrees, float verticalFovDegrees)
Definition: OVR_Stereo.h:92
bool LoadLensConfig(LensConfig *presult, UByte const *pbuffer, int bufferSizeInBytes)
Definition: OVR_Stereo.cpp:434
float GetHorizontalFovDegrees() const
Definition: OVR_Stereo.h:104
static FovPort Max(const FovPort &a, const FovPort &b)
Definition: OVR_Stereo.h:126
float LensSurfaceToMidplateInMeters
Definition: OVR_Stereo.h:273
float GetVerticalFovDegrees() const
Definition: OVR_Stereo.h:103
EyeConfig GetEyeCenter() const
Definition: OVR_Stereo.h:327
OVR_FORCE_INLINE const T Min(const T a, const T b)
Definition: OVR_Alg.h:46
Matrix4f CreateOrthoSubProjection(bool rightHanded, StereoEye eyeType, float tanHalfFovX, float tanHalfFovY, float unitsX, float unitsY, float distanceFromCamera, float interpupillaryDistance, Matrix4f const &projection, float zNear, float zFar)
float DownTan
Definition: OVR_Stereo.h:68
Vector2f TransformScreenNDCToTanFovSpace(DistortionRenderDesc const &distortion, const Vector2f &framebufferNDC)
float ChromaticAberration[4]
Definition: OVR_Stereo.h:215
Size< float > ScreenSizeInMeters
Definition: OVR_Stereo.h:266
EyeCupType EyeCups
Definition: OVR_Stereo.h:274
Vector2f PixelsPerTanAngleAtCenter
Definition: OVR_Stereo.h:247
Vector2f TransformRendertargetNDCToTanFovSpace(const ScaleAndOffset2D &eyeToSourceNDC, const Vector2f &textureNDC)
Vector2f TransformScreenNDCToRendertargetTexUV(DistortionRenderDesc const &distortion, StereoEyeParams const &eyeParams, Vector2f const &pixel)
Vector2f TransformScreenPixelToRendertargetTexUV(Recti const &distortionViewport, DistortionRenderDesc const &distortion, StereoEyeParams const &eyeParams, Vector2f const &pixel)
float LeftTan
Definition: OVR_Stereo.h:69
HmdRenderInfo GenerateHmdRenderInfoFromHmdInfo(HMDInfo const &hmdInfo, Profile const *profile, DistortionEqnType distortionType, EyeCupType eyeCupOverride)
Definition: OVR_Stereo.cpp:662
StereoEye
Definition: OVR_Stereo.h:44
ScaleAndOffset2D EyeToSourceNDC
Definition: OVR_Stereo.h:422
DistortionEqnType Eqn
Definition: OVR_Stereo.h:204
float CenterFromTopInMeters
Definition: OVR_Stereo.h:270