diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-03-25 23:48:28 -0700 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-03-26 00:09:15 -0700 |
commit | 6fda2f28a6ad9ca63da3853ed5b6164b50948bd6 (patch) | |
tree | f1ef25c88504ceefe76d4ab5e89f07ac654ab20d /components/script/dom | |
parent | 77e857891ad9c82b54586e221086fad58f53452f (diff) | |
download | servo-6fda2f28a6ad9ca63da3853ed5b6164b50948bd6.tar.gz servo-6fda2f28a6ad9ca63da3853ed5b6164b50948bd6.zip |
Precompute XRRigidTransform's matrices
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/trace.rs | 9 | ||||
-rw-r--r-- | components/script/dom/xrrigidtransform.rs | 32 |
2 files changed, 27 insertions, 14 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 181bae0a3f9..ecb24ecee2d 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -56,7 +56,7 @@ use cssparser::RGBA; use devtools_traits::{CSSError, TimelineMarkerType, WorkerId}; use encoding_rs::{Decoder, Encoding}; use euclid::Length as EuclidLength; -use euclid::{Point2D, Rect, 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; @@ -582,6 +582,13 @@ where } } +unsafe impl JSTraceable for Rotation3D<f64> { + #[inline] + unsafe fn trace(&self, _trc: *mut JSTracer) { + // Do nothing + } +} + unsafe impl JSTraceable for Transform2D<f32> { #[inline] unsafe fn trace(&self, _trc: *mut JSTracer) { diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index 2999ce7a1b1..e019f90d678 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -20,6 +20,10 @@ pub struct XRRigidTransform { reflector_: Reflector, 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>, } impl XRRigidTransform { @@ -27,10 +31,22 @@ impl XRRigidTransform { position: &DOMPointReadOnly, orientation: &DOMPointReadOnly, ) -> XRRigidTransform { + let translate = Transform3D::create_translation( + position.X() as f64, + position.Y() as f64, + position.Z() as f64, + ); + let rotate = Rotation3D::unit_quaternion( + orientation.X() as f64, + orientation.Y() as f64, + orientation.Z() as f64, + orientation.W() as f64, + ); XRRigidTransform { reflector_: Reflector::new(), position: Dom::from_ref(position), orientation: Dom::from_ref(orientation), + translate, rotate } } @@ -86,18 +102,8 @@ impl XRRigidTransformMethods for XRRigidTransform { impl XRRigidTransform { pub fn matrix(&self) -> Transform3D<f64> { - // XXXManishearth compute this during initialization - let translate = Transform3D::create_translation( - self.position.X(), - self.position.Y(), - self.position.Z(), - ); - let rotation = Rotation3D::unit_quaternion( - self.orientation.X(), - self.orientation.Y(), - self.orientation.Z(), - self.orientation.W(), - ); - translate.pre_mul(&rotation.to_transform()) + // Spec says the orientation applies first, + // so post-multiply (?) + self.translate.post_mul(&self.rotate.to_transform()) } } |