aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrview.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-03-27 00:05:03 -0400
committerGitHub <noreply@github.com>2019-03-27 00:05:03 -0400
commit3c27dc993d3f1ffe61b09de32ce6f8fdfeb1df39 (patch)
tree78f3e26e10c364d6cfd8ca9c26e49c0bb769fea3 /components/script/dom/xrview.rs
parent2684499d2fc359ce609318bec24503306a151219 (diff)
parent2e628055786cd5d1d17cf739aea689f16e7a0d27 (diff)
downloadservo-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.rs23
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
}