diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-03-27 00:05:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-27 00:05:03 -0400 |
commit | 3c27dc993d3f1ffe61b09de32ce6f8fdfeb1df39 (patch) | |
tree | 78f3e26e10c364d6cfd8ca9c26e49c0bb769fea3 /components/script/dom/xrview.rs | |
parent | 2684499d2fc359ce609318bec24503306a151219 (diff) | |
parent | 2e628055786cd5d1d17cf739aea689f16e7a0d27 (diff) | |
download | servo-3c27dc993d3f1ffe61b09de32ce6f8fdfeb1df39.tar.gz servo-3c27dc993d3f1ffe61b09de32ce6f8fdfeb1df39.zip |
Auto merge of #23097 - Manishearth:transforms, r=asajeffrey
Properly support transforms in WebXR
Still need to test this
There are also a bunch of fixmes that I should get to in this PR.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23097)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/xrview.rs')
-rw-r--r-- | components/script/dom/xrview.rs | 23 |
1 files changed, 19 insertions, 4 deletions
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 } |