| /* 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_ |