diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/vrdisplay.rs | 8 | ||||
-rw-r--r-- | components/script/dom/vreyeparameters.rs | 4 | ||||
-rw-r--r-- | components/script/dom/xrframe.rs | 29 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 4 | ||||
-rw-r--r-- | components/script/dom/xrview.rs | 23 |
5 files changed, 51 insertions, 17 deletions
diff --git a/components/script/dom/vrdisplay.rs b/components/script/dom/vrdisplay.rs index 789f0e5936e..3bcfbddd3b9 100644 --- a/components/script/dom/vrdisplay.rs +++ b/components/script/dom/vrdisplay.rs @@ -173,6 +173,14 @@ impl VRDisplay { VRDisplayBinding::Wrap, ) } + + pub fn left_eye_params_offset(&self) -> [f32; 3] { + self.left_eye_params.get().offset_array() + } + + pub fn right_eye_params_offset(&self) -> [f32; 3] { + self.right_eye_params.get().offset_array() + } } impl Drop for VRDisplay { diff --git a/components/script/dom/vreyeparameters.rs b/components/script/dom/vreyeparameters.rs index 46b8472421d..2a212ab48bc 100644 --- a/components/script/dom/vreyeparameters.rs +++ b/components/script/dom/vreyeparameters.rs @@ -61,6 +61,10 @@ impl VREyeParameters { eye_parameters } + + pub fn offset_array(&self) -> [f32; 3] { + self.parameters.borrow().offset + } } impl VREyeParametersMethods for VREyeParameters { diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index b569f7d9e46..37017da9a5a 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -5,13 +5,11 @@ use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; -use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrsession::XRSession; -use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use crate::dom::xrview::XRView; use crate::dom::xrviewerpose::XRViewerPose; use dom_struct::dom_struct; @@ -55,16 +53,21 @@ impl XRFrameMethods for XRFrame { /// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option<DomRoot<XRViewerPose>> { - if let Some(_) = reference.downcast::<XRStationaryReferenceSpace>() { - // For 3DOF devices all three kinds of reference spaces are identical - // FIXME(#23070, Manishearth) support originOffset - let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data); - let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data); - Some(XRViewerPose::new(&self.global(), &left, &right)) - } else { - // FIXME(#23070, Manishearth) support identity reference spaces - // depends on https://github.com/immersive-web/webxr/issues/565 - None - } + let pose = reference.get_viewer_pose(&self.data); + let left = XRView::new( + &self.global(), + &self.session, + XREye::Left, + &pose, + &self.data, + ); + let right = XRView::new( + &self.global(), + &self.session, + XREye::Right, + &pose, + &self.data, + ); + Some(XRViewerPose::new(&self.global(), &left, &right)) } } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 575d0be2977..8c96ab66094 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -56,6 +56,10 @@ impl XRSession { self.display.xr_present(self, None, Some(p)); } + pub fn display(&self) -> &VRDisplay { + &self.display + } + pub fn set_layer(&self, layer: &XRLayer) { self.base_layer.set(Some(layer)) } diff --git a/components/script/dom/xrview.rs b/components/script/dom/xrview.rs index 59da37a144e..355177880a8 100644 --- a/components/script/dom/xrview.rs +++ b/components/script/dom/xrview.rs @@ -10,6 +10,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::vrframedata::create_typed_array; use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; +use euclid::Transform3D; use js::jsapi::{Heap, JSContext, JSObject}; use std::ptr::NonNull; use webvr_traits::WebVRFrameData; @@ -39,6 +40,7 @@ impl XRView { global: &GlobalScope, session: &XRSession, eye: XREye, + pose: &Transform3D<f64>, data: &WebVRFrameData, ) -> DomRoot<XRView> { let ret = reflect_dom_object( @@ -47,16 +49,29 @@ impl XRView { XRViewBinding::Wrap, ); - let (proj, view) = if eye == XREye::Left { - (&data.left_projection_matrix, &data.left_view_matrix) + let vr_display = session.display(); + + // XXXManishearth compute and cache projection matrices on the Display + let (proj, offset) = if eye == XREye::Left { + ( + &data.left_projection_matrix, + vr_display.left_eye_params_offset(), + ) } else { - (&data.right_projection_matrix, &data.right_view_matrix) + ( + &data.right_projection_matrix, + vr_display.right_eye_params_offset(), + ) }; + let offset = + Transform3D::create_translation(offset[0] as f64, offset[1] as f64, offset[2] as f64); + let view = pose.post_mul(&offset).cast().to_column_major_array(); + let cx = global.get_cx(); unsafe { create_typed_array(cx, proj, &ret.proj); - create_typed_array(cx, view, &ret.view); + create_typed_array(cx, &view, &ret.view); } ret } |