Add XRSession.viewerSpace

This commit is contained in:
Manish Goregaokar 2019-04-04 17:40:18 -07:00
parent 7e4b6512a7
commit 813613628d
3 changed files with 21 additions and 3 deletions

View file

@ -20,6 +20,7 @@ interface XRSession : EventTarget {
readonly attribute XREnvironmentBlendMode environmentBlendMode; readonly attribute XREnvironmentBlendMode environmentBlendMode;
readonly attribute XRRenderState renderState; readonly attribute XRRenderState renderState;
readonly attribute XRSpace viewerSpace;
// // Methods // // Methods
Promise<XRReferenceSpace> requestReferenceSpace(XRReferenceSpaceOptions options); Promise<XRReferenceSpace> requestReferenceSpace(XRReferenceSpaceOptions options);

View file

@ -21,6 +21,7 @@ use crate::dom::vrdisplay::VRDisplay;
use crate::dom::xrlayer::XRLayer; use crate::dom::xrlayer::XRLayer;
use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrrenderstate::XRRenderState; use crate::dom::xrrenderstate::XRRenderState;
use crate::dom::xrspace::XRSpace;
use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use std::rc::Rc; use std::rc::Rc;
@ -82,6 +83,11 @@ impl XRSessionMethods for XRSession {
) )
} }
// https://immersive-web.github.io/webxr/#dom-xrsession-viewerspace
fn ViewerSpace(&self) -> DomRoot<XRSpace> {
XRSpace::new_viewerspace(&self.global(), &self)
}
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe /// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe
fn UpdateRenderState(&self, init: &XRRenderStateInit) -> Rc<Promise> { fn UpdateRenderState(&self, init: &XRRenderStateInit) -> Rc<Promise> {
let p = Promise::new(&self.global()); let p = Promise::new(&self.global());

View file

@ -18,6 +18,7 @@ use webvr_traits::WebVRFrameData;
pub struct XRSpace { pub struct XRSpace {
eventtarget: EventTarget, eventtarget: EventTarget,
session: Dom<XRSession>, session: Dom<XRSession>,
is_viewerspace: bool,
} }
impl XRSpace { impl XRSpace {
@ -25,13 +26,21 @@ impl XRSpace {
XRSpace { XRSpace {
eventtarget: EventTarget::new_inherited(), eventtarget: EventTarget::new_inherited(),
session: Dom::from_ref(session), session: Dom::from_ref(session),
is_viewerspace: false,
} }
} }
#[allow(unused)] fn new_viewerspace_inner(session: &XRSession) -> XRSpace {
pub fn new(global: &GlobalScope, session: &XRSession) -> DomRoot<XRSpace> { XRSpace {
eventtarget: EventTarget::new_inherited(),
session: Dom::from_ref(session),
is_viewerspace: true,
}
}
pub fn new_viewerspace(global: &GlobalScope, session: &XRSession) -> DomRoot<XRSpace> {
reflect_dom_object( reflect_dom_object(
Box::new(XRSpace::new_inherited(session)), Box::new(XRSpace::new_viewerspace_inner(session)),
global, global,
XRSpaceBinding::Wrap, XRSpaceBinding::Wrap,
) )
@ -47,6 +56,8 @@ impl XRSpace {
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)
} else if self.is_viewerspace {
XRSpace::viewer_pose_from_frame_data(base_pose)
} else { } else {
unreachable!() unreachable!()
} }