From 7e4b6512a7c0899b642e5eedf0f250630f7d9d34 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 4 Apr 2019 16:21:15 -0700 Subject: [PATCH] Add XRFrame.getPose() --- components/script/dom/webidls/XRFrame.webidl | 1 + components/script/dom/xrframe.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/components/script/dom/webidls/XRFrame.webidl b/components/script/dom/webidls/XRFrame.webidl index 4a8159177d8..a393acbc588 100644 --- a/components/script/dom/webidls/XRFrame.webidl +++ b/components/script/dom/webidls/XRFrame.webidl @@ -9,5 +9,6 @@ interface XRFrame { readonly attribute XRSession session; [Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); + [Throws] XRPose? getPose(XRSpace space, XRSpace relativeTo); // XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace); }; diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index a3a8c201255..67602709d9b 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -9,8 +9,10 @@ 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; @@ -67,4 +69,19 @@ impl XRFrameMethods for XRFrame { &self.data, ))) } + + /// https://immersive-web.github.io/webxr/#dom-xrframe-getpose + fn GetPose( + &self, + space: &XRSpace, + relative_to: &XRSpace, + ) -> Result>, 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))) + } }