aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/OVR_CAPI.h
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/OVR_CAPI.h')
-rw-r--r--LibOVR/Src/OVR_CAPI.h842
1 files changed, 480 insertions, 362 deletions
diff --git a/LibOVR/Src/OVR_CAPI.h b/LibOVR/Src/OVR_CAPI.h
index ec4708c..e98cad7 100644
--- a/LibOVR/Src/OVR_CAPI.h
+++ b/LibOVR/Src/OVR_CAPI.h
@@ -1,7 +1,7 @@
/************************************************************************************
Filename : OVR_CAPI.h
-Content : C Interface to Oculus sensors and rendering.
+Content : C Interface to Oculus tracking and rendering.
Created : November 23, 2013
Authors : Michael Antonov
@@ -23,6 +23,15 @@ See the License for the specific language governing permissions and
limitations under the License.
************************************************************************************/
+
+/// @file OVR_CAPI.h
+/// Exposes all general Rift functionality.
+///
+/// @mainpage Overview
+/// Welcome to the Oculus SDK Reference Manual. All SDK functionality is exposed through a simple and portable C API, found in OVR_CAPI.h.
+///
+/// Please see the Oculus Developer Guide for detailed information about using the SDK in your native applications.
+
#ifndef OVR_CAPI_h
#define OVR_CAPI_h
@@ -34,59 +43,67 @@ typedef char ovrBool;
// ***** OVR_EXPORT definition
#if !defined(OVR_EXPORT)
- #if defined(WIN32)
+ #ifdef OVR_OS_WIN32
#define OVR_EXPORT __declspec(dllexport)
#else
#define OVR_EXPORT
#endif
#endif
+//#define ENABLE_LATENCY_TESTER
+
//-----------------------------------------------------------------------------------
// ***** Simple Math Structures
-// 2D integer
+/// A 2D vector with integer components.
typedef struct ovrVector2i_
{
int x, y;
} ovrVector2i;
+/// A 2D size with integer components.
typedef struct ovrSizei_
{
int w, h;
} ovrSizei;
+/// A 2D rectangle with a position and size.
+/// All components are integers.
typedef struct ovrRecti_
{
ovrVector2i Pos;
ovrSizei Size;
} ovrRecti;
-// 3D
+/// A quaternion rotation.
typedef struct ovrQuatf_
{
float x, y, z, w;
} ovrQuatf;
+/// A 2D vector with float components.
typedef struct ovrVector2f_
{
float x, y;
} ovrVector2f;
+/// A 3D vector with float components.
typedef struct ovrVector3f_
{
float x, y, z;
} ovrVector3f;
+/// A 4x4 matrix with float elements.
typedef struct ovrMatrix4f_
{
float M[4][4];
} ovrMatrix4f;
-// Position and orientation together.
+/// Position and orientation together.
typedef struct ovrPosef_
{
ovrQuatf Orientation;
ovrVector3f Position;
} ovrPosef;
-// Full pose (rigid body) configuration with first and second derivatives.
+/// A full pose (rigid body) configuration with first and second derivatives.
typedef struct ovrPoseStatef_
{
- ovrPosef Pose;
+ ovrPosef ThePose;
ovrVector3f AngularVelocity;
ovrVector3f LinearVelocity;
ovrVector3f AngularAcceleration;
@@ -94,14 +111,18 @@ typedef struct ovrPoseStatef_
double TimeInSeconds; // Absolute time of this state sample.
} ovrPoseStatef;
-// Field Of View (FOV) in tangent of the angle units.
-// As an example, for a standard 90 degree vertical FOV, we would
-// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
+/// Field Of View (FOV) in tangent of the angle units.
+/// As an example, for a standard 90 degree vertical FOV, we would
+/// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
typedef struct ovrFovPort_
{
+ /// The tangent of the angle between the viewing vector and the top edge of the field of view.
float UpTan;
+ /// The tangent of the angle between the viewing vector and the bottom edge of the field of view.
float DownTan;
+ /// The tangent of the angle between the viewing vector and the left edge of the field of view.
float LeftTan;
+ /// The tangent of the angle between the viewing vector and the right edge of the field of view.
float RightTan;
} ovrFovPort;
@@ -109,71 +130,77 @@ typedef struct ovrFovPort_
//-----------------------------------------------------------------------------------
// ***** HMD Types
-// Enumerates all HMD types that we support.
+/// Enumerates all HMD types that we support.
typedef enum
{
ovrHmd_None = 0,
ovrHmd_DK1 = 3,
- ovrHmd_DKHD = 4,
- ovrHmd_CrystalCoveProto = 5,
+ ovrHmd_DKHD = 4,
ovrHmd_DK2 = 6,
ovrHmd_Other // Some HMD other then the one in the enumeration.
} ovrHmdType;
-// HMD capability bits reported by device.
-//
+/// HMD capability bits reported by device.
typedef enum
{
// Read-only flags.
- ovrHmdCap_Present = 0x0001, // This HMD exists (as opposed to being unplugged).
- ovrHmdCap_Available = 0x0002, // HMD and is sensor is available for use
- // (if not owned by another app).
+ ovrHmdCap_Present = 0x0001, /// The HMD is plugged in and detected by the system.
+ ovrHmdCap_Available = 0x0002, /// The HMD and its sensor is available for ownership use.
+ /// i.e. it is not already owned by another application.
+ ovrHmdCap_Captured = 0x0004, /// Set to 'true' if we captured ownership of this HMD.
// These flags are intended for use with the new driver display mode.
- /*
- ovrHmdCap_ExtendDesktop = 0x0004, // Read only, means display driver is in compatibility mode.
-
- ovrHmdCap_DisplayOff = 0x0040, // Turns off Oculus HMD screen and output.
- ovrHmdCap_NoMirrorToWindow = 0x2000, // Disables mirrowing of HMD output to the window;
- // may improve rendering performance slightly.
- */
+ ovrHmdCap_ExtendDesktop = 0x0008, /// (read only) Means the display driver is in compatibility mode.
// Modifiable flags (through ovrHmd_SetEnabledCaps).
- ovrHmdCap_LowPersistence = 0x0080, // Supports low persistence mode.
- ovrHmdCap_LatencyTest = 0x0100, // Supports pixel reading for continuous latency testing.
- ovrHmdCap_DynamicPrediction = 0x0200, // Adjust prediction dynamically based on DK2 Latency.
- // Support rendering without VSync for debugging
+ ovrHmdCap_NoMirrorToWindow = 0x2000, /// Disables mirroring of HMD output to the window. This may improve
+ /// rendering performance slightly (only if 'ExtendDesktop' is off).
+ ovrHmdCap_DisplayOff = 0x0040, /// Turns off HMD screen and output (only if 'ExtendDesktop' is off).
+
+ ovrHmdCap_LowPersistence = 0x0080, /// HMD supports low persistence mode.
+ ovrHmdCap_DynamicPrediction = 0x0200, /// Adjust prediction dynamically based on internally measured latency.
+ /// Support rendering without VSync for debugging.
ovrHmdCap_NoVSync = 0x1000,
- ovrHmdCap_NoRestore = 0x4000,
// These bits can be modified by ovrHmd_SetEnabledCaps.
- ovrHmdCap_Writable_Mask = 0x1380
+ ovrHmdCap_Writable_Mask = 0x33F0,
+ /// These flags are currently passed into the service. May change without notice.
+ ovrHmdCap_Service_Mask = 0x23F0
} ovrHmdCaps;
-// Sensor capability bits reported by device.
-// Used with ovrHmd_StartSensor.
+/// Tracking capability bits reported by the device.
+/// Used with ovrHmd_ConfigureTracking.
typedef enum
{
- ovrSensorCap_Orientation = 0x0010, // Supports orientation tracking (IMU).
- ovrSensorCap_YawCorrection = 0x0020, // Supports yaw correction through magnetometer or other means.
- ovrSensorCap_Position = 0x0040, // Supports positional tracking.
-
-} ovrSensorCaps;
-
-// Distortion capability bits reported by device.
-// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
+ ovrTrackingCap_Orientation = 0x0010, /// Supports orientation tracking (IMU).
+ ovrTrackingCap_MagYawCorrection = 0x0020, /// Supports yaw drift correction via a magnetometer or other means.
+ ovrTrackingCap_Position = 0x0040, /// Supports positional tracking.
+ /// Overrides the other flags. Indicates that the application
+ /// doesn't care about tracking settings. This is the internal
+ /// default before ovrHmd_ConfigureTracking is called.
+ ovrTrackingCap_Idle = 0x0100,
+} ovrTrackingCaps;
+
+/// Distortion capability bits reported by device.
+/// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
typedef enum
{
- ovrDistortionCap_Chromatic = 0x01, // Supports chromatic aberration correction.
- ovrDistortionCap_TimeWarp = 0x02, // Supports timewarp.
- ovrDistortionCap_Vignette = 0x08 // Supports vignetting around the edges of the view.
+ ovrDistortionCap_Chromatic = 0x01, /// Supports chromatic aberration correction.
+ ovrDistortionCap_TimeWarp = 0x02, /// Supports timewarp.
+ ovrDistortionCap_Vignette = 0x08, /// Supports vignetting around the edges of the view.
+ ovrDistortionCap_NoRestore = 0x10, /// Do not save and restore the graphics state when rendering distortion.
+ ovrDistortionCap_FlipInput = 0x20, /// Flip the vertical texture coordinate of input images.
+ ovrDistortionCap_SRGB = 0x40, /// Assume input images are in sRGB gamma-corrected color space.
+ ovrDistortionCap_Overdrive = 0x80, /// Overdrive brightness transitions to reduce artifacts on DK2+ displays
+
+ ovrDistortionCap_ProfileNoTimewarpSpinWaits = 0x10000, /// Use when profiling with timewarp to remove false positives
} ovrDistortionCaps;
-// Specifies which eye is being used for rendering.
-// This type explicitly does not include a third "NoStereo" option, as such is
-// not required for an HMD-centered API.
+/// Specifies which eye is being used for rendering.
+/// This type explicitly does not include a third "NoStereo" option, as such is
+/// not required for an HMD-centered API.
typedef enum
{
ovrEye_Left = 0,
@@ -182,162 +209,176 @@ typedef enum
} ovrEyeType;
-// Handle to HMD; returned by ovrHmd_Create.
-typedef struct ovrHmdStruct* ovrHmd;
-// This is a complete descriptor of the HMD.
+/// This is a complete descriptor of the HMD.
typedef struct ovrHmdDesc_
{
- ovrHmd Handle; // Handle of this HMD.
+ /// Internal handle of this HMD.
+ struct ovrHmdStruct* Handle;
+
+ /// This HMD's type.
ovrHmdType Type;
- // Name string describing the product: "Oculus Rift DK1", etc.
+ /// Name string describing the product: "Oculus Rift DK1", etc.
const char* ProductName;
const char* Manufacturer;
-
- // Capability bits described by ovrHmdCaps.
+
+ /// HID Vendor and ProductId of the device.
+ short VendorId;
+ short ProductId;
+ /// Sensor (and display) serial number.
+ char SerialNumber[24];
+ /// Sensor firmware version.
+ short FirmwareMajor;
+ short FirmwareMinor;
+ /// External tracking camera frustum dimensions (if present).
+ float CameraFrustumHFovInRadians;
+ float CameraFrustumVFovInRadians;
+ float CameraFrustumNearZInMeters;
+ float CameraFrustumFarZInMeters;
+
+ /// Capability bits described by ovrHmdCaps.
unsigned int HmdCaps;
- // Capability bits described by ovrSensorCaps.
- unsigned int SensorCaps;
- // Capability bits described by ovrDistortionCaps.
+ /// Capability bits described by ovrTrackingCaps.
+ unsigned int TrackingCaps;
+ /// Capability bits described by ovrDistortionCaps.
unsigned int DistortionCaps;
- // Resolution of the entire HMD screen (for both eyes) in pixels.
- ovrSizei Resolution;
- // Where monitor window should be on screen or (0,0).
- ovrVector2i WindowsPos;
-
- // These define the recommended and maximum optical FOVs for the HMD.
+ /// These define the recommended and maximum optical FOVs for the HMD.
ovrFovPort DefaultEyeFov[ovrEye_Count];
ovrFovPort MaxEyeFov[ovrEye_Count];
- // Preferred eye rendering order for best performance.
- // Can help reduce latency on sideways-scanned screens.
+ /// Preferred eye rendering order for best performance.
+ /// Can help reduce latency on sideways-scanned screens.
ovrEyeType EyeRenderOrder[ovrEye_Count];
-
- // Display that HMD should present on.
- // TBD: It may be good to remove this information relying on WidowPos instead.
- // Ultimately, we may need to come up with a more convenient alternative,
- // such as a API-specific functions that return adapter, ot something that will
- // work with our monitor driver.
- // Windows: "\\\\.\\DISPLAY3", etc. Can be used in EnumDisplaySettings/CreateDC.
+ /// Resolution of the full HMD screen (both eyes) in pixels.
+ ovrSizei Resolution;
+ /// Location of the application window on the desktop (or 0,0).
+ ovrVector2i WindowsPos;
+
+ /// Display that the HMD should present on.
+ /// TBD: It may be good to remove this information relying on WindowPos instead.
+ /// Ultimately, we may need to come up with a more convenient alternative,
+ /// such as API-specific functions that return adapter, or something that will
+ /// work with our monitor driver.
+ /// Windows: (e.g. "\\\\.\\DISPLAY3", can be used in EnumDisplaySettings/CreateDC).
const char* DisplayDeviceName;
- // MacOS
- int DisplayId;
+ /// MacOS:
+ int DisplayId;
+
} ovrHmdDesc;
-// Describes the type of positional tracking being done.
-/*
-typedef enum
-{
- ovrPose_None,
- ovrPose_HeadModel,
- ovrPose_Positional
-} ovrPoseType;
-*/
+
+/// Simple type ovrHmd is used in ovrHmd_* calls.
+typedef const ovrHmdDesc * ovrHmd;
-// Bit flags describing the current status of sensor tracking.
+
+/// Bit flags describing the current status of sensor tracking.
typedef enum
{
- ovrStatus_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use).
- ovrStatus_PositionTracked = 0x0002, // Position is currently tracked (FALSE if out of range).
- ovrStatus_PositionConnected = 0x0020, // Position tracking HW is connected.
- ovrStatus_HmdConnected = 0x0080 // HMD Display is available & connected.
+ ovrStatus_OrientationTracked = 0x0001, /// Orientation is currently tracked (connected and in use).
+ ovrStatus_PositionTracked = 0x0002, /// Position is currently tracked (false if out of range).
+ ovrStatus_CameraPoseTracked = 0x0004, /// Camera pose is currently tracked.
+ ovrStatus_PositionConnected = 0x0020, /// Position tracking hardware is connected.
+ ovrStatus_HmdConnected = 0x0080 /// HMD Display is available and connected.
} ovrStatusBits;
-
-// State of the sensor at a given absolute time.
-typedef struct ovrSensorState_
+/// Specifies a reading we can query from the sensor.
+typedef struct ovrSensorData_
{
- // Predicted pose configuration at requested absolute time.
- // One can determine the time difference between predicted and actual
- // readings by comparing ovrPoseState.TimeInSeconds.
- ovrPoseStatef Predicted;
- // Actual recorded pose configuration based on the sensor sample at a
- // moment closest to the requested time.
- ovrPoseStatef Recorded;
-
- // Sensor temperature reading, in degrees Celsius, as sample time.
- float Temperature;
- // Sensor status described by ovrStatusBits.
- unsigned int StatusFlags;
-} ovrSensorState;
+ ovrVector3f Accelerometer; /// Acceleration reading in m/s^2.
+ ovrVector3f Gyro; /// Rotation rate in rad/s.
+ ovrVector3f Magnetometer; /// Magnetic field in Gauss.
+ float Temperature; /// Temperature of the sensor in degrees Celsius.
+ float TimeInSeconds; /// Time when the reported IMU reading took place, in seconds.
+} ovrSensorData;
+
-// For now.
-// TBD: Decide if this becomes a part of HMDDesc
-typedef struct ovrSensorDesc_
+/// Tracking state at a given absolute time (describes predicted HMD pose etc).
+/// Returned by ovrHmd_GetTrackingState.
+typedef struct ovrTrackingState_
{
- // HID Vendor and ProductId of the device.
- short VendorId;
- short ProductId;
- // Sensor (and display) serial number.
- char SerialNumber[24];
-} ovrSensorDesc;
+ /// Predicted head pose (and derivatives) at the requested absolute time.
+ /// The look-ahead interval is equal to (HeadPose.TimeInSeconds - RawSensorData.TimeInSeconds).
+ ovrPoseStatef HeadPose;
+ /// Current pose of the external camera (if present).
+ /// This pose includes camera tilt (roll and pitch). For a leveled coordinate
+ /// system use LeveledCameraPose.
+ ovrPosef CameraPose;
+ /// Camera frame aligned with gravity.
+ /// This value includes position and yaw of the camera, but not roll and pitch.
+ /// It can be used as a reference point to render real-world objects in the correct location.
+ ovrPosef LeveledCameraPose;
-// Frame data reported by ovrHmd_BeginFrameTiming().
+ /// The most recent sensor data received from the HMD.
+ ovrSensorData RawSensorData;
+
+ /// Tracking status described by ovrStatusBits.
+ unsigned int StatusFlags;
+} ovrTrackingState;
+
+
+/// Frame timing data reported by ovrHmd_BeginFrameTiming() or ovrHmd_BeginFrame().
typedef struct ovrFrameTiming_
{
- // The amount of time that has passed since the previous frame returned
- // BeginFrameSeconds value, usable for movement scaling.
- // This will be clamped to no more than 0.1 seconds to prevent
- // excessive movement after pauses for loading or initialization.
+ /// The amount of time that has passed since the previous frame's
+ /// ThisFrameSeconds value (usable for movement scaling).
+ /// This will be clamped to no more than 0.1 seconds to prevent
+ /// excessive movement after pauses due to loading or initialization.
float DeltaSeconds;
- // It is generally expected that the following hold:
- // ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
- // EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]]
+ /// It is generally expected that the following holds:
+ /// ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
+ /// EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]].
- // Absolute time value of when rendering of this frame began or is expected to
- // begin; generally equal to NextFrameSeconds of the previous frame. Can be used
- // for animation timing.
+ /// Absolute time value when rendering of this frame began or is expected to
+ /// begin. Generally equal to NextFrameSeconds of the previous frame. Can be used
+ /// for animation timing.
double ThisFrameSeconds;
- // Absolute point when IMU expects to be sampled for this frame.
+ /// Absolute point when IMU expects to be sampled for this frame.
double TimewarpPointSeconds;
- // Absolute time when frame Present + GPU Flush will finish, and the next frame starts.
+ /// Absolute time when frame Present followed by GPU Flush will finish and the next frame begins.
double NextFrameSeconds;
- // Time when when half of the screen will be scanned out. Can be passes as a prediction
- // value to ovrHmd_GetSensorState() go get general orientation.
+ /// Time when when half of the screen will be scanned out. Can be passed as an absolute time
+ /// to ovrHmd_GetTrackingState() to get the predicted general orientation.
double ScanoutMidpointSeconds;
- // Timing points when each eye will be scanned out to display. Used for rendering each eye.
+ /// Timing points when each eye will be scanned out to display. Used when rendering each eye.
double EyeScanoutSeconds[2];
-
} ovrFrameTiming;
-// Rendering information for each eye, computed by either ovrHmd_ConfigureRendering().
-// or ovrHmd_GetRenderDesc() based on the specified Fov.
-// Note that the rendering viewport is not included here as it can be
-// specified separately and modified per frame though:
-// (a) calling ovrHmd_GetRenderScaleAndOffset with game-rendered api,
-// or (b) passing different values in ovrTexture in case of SDK-rendered distortion.
+/// Rendering information for each eye. Computed by either ovrHmd_ConfigureRendering()
+/// or ovrHmd_GetRenderDesc() based on the specified FOV. Note that the rendering viewport
+/// is not included here as it can be specified separately and modified per frame through:
+/// (a) ovrHmd_GetRenderScaleAndOffset in the case of client rendered distortion,
+/// or (b) passing different values via ovrTexture in the case of SDK rendered distortion.
typedef struct ovrEyeRenderDesc_
{
ovrEyeType Eye;
ovrFovPort Fov;
- ovrRecti DistortedViewport; // Distortion viewport
- ovrVector2f PixelsPerTanAngleAtCenter; // How many display pixels will fit in tan(angle) = 1.
- ovrVector3f ViewAdjust; // Translation to be applied to view matrix.
+ ovrRecti DistortedViewport; /// Distortion viewport.
+ ovrVector2f PixelsPerTanAngleAtCenter; /// How many display pixels will fit in tan(angle) = 1.
+ ovrVector3f ViewAdjust; /// Translation to be applied to view matrix.
} ovrEyeRenderDesc;
//-----------------------------------------------------------------------------------
// ***** Platform-independent Rendering Configuration
-// These types are used to hide platform-specific details when passing
-// render device, OS and texture data to the APIs.
-//
-// The benefit of having these wrappers vs. platform-specific API functions is
-// that they allow game glue code to be portable. A typical example is an
-// engine that has multiple back ends, say GL and D3D. Portable code that calls
-// these back ends may also use LibOVR. To do this, back ends can be modified
-// to return portable types such as ovrTexture and ovrRenderAPIConfig.
-
+/// These types are used to hide platform-specific details when passing
+/// render device, OS, and texture data to the API.
+///
+/// The benefit of having these wrappers versus platform-specific API functions is
+/// that they allow game glue code to be portable. A typical example is an
+/// engine that has multiple back ends, say GL and D3D. Portable code that calls
+/// these back ends may also use LibOVR. To do this, back ends can be modified
+/// to return portable types such as ovrTexture and ovrRenderAPIConfig.
typedef enum
{
ovrRenderAPI_None,
@@ -349,8 +390,8 @@ typedef enum
ovrRenderAPI_Count
} ovrRenderAPIType;
-// Platform-independent part of rendering API-configuration data.
-// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
+/// Platform-independent part of rendering API-configuration data.
+/// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
typedef struct ovrRenderAPIConfigHeader_
{
ovrRenderAPIType API;
@@ -358,22 +399,24 @@ typedef struct ovrRenderAPIConfigHeader_
int Multisample;
} ovrRenderAPIConfigHeader;
+/// Contains platform-specific information for rendering.
typedef struct ovrRenderAPIConfig_
{
ovrRenderAPIConfigHeader Header;
uintptr_t PlatformData[8];
} ovrRenderAPIConfig;
-// Platform-independent part of eye texture descriptor.
-// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
-// - If RenderViewport is all zeros, will be used.
+/// Platform-independent part of the eye texture descriptor.
+/// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
+/// If RenderViewport is all zeros then the full texture will be used.
typedef struct ovrTextureHeader_
{
- ovrRenderAPIType API;
+ ovrRenderAPIType API;
ovrSizei TextureSize;
ovrRecti RenderViewport; // Pixel viewport in texture that holds eye image.
} ovrTextureHeader;
+/// Contains platform-specific information about a texture.
typedef struct ovrTexture_
{
ovrTextureHeader Header;
@@ -387,21 +430,22 @@ typedef struct ovrTexture_
// Basic steps to use the API:
//
// Setup:
-// 1. ovrInitialize();
-// 2. ovrHMD hmd = ovrHmd_Create(0); ovrHmd_GetDesc(hmd, &hmdDesc);
-// 3. Use hmdDesc and ovrHmd_GetFovTextureSize() to determine graphics configuration.
-// 4. Call ovrHmd_StartSensor() to configure and initialize tracking.
+// 1. ovrInitialize()
+// 2. ovrHMD hmd = ovrHmd_Create(0)
+// 3. Use hmd members and ovrHmd_GetFovTextureSize() to determine graphics configuration.
+// 4. Call ovrHmd_ConfigureTracking() to configure and initialize tracking.
// 5. Call ovrHmd_ConfigureRendering() to setup graphics for SDK rendering,
// which is the preferred approach.
-// Please refer to "Game-Side Rendering" below if you prefer to do that instead.
-// 5. Allocate textures as needed.
+// Please refer to "Client Distorton Rendering" below if you prefer to do that instead.
+// 6. If the ovrHmdCap_ExtendDesktop flag is not set, then use ovrHmd_AttachToWindow to
+// associate the relevant application window with the hmd.
+// 5. Allocate render target textures as needed.
//
// Game Loop:
-// 6. Call ovrHmd_BeginFrame() to get frame timing and orientation information.
-// 7. Render each eye in between ovrHmd_BeginEyeRender and ovrHmd_EndEyeRender calls,
-// providing the result texture to the API.
-// 8. Call ovrHmd_EndFrame() to render distorted textures to the back buffer
-// and present them on the Hmd.
+// 6. Call ovrHmd_BeginFrame() to get the current frame timing information.
+// 7. Render each eye using ovrHmd_GetEyePose to get the predicted head pose.
+// 8. Call ovrHmd_EndFrame() to render the distorted textures to the back buffer
+// and present them on the hmd.
//
// Shutdown:
// 9. ovrHmd_Destroy(hmd)
@@ -414,87 +458,102 @@ extern "C" {
// Library init/shutdown, must be called around all other OVR code.
// No other functions calls are allowed before ovr_Initialize succeeds or after ovr_Shutdown.
+/// Initializes all Oculus functionality.
OVR_EXPORT ovrBool ovr_Initialize();
+/// Shuts down all Oculus functionality.
OVR_EXPORT void ovr_Shutdown();
+/// Returns version string representing libOVR version. Static, so
+/// string remains valid for app lifespan
+OVR_EXPORT const char* ovr_GetVersionString();
+
-// Detects or re-detects HMDs and reports the total number detected.
-// Users can get information about each HMD by calling ovrHmd_Create with an index.
+
+/// Detects or re-detects HMDs and reports the total number detected.
+/// Users can get information about each HMD by calling ovrHmd_Create with an index.
OVR_EXPORT int ovrHmd_Detect();
-// Creates a handle to an HMD and optionally fills in data about it.
-// Index can [0 .. ovrHmd_Detect()-1]; index mappings can cange after each ovrHmd_Detect call.
-// If not null, returned handle must be freed with ovrHmd_Destroy.
+/// Creates a handle to an HMD which doubles as a description structure.
+/// Index can [0 .. ovrHmd_Detect()-1]. Index mappings can cange after each ovrHmd_Detect call.
+/// If not null, then the returned handle must be freed with ovrHmd_Destroy.
OVR_EXPORT ovrHmd ovrHmd_Create(int index);
OVR_EXPORT void ovrHmd_Destroy(ovrHmd hmd);
-// Creates a "fake" HMD used for debugging only. This is not tied to specific hardware,
-// but may be used to debug some of the related rendering.
+/// Creates a 'fake' HMD used for debugging only. This is not tied to specific hardware,
+/// but may be used to debug some of the related rendering.
OVR_EXPORT ovrHmd ovrHmd_CreateDebug(ovrHmdType type);
-// Returns last error for HMD state. Returns null for no error.
-// String is valid until next call or GetLastError or HMD is destroyed.
-// Pass null hmd to get global error (for create, etc).
+/// Returns last error for HMD state. Returns null for no error.
+/// String is valid until next call or GetLastError or HMD is destroyed.
+/// Pass null hmd to get global errors (during create etc).
OVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmd);
+/// Platform specific function to specify the application window whose output will be
+/// displayed on the HMD. Only used if the ovrHmdCap_ExtendDesktop flag is false.
+/// Windows: SwapChain associated with this window will be displayed on the HMD.
+/// Specify 'destMirrorRect' in window coordinates to indicate an area
+/// of the render target output that will be mirrored from 'sourceRenderTargetRect'.
+/// Null pointers mean "full size".
+/// @note Source and dest mirror rects are not yet implemented.
+OVR_EXPORT ovrBool ovrHmd_AttachToWindow(ovrHmd hmd, void* window,
+ const ovrRecti* destMirrorRect,
+ const ovrRecti* sourceRenderTargetRect);
//-------------------------------------------------------------------------------------
-// Returns capability bits that are enabled at this time; described by ovrHmdCaps.
-// Note that this value is different font ovrHmdDesc::HmdCaps, which describes what
-// capabilities are available.
+/// Returns capability bits that are enabled at this time as described by ovrHmdCaps.
+/// Note that this value is different font ovrHmdDesc::HmdCaps, which describes what
+/// capabilities are available for that HMD.
OVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmd);
-// Modifies capability bits described by ovrHmdCaps that can be modified,
-// such as ovrHmd_LowPersistance.
+/// Modifies capability bits described by ovrHmdCaps that can be modified,
+/// such as ovrHmd_LowPersistance.
OVR_EXPORT void ovrHmd_SetEnabledCaps(ovrHmd hmd, unsigned int hmdCaps);
//-------------------------------------------------------------------------------------
-// ***** Sensor Interface
-
-// All sensor interface functions are thread-safe, allowing sensor state to be sampled
-// from different threads.
-// Starts sensor sampling, enabling specified capabilities, described by ovrSensorCaps.
-// - supportedSensorCaps specifies support that is requested. The function will succeed
-// even if these caps are not available (i.e. sensor or camera is unplugged). Support
-// will automatically be enabled if such device is plugged in later. Software should
-// check ovrSensorState.StatusFlags for real-time status.
-// - requiredSensorCaps specify sensor capabilities required at the time of the call.
-// If they are not available, the function will fail. Pass 0 if only specifying
-// supportedSensorCaps.
-OVR_EXPORT ovrBool ovrHmd_StartSensor(ovrHmd hmd, unsigned int supportedSensorCaps,
- unsigned int requiredSensorCaps);
-// Stops sensor sampling, shutting down internal resources.
-OVR_EXPORT void ovrHmd_StopSensor(ovrHmd hmd);
-// Resets sensor orientation.
-OVR_EXPORT void ovrHmd_ResetSensor(ovrHmd hmd);
-
-// Returns sensor state reading based on the specified absolute system time.
-// Pass absTime value of 0.0 to request the most recent sensor reading; in this case
-// both PredictedPose and SamplePose will have the same value.
-// ovrHmd_GetEyePredictedSensorState relies on this internally.
-// This may also be used for more refined timing of FrontBuffer rendering logic, etc.
-OVR_EXPORT ovrSensorState ovrHmd_GetSensorState(ovrHmd hmd, double absTime);
-
-// Returns information about a sensor.
-// Only valid after StartSensor.
-OVR_EXPORT ovrBool ovrHmd_GetSensorDesc(ovrHmd hmd, ovrSensorDesc* descOut);
+// ***** Tracking Interface
+
+/// All tracking interface functions are thread-safe, allowing tracking state to be sampled
+/// from different threads.
+/// ConfigureTracking starts sensor sampling, enabling specified capabilities,
+/// described by ovrTrackingCaps.
+/// - supportedTrackingCaps specifies support that is requested. The function will succeed
+/// even if these caps are not available (i.e. sensor or camera is unplugged). Support
+/// will automatically be enabled if such device is plugged in later. Software should
+/// check ovrTrackingState.StatusFlags for real-time status.
+/// - requiredTrackingCaps specify sensor capabilities required at the time of the call.
+/// If they are not available, the function will fail. Pass 0 if only specifying
+/// supportedTrackingCaps.
+/// - Pass 0 for both supportedTrackingCaps and requiredTrackingCaps to disable tracking.
+OVR_EXPORT ovrBool ovrHmd_ConfigureTracking(ovrHmd hmd, unsigned int supportedTrackingCaps,
+ unsigned int requiredTrackingCaps);
+
+/// Re-centers the sensor orientation.
+/// Normally this will recenter the (x,y,z) translational components and the yaw
+/// component of orientation.
+OVR_EXPORT void ovrHmd_RecenterPose(ovrHmd hmd);
+
+/// Returns tracking state reading based on the specified absolute system time.
+/// Pass an absTime value of 0.0 to request the most recent sensor reading. In this case
+/// both PredictedPose and SamplePose will have the same value.
+/// ovrHmd_GetEyePose relies on this internally.
+/// This may also be used for more refined timing of FrontBuffer rendering logic, etc.
+OVR_EXPORT ovrTrackingState ovrHmd_GetTrackingState(ovrHmd hmd, double absTime);
//-------------------------------------------------------------------------------------
// ***** Graphics Setup
-// Fills in description about HMD; this is the same as filled in by ovrHmd_Create.
-OVR_EXPORT void ovrHmd_GetDesc(ovrHmd hmd, ovrHmdDesc* desc);
-// Calculates texture size recommended for rendering one eye within HMD, given FOV cone.
-// Higher FOV will generally require larger textures to maintain quality.
-// - pixelsPerDisplayPixel specifies that number of render target pixels per display
-// pixel at center of distortion; 1.0 is the default value. Lower values
-// can improve performance.
+/// Calculates the recommended texture size for rendering a given eye within the HMD
+/// with a given FOV cone. Higher FOV will generally require larger textures to
+/// maintain quality.
+/// - pixelsPerDisplayPixel specifies the ratio of the number of render target pixels
+/// to display pixels at the center of distortion. 1.0 is the default value. Lower
+/// values can improve performance.
OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov,
float pixelsPerDisplayPixel);
@@ -503,8 +562,8 @@ OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovP
//-------------------------------------------------------------------------------------
// ***** Rendering API Thread Safety
-// All of rendering APIs, inclusing Configure and frame functions are *NOT
-// Thread Safe*. It is ok to use ConfigureRendering on one thread and handle
+// All of rendering functions including the configure and frame functions
+// are *NOT thread safe*. It is ok to use ConfigureRendering on one thread and handle
// frames on another thread, but explicit synchronization must be done since
// functions that depend on configured state are not reentrant.
//
@@ -512,113 +571,102 @@ OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovP
// the render thread, which is the same thread that calls ovrHmd_BeginFrame
// or ovrHmd_BeginFrameTiming.
// - ovrHmd_EndFrame
-// - ovrHmd_BeginEyeRender
-// - ovrHmd_EndEyeRender
-// - ovrHmd_GetFramePointTime
// - ovrHmd_GetEyePose
// - ovrHmd_GetEyeTimewarpMatrices
//-------------------------------------------------------------------------------------
-// ***** SDK-Rendering Functions
+// ***** SDK Distortion Rendering Functions
// These functions support rendering of distortion by the SDK through direct
-// access to the underlying rendering HW, such as D3D or GL.
-// This is the recommended approach, as it allows for better support or future
-// Oculus hardware and a range of low-level optimizations.
-
-
-// Configures rendering; fills in computed render parameters.
-// This function can be called multiple times to change rendering settings.
-// The users pass in two eye view descriptors that are used to
-// generate complete rendering information for each eye in eyeRenderDescOut[2].
-//
-// - apiConfig provides D3D/OpenGL specific parameters. Pass null
-// to shutdown rendering and release all resources.
-// - distortionCaps describe distortion settings that will be applied.
-//
+// access to the underlying rendering API, such as D3D or GL.
+// This is the recommended approach since it allows better support for future
+// Oculus hardware, and enables a range of low-level optimizations.
+
+
+/// Configures rendering and fills in computed render parameters.
+/// This function can be called multiple times to change rendering settings.
+/// eyeRenderDescOut is a pointer to an array of two ovrEyeRenderDesc structs
+/// that are used to return complete rendering information for each eye.
+///
+/// - apiConfig provides D3D/OpenGL specific parameters. Pass null
+/// to shutdown rendering and release all resources.
+/// - distortionCaps describe desired distortion settings.
+///
OVR_EXPORT ovrBool ovrHmd_ConfigureRendering( ovrHmd hmd,
- const ovrRenderAPIConfig* apiConfig,
+ const ovrRenderAPIConfig* apiConfig,
unsigned int distortionCaps,
const ovrFovPort eyeFovIn[2],
ovrEyeRenderDesc eyeRenderDescOut[2] );
-// Begins a frame, returning timing and orientation information useful for simulation.
-// This should be called in the beginning of game rendering loop (on render thread).
-// This function relies on ovrHmd_BeginFrameTiming for some of its functionality.
-// Pass 0 for frame index if not using GetFrameTiming.
+/// Begins a frame, returning timing information.
+/// This should be called at the beginning of the game rendering loop (on the render thread).
+/// Pass 0 for the frame index if not using ovrHmd_GetFrameTiming.
OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmd, unsigned int frameIndex);
-// Ends frame, rendering textures to frame buffer. This may perform distortion and scaling
-// internally, assuming is it not delegated to another thread.
-// Must be called on the same thread as BeginFrame. Calls ovrHmd_BeginEndTiming internally.
-// *** This Function will to Present/SwapBuffers and potentially wait for GPU Sync ***.
-OVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmd);
-
-
-// Marks beginning of eye rendering. Must be called on the same thread as BeginFrame.
-// This function uses ovrHmd_GetEyePose to predict sensor state that should be
-// used rendering the specified eye.
-// This combines current absolute time with prediction that is appropriate for this HMD.
-// It is ok to call ovrHmd_BeginEyeRender() on both eyes before calling ovrHmd_EndEyeRender.
-// If rendering one eye at a time, it is best to render eye specified by
-// HmdDesc.EyeRenderOrder[0] first.
-OVR_EXPORT ovrPosef ovrHmd_BeginEyeRender(ovrHmd hmd, ovrEyeType eye);
-
-// Marks the end of eye rendering and submits the eye texture for display after it is ready.
-// Rendering viewport within the texture can change per frame if necessary.
-// Specified texture may be presented immediately or wait until ovrHmd_EndFrame based
-// on the implementation. The API performs distortion and scaling internally.
-// 'renderPose' will typically be the value returned from ovrHmd_BeginEyeRender, but can
-// be different if a different pose was used for rendering.
-OVR_EXPORT void ovrHmd_EndEyeRender(ovrHmd hmd, ovrEyeType eye,
- ovrPosef renderPose, ovrTexture* eyeTexture);
+/// Ends a frame, submitting the rendered textures to the frame buffer.
+/// - RenderViewport within each eyeTexture can change per frame if necessary.
+/// - 'renderPose' will typically be the value returned from ovrHmd_GetEyePose,
+/// but can be different if a different head pose was used for rendering.
+/// - This may perform distortion and scaling internally, assuming is it not
+/// delegated to another thread.
+/// - Must be called on the same thread as BeginFrame.
+/// - *** This Function will call Present/SwapBuffers and potentially wait for GPU Sync ***.
+OVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmd,
+ const ovrPosef renderPose[2],
+ const ovrTexture eyeTexture[2]);
+
+
+/// Returns the predicted head pose to use when rendering the specified eye.
+/// - Must be called between ovrHmd_BeginFrameTiming and ovrHmd_EndFrameTiming.
+/// - If the pose is used for rendering the eye, it should be passed to ovrHmd_EndFrame.
+OVR_EXPORT ovrPosef ovrHmd_GetEyePose(ovrHmd hmd, ovrEyeType eye);
//-------------------------------------------------------------------------------------
-// ***** Game-Side Rendering Functions
+// ***** Client Distortion Rendering Functions
-// These functions provide distortion data and render timing support necessary to allow
-// game rendering of distortion. Game-side rendering involves the following steps:
+// These functions provide the distortion data and render timing support necessary to allow
+// client rendering of distortion. Client-side rendering involves the following steps:
//
-// 1. Setup ovrEyeDesc based on desired texture size and Fov.
+// 1. Setup ovrEyeDesc based on the desired texture size and FOV.
// Call ovrHmd_GetRenderDesc to get the necessary rendering parameters for each eye.
//
-// 2. Use ovrHmd_CreateDistortionMesh to generate distortion mesh.
+// 2. Use ovrHmd_CreateDistortionMesh to generate the distortion mesh.
//
-// 3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePose and ovrHmd_BeginFrameTiming
-// in the rendering loop to obtain timing and predicted view orientation for
-// each eye.
-// - If relying on timewarp, use ovr_WaitTillTime after rendering+flush, followed
-// by ovrHmd_GetEyeTimewarpMatrices to obtain timewarp matrices used
-// in distortion pixel shader to reduce latency.
+// 3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePose, and ovrHmd_BeginFrameTiming
+// in the rendering loop to obtain timing and predicted head orientation when
+// rendering each eye.
+// - When using timewarp, use ovr_WaitTillTime after the rendering and gpu flush, followed
+// by ovrHmd_GetEyeTimewarpMatrices to obtain the timewarp matrices used
+// by the distortion pixel shader. This will minimize latency.
//
-// Computes distortion viewport, view adjust and other rendering for the specified
-// eye. This can be used instead of ovrHmd_ConfigureRendering to help setup rendering on
-// the game side.
+/// Computes the distortion viewport, view adjust, and other rendering parameters for
+/// the specified eye. This can be used instead of ovrHmd_ConfigureRendering to do
+/// setup for client rendered distortion.
OVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmd,
ovrEyeType eyeType, ovrFovPort fov);
-// Describes a vertex used for distortion; this is intended to be converted into
-// the engine-specific format.
-// Some fields may be unused based on ovrDistortionCaps selected. TexG and TexB, for example,
-// are not used if chromatic correction is not requested.
+/// Describes a vertex used by the distortion mesh. This is intended to be converted into
+/// the engine-specific format. Some fields may be unused based on the ovrDistortionCaps
+/// flags selected. TexG and TexB, for example, are not used if chromatic correction is
+/// not requested.
typedef struct ovrDistortionVertex_
{
- ovrVector2f Pos;
+ ovrVector2f ScreenPosNDC; // [-1,+1],[-1,+1] over the entire framebuffer.
float TimeWarpFactor; // Lerp factor between time-warp matrices. Can be encoded in Pos.z.
float VignetteFactor; // Vignette fade factor. Can be encoded in Pos.w.
- ovrVector2f TexR;
- ovrVector2f TexG;
- ovrVector2f TexB;
+ ovrVector2f TanEyeAnglesR;
+ ovrVector2f TanEyeAnglesG;
+ ovrVector2f TanEyeAnglesB;
} ovrDistortionVertex;
-// Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
-// Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
+/// Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
+/// Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
typedef struct ovrDistortionMesh_
{
ovrDistortionVertex* pVertexData;
@@ -627,82 +675,80 @@ typedef struct ovrDistortionMesh_
unsigned int IndexCount;
} ovrDistortionMesh;
-// Generate distortion mesh per eye.
-// Distortion capabilities will depend on 'distortionCaps' flags; user should rely on
-// appropriate shaders based on their settings.
-// Distortion mesh data will be allocated and stored into the ovrDistortionMesh data structure,
-// which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
-// Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
-// The function shouldn't fail unless theres is a configuration or memory error, in which case
-// ovrDistortionMesh values will be set to null.
+/// Generate distortion mesh per eye.
+/// Distortion capabilities will depend on 'distortionCaps' flags. Users should
+/// render using the appropriate shaders based on their settings.
+/// Distortion mesh data will be allocated and written into the ovrDistortionMesh data structure,
+/// which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
+/// Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
+/// The function shouldn't fail unless theres is a configuration or memory error, in which case
+/// ovrDistortionMesh values will be set to null.
+/// This is the only function in the SDK reliant on eye relief, currently imported from profiles,
+/// or overriden here.
OVR_EXPORT ovrBool ovrHmd_CreateDistortionMesh( ovrHmd hmd,
ovrEyeType eyeType, ovrFovPort fov,
unsigned int distortionCaps,
- ovrDistortionMesh *meshData );
+ ovrDistortionMesh *meshData);
-// Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements
-// are set to null and zeroes after the call.
+/// Used to free the distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements
+/// are set to null and zeroes after the call.
OVR_EXPORT void ovrHmd_DestroyDistortionMesh( ovrDistortionMesh* meshData );
-// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
-// viewport changes after the fact. This can be used to adjust render size every frame, if desired.
+/// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
+/// viewport changes after the fact. This can be used to adjust render size every frame if desired.
OVR_EXPORT void ovrHmd_GetRenderScaleAndOffset( ovrFovPort fov,
ovrSizei textureSize, ovrRecti renderViewport,
ovrVector2f uvScaleOffsetOut[2] );
-// Thread-safe timing function for the main thread. Caller should increment frameIndex
-// with every frame and pass the index to RenderThread for processing.
+/// Thread-safe timing function for the main thread. Caller should increment frameIndex
+/// with every frame and pass the index where applicable to functions called on the
+/// rendering thread.
OVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
-// Called at the beginning of the frame on the Render Thread.
-// Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
-// pass the same frame index as was used for GetFrameTiming on the main thread.
+/// Called at the beginning of the frame on the rendering thread.
+/// Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
+/// pass the same frame index as was used for GetFrameTiming on the main thread.
OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmd, unsigned int frameIndex);
-// Marks the end of game-rendered frame, tracking the necessary timing information. This
-// function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is important
-// before this call to reduce latency and ensure proper timing.
+/// Marks the end of client distortion rendered frame, tracking the necessary timing information.
+/// This function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is
+/// important before this call to reduce latency and ensure proper timing.
OVR_EXPORT void ovrHmd_EndFrameTiming(ovrHmd hmd);
-// Initializes and resets frame time tracking. This is typically not necessary, but
-// is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
-// isn't called. Resets internal frame index to the specified number.
+/// Initializes and resets frame time tracking. This is typically not necessary, but
+/// is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
+/// isn't called. Resets internal frame index to the specified number.
OVR_EXPORT void ovrHmd_ResetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
-// Predicts and returns Pose that should be used rendering the specified eye.
-// Must be called between ovrHmd_BeginFrameTiming & ovrHmd_EndFrameTiming.
-OVR_EXPORT ovrPosef ovrHmd_GetEyePose(ovrHmd hmd, ovrEyeType eye);
-
-// Computes timewarp matrices used by distortion mesh shader, these are used to adjust
-// for orientation change since the last call to ovrHmd_GetEyePose for this eye.
-// The ovrDistortionVertex::TimeWarpFactor is used to blend between the matrices,
-// usually representing two different sides of the screen.
-// Must be called on the same thread as ovrHmd_BeginFrameTiming.
+/// Computes timewarp matrices used by distortion mesh shader, these are used to adjust
+/// for head orientation change since the last call to ovrHmd_GetEyePose when rendering
+/// this eye. The ovrDistortionVertex::TimeWarpFactor is used to blend between the
+/// matrices, usually representing two different sides of the screen.
+/// Must be called on the same thread as ovrHmd_BeginFrameTiming.
OVR_EXPORT void ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmd, ovrEyeType eye,
ovrPosef renderPose, ovrMatrix4f twmOut[2]);
-
//-------------------------------------------------------------------------------------
// ***** Stateless math setup functions
-// Used to generate projection from ovrEyeDesc::Fov.
+/// Used to generate projection from ovrEyeDesc::Fov.
OVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection( ovrFovPort fov,
float znear, float zfar, ovrBool rightHanded );
-// Used for 2D rendering, Y is down
-// orthoScale = 1.0f / pixelsPerTanAngleAtCenter
-// orthoDistance = distance from camera, such as 0.8m
+/// Used for 2D rendering, Y is down
+/// orthoScale = 1.0f / pixelsPerTanAngleAtCenter
+/// orthoDistance = distance from camera, such as 0.8m
OVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,
float orthoDistance, float eyeViewAdjustX);
-// Returns global, absolute high-resolution time in seconds. This is the same
-// value as used in sensor messages.
+/// Returns global, absolute high-resolution time in seconds. This is the same
+/// value as used in sensor messages.
OVR_EXPORT double ovr_GetTimeInSeconds();
-// Waits until the specified absolute time.
+/// Waits until the specified absolute time.
OVR_EXPORT double ovr_WaitTillTime(double absTime);
@@ -710,17 +756,72 @@ OVR_EXPORT double ovr_WaitTillTime(double absTime);
// -----------------------------------------------------------------------------------
// ***** Latency Test interface
-// Does latency test processing and returns 'TRUE' if specified rgb color should
-// be used to clear the screen.
+/// Does latency test processing and returns 'TRUE' if specified rgb color should
+/// be used to clear the screen.
OVR_EXPORT ovrBool ovrHmd_ProcessLatencyTest(ovrHmd hmd, unsigned char rgbColorOut[3]);
-// Returns non-null string once with latency test result, when it is available.
-// Buffer is valid until next call.
+/// Returns non-null string once with latency test result, when it is available.
+/// Buffer is valid until next call.
OVR_EXPORT const char* ovrHmd_GetLatencyTestResult(ovrHmd hmd);
-// Returns latency for HMDs that support internal latency testing via the
-// pixel-read back method (-1 for invalid or N/A)
-OVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmd);
+
+
+//-------------------------------------------------------------------------------------
+// ***** Health and Safety Warning Display interface
+//
+
+/// Used by ovrhmd_GetHSWDisplayState to report the current display state.
+typedef struct ovrHSWDisplayState_
+{
+ /// If true then the warning should be currently visible
+ /// and the following variables have meaning. Else there is no
+ /// warning being displayed for this application on the given HMD.
+ ovrBool Displayed;
+ double StartTime; /// Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds().
+ double DismissibleTime; /// Earliest absolute time when the warning can be dismissed. May be a time in the past.
+} ovrHSWDisplayState;
+
+/// Returns the current state of the HSW display. If the application is doing the rendering of
+/// the HSW display then this function serves to indicate that the the warning should be
+/// currently displayed. If the application is using SDK-based eye rendering then the SDK by
+/// default automatically handles the drawing of the HSW display. An application that uses
+/// application-based eye rendering should use this function to know when to start drawing the
+/// HSW display itself and can optionally use it in conjunction with ovrhmd_DismissHSWDisplay
+/// as described below.
+///
+/// Example usage for application-based rendering:
+/// bool HSWDisplayCurrentlyDisplayed = false; // global or class member variable
+/// ovrHSWDisplayState hswDisplayState;
+/// ovrhmd_GetHSWDisplayState(Hmd, &hswDisplayState);
+///
+/// if (hswDisplayState.Displayed && !HSWDisplayCurrentlyDisplayed) {
+/// <insert model into the scene that stays in front of the user>
+/// HSWDisplayCurrentlyDisplayed = true;
+/// }
+OVR_EXPORT void ovrHmd_GetHSWDisplayState(ovrHmd hmd, ovrHSWDisplayState *hasWarningState);
+
+/// Dismisses the HSW display if the warning is dismissible and the earliest dismissal time
+/// has occurred. Returns true if the display is valid and could be dismissed. The application
+/// should recognize that the HSW display is being displayed (via ovrhmd_GetHSWDisplayState)
+/// and if so then call this function when the appropriate user input to dismiss the warning
+/// occurs.
+///
+/// Example usage :
+/// void ProcessEvent(int key) {
+/// if(key == escape) {
+/// ovrHSWDisplayState hswDisplayState;
+/// ovrhmd_GetHSWDisplayState(hmd, &hswDisplayState);
+///
+/// if(hswDisplayState.Displayed && ovrhmd_DismissHSWDisplay(hmd)) {
+/// <remove model from the scene>
+/// HSWDisplayCurrentlyDisplayed = false;
+/// }
+/// }
+/// }
+OVR_EXPORT ovrBool ovrHmd_DismissHSWDisplay(ovrHmd hmd);
+
+
+
// -----------------------------------------------------------------------------------
@@ -742,45 +843,62 @@ OVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmd);
#define OVR_KEY_PLAYER_HEIGHT "PlayerHeight"
#define OVR_KEY_EYE_HEIGHT "EyeHeight"
#define OVR_KEY_IPD "IPD"
- #define OVR_KEY_NECK_TO_EYE_HORIZONTAL "NeckEyeHori"
- #define OVR_KEY_NECK_TO_EYE_VERTICAL "NeckEyeVert"
-
- #define OVR_DEFAULT_GENDER "Male"
- #define OVR_DEFAULT_PLAYER_HEIGHT 1.778f
- #define OVR_DEFAULT_EYE_HEIGHT 1.675f
- #define OVR_DEFAULT_IPD 0.064f
- #define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL 0.12f
- #define OVR_DEFAULT_NECK_TO_EYE_VERTICAL 0.12f
+ #define OVR_KEY_NECK_TO_EYE_DISTANCE "NeckEyeDistance"
+
+ // TODO: remove this duplication with OVR_Profile.h
+ // Default measurements empirically determined at Oculus to make us happy
+ // The neck model numbers were derived as an average of the male and female averages from ANSUR-88
+ // NECK_TO_EYE_HORIZONTAL = H22 - H43 = INFRAORBITALE_BACK_OF_HEAD - TRAGION_BACK_OF_HEAD
+ // NECK_TO_EYE_VERTICAL = H21 - H15 = GONION_TOP_OF_HEAD - ECTOORBITALE_TOP_OF_HEAD
+ // These were determined to be the best in a small user study, clearly beating out the previous default values
+ #define OVR_DEFAULT_GENDER "Unknown"
+ #define OVR_DEFAULT_PLAYER_HEIGHT 1.778f
+ #define OVR_DEFAULT_EYE_HEIGHT 1.675f
+ #define OVR_DEFAULT_IPD 0.064f
+ #define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL 0.0805f
+ #define OVR_DEFAULT_NECK_TO_EYE_VERTICAL 0.075f
+ #define OVR_DEFAULT_EYE_RELIEF_DIAL 3
#endif
+/// Get boolean property. Returns first element if property is a boolean array.
+/// Returns defaultValue if property doesn't exist.
+OVR_EXPORT ovrBool ovrHmd_GetBool(ovrHmd hmd, const char* propertyName, ovrBool defaultVal);
-// Get float property. Returns first element if property is a float array.
-// Returns defaultValue if property doesn't exist.
-OVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);
+/// Modify bool property; false if property doesn't exist or is readonly.
+OVR_EXPORT ovrBool ovrHmd_SetBool(ovrHmd hmd, const char* propertyName, ovrBool value);
-// Modify float property; false if property doesn't exist or is readonly.
-OVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);
+/// Get integer property. Returns first element if property is an integer array.
+/// Returns defaultValue if property doesn't exist.
+OVR_EXPORT int ovrHmd_GetInt(ovrHmd hmd, const char* propertyName, int defaultVal);
+
+/// Modify integer property; false if property doesn't exist or is readonly.
+OVR_EXPORT ovrBool ovrHmd_SetInt(ovrHmd hmd, const char* propertyName, int value);
+/// Get float property. Returns first element if property is a float array.
+/// Returns defaultValue if property doesn't exist.
+OVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);
-// Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.
-// Maximum of arraySize elements will be written.
+/// Modify float property; false if property doesn't exist or is readonly.
+OVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);
+
+/// Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.
+/// Maximum of arraySize elements will be written.
OVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmd, const char* propertyName,
float values[], unsigned int arraySize);
-// Modify float[] property; false if property doesn't exist or is readonly.
+/// Modify float[] property; false if property doesn't exist or is readonly.
OVR_EXPORT ovrBool ovrHmd_SetFloatArray(ovrHmd hmd, const char* propertyName,
float values[], unsigned int arraySize);
-// Get string property. Returns first element if property is a string array.
-// Returns defaultValue if property doesn't exist.
-// String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
-OVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmd, const char* propertyName,
+/// Get string property. Returns first element if property is a string array.
+/// Returns defaultValue if property doesn't exist.
+/// String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
+OVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmd, const char* propertyName,
const char* defaultVal);
-// Returns array size of a property, 0 if property doesn't exist.
-// Can be used to check existence of a property.
-OVR_EXPORT unsigned int ovrHmd_GetArraySize(ovrHmd hmd, const char* propertyName);
-
+/// Set string property
+OVR_EXPORT ovrBool ovrHmd_SetString(ovrHmd hmddesc, const char* propertyName,
+ const char* value);
#ifdef __cplusplus
} // extern "C"