1use std::marker::PhantomData;
8
9use euclid::{Rect, RigidTransform3D, Transform3D};
10#[cfg(feature = "ipc")]
11use serde::{Deserialize, Serialize};
12
13#[derive(Clone, Copy, Debug)]
16#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
17pub enum Viewer {}
18
19#[derive(Clone, Copy, Debug)]
22#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
23pub enum Floor {}
24
25#[derive(Clone, Copy, Debug)]
28#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
29pub enum LeftEye {}
30
31#[derive(Clone, Copy, Debug)]
34#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
35pub enum RightEye {}
36
37#[derive(Clone, Copy, Debug)]
39#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
40pub enum CubeLeft {}
41
42#[derive(Clone, Copy, Debug)]
44#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
45pub enum CubeRight {}
46
47#[derive(Clone, Copy, Debug)]
49#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
50pub enum CubeTop {}
51
52#[derive(Clone, Copy, Debug)]
54#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
55pub enum CubeBottom {}
56
57#[derive(Clone, Copy, Debug)]
59#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
60pub enum CubeBack {}
61
62#[derive(Clone, Copy, Debug)]
64#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
65pub struct SomeEye<Eye>(u8, PhantomData<Eye>);
66pub const LEFT_EYE: SomeEye<LeftEye> = SomeEye(0, PhantomData);
67pub const RIGHT_EYE: SomeEye<RightEye> = SomeEye(1, PhantomData);
68pub const VIEWER: SomeEye<Viewer> = SomeEye(2, PhantomData);
69pub const CUBE_LEFT: SomeEye<CubeLeft> = SomeEye(3, PhantomData);
70pub const CUBE_RIGHT: SomeEye<CubeRight> = SomeEye(4, PhantomData);
71pub const CUBE_TOP: SomeEye<CubeTop> = SomeEye(5, PhantomData);
72pub const CUBE_BOTTOM: SomeEye<CubeBottom> = SomeEye(6, PhantomData);
73pub const CUBE_BACK: SomeEye<CubeBack> = SomeEye(7, PhantomData);
74
75impl<Eye1, Eye2> PartialEq<SomeEye<Eye2>> for SomeEye<Eye1> {
76 fn eq(&self, rhs: &SomeEye<Eye2>) -> bool {
77 self.0 == rhs.0
78 }
79}
80
81#[derive(Clone, Copy, Debug)]
84#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
85pub enum Native {}
86
87#[derive(Clone, Copy, Debug)]
91#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
92pub enum Display {}
93
94#[derive(Clone, Copy, Debug)]
98#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
99pub enum Viewport {}
100
101#[derive(Clone, Copy, Debug)]
103#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
104pub enum Input {}
105
106#[derive(Clone, Copy, Debug)]
108#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
109pub enum Capture {}
110
111#[derive(Clone, Debug)]
117#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
118pub struct View<Eye> {
119 pub transform: RigidTransform3D<f32, Eye, Native>,
120 pub projection: Transform3D<f32, Eye, Display>,
121}
122
123impl<Eye> Default for View<Eye> {
124 fn default() -> Self {
125 View {
126 transform: RigidTransform3D::identity(),
127 projection: Transform3D::identity(),
128 }
129 }
130}
131
132impl<Eye> View<Eye> {
133 pub fn cast_unit<NewEye>(&self) -> View<NewEye> {
134 View {
135 transform: self.transform.cast_unit(),
136 projection: Transform3D::from_untyped(&self.projection.to_untyped()),
137 }
138 }
139}
140
141#[derive(Clone, Debug)]
143#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
144#[allow(clippy::large_enum_variant)]
145pub enum Views {
146 Inline,
148 Mono(View<Viewer>),
149 Stereo(View<LeftEye>, View<RightEye>),
150 StereoCapture(View<LeftEye>, View<RightEye>, View<Capture>),
151 Cubemap(
152 View<Viewer>,
153 View<CubeLeft>,
154 View<CubeRight>,
155 View<CubeTop>,
156 View<CubeBottom>,
157 View<CubeBack>,
158 ),
159}
160
161#[derive(Clone, Debug)]
165#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
166pub struct Viewports {
167 pub viewports: Vec<Rect<i32, Viewport>>,
168}