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/xrreferencespace.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/xrreferencespace.rs')
-rw-r--r-- | components/script/dom/xrreferencespace.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index a24ab48d0c1..1c137d575ce 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -4,6 +4,7 @@ use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceMethods; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::root::{DomRoot, MutDom}; use crate::dom::dompointreadonly::DOMPointReadOnly; @@ -11,7 +12,10 @@ use crate::dom::window::Window; use crate::dom::xrrigidtransform::XRRigidTransform; use crate::dom::xrsession::XRSession; use crate::dom::xrspace::XRSpace; +use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use dom_struct::dom_struct; +use euclid::Transform3D; +use webvr_traits::WebVRFrameData; #[dom_struct] pub struct XRReferenceSpace { @@ -64,3 +68,33 @@ impl XRReferenceSpaceMethods for XRReferenceSpace { self.transform.get() } } + +impl XRReferenceSpace { + /// Gets viewer pose represented by this space + pub fn get_viewer_pose(&self, base_pose: &WebVRFrameData) -> Transform3D<f64> { + let pose = self.get_pose(base_pose); + + // This may change, see https://github.com/immersive-web/webxr/issues/567 + let offset = self.transform.get().matrix(); + // XXXManishearth we can directly compute the inverse from the transform parameters + // (and perhaps cache it) + // XXXManishearth we can also optimize for the unset/identity offset case + let inverse = offset + .inverse() + .expect("rigid transforms are always invertible"); + inverse.pre_mul(&pose) + } + + /// Gets pose represented by this space + /// + /// Does not apply originOffset, use get_viewer_pose instead if you need it + pub fn get_pose(&self, base_pose: &WebVRFrameData) -> Transform3D<f64> { + if let Some(stationary) = self.downcast::<XRStationaryReferenceSpace>() { + stationary.get_pose(base_pose) + } else { + // non-subclassed XRReferenceSpaces exist, obtained via the "identity" + // type. The pose does not depend on the base pose. + Transform3D::identity() + } + } +} |