aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/xrspace.rs')
-rw-r--r--components/script/dom/xrspace.rs39
1 files changed, 33 insertions, 6 deletions
diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs
index 8948ac03c8e..30f9246c354 100644
--- a/components/script/dom/xrspace.rs
+++ b/components/script/dom/xrspace.rs
@@ -5,20 +5,22 @@
use crate::dom::bindings::codegen::Bindings::XRSpaceBinding;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::reflect_dom_object;
-use crate::dom::bindings::root::{Dom, DomRoot};
+use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
+use crate::dom::xrinputsource::XRInputSource;
use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrsession::XRSession;
use dom_struct::dom_struct;
use euclid::{RigidTransform3D, Rotation3D, Vector3D};
-use webvr_traits::WebVRFrameData;
+use webvr_traits::{WebVRFrameData, WebVRPose};
#[dom_struct]
pub struct XRSpace {
eventtarget: EventTarget,
session: Dom<XRSession>,
is_viewerspace: bool,
+ input_source: MutNullableDom<XRInputSource>,
}
impl XRSpace {
@@ -27,6 +29,7 @@ impl XRSpace {
eventtarget: EventTarget::new_inherited(),
session: Dom::from_ref(session),
is_viewerspace: false,
+ input_source: Default::default(),
}
}
@@ -35,6 +38,7 @@ impl XRSpace {
eventtarget: EventTarget::new_inherited(),
session: Dom::from_ref(session),
is_viewerspace: true,
+ input_source: Default::default(),
}
}
@@ -45,6 +49,27 @@ impl XRSpace {
XRSpaceBinding::Wrap,
)
}
+
+ fn new_inputspace_inner(session: &XRSession, input: &XRInputSource) -> XRSpace {
+ XRSpace {
+ eventtarget: EventTarget::new_inherited(),
+ session: Dom::from_ref(session),
+ is_viewerspace: false,
+ input_source: MutNullableDom::new(Some(input)),
+ }
+ }
+
+ pub fn new_inputspace(
+ global: &GlobalScope,
+ session: &XRSession,
+ input: &XRInputSource,
+ ) -> DomRoot<XRSpace> {
+ reflect_dom_object(
+ Box::new(XRSpace::new_inputspace_inner(session, input)),
+ global,
+ XRSpaceBinding::Wrap,
+ )
+ }
}
impl XRSpace {
@@ -57,16 +82,18 @@ impl XRSpace {
if let Some(reference) = self.downcast::<XRReferenceSpace>() {
reference.get_pose(base_pose)
} else if self.is_viewerspace {
- XRSpace::viewer_pose_from_frame_data(base_pose)
+ XRSpace::pose_to_transform(&base_pose.pose)
+ } else if let Some(source) = self.input_source.get() {
+ XRSpace::pose_to_transform(&source.pose())
} else {
unreachable!()
}
}
- pub fn viewer_pose_from_frame_data(data: &WebVRFrameData) -> RigidTransform3D<f64> {
- let pos = data.pose.position.unwrap_or([0., 0., 0.]);
+ pub fn pose_to_transform(pose: &WebVRPose) -> RigidTransform3D<f64> {
+ let pos = pose.position.unwrap_or([0., 0., 0.]);
let translation = Vector3D::new(pos[0] as f64, pos[1] as f64, pos[2] as f64);
- let orient = data.pose.orientation.unwrap_or([0., 0., 0., 0.]);
+ let orient = pose.orientation.unwrap_or([0., 0., 0., 0.]);
let rotation = Rotation3D::quaternion(
orient[0] as f64,
orient[1] as f64,