mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Add XRSession.viewerSpace
This commit is contained in:
parent
7e4b6512a7
commit
813613628d
3 changed files with 21 additions and 3 deletions
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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!()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue