diff options
Diffstat (limited to 'components/script/dom/xrframe.rs')
-rw-r--r-- | components/script/dom/xrframe.rs | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index c9bb240a3bf..67602709d9b 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -4,11 +4,15 @@ use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; +use crate::dom::bindings::error::Error; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; +use crate::dom::xrpose::XRPose; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrsession::XRSession; +use crate::dom::xrspace::XRSpace; use crate::dom::xrviewerpose::XRViewerPose; use dom_struct::dom_struct; use webvr_traits::WebVRFrameData; @@ -50,13 +54,34 @@ impl XRFrameMethods for XRFrame { } /// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose - fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option<DomRoot<XRViewerPose>> { + fn GetViewerPose( + &self, + reference: &XRReferenceSpace, + ) -> Result<Option<DomRoot<XRViewerPose>>, Error> { + if self.session != reference.upcast::<XRSpace>().session() { + return Err(Error::InvalidState); + } let pose = reference.get_viewer_pose(&self.data); - Some(XRViewerPose::new( + Ok(Some(XRViewerPose::new( &self.global(), &self.session, pose, &self.data, - )) + ))) + } + + /// https://immersive-web.github.io/webxr/#dom-xrframe-getpose + fn GetPose( + &self, + space: &XRSpace, + relative_to: &XRSpace, + ) -> Result<Option<DomRoot<XRPose>>, Error> { + if self.session != space.session() || self.session != relative_to.session() { + return Err(Error::InvalidState); + } + let space = space.get_pose(&self.data); + let relative_to = relative_to.get_pose(&self.data); + let pose = relative_to.inverse().pre_mul(&space); + Ok(Some(XRPose::new(&self.global(), pose))) } } |