/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ //! This crate uses `euclid`'s typed units, and exposes different coordinate spaces. use euclid::Rect; use euclid::RigidTransform3D; use euclid::Transform3D; #[cfg(feature = "ipc")] use serde::{Deserialize, Serialize}; use std::marker::PhantomData; /// The coordinate space of the viewer /// https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-viewer #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Viewer {} /// The coordinate space of the floor /// https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-local-floor #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Floor {} /// The coordinate space of the left eye /// https://immersive-web.github.io/webxr/#dom-xreye-left #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum LeftEye {} /// The coordinate space of the right eye /// https://immersive-web.github.io/webxr/#dom-xreye-right #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum RightEye {} /// The coordinate space of the left frustrum of a cubemap #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum CubeLeft {} /// The coordinate space of the right frustrum of a cubemap #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum CubeRight {} /// The coordinate space of the top frustrum of a cubemap #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum CubeTop {} /// The coordinate space of the bottom frustrum of a cubemap #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum CubeBottom {} /// The coordinate space of the back frustrum of a cubemap #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum CubeBack {} /// Pattern-match on eyes #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub struct SomeEye(u8, PhantomData); pub const LEFT_EYE: SomeEye = SomeEye(0, PhantomData); pub const RIGHT_EYE: SomeEye = SomeEye(1, PhantomData); pub const VIEWER: SomeEye = SomeEye(2, PhantomData); pub const CUBE_LEFT: SomeEye = SomeEye(3, PhantomData); pub const CUBE_RIGHT: SomeEye = SomeEye(4, PhantomData); pub const CUBE_TOP: SomeEye = SomeEye(5, PhantomData); pub const CUBE_BOTTOM: SomeEye = SomeEye(6, PhantomData); pub const CUBE_BACK: SomeEye = SomeEye(7, PhantomData); impl PartialEq> for SomeEye { fn eq(&self, rhs: &SomeEye) -> bool { self.0 == rhs.0 } } /// The native 3D coordinate space of the device /// This is not part of the webvr specification. #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Native {} /// The normalized device coordinate space, where the display /// is from (-1,-1) to (1,1). // TODO: are we OK assuming that we can use the same coordinate system for all displays? #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Display {} /// The unnormalized device coordinate space, where the display /// is from (0,0) to (w,h), measured in pixels. // TODO: are we OK assuming that we can use the same coordinate system for all displays? #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Viewport {} /// The coordinate space of an input device #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Input {} /// The coordinate space of a secondary capture view #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Capture {} /// For each eye, the pose of that eye, /// its projection onto its display. /// For stereo displays, we have a `View` and a `View`. /// For mono displays, we hagve a `View` /// https://immersive-web.github.io/webxr/#xrview #[derive(Clone, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub struct View { pub transform: RigidTransform3D, pub projection: Transform3D, } impl Default for View { fn default() -> Self { View { transform: RigidTransform3D::identity(), projection: Transform3D::identity(), } } } impl View { pub fn cast_unit(&self) -> View { View { transform: self.transform.cast_unit(), projection: Transform3D::from_untyped(&self.projection.to_untyped()), } } } /// Whether a device is mono or stereo, and the views it supports. #[derive(Clone, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub enum Views { /// Mono view for inline VR, viewport and projection matrices are calculated by client Inline, Mono(View), Stereo(View, View), StereoCapture(View, View, View), Cubemap( View, View, View, View, View, View, ), } /// A list of viewports per-eye in the order of fields in Views. /// /// Not all must be in active use. #[derive(Clone, Debug)] #[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))] pub struct Viewports { pub viewports: Vec>, }