aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/bindings/trace.rs4
-rw-r--r--components/script/dom/webidls/XRRigidTransform.webidl1
-rw-r--r--components/script/dom/xrrigidtransform.rs39
3 files changed, 42 insertions, 2 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index ecb24ecee2d..1cc2a9a12a5 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -56,7 +56,9 @@ use cssparser::RGBA;
use devtools_traits::{CSSError, TimelineMarkerType, WorkerId};
use encoding_rs::{Decoder, Encoding};
use euclid::Length as EuclidLength;
-use euclid::{Point2D, Rect, Rotation3D, Transform2D, Transform3D, TypedScale, TypedSize2D, Vector2D};
+use euclid::{
+ Point2D, Rect, Rotation3D, Transform2D, Transform3D, TypedScale, TypedSize2D, Vector2D,
+};
use html5ever::buffer_queue::BufferQueue;
use html5ever::{LocalName, Namespace, Prefix, QualName};
use http::header::HeaderMap;
diff --git a/components/script/dom/webidls/XRRigidTransform.webidl b/components/script/dom/webidls/XRRigidTransform.webidl
index 91b4f92dc3c..2131ec22356 100644
--- a/components/script/dom/webidls/XRRigidTransform.webidl
+++ b/components/script/dom/webidls/XRRigidTransform.webidl
@@ -10,4 +10,5 @@ interface XRRigidTransform {
readonly attribute DOMPointReadOnly position;
readonly attribute DOMPointReadOnly orientation;
// readonly attribute Float32Array matrix;
+ XRRigidTransform inverse();
};
diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs
index e019f90d678..ad7cbe7543b 100644
--- a/components/script/dom/xrrigidtransform.rs
+++ b/components/script/dom/xrrigidtransform.rs
@@ -46,7 +46,8 @@ impl XRRigidTransform {
reflector_: Reflector::new(),
position: Dom::from_ref(position),
orientation: Dom::from_ref(orientation),
- translate, rotate
+ translate,
+ rotate,
}
}
@@ -98,6 +99,42 @@ impl XRRigidTransformMethods for XRRigidTransform {
fn Orientation(&self) -> DomRoot<DOMPointReadOnly> {
DomRoot::from_ref(&self.orientation)
}
+ // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-inverse
+ fn Inverse(&self) -> DomRoot<XRRigidTransform> {
+ // An XRRigidTransform is a rotation and a translation,
+ // i.e. T * R
+ //
+ // Its inverse is (T * R)^-1
+ // = R^-1 * T^-1
+ // = R^-1 * T^-1 * (R * R^-1)
+ // = (R^-1 * T^-1 * R) * R^-1
+ // = T' * R^-1
+ // = T' * R'
+ //
+ // (R^-1 * T^-1 * R) is a translation matrix, and R^-1 is a
+ // rotation matrix, so we can use these in the new rigid transform
+ let r_1 = self.rotate.inverse();
+ let t_1 = self
+ .translate
+ .inverse()
+ .expect("translation matrices should be invertible");
+ let t_p = r_1
+ .to_transform()
+ .post_mul(&t_1)
+ .post_mul(&self.rotate.to_transform());
+
+ let global = self.global();
+ let position =
+ DOMPointReadOnly::new(&global, t_p.m41.into(), t_p.m42.into(), t_p.m43.into(), 1.);
+ let orientation = DOMPointReadOnly::new(
+ &global,
+ r_1.i.into(),
+ r_1.j.into(),
+ r_1.k.into(),
+ r_1.r.into(),
+ );
+ XRRigidTransform::new(global.as_window(), &position, &orientation)
+ }
}
impl XRRigidTransform {