aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/xrspace.rs')
-rw-r--r--components/script/dom/xrspace.rs51
1 files changed, 35 insertions, 16 deletions
diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs
index 60589be4054..8948ac03c8e 100644
--- a/components/script/dom/xrspace.rs
+++ b/components/script/dom/xrspace.rs
@@ -11,13 +11,14 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrsession::XRSession;
use dom_struct::dom_struct;
-use euclid::RigidTransform3D;
+use euclid::{RigidTransform3D, Rotation3D, Vector3D};
use webvr_traits::WebVRFrameData;
#[dom_struct]
pub struct XRSpace {
eventtarget: EventTarget,
session: Dom<XRSession>,
+ is_viewerspace: bool,
}
impl XRSpace {
@@ -25,13 +26,21 @@ impl XRSpace {
XRSpace {
eventtarget: EventTarget::new_inherited(),
session: Dom::from_ref(session),
+ is_viewerspace: false,
}
}
- #[allow(unused)]
- pub fn new(global: &GlobalScope, session: &XRSession) -> DomRoot<XRSpace> {
+ fn new_viewerspace_inner(session: &XRSession) -> XRSpace {
+ XRSpace {
+ eventtarget: EventTarget::new_inherited(),
+ session: Dom::from_ref(session),
+ is_viewerspace: true,
+ }
+ }
+
+ pub fn new_viewerspace(global: &GlobalScope, session: &XRSession) -> DomRoot<XRSpace> {
reflect_dom_object(
- Box::new(XRSpace::new_inherited(session)),
+ Box::new(XRSpace::new_viewerspace_inner(session)),
global,
XRSpaceBinding::Wrap,
)
@@ -39,25 +48,35 @@ impl XRSpace {
}
impl XRSpace {
- /// Gets viewer pose represented by this space
- #[allow(unused)]
- pub fn get_viewer_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D<f64> {
- if let Some(reference) = self.downcast::<XRReferenceSpace>() {
- reference.get_viewer_pose(base_pose)
- } else {
- unreachable!()
- }
- }
-
/// Gets pose represented by this space
///
- /// Does not apply originOffset, use get_viewer_pose instead if you need it
- #[allow(unused)]
+ /// The reference origin used is common between all
+ /// get_pose calls for spaces from the same device, so this can be used to compare
+ /// with other spaces
pub fn get_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D<f64> {
if let Some(reference) = self.downcast::<XRReferenceSpace>() {
reference.get_pose(base_pose)
+ } else if self.is_viewerspace {
+ XRSpace::viewer_pose_from_frame_data(base_pose)
} else {
unreachable!()
}
}
+
+ pub fn viewer_pose_from_frame_data(data: &WebVRFrameData) -> RigidTransform3D<f64> {
+ let pos = data.pose.position.unwrap_or([0., 0., 0.]);
+ let translation = Vector3D::new(pos[0] as f64, pos[1] as f64, pos[2] as f64);
+ let orient = data.pose.orientation.unwrap_or([0., 0., 0., 0.]);
+ let rotation = Rotation3D::quaternion(
+ orient[0] as f64,
+ orient[1] as f64,
+ orient[2] as f64,
+ orient[3] as f64,
+ );
+ RigidTransform3D::new(rotation, translation)
+ }
+
+ pub fn session(&self) -> &XRSession {
+ &self.session
+ }
}