Skip to content

Commit

Permalink
Add XRFrame.getPose()
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Apr 5, 2019
1 parent 3d79027 commit 7e4b651
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
1 change: 1 addition & 0 deletions components/script/dom/webidls/XRFrame.webidl
Expand Up @@ -9,5 +9,6 @@ interface XRFrame {
readonly attribute XRSession session; readonly attribute XRSession session;


[Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); [Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
[Throws] XRPose? getPose(XRSpace space, XRSpace relativeTo);
// XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace); // XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace);
}; };
17 changes: 17 additions & 0 deletions components/script/dom/xrframe.rs
Expand Up @@ -9,8 +9,10 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::xrpose::XRPose;
use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrsession::XRSession; use crate::dom::xrsession::XRSession;
use crate::dom::xrspace::XRSpace;
use crate::dom::xrviewerpose::XRViewerPose; use crate::dom::xrviewerpose::XRViewerPose;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use webvr_traits::WebVRFrameData; use webvr_traits::WebVRFrameData;
Expand Down Expand Up @@ -67,4 +69,19 @@ impl XRFrameMethods for XRFrame {
&self.data, &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)))
}
} }

0 comments on commit 7e4b651

Please sign in to comment.