rust_raylib/
vr.rs

1use crate::{ffi, math::Matrix};
2
3use static_assertions::{assert_eq_align, assert_eq_size};
4
5/// VrDeviceInfo, Head-Mounted-Display device parameters
6#[repr(C)]
7#[derive(Clone, Debug, PartialEq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct VrDeviceInfo {
10    /// Horizontal resolution in pixels
11    pub horizontal_resolution: u32,
12    /// Vertical resolution in pixels
13    pub vertical_resolution: u32,
14    /// Horizontal size in meters
15    pub horizontal_screen_size: f32,
16    /// Vertical size in meters
17    pub vertical_screen_size: f32,
18    /// Screen center in meters
19    pub screen_center_v: f32,
20    /// Distance between eye and display in meters
21    pub eye_to_screen_distance: f32,
22    /// Lens separation distance in meters
23    pub lens_separation_distance: f32,
24    /// IPD (distance between pupils) in meters
25    pub interpupillary_distance: f32,
26    /// Lens distortion constant parameters
27    pub lens_distortion_values: [f32; 4],
28    /// Chromatic aberration correction parameters
29    pub chroma_ab_correction: [f32; 4],
30}
31
32assert_eq_size!(VrDeviceInfo, ffi::VrDeviceInfo);
33assert_eq_align!(VrDeviceInfo, ffi::VrDeviceInfo);
34
35impl From<VrDeviceInfo> for ffi::VrDeviceInfo {
36    #[inline]
37    fn from(val: VrDeviceInfo) -> Self {
38        unsafe { std::mem::transmute(val) }
39    }
40}
41
42impl From<ffi::VrDeviceInfo> for VrDeviceInfo {
43    #[inline]
44    fn from(value: ffi::VrDeviceInfo) -> Self {
45        unsafe { std::mem::transmute(value) }
46    }
47}
48
49/// VrStereoConfig, VR stereo rendering configuration for simulator
50#[repr(C)]
51#[derive(Clone, Debug, PartialEq)]
52#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
53pub struct VrStereoConfig {
54    /// VR projection matrices (per eye)
55    pub projection: [Matrix; 2],
56    /// VR view offset matrices (per eye)
57    pub view_offset: [Matrix; 2],
58    /// VR left lens center
59    pub left_lens_center: [f32; 2],
60    /// VR right lens center
61    pub right_lens_center: [f32; 2],
62    /// VR left screen center
63    pub left_screen_center: [f32; 2],
64    /// VR right screen center
65    pub right_screen_center: [f32; 2],
66    /// VR distortion scale
67    pub scale: [f32; 2],
68    /// VR distortion scale in
69    pub scale_in: [f32; 2],
70}
71
72impl VrStereoConfig {
73    /// Load VR stereo config for VR simulator device parameters
74    pub fn load(device: VrDeviceInfo) -> Self {
75        // raylib 4.5.0 doesn't allocate VrStereoConfig and UnloadVrStereoConfig is an empty func
76        assert_eq!(crate::RAYLIB_VERSION, "4.5");
77
78        unsafe { ffi::LoadVrStereoConfig(device.into()).into() }
79    }
80}
81
82assert_eq_size!(VrStereoConfig, ffi::VrStereoConfig);
83assert_eq_align!(VrStereoConfig, ffi::VrStereoConfig);
84
85impl From<VrStereoConfig> for ffi::VrStereoConfig {
86    #[inline]
87    fn from(val: VrStereoConfig) -> Self {
88        // raylib 4.5.0 doesn't allocate VrStereoConfig and UnloadVrStereoConfig is an empty func
89        assert_eq!(crate::RAYLIB_VERSION, "4.5");
90
91        unsafe { std::mem::transmute(val) }
92    }
93}
94
95impl From<ffi::VrStereoConfig> for VrStereoConfig {
96    #[inline]
97    fn from(value: ffi::VrStereoConfig) -> Self {
98        // raylib 4.5.0 doesn't allocate VrStereoConfig and UnloadVrStereoConfig is an empty func
99        assert_eq!(crate::RAYLIB_VERSION, "4.5");
100
101        unsafe { std::mem::transmute(value) }
102    }
103}
104
105impl Drop for VrStereoConfig {
106    #[inline]
107    fn drop(&mut self) {
108        // raylib 4.5.0 doesn't allocate VrStereoConfig and UnloadVrStereoConfig is an empty func
109        assert_eq!(crate::RAYLIB_VERSION, "4.5");
110
111        // unsafe { ffi::UnloadVrStereoConfig( ... ) }
112    }
113}