aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrframe.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/xrframe.rs')
-rw-r--r--components/script/dom/xrframe.rs31
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)))
}
}