Validate spaces passed to getViewerPose()

This commit is contained in:
Manish Goregaokar 2019-04-04 16:09:53 -07:00
parent e33896f3ec
commit 3d790278f1
3 changed files with 16 additions and 5 deletions

View file

@ -8,6 +8,6 @@
interface XRFrame { interface XRFrame {
readonly attribute XRSession session; readonly attribute XRSession session;
XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); [Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
// XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace); // XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace);
}; };

View file

@ -4,6 +4,8 @@
use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding;
use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; 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::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;
@ -50,13 +52,19 @@ impl XRFrameMethods for XRFrame {
} }
/// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose /// 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); let pose = reference.get_viewer_pose(&self.data);
Some(XRViewerPose::new( Ok(Some(XRViewerPose::new(
&self.global(), &self.global(),
&self.session, &self.session,
pose, pose,
&self.data, &self.data,
)) )))
} }
} }

View file

@ -44,7 +44,6 @@ impl XRSpace {
/// The reference origin used is common between all /// The reference origin used is common between all
/// get_pose calls for spaces from the same device, so this can be used to compare /// get_pose calls for spaces from the same device, so this can be used to compare
/// with other spaces /// with other spaces
#[allow(unused)]
pub fn get_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D<f64> { pub fn get_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D<f64> {
if let Some(reference) = self.downcast::<XRReferenceSpace>() { if let Some(reference) = self.downcast::<XRReferenceSpace>() {
reference.get_pose(base_pose) reference.get_pose(base_pose)
@ -65,4 +64,8 @@ impl XRSpace {
); );
RigidTransform3D::new(rotation, translation) RigidTransform3D::new(rotation, translation)
} }
pub fn session(&self) -> &XRSession {
&self.session
}
} }