From 813613628db87f09014330a9c508b079454198e6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 4 Apr 2019 17:40:18 -0700 Subject: [PATCH] Add XRSession.viewerSpace --- components/script/dom/webidls/XRSession.webidl | 1 + components/script/dom/xrsession.rs | 6 ++++++ components/script/dom/xrspace.rs | 17 ++++++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 5f2cfb23929..f22918d469d 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -20,6 +20,7 @@ interface XRSession : EventTarget { readonly attribute XREnvironmentBlendMode environmentBlendMode; readonly attribute XRRenderState renderState; + readonly attribute XRSpace viewerSpace; // // Methods Promise requestReferenceSpace(XRReferenceSpaceOptions options); diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index bf7dcb92258..c8394be5230 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -21,6 +21,7 @@ use crate::dom::vrdisplay::VRDisplay; use crate::dom::xrlayer::XRLayer; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrenderstate::XRRenderState; +use crate::dom::xrspace::XRSpace; use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use dom_struct::dom_struct; use std::rc::Rc; @@ -82,6 +83,11 @@ impl XRSessionMethods for XRSession { ) } + // https://immersive-web.github.io/webxr/#dom-xrsession-viewerspace + fn ViewerSpace(&self) -> DomRoot { + XRSpace::new_viewerspace(&self.global(), &self) + } + /// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe fn UpdateRenderState(&self, init: &XRRenderStateInit) -> Rc { let p = Promise::new(&self.global()); diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs index d9bbad8cd86..8948ac03c8e 100644 --- a/components/script/dom/xrspace.rs +++ b/components/script/dom/xrspace.rs @@ -18,6 +18,7 @@ use webvr_traits::WebVRFrameData; pub struct XRSpace { eventtarget: EventTarget, session: Dom, + 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 { + 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 { reflect_dom_object( - Box::new(XRSpace::new_inherited(session)), + Box::new(XRSpace::new_viewerspace_inner(session)), global, XRSpaceBinding::Wrap, ) @@ -47,6 +56,8 @@ impl XRSpace { pub fn get_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D { if let Some(reference) = self.downcast::() { reference.get_pose(base_pose) + } else if self.is_viewerspace { + XRSpace::viewer_pose_from_frame_data(base_pose) } else { unreachable!() }