From 6fda2f28a6ad9ca63da3853ed5b6164b50948bd6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 25 Mar 2019 23:48:28 -0700 Subject: [PATCH] Precompute XRRigidTransform's matrices --- components/script/dom/bindings/trace.rs | 9 ++++++- 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 { + #[inline] + unsafe fn trace(&self, _trc: *mut JSTracer) { + // Do nothing + } +} + unsafe impl JSTraceable for Transform2D { #[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, orientation: Dom, + #[ignore_malloc_size_of = "defined in euclid"] + translate: Transform3D, + #[ignore_malloc_size_of = "defined in euclid"] + rotate: Rotation3D, } 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 { - // 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()) } }