pub struct BackendOpenXR;
Expand description
This class is NOT of general interest, unless you are trying to add support for some unusual OpenXR extension! StereoKit should do all the OpenXR work that most people will need. If you find yourself here anyhow for something you feel StereoKit should support already, please add a feature request on GitHub!
This class contains handles and methods for working directly with OpenXR. This may allow you to activate or work with OpenXR extensions that StereoKit hasn’t implemented or exposed yet. Check that Backend.XRType is OpenXR before using any of this.
These properties may best be used with some external OpenXR binding library, but you may get some limited mileage with the API as provided here. https://stereokit.net/Pages/StereoKit/Backend.OpenXR.html
see implementations in crate::tools::passthrough_fb_ext
crate::tools::os_api
§Examples
use stereokit_rust::system::{Backend, BackendOpenXR, BackendXRType};
// This must be set before initializing StereoKit.
BackendOpenXR::use_minimum_exts(false);
BackendOpenXR::exclude_ext("XR_EXT_hand_tracking");
BackendOpenXR::request_ext("XR_EXT_hand_tracking");
stereokit_rust::test_init_sk!(); // !!!! Get a proper way to initialize sk !!!!
// These are result when not running in an OpenXR environment:
assert_eq!( Backend::xr_type(), BackendXRType::None);
assert_ne!( Backend::xr_type(), BackendXRType::OpenXR);
let eyes_sample_time = BackendOpenXR::eyes_sample_time();
assert_eq!(eyes_sample_time, 0);
let instance = BackendOpenXR::instance();
assert_eq!(instance, 0);
let session = BackendOpenXR::session();
assert_eq!(session, 0);
let space = BackendOpenXR::space();
assert_eq!(space, 0);
let system_id = BackendOpenXR::system_id();
assert_eq!(system_id, 0);
let time = BackendOpenXR::time();
assert_eq!(time, 0);
let ext_enabled = BackendOpenXR::ext_enabled("XR_EXT_hand_tracking");
assert_eq!(ext_enabled, false);
let get_function_ptr = BackendOpenXR::get_function_ptr("xrGetHandTrackerEXT");
assert_eq!(get_function_ptr, None);
let get_function = BackendOpenXR::get_function::<unsafe extern "C" fn()>("xrGetHandTrackerEXT");
assert_eq!(get_function, None);
BackendOpenXR::set_hand_joint_scale(1.0);
// using openxrs crate:
// let mut xr_composition_layer_x = XrCompositionLayerProjection{
// ty: XrStructureType::XR_TYPE_COMPOSITION_LAYER_PROJECTION,
// next: std::ptr::null(),
// layer_flags: XrCompositionLayerFlags::empty(),
// space: 0,
// view_count: 0,
// views: [XrCompositionLayerProjectionView::default(); 0],
// };
// BackendOpenXR::add_composition_layer(&mut xr_composition_layer_x, 0);
Implementations§
Source§impl BackendOpenXR
impl BackendOpenXR
Sourcepub fn eyes_sample_time() -> i64
pub fn eyes_sample_time() -> i64
Type: XrTime. This is the OpenXR time of the eye tracker sample associated with the current value of. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/EyesSampleTime.html
see also backend_openxr_get_eyes_sample_time
Sourcepub fn instance() -> OpenXRHandleT
pub fn instance() -> OpenXRHandleT
Type: XrInstance. StereoKit’s instance handle, valid after Sk.initialize. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/Instance.html
see also backend_openxr_get_instance
Sourcepub fn session() -> OpenXRHandleT
pub fn session() -> OpenXRHandleT
Type: XrSession. StereoKit’s current session handle, this will be valid after SK.Initialize, but the session may not be started quite so early. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/Session.html
see also backend_openxr_get_session
Sourcepub fn space() -> OpenXRHandleT
pub fn space() -> OpenXRHandleT
Type: XrSpace. StereoKit’s primary coordinate space, valid after SK.Initialize, this will most likely be created from XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT or XR_REFERENCE_SPACE_TYPE_LOCAL. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/Space.html
see also backend_openxr_get_space
Sourcepub fn system_id() -> OpenXRHandleT
pub fn system_id() -> OpenXRHandleT
Type: XrSystemId. This is the id of the device StereoKit is currently using! This is the result of calling xrGetSystem with XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/SystemId.html
see also backend_openxr_get_system_id
Sourcepub fn time() -> i64
pub fn time() -> i64
Type: XrTime. This is the OpenXR time for the current frame, and is available after Sk.initialize. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/Time.html
see also backend_openxr_get_time
Sourcepub fn use_minimum_exts(value: bool)
pub fn use_minimum_exts(value: bool)
Tells StereoKit to request only the extensions that are absolutely critical to StereoKit. You can still request extensions via OpenXR.RequestExt, and this can be used to opt-in to extensions that StereoKit would normally request automatically. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/UseMinimumExts.html
see also backend_openxr_use_minimum_exts
Sourcepub fn add_composition_layer<T>(xr_composition_layer_x: &mut T, sort_order: i32)
pub fn add_composition_layer<T>(xr_composition_layer_x: &mut T, sort_order: i32)
This allows you to add XrCompositionLayers to the list that StereoKit submits to xrEndFrame. You must call this every frame you wish the layer to be included. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/AddCompositionLayer.html
xr_composition_layer_x
- A serializable XrCompositionLayer struct that follows the XrCompositionLayerBaseHeader data pattern.sort_order
- An sort order value for sorting with other composition layers in the list. The primary projection layer that StereoKit renders to is at 0, -1 would be before it, and +1 would be after.
see also backend_openxr_composition_layer
Sourcepub fn add_end_frame_chain<T>(xr_base_header: &mut T)
pub fn add_end_frame_chain<T>(xr_base_header: &mut T)
This adds an item to the chain of objects submitted to StereoKit’s xrEndFrame call! https://stereokit.net/Pages/StereoKit/Backend.OpenXR/AddEndFrameChain.html
xr_base_header
- An OpenXR object that will be chained into the xrEndFrame call.
see also backend_openxr_end_frame_chain
Sourcepub fn exclude_ext(extension_name: impl AsRef<str>)
pub fn exclude_ext(extension_name: impl AsRef<str>)
This ensures that StereoKit does not load a particular extension! StereoKit will behave as if the extension is not available on the device. It will also be excluded even if you explicitly requested it with RequestExt earlier, or afterwards. This MUST be called before SK.Initialize. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/ExcludeExt.html
extension_name
- The extension name as listed in the OpenXR spec. For example: “XR_EXT_hand_tracking”.
see also backend_openxr_ext_exclude
Sourcepub fn request_ext(extension_name: impl AsRef<str>)
pub fn request_ext(extension_name: impl AsRef<str>)
Requests that OpenXR load a particular extension. This MUST be called before SK.Initialize. Note that it’s entirely possible that your extension will not load on certain runtimes, so be sure to check ExtEnabled to see if it’s available to use. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/RequestExt.html
extension_name
- The extension name as listed in the OpenXR spec. For example: “XR_EXT_hand_tracking”.
see also backend_openxr_ext_request
Sourcepub fn ext_enabled(extension_name: impl AsRef<str>) -> bool
pub fn ext_enabled(extension_name: impl AsRef<str>) -> bool
This tells if an OpenXR extension has been requested and successfully loaded by the runtime. This MUST only be called after SK.Initialize. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/ExtEnabled.html
extension_name
- The extension name as listed in the OpenXR spec. For example: “XR_EXT_hand_tracking”.
see also backend_openxr_ext_enabled
Sourcepub fn get_function_ptr(function_name: impl AsRef<str>) -> Option<VoidFunction>
pub fn get_function_ptr(function_name: impl AsRef<str>) -> Option<VoidFunction>
This is basically xrGetInstanceProcAddr from OpenXR, you can use this to get and call functions from an extension you’ve loaded. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/GetFunctionPtr.html
function_name
- The name of the function to get the pointer for.
see also backend_openxr_get_function
Sourcepub fn get_function<T>(function_name: impl AsRef<str>) -> Option<T>
pub fn get_function<T>(function_name: impl AsRef<str>) -> Option<T>
This is basically xrGetInstanceProcAddr from OpenXR, you can use this to get and call functions from an extension you’ve loaded. https://stereokit.net/Pages/StereoKit/Backend.OpenXR/GetFunctionPtr.html
function_name
- The name of the function to get the pointer for.
see also backend_openxr_get_function
Sourcepub fn set_hand_joint_scale(joint_scale_factor: f32)
pub fn set_hand_joint_scale(joint_scale_factor: f32)
This sets a scaling value for joints provided by the articulated hand extension. Some systems just don’t seem to get their joint sizes right! https://stereokit.net/Pages/StereoKit/Backend.OpenXR/SetHandJointScale.html
joint_scale_factor
- 1 being the default value, 2 being twice as large as normal, and 0.5 being half as big as normal.
see also backend_openxr_set_hand_joint_scale
Auto Trait Implementations§
impl Freeze for BackendOpenXR
impl RefUnwindSafe for BackendOpenXR
impl Send for BackendOpenXR
impl Sync for BackendOpenXR
impl Unpin for BackendOpenXR
impl UnwindSafe for BackendOpenXR
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.