blob: c20a338102f3bda1bb530b97daa5441d8c530ca3 [file] [log] [blame]
/* Copyright 2016 Google 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 VR_GVR_CAPI_INCLUDE_GVR_TYPES_H_
#define VR_GVR_CAPI_INCLUDE_GVR_TYPES_H_
#include <stdbool.h>
#include <stdint.h>
#if defined(__cplusplus) && !defined(GVR_NO_CPP_WRAPPER)
#include <cassert>
#include <type_traits>
#include <utility> // for std::swap
#endif
#ifdef __cplusplus
extern "C" {
#endif
/// @defgroup types Google VR Types
/// @brief Various types used in the Google VR NDK.
/// @{
/// Primary context for invoking Google VR APIs.
typedef struct gvr_context_ gvr_context;
/// An enum for the left and right eye.
typedef enum {
GVR_LEFT_EYE = 0,
GVR_RIGHT_EYE,
GVR_NUM_EYES
} gvr_eye;
/// The type of VR viewer.
typedef enum {
/// A Cardboard-compatible viewer. A typical Cardboard viewer supports a
/// simple touchscreen-based trigger input mechanism. On most platforms, this
/// is the default viewer type if no viewer has been explicitly paired.
GVR_VIEWER_TYPE_CARDBOARD = 0,
/// A Daydream-compatible viewer. A typical Daydream viewer supports 3DOF
/// controller input (as defined in gvr_controller.h), and is intended only
/// for Daydream-ready platforms. It does *not* support touchscreen-based
/// input unless Cardboard emulation is explicitly enabled.
GVR_VIEWER_TYPE_DAYDREAM = 1,
} gvr_viewer_type;
/// Types of VR-specific features which may or may not be supported on the
/// underlying platform.
typedef enum {
/// Asynchronous reprojection warps the app's rendered frame using the most
/// recent head pose just before pushing the frame to the display.
GVR_FEATURE_ASYNC_REPROJECTION = 0,
/// Support for framebuffers suitable for rendering with the GL_OVR_multiview2
/// and GL_OVR_multiview_multisampled_render_to_texture extensions.
GVR_FEATURE_MULTIVIEW = 1,
/// Support for external surface creation and compositing. Note that this
/// feature may be supported only under certain configurations, e.g., when
/// async reprojection is explicitly enabled.
GVR_FEATURE_EXTERNAL_SURFACE = 2,
/// Support for providing head poses with 6 degrees-of-freedom (orientation
/// and position).
GVR_FEATURE_HEAD_POSE_6DOF = 3,
/// Indicates that buffers which are part of a frame are backed by Android
/// AHardwareBuffer objects. When this feature is available, the function
/// gvr_frame_get_hardware_buffer can be called to get the AHardwareBuffer
/// pointer.
/// Hardware buffers are only supported on Android O and later, on a
/// best-effort basis. Future versions of GVR and/or Android may also cease to
/// support hardware buffers if the underlying implementation no longer
/// supports this rendering path.
GVR_FEATURE_HARDWARE_BUFFERS = 4,
} gvr_feature;
/// @}
/// Version information for the Google VR API.
typedef struct gvr_version_ {
int32_t major;
int32_t minor;
int32_t patch;
} gvr_version;
/// An integral 2D size. Used for render target sizes.
typedef struct gvr_sizei {
int32_t width;
int32_t height;
} gvr_sizei;
/// An integral 2D rect. Used for window bounds in pixels.
typedef struct gvr_recti {
int32_t left;
int32_t right;
int32_t bottom;
int32_t top;
} gvr_recti;
/// A floating point 2D rect. Used for field of view, and also for ranges
/// in texture space. When used for a field of view, all angles are in positive
/// degrees from the optical axis.
typedef struct gvr_rectf {
float left;
float right;
float bottom;
float top;
} gvr_rectf;
/// A floating point 2D vector.
typedef struct gvr_vec2f {
float x;
float y;
} gvr_vec2f;
/// A floating point 3D vector.
typedef struct gvr_vec3f {
float x;
float y;
float z;
} gvr_vec3f;
/// A floating point 4x4 matrix stored in row-major form. It needs to be
/// transposed before being used with OpenGL.
typedef struct gvr_mat4f {
float m[4][4];
} gvr_mat4f;
/// A floating point quaternion, in JPL format.
/// We use this simple struct in order not to impose a dependency on a
/// particular math library. The user of this API is free to encapsulate this
/// into any math library they want.
typedef struct gvr_quatf {
/// qx, qy, qz are the vector components.
float qx;
float qy;
float qz;
/// qw is the scalar component.
float qw;
} gvr_quatf;
/// A *monotonic system time* representation. On Android, this is equivalent to
/// System.nanoTime(), or clock_gettime(CLOCK_MONOTONIC). If there is any doubt
/// about how to get the current time for the current platform, simply use
/// gvr_get_time_point_now().
typedef struct gvr_clock_time_point {
int64_t monotonic_system_time_nanos;
} gvr_clock_time_point;
/// A structure that ties together a region of a buffer, the field of view
/// rendered into that region and a target eye index to define part of the
/// user's field of view. The SDK implementation uses this information to
/// transform the images generated by the app output into the final display that
/// is sent to the screen.
///
/// A set of these structures will most often be generated by the API, via
/// gvr_get_recommended_buffer_viewports() or
/// gvr_get_screen_buffer_viewports(). However, the client may also customize
/// these values via gvr_buffer_viewport_list_set(), constructing a custom
/// gvr_buffer_viewport_list for use in the distortion pass.
typedef struct gvr_buffer_viewport_ gvr_buffer_viewport;
/// List of buffer viewports that completely specifies how to transform the
/// frame's buffers into the image displayed on the screen.
typedef struct gvr_buffer_viewport_list_ gvr_buffer_viewport_list;
/// Specification of a pixel buffer. A pixel buffer can have color, depth and
/// stencil attachments and mostly corresponds to the OpenGL concept of a
/// framebuffer object. However, since there can be multiple such objects for
/// each frame, we avoid calling them "framebuffers". Pixel buffers which are
/// part of the currently acquired frame are immutable, i.e., they cannot be
/// resized or otherwise reconfigured.
typedef struct gvr_buffer_spec_ gvr_buffer_spec;
/// Swap chain that contains some number of frames. Frames in the swap chain
/// can be unused, in the process of being distorted and presented on the
/// screen, or acquired and being rendered to by the application. The swap chain
/// ensures that the most recent available frame is always shown and that the
/// application never has to wait to render the next frame.
typedef struct gvr_swap_chain_ gvr_swap_chain;
/// A single frame acquired from the swap chain. Each frame is composed of one
/// or more buffers, which are then lens distorted and composited into the final
/// output. Buffers are identified by indices that correspond to the position
/// of their gvr_buffer_spec in the list passed when constructing the swap
/// chain.
typedef struct gvr_frame_ gvr_frame;
/// Generic flag type.
typedef uint32_t gvr_flags;
/// Generic 64-bit flag type.
typedef uint64_t gvr_flags64;
/// Opaque handle to a collection of properties.
typedef struct gvr_properties_ gvr_properties;
/// Represents a Daydream Controller API object, used to invoke the
/// Daydream Controller API.
typedef struct gvr_controller_context_ gvr_controller_context;
/// A generic container for various pure value types.
typedef struct gvr_value {
int32_t value_type; // gvr_value_type
gvr_flags flags;
union {
float f;
double d;
int32_t i;
int64_t i64;
gvr_flags fl;
gvr_flags64 fl64;
gvr_sizei si;
gvr_recti ri;
gvr_rectf rf;
gvr_vec2f v2f;
gvr_vec3f v3f;
gvr_quatf qf;
gvr_mat4f m4f;
gvr_clock_time_point t;
// Pad the struct to 256 bytes.
uint8_t padding[248];
};
} gvr_value;
/// @addtogroup types
/// @{
/// The type of a recentering associated with a GVR_EVENT_RECENTER event.
typedef enum {
/// Recentering state received from the platform upon starting or resuming the
/// application. This event is usually precedes a
/// GVR_EVENT_HEAD_TRACKING_RESUMED event in the same frame.
GVR_RECENTER_EVENT_RESTART = 1,
/// A recenter event triggered by the controller (e.g. long-press on Home
/// button or connecting controller as part of donning UX).
GVR_RECENTER_EVENT_ALIGNED = 2,
/// A recenter event triggered by proximity sensor detecting the user has put
/// put the headset on (a.k.a. donned the headset).
GVR_RECENTER_EVENT_DON = 3,
} gvr_recenter_event_type;
/// @}
/// Event data associated with a system-initiated GVR_EVENT_RECENTER event. The
/// client may wish to handle this event to provide custom recentering logic.
typedef struct gvr_recenter_event_data {
int32_t recenter_type; // gvr_recenter_event_type
gvr_flags recenter_event_flags;
/// The new transform that maps from "sensor" space to the recentered "start"
/// space. This transform can also be retrieved by querying for the
/// GVR_PROPERTY_RECENTER_TRANSFORM property.
gvr_mat4f start_space_from_tracking_space_transform;
} gvr_recenter_event_data;
/// Container for various GVR-events to which the client can optionally respond.
typedef struct gvr_event {
gvr_clock_time_point timestamp;
int32_t type; // gvr_event_type
gvr_flags flags;
union {
gvr_recenter_event_data recenter_event_data;
// Pad the struct to 512 bytes.
uint8_t padding[496];
};
} gvr_event;
/// @addtogroup types
/// @{
/// Constants that represent GVR error codes.
typedef enum {
GVR_ERROR_NONE = 0,
GVR_ERROR_CONTROLLER_CREATE_FAILED = 2,
GVR_ERROR_NO_FRAME_AVAILABLE = 3,
/// Error code indicating that no events are currently available.
/// See also gvr_poll_event()
GVR_ERROR_NO_EVENT_AVAILABLE = 1000000,
/// Error code indicating that the given property is not available.
/// See also gvr_properties_get().
GVR_ERROR_NO_PROPERTY_AVAILABLE = 1000001,
} gvr_error;
/// Flags indicating the current status of the tracker.
/// See also GVR_PROPERTY_TRACKING_STATUS.
enum {
/// The tracker is in an invalid (potentially paused) state, or no valid
/// tracker exists.
GVR_TRACKING_STATUS_FLAG_INVALID = (1U << 0),
/// The tracker is still initializing, so the pose may not be accurate.
GVR_TRACKING_STATUS_FLAG_INITIALIZING = (1U << 1),
/// The tracker pose is derived from 6DoF sensors and has a translational
/// component.
GVR_TRACKING_STATUS_FLAG_HAS_6DOF = (1U << 2),
};
/// Controller API options (bit flags).
enum {
/// Indicates that controller orientation data should be reported.
GVR_CONTROLLER_ENABLE_ORIENTATION = 1 << 0,
/// Indicates that controller touchpad data should be reported.
GVR_CONTROLLER_ENABLE_TOUCH = 1 << 1,
/// Indicates that controller gyroscope data should be reported.
GVR_CONTROLLER_ENABLE_GYRO = 1 << 2,
/// Indicates that controller accelerometer data should be reported.
GVR_CONTROLLER_ENABLE_ACCEL = 1 << 3,
/// Indicates that controller gestures should be reported.
GVR_CONTROLLER_ENABLE_GESTURES = 1 << 4,
/// Indicates that controller pose prediction should be enabled.
GVR_CONTROLLER_ENABLE_POSE_PREDICTION = 1 << 5,
/// Indicates that controller position data should be reported.
GVR_CONTROLLER_ENABLE_POSITION = 1 << 6,
/// Indicates that controller battery data should be reported.
GVR_CONTROLLER_ENABLE_BATTERY = 1 << 7,
/// Indicates that elbow model should be enabled.
GVR_CONTROLLER_ENABLE_ARM_MODEL = 1 << 8,
};
/// Constants that represent the status of the controller API.
typedef enum {
/// API is happy and healthy. This doesn't mean the controller itself
/// is connected, it just means that the underlying service is working
/// properly.
GVR_CONTROLLER_API_OK = 0,
/// Any other status represents a permanent failure that requires
/// external action to fix:
/// API failed because this device does not support controllers (API is too
/// low, or other required feature not present).
GVR_CONTROLLER_API_UNSUPPORTED = 1,
/// This app was not authorized to use the service (e.g., missing permissions,
/// the app is blacklisted by the underlying service, etc).
GVR_CONTROLLER_API_NOT_AUTHORIZED = 2,
/// The underlying VR service is not present.
GVR_CONTROLLER_API_UNAVAILABLE = 3,
/// The underlying VR service is too old, needs upgrade.
GVR_CONTROLLER_API_SERVICE_OBSOLETE = 4,
/// The underlying VR service is too new, is incompatible with current client.
GVR_CONTROLLER_API_CLIENT_OBSOLETE = 5,
/// The underlying VR service is malfunctioning. Try again later.
GVR_CONTROLLER_API_MALFUNCTION = 6,
} gvr_controller_api_status;
/// Constants that represent the state of the controller.
typedef enum {
/// Controller is disconnected.
GVR_CONTROLLER_DISCONNECTED = 0,
/// Controller is scanning.
GVR_CONTROLLER_SCANNING = 1,
/// Controller is connecting.
GVR_CONTROLLER_CONNECTING = 2,
/// Controller is connected.
GVR_CONTROLLER_CONNECTED = 3,
} gvr_controller_connection_state;
/// Controller buttons.
typedef enum {
GVR_CONTROLLER_BUTTON_NONE = 0,
GVR_CONTROLLER_BUTTON_CLICK = 1, ///< Touchpad Click.
GVR_CONTROLLER_BUTTON_HOME = 2,
GVR_CONTROLLER_BUTTON_APP = 3,
GVR_CONTROLLER_BUTTON_VOLUME_UP = 4,
GVR_CONTROLLER_BUTTON_VOLUME_DOWN = 5,
GVR_CONTROLLER_BUTTON_RESERVED0 = 6,
GVR_CONTROLLER_BUTTON_RESERVED1 = 7,
GVR_CONTROLLER_BUTTON_RESERVED2 = 8,
/// Note: there are 8 buttons on the controller, but the state arrays have
/// this many elements due to the inclusion of a dummy "none" button.
GVR_CONTROLLER_BUTTON_COUNT = 9,
} gvr_controller_button;
/// Controller battery states.
typedef enum {
GVR_CONTROLLER_BATTERY_LEVEL_UNKNOWN = 0,
GVR_CONTROLLER_BATTERY_LEVEL_CRITICAL_LOW = 1,
GVR_CONTROLLER_BATTERY_LEVEL_LOW = 2,
GVR_CONTROLLER_BATTERY_LEVEL_MEDIUM = 3,
GVR_CONTROLLER_BATTERY_LEVEL_ALMOST_FULL = 4,
GVR_CONTROLLER_BATTERY_LEVEL_FULL = 5,
/// Note: there are 5 distinct levels, but there are 6 due to the inclusion
/// of an UNKNOWN state before any battery information is collected, etc.
GVR_CONTROLLER_BATTERY_LEVEL_COUNT = 6,
} gvr_controller_battery_level;
/// @}
/// Opaque handle to controller state.
typedef struct gvr_controller_state_ gvr_controller_state;
/// @addtogroup types
/// @{
/// Rendering modes define CPU load / rendering quality balances.
typedef enum {
/// Stereo panning of all Sound Objects. This disables HRTF-based rendering.
GVR_AUDIO_RENDERING_STEREO_PANNING = 0,
/// HRTF-based rendering over a virtual array of 8 loudspeakers arranged in
/// a cube configuration around the listener’s head.
GVR_AUDIO_RENDERING_BINAURAL_LOW_QUALITY = 1,
/// HRTF-based rendering over a virtual array of 16 loudspeakers arranged in
/// an approximate equidistribution about the around the listener’s head.
GVR_AUDIO_RENDERING_BINAURAL_HIGH_QUALITY = 2,
} gvr_audio_rendering_mode;
/// Room surface material names, used to set room properties.
typedef enum {
/// Acoustically transparent material, reflects no sound.
GVR_AUDIO_MATERIAL_TRANSPARENT = 0,
/// Acoustic ceiling tiles, absorbs most frequencies.
GVR_AUDIO_MATERIAL_ACOUSTIC_CEILING_TILES = 1,
/// Bare brick, relatively reflective.
GVR_AUDIO_MATERIAL_BRICK_BARE = 2,
/// Painted brick
GVR_AUDIO_MATERIAL_BRICK_PAINTED = 3,
/// Coarse surface concrete block.
GVR_AUDIO_MATERIAL_CONCRETE_BLOCK_COARSE = 4,
/// Painted concrete block.
GVR_AUDIO_MATERIAL_CONCRETE_BLOCK_PAINTED = 5,
/// Heavy curtains.
GVR_AUDIO_MATERIAL_CURTAIN_HEAVY = 6,
/// Fiber glass insulation.
GVR_AUDIO_MATERIAL_FIBER_GLASS_INSULATION = 7,
/// Thin glass.
GVR_AUDIO_MATERIAL_GLASS_THIN = 8,
/// Thick glass.
GVR_AUDIO_MATERIAL_GLASS_THICK = 9,
/// Grass.
GVR_AUDIO_MATERIAL_GRASS = 10,
/// Linoleum on concrete.
GVR_AUDIO_MATERIAL_LINOLEUM_ON_CONCRETE = 11,
/// Marble.
GVR_AUDIO_MATERIAL_MARBLE = 12,
/// Galvanized sheet metal.
GVR_AUDIO_MATERIAL_METAL = 13,
/// Wooden parquet on concrete.
GVR_AUDIO_MATERIAL_PARQUET_ON_CONCRETE = 14,
/// Rough plaster surface.
GVR_AUDIO_MATERIAL_PLASTER_ROUGH = 15,
/// Smooth plaster surface.
GVR_AUDIO_MATERIAL_PLASTER_SMOOTH = 16,
/// Plywood panel.
GVR_AUDIO_MATERIAL_PLYWOOD_PANEL = 17,
/// Polished concrete OR tile surface.
GVR_AUDIO_MATERIAL_POLISHED_CONCRETE_OR_TILE = 18,
/// Sheet rock.
GVR_AUDIO_MATERIAL_SHEET_ROCK = 19,
/// Surface of water or ice.
GVR_AUDIO_MATERIAL_WATER_OR_ICE_SURFACE = 20,
/// Wooden ceiling.
GVR_AUDIO_MATERIAL_WOOD_CEILING = 21,
/// Wood paneling.
GVR_AUDIO_MATERIAL_WOOD_PANEL = 22,
} gvr_audio_material_type;
/// Distance rolloff models used for distance attenuation.
typedef enum {
/// Logarithmic distance rolloff model.
GVR_AUDIO_ROLLOFF_LOGARITHMIC = 0,
/// Linear distance rolloff model.
GVR_AUDIO_ROLLOFF_LINEAR = 1,
/// No distance attenuation will be applied.
GVR_AUDIO_ROLLOFF_NONE = 2,
} gvr_audio_distance_rolloff_type;
/// Sound object and sound field identifier.
typedef int32_t gvr_audio_source_id;
/// Supported surround sound formats.
typedef enum {
// Enables to initialize a yet undefined rendering mode.
GVR_AUDIO_SURROUND_FORMAT_INVALID = 0,
// Virtual mono speaker at 0 degrees (front).
GVR_AUDIO_SURROUND_FORMAT_SURROUND_MONO = 1,
// Virtual stereo speakers at -30 degrees and +30 degrees.
GVR_AUDIO_SURROUND_FORMAT_SURROUND_STEREO = 2,
// 5.1 surround sound according to the ITU-R BS.775-3 speaker configuration
// recommendation:
// - Left (L) at 30 degrees.
// - Right (R) at -30 degrees.
// - Center (C) at 0 degrees.
// - Low frequency effects (LFE) at front center at 0 degrees.
// - Left surround (LS) at 110 degrees.
// - Right surround (RS) at -110 degrees.
//
// The 5.1 channel input layout must matches AAC: L, R, C, LFE, LS, RS.
// Note that this differs from the Vorbis/Opus 5.1 channel layout, which
// is: L, C, R, LS, RS, LFE.
GVR_AUDIO_SURROUND_FORMAT_SURROUND_FIVE_DOT_ONE = 3,
// 7.1 surround sound according to the ITU-R BS.775-3 speaker configuration
// recommendation:
// - Left (FL) at 30 degrees.
// - Right (FR) at -30 degrees.
// - Center (C) at 0 degrees.
// - Low frequency effects (LFE) at front center at 0 degrees.
// - Left surround 1 (LS1) at 90 degrees.
// - Right surround 1 (RS1) at -90 degrees.
// - Left surround 2 (LS2) at 150 degrees.
// - Right surround 2 (LS2) at -150 degrees.
//
// The 7.1 channel input layout must matches AAC: L, R, C, LFE, LS1, RS1,
// LS2, RS2.
// Note that this differs from the Vorbis/Opus 7.1 channel layout, which
// is: L, C, R, LS1, RS1, LS2, RS2, LFE.
GVR_AUDIO_SURROUND_FORMAT_SURROUND_SEVEN_DOT_ONE = 10,
// First-order ambisonics (AmbiX format: 4 channels, ACN channel ordering,
// SN3D normalization).
GVR_AUDIO_SURROUND_FORMAT_FIRST_ORDER_AMBISONICS = 4,
// Second-order ambisonics (AmbiX format: 9 channels, ACN channel ordering,
// SN3D normalization).
GVR_AUDIO_SURROUND_FORMAT_SECOND_ORDER_AMBISONICS = 5,
// Third-order ambisonics (AmbiX format: 16 channels, ACN channel ordering,
// SN3D normalization).
GVR_AUDIO_SURROUND_FORMAT_THIRD_ORDER_AMBISONICS = 6,
// First-order ambisonics with a non-diegetic stereo. The first 4 channels
// contain ambisonic AmbiX format.
// (AmbiX format: 4 channels, ACN channel ordering, SN3D normalization).
// Channel 5 to 6 contain non-diegetic stereo.
GVR_AUDIO_SURROUND_FORMAT_FIRST_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO = 7,
// Second-order ambisonics with a non-diegetic stereo. The first 9 channels
// contain ambisonic AmbiX format.
// (AmbiX format: 9 channels, ACN channel ordering, SN3D normalization).
// Channel 10 to 11 contain non-diegetic stereo.
GVR_AUDIO_SURROUND_FORMAT_SECOND_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO =
8,
// Third-order ambisonics with a non-diegetic stereo. The first 16 channels
// contain ambisonic AmbiX format.
// (AmbiX format: 16 channels, ACN channel ordering, SN3D normalization).
// Channel 17 to 18 contain non-diegetic stereo.
GVR_AUDIO_SURROUND_FORMAT_THIRD_ORDER_AMBISONICS_WITH_NON_DIEGETIC_STEREO = 9,
// Note: Next available value is: 11
} gvr_audio_surround_format_type;
/// Valid color formats for swap chain buffers.
typedef enum {
/// Equivalent to GL_RGBA8. Pixel values are expected to be premultiplied
/// with alpha.
GVR_COLOR_FORMAT_RGBA_8888 = 0,
/// Equivalent to GL_RGB565.
GVR_COLOR_FORMAT_RGB_565 = 1,
} gvr_color_format_type;
typedef enum {
/// No depth or stencil buffer.
GVR_DEPTH_STENCIL_FORMAT_NONE = 255,
/// Equivalent to GL_DEPTH_COMPONENT16.
GVR_DEPTH_STENCIL_FORMAT_DEPTH_16 = 0,
/// Equivalent to GL_DEPTH_COMPONENT24.
GVR_DEPTH_STENCIL_FORMAT_DEPTH_24 = 1,
/// Equivlaent to GL_DEPTH24_STENCIL8.
GVR_DEPTH_STENCIL_FORMAT_DEPTH_24_STENCIL_8 = 2,
/// Equivalent to GL_DEPTH_COMPONENT32F.
GVR_DEPTH_STENCIL_FORMAT_DEPTH_32_F = 3,
/// Equivalent to GL_DEPTH_32F_STENCIL8.
GVR_DEPTH_STENCIL_FORMAT_DEPTH_32_F_STENCIL_8 = 4,
/// Equivalent to GL_STENCIL8.
GVR_DEPTH_STENCIL_FORMAT_STENCIL_8 = 5,
} gvr_depth_stencil_format_type;
/// Types of asynchronous reprojection.
typedef enum {
/// Do not reproject.
GVR_REPROJECTION_NONE = 0,
/// Reproject in all dimensions.
GVR_REPROJECTION_FULL = 1,
} gvr_reprojection;
typedef enum {
GVR_CONTROLLER_RIGHT_HANDED = 0,
GVR_CONTROLLER_LEFT_HANDED = 1,
} gvr_controller_handedness;
/// Types of gaze behaviors used for arm model.
typedef enum {
// Body rotation matches head rotation all the time.
GVR_ARM_MODEL_SYNC_GAZE = 0,
// Body rotates as head rotates, but at a smaller angle.
GVR_ARM_MODEL_FOLLOW_GAZE = 1,
// Body doesn't rotate as head rotates.
GVR_ARM_MODEL_IGNORE_GAZE = 2,
} gvr_arm_model_behavior;
typedef struct gvr_user_prefs_ gvr_user_prefs;
// Anonymous enum for miscellaneous integer constants.
enum {
/// Constant that represents a nonexistent external surface. Pass to
/// gvr_buffer_viewport_set_external_surface_id() to disable sampling from
/// an external surface.
GVR_EXTERNAL_SURFACE_ID_NONE = -1,
/// Special index for a source buffer that has the same contents as the
/// external surface attached to the given viewport. Pass this to
/// gvr_buffer_viewport_set_source_buffer_index() to use the external surface
/// as the buffer contents.
GVR_BUFFER_INDEX_EXTERNAL_SURFACE = -1,
/// Invalid source id that can be used to initialize source id variables
/// during construction.
GVR_AUDIO_INVALID_SOURCE_ID = -1,
};
/// Property types exposed by the gvr_properties_get() API.
typedef enum {
/// The height of the floor, if available, relative to the current start space
/// origin. In general, for tracking systems with an eye level origin, this
/// value will be negative.
/// Type: float
GVR_PROPERTY_TRACKING_FLOOR_HEIGHT = 1,
/// The current transform that maps from "sensor" space to the recentered
/// "start" space. Apps can optionally undo or extend this transform to
/// perform custom recentering logic with the returned pose, but all poses
/// supplied during frame submission are assumed to be in start space. This
/// transform matches the one reported in the most
/// recent gvr_recenter_event_data.
/// Type: gvr_mat4f
GVR_PROPERTY_RECENTER_TRANSFORM = 2,
/// The type of safety region, if any, currently employed by the headset's
/// tracker.
/// Type: int (gvr_safety_region_type)
GVR_PROPERTY_SAFETY_REGION = 3,
/// Distance from safety cylinder axis at which the user's state transitions
/// from outside to inside, generating a GVR_EVENT_SAFETY_REGION_ENTER event.
/// This value is guaranteed to be less than
/// GVR_PROPERTY_SAFETY_CYLINDER_EXIT_RADIUS.
/// Type: float
GVR_PROPERTY_SAFETY_CYLINDER_ENTER_RADIUS = 4,
/// Distance from safety cylinder axis at which the user's state transitions
/// from inside to outside, generating a GVR_EVENT_SAFETY_REGION_EXIT event.
/// This value is guaranteed to be greater than
/// GVR_PROPERTY_SAFETY_CYLINDER_ENTER_RADIUS.
/// Type: float
GVR_PROPERTY_SAFETY_CYLINDER_EXIT_RADIUS = 5,
/// The current status of the head tracker, if available.
/// Type: gvr_flags
GVR_PROPERTY_TRACKING_STATUS = 6
} gvr_property_type;
/// Safety region types exposed from the GVR_PROPERTY_SAFETY_REGION property.
typedef enum {
GVR_SAFETY_REGION_NONE = 0,
/// A safety region defined by a vertically-oriented cylinder, extending
/// infinitely along the Y axis, and centered at the start space origin.
/// Extents can be queried with the GVR_PROPERTY_SAFETY_CYLINDER_INNER_RADIUS
/// and GVR_PROPERTY_SAFETY_CYLINDER_OUTER_RADIUS property keys.
GVR_SAFETY_REGION_CYLINDER = 1,
} gvr_safety_region_type;
/// Value types for the contents of a gvr_value object instance.
typedef enum {
GVR_VALUE_TYPE_NONE = 0,
GVR_VALUE_TYPE_FLOAT = 1,
GVR_VALUE_TYPE_DOUBLE = 2,
GVR_VALUE_TYPE_INT = 3,
GVR_VALUE_TYPE_INT64 = 4,
GVR_VALUE_TYPE_FLAGS = 5,
GVR_VALUE_TYPE_SIZEI = 6,
GVR_VALUE_TYPE_RECTI = 7,
GVR_VALUE_TYPE_RECTF = 8,
GVR_VALUE_TYPE_VEC2F = 9,
GVR_VALUE_TYPE_VEC3F = 10,
GVR_VALUE_TYPE_QUATF = 11,
GVR_VALUE_TYPE_MAT4F = 12,
GVR_VALUE_TYPE_CLOCK_TIME_POINT = 13,
} gvr_value_type;
/// The type of gvr_event.
typedef enum {
/// Notification that a global recentering event has occurred.
/// Event data type: gvr_recenter_event_data
GVR_EVENT_RECENTER = 1,
/// Notification that the user has exited the safety region, as defined by the
/// gvr_safety_region_type.
/// Event data type: none
GVR_EVENT_SAFETY_REGION_EXIT = 2,
/// Notification that the user has re-entered the safety region, as defined by
/// the gvr_safety_region_type.
/// Event data type: none
GVR_EVENT_SAFETY_REGION_ENTER = 3,
/// Notification that head tracking was resumed (or started for the first
/// time). Before this event is sent, head tracking will always return the
/// identity pose. This event is usually preceded in the same frame by a
/// GVR_EVENT_RECENTER of recenter_type GVR_RECENTER_EVENT_RESTART.
/// Event data type: none
GVR_EVENT_HEAD_TRACKING_RESUMED = 4,
/// Notification that head tracking was paused.
/// Event data type: none
GVR_EVENT_HEAD_TRACKING_PAUSED = 5,
} gvr_event_type;
/// @}
// Forward declaration of Android AHardwareBuffer.
typedef struct AHardwareBuffer AHardwareBuffer;
#ifdef __cplusplus
} // extern "C"
#endif
#if defined(__cplusplus) && !defined(GVR_NO_CPP_WRAPPER)
namespace gvr {
template <typename WrappedType>
void NoopDestroy(WrappedType** cobject) {
// Make sure that we don't forget to specify the destroy function.
// If the wrapped object type doesn't need destruction, add it here.
static_assert(std::is_same<WrappedType, gvr_frame>::value ||
std::is_same<WrappedType, const gvr_user_prefs>::value ||
std::is_same<WrappedType, const gvr_properties>::value,
"Did you forget to specify a destroy function?");
}
/// Base class for all C++ wrapper objects.
template <typename WrappedType,
void (*DestroyFunction)(WrappedType**) = NoopDestroy<WrappedType>>
class WrapperBase {
public:
/// Initializes a wrapper that holds a C object.
explicit WrapperBase(WrappedType* cobject = nullptr) : cobject_(cobject) {}
~WrapperBase() {
if (cobject_ != nullptr) DestroyFunction(&cobject_);
}
WrapperBase(WrapperBase&& other) : cobject_(nullptr) {
std::swap(cobject_, other.cobject_);
}
WrapperBase& operator=(WrapperBase&& other) {
std::swap(cobject_, other.cobject_);
return *this;
}
// Disallow copy and assign.
WrapperBase(const WrapperBase&) = delete;
void operator=(const WrapperBase&) = delete;
/// Returns the wrapped C object. Does not affect ownership.
WrappedType* cobj() { return cobject_; }
const WrappedType* cobj() const { return cobject_; }
/// Returns the wrapped C object and transfers its ownership to the caller.
/// The wrapper becomes invalid and should not be used.
WrappedType* release() {
auto result = cobject_;
cobject_ = nullptr;
return result;
}
/// Returns true if the wrapper holds an object.
explicit operator bool() const {
return cobj() != nullptr;
}
protected:
WrappedType* cobject_;
};
// These typedefs convert the C-style names to C++-style names.
const int32_t kControllerEnableOrientation =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_ORIENTATION);
const int32_t kControllerEnableTouch =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_TOUCH);
const int32_t kControllerEnableGyro =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_GYRO);
const int32_t kControllerEnableAccel =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_ACCEL);
const int32_t kControllerEnableGestures =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_GESTURES);
const int32_t kControllerEnablePosePrediction =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_POSE_PREDICTION);
const int32_t kControllerEnablePosition =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_POSITION);
const int32_t kControllerEnableBattery =
static_cast<int32_t>(GVR_CONTROLLER_ENABLE_BATTERY);
typedef gvr_controller_api_status ControllerApiStatus;
const ControllerApiStatus kControllerApiOk =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_OK);
const ControllerApiStatus kControllerApiUnsupported =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_UNSUPPORTED);
const ControllerApiStatus kControllerApiNotAuthorized =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_NOT_AUTHORIZED);
const ControllerApiStatus kControllerApiUnavailable =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_UNAVAILABLE);
const ControllerApiStatus kControllerApiServiceObsolete =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_SERVICE_OBSOLETE);
const ControllerApiStatus kControllerApiClientObsolete =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_CLIENT_OBSOLETE);
const ControllerApiStatus kControllerApiMalfunction =
static_cast<ControllerApiStatus>(GVR_CONTROLLER_API_MALFUNCTION);
typedef gvr_controller_connection_state ControllerConnectionState;
const ControllerConnectionState kControllerDisconnected =
static_cast<ControllerConnectionState>(GVR_CONTROLLER_DISCONNECTED);
const ControllerConnectionState kControllerScanning =
static_cast<ControllerConnectionState>(GVR_CONTROLLER_SCANNING);
const ControllerConnectionState kControllerConnecting =
static_cast<ControllerConnectionState>(GVR_CONTROLLER_CONNECTING);
const ControllerConnectionState kControllerConnected =
static_cast<ControllerConnectionState>(GVR_CONTROLLER_CONNECTED);
typedef gvr_controller_button ControllerButton;
const ControllerButton kControllerButtonNone =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_NONE);
const ControllerButton kControllerButtonClick =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_CLICK);
const ControllerButton kControllerButtonHome =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_HOME);
const ControllerButton kControllerButtonApp =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_APP);
const ControllerButton kControllerButtonVolumeUp =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_VOLUME_UP);
const ControllerButton kControllerButtonVolumeDown =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_VOLUME_DOWN);
const ControllerButton kControllerButtonCount =
static_cast<ControllerButton>(GVR_CONTROLLER_BUTTON_COUNT);
typedef gvr_controller_battery_level ControllerBatteryLevel;
const ControllerBatteryLevel kControllerBatteryLevelUnknown =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_UNKNOWN);
const ControllerBatteryLevel kControllerBatteryLevelCriticalLow =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_CRITICAL_LOW);
const ControllerBatteryLevel kControllerBatteryLevelLow =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_LOW);
const ControllerBatteryLevel kControllerBatteryLevelMedium =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_MEDIUM);
const ControllerBatteryLevel kControllerBatteryLevelAlmostFull =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_ALMOST_FULL);
const ControllerBatteryLevel kControllerBatteryLevelFull =
static_cast<ControllerBatteryLevel>(
GVR_CONTROLLER_BATTERY_LEVEL_FULL);
enum {
kTrackingStatusFlagInvalid = GVR_TRACKING_STATUS_FLAG_INVALID,
kTrackingStatusFlagInitializing = GVR_TRACKING_STATUS_FLAG_INITIALIZING,
kTrackingStatusFlagHas6Dof = GVR_TRACKING_STATUS_FLAG_HAS_6DOF
};
/// An uninitialized external surface ID.
const int32_t kUninitializedExternalSurface = GVR_BUFFER_INDEX_EXTERNAL_SURFACE;
/// The default source buffer index for viewports.
const int32_t kDefaultBufferIndex = 0;
/// Invalid source id that can be used to initialize source id variables
/// during construction.
typedef gvr_audio_source_id AudioSourceId;
const AudioSourceId kInvalidSourceId = GVR_AUDIO_INVALID_SOURCE_ID;
typedef gvr_eye Eye;
typedef gvr_viewer_type ViewerType;
const ViewerType kViewerTypeCardboard =
static_cast<ViewerType>(GVR_VIEWER_TYPE_CARDBOARD);
const ViewerType kViewerTypeDaydream =
static_cast<ViewerType>(GVR_VIEWER_TYPE_DAYDREAM);
typedef gvr_version Version;
typedef gvr_sizei Sizei;
typedef gvr_recti Recti;
typedef gvr_rectf Rectf;
typedef gvr_vec2f Vec2f;
typedef gvr_vec3f Vec3f;
typedef gvr_mat4f Mat4f;
typedef gvr_quatf Quatf;
typedef gvr_clock_time_point ClockTimePoint;
typedef gvr_value Value;
typedef gvr_event Event;
typedef gvr_flags Flags;
typedef gvr_vec2f ControllerVec2;
typedef gvr_vec3f ControllerVec3;
typedef gvr_quatf ControllerQuat;
typedef gvr_audio_rendering_mode AudioRenderingMode;
typedef gvr_audio_material_type AudioMaterialName;
typedef gvr_audio_distance_rolloff_type AudioRolloffMethod;
typedef gvr_audio_surround_format_type AudioSurroundFormat;
typedef gvr_color_format_type ColorFormat;
const ColorFormat kColorFormatRgba8888 =
static_cast<ColorFormat>(GVR_COLOR_FORMAT_RGBA_8888);
const ColorFormat kColorFormatRgb565 =
static_cast<ColorFormat>(GVR_COLOR_FORMAT_RGB_565);
typedef gvr_depth_stencil_format_type DepthStencilFormat;
const DepthStencilFormat kDepthStencilFormatNone =
static_cast<DepthStencilFormat>(GVR_DEPTH_STENCIL_FORMAT_NONE);
const DepthStencilFormat kDepthStencilFormatDepth16 =
static_cast<DepthStencilFormat>(GVR_DEPTH_STENCIL_FORMAT_DEPTH_16);
const DepthStencilFormat kDepthStencilFormatDepth24 =
static_cast<DepthStencilFormat>(GVR_DEPTH_STENCIL_FORMAT_DEPTH_24);
const DepthStencilFormat kDepthStencilFormatDepth24Stencil8 =
static_cast<DepthStencilFormat>(
GVR_DEPTH_STENCIL_FORMAT_DEPTH_24_STENCIL_8);
const DepthStencilFormat kDepthStencilFormatDepth32f =
static_cast<DepthStencilFormat>(GVR_DEPTH_STENCIL_FORMAT_DEPTH_32_F);
const DepthStencilFormat kDepthStencilFormatDepth32fStencil8 =
static_cast<DepthStencilFormat>(
GVR_DEPTH_STENCIL_FORMAT_DEPTH_32_F_STENCIL_8);
const DepthStencilFormat kDepthStencilFormatStencil8 =
static_cast<DepthStencilFormat>(GVR_DEPTH_STENCIL_FORMAT_STENCIL_8);
typedef gvr_controller_handedness ControllerHandedness;
const ControllerHandedness kControllerRightHanded =
static_cast<ControllerHandedness>(GVR_CONTROLLER_RIGHT_HANDED);
const ControllerHandedness kControllerLeftHanded =
static_cast<ControllerHandedness>(GVR_CONTROLLER_LEFT_HANDED);
typedef gvr_arm_model_behavior ArmModelBehavior;
const ArmModelBehavior kArmModelBehaviorFollowGaze =
static_cast<ArmModelBehavior>(GVR_ARM_MODEL_FOLLOW_GAZE);
const ArmModelBehavior kArmModelBehaviorSyncGaze =
static_cast<ArmModelBehavior>(GVR_ARM_MODEL_SYNC_GAZE);
const ArmModelBehavior kArmModelBehaviorIgnoreGaze =
static_cast<ArmModelBehavior>(GVR_ARM_MODEL_IGNORE_GAZE);
typedef gvr_error Error;
const Error kErrorNone = static_cast<Error>(GVR_ERROR_NONE);
const Error kErrorControllerCreateFailed =
static_cast<Error>(GVR_ERROR_CONTROLLER_CREATE_FAILED);
const Error kErrorNoFrameAvailable =
static_cast<Error>(GVR_ERROR_NO_FRAME_AVAILABLE);
class AudioApi;
class BufferSpec;
class ControllerApi;
class ControllerState;
class Frame;
class GvrApi;
class BufferViewport;
class BufferViewportList;
class SwapChain;
class UserPrefs;
} // namespace gvr
// Non-member operators for convenience. Since typedefs do not trigger
// argument-dependent lookup, these operators have to be defined for the
// underlying types.
inline bool operator==(const gvr_vec2f& lhs, const gvr_vec2f& rhs) {
return lhs.x == rhs.x && lhs.y == rhs.y;
}
inline bool operator!=(const gvr_vec2f& lhs, const gvr_vec2f& rhs) {
return !(lhs == rhs);
}
inline bool operator==(const gvr_vec3f& lhs, const gvr_vec3f& rhs) {
return lhs.x == rhs.x && lhs.y == rhs.y;
}
inline bool operator!=(const gvr_vec3f& lhs, const gvr_vec3f& rhs) {
return !(lhs == rhs);
}
inline bool operator==(const gvr_recti& lhs, const gvr_recti& rhs) {
return lhs.left == rhs.left && lhs.right == rhs.right &&
lhs.bottom == rhs.bottom && lhs.top == rhs.top;
}
inline bool operator!=(const gvr_recti& lhs, const gvr_recti& rhs) {
return !(lhs == rhs);
}
inline bool operator==(const gvr_rectf& lhs, const gvr_rectf& rhs) {
return lhs.left == rhs.left && lhs.right == rhs.right &&
lhs.bottom == rhs.bottom && lhs.top == rhs.top;
}
inline bool operator!=(const gvr_rectf& lhs, const gvr_rectf& rhs) {
return !(lhs == rhs);
}
inline bool operator==(const gvr_sizei& lhs, const gvr_sizei& rhs) {
return lhs.width == rhs.width && lhs.height == rhs.height;
}
inline bool operator!=(const gvr_sizei& lhs, const gvr_sizei& rhs) {
return !(lhs == rhs);
}
inline bool operator==(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos == rhs.monotonic_system_time_nanos;
}
inline bool operator!=(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos != rhs.monotonic_system_time_nanos;
}
inline bool operator<(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos < rhs.monotonic_system_time_nanos;
}
inline bool operator<=(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos <= rhs.monotonic_system_time_nanos;
}
inline bool operator>(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos > rhs.monotonic_system_time_nanos;
}
inline bool operator>=(gvr_clock_time_point lhs, gvr_clock_time_point rhs) {
return lhs.monotonic_system_time_nanos >= rhs.monotonic_system_time_nanos;
}
#endif // #if defined(__cplusplus) && !defined(GVR_NO_CPP_WRAPPER)
#endif // VR_GVR_CAPI_INCLUDE_GVR_TYPES_H_