aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrrigidtransform.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-04-03 00:05:01 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-04-03 23:55:33 -0700
commitfeb3517ad5af7d62dc902031d6487ee593f37364 (patch)
tree123b8198c0b08ab6a6492d77260f24f71127e679 /components/script/dom/xrrigidtransform.rs
parent67694dc90d60de6feafb78a02ac62e3d39f23257 (diff)
downloadservo-feb3517ad5af7d62dc902031d6487ee593f37364.tar.gz
servo-feb3517ad5af7d62dc902031d6487ee593f37364.zip
Move XRRigidTransform to using RigidTransform3D
Diffstat (limited to 'components/script/dom/xrrigidtransform.rs')
-rw-r--r--components/script/dom/xrrigidtransform.rs55
1 files changed, 19 insertions, 36 deletions
diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs
index ad7cbe7543b..c32d0f75838 100644
--- a/components/script/dom/xrrigidtransform.rs
+++ b/components/script/dom/xrrigidtransform.rs
@@ -13,7 +13,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::dompointreadonly::DOMPointReadOnly;
use crate::dom::window::Window;
use dom_struct::dom_struct;
-use euclid::{Rotation3D, Transform3D};
+use euclid::{RigidTransform3D, Rotation3D, Transform3D, Vector3D};
#[dom_struct]
pub struct XRRigidTransform {
@@ -21,9 +21,7 @@ pub struct XRRigidTransform {
position: Dom<DOMPointReadOnly>,
orientation: Dom<DOMPointReadOnly>,
#[ignore_malloc_size_of = "defined in euclid"]
- translate: Transform3D<f64>,
- #[ignore_malloc_size_of = "defined in euclid"]
- rotate: Rotation3D<f64>,
+ transform: RigidTransform3D<f64>,
}
impl XRRigidTransform {
@@ -31,7 +29,7 @@ impl XRRigidTransform {
position: &DOMPointReadOnly,
orientation: &DOMPointReadOnly,
) -> XRRigidTransform {
- let translate = Transform3D::create_translation(
+ let translate = Vector3D::new(
position.X() as f64,
position.Y() as f64,
position.Z() as f64,
@@ -42,12 +40,12 @@ impl XRRigidTransform {
orientation.Z() as f64,
orientation.W() as f64,
);
+ let transform = RigidTransform3D::new(rotate, translate);
XRRigidTransform {
reflector_: Reflector::new(),
position: Dom::from_ref(position),
orientation: Dom::from_ref(orientation),
- translate,
- rotate,
+ transform,
}
}
@@ -101,37 +99,22 @@ impl XRRigidTransformMethods for XRRigidTransform {
}
// 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 inverse = self.transform.inverse();
+
+ let position = DOMPointReadOnly::new(
+ &global,
+ inverse.translation.x.into(),
+ inverse.translation.y.into(),
+ inverse.translation.z.into(),
+ 1.,
+ );
let orientation = DOMPointReadOnly::new(
&global,
- r_1.i.into(),
- r_1.j.into(),
- r_1.k.into(),
- r_1.r.into(),
+ inverse.rotation.i.into(),
+ inverse.rotation.j.into(),
+ inverse.rotation.k.into(),
+ inverse.rotation.r.into(),
);
XRRigidTransform::new(global.as_window(), &position, &orientation)
}
@@ -141,6 +124,6 @@ impl XRRigidTransform {
pub fn matrix(&self) -> Transform3D<f64> {
// Spec says the orientation applies first,
// so post-multiply (?)
- self.translate.post_mul(&self.rotate.to_transform())
+ self.transform.to_transform()
}
}