aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-03-25 23:48:28 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-03-26 00:09:15 -0700
commit6fda2f28a6ad9ca63da3853ed5b6164b50948bd6 (patch)
treef1ef25c88504ceefe76d4ab5e89f07ac654ab20d /components/script/dom
parent77e857891ad9c82b54586e221086fad58f53452f (diff)
downloadservo-6fda2f28a6ad9ca63da3853ed5b6164b50948bd6.tar.gz
servo-6fda2f28a6ad9ca63da3853ed5b6164b50948bd6.zip
Precompute XRRigidTransform's matrices
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/trace.rs9
-rw-r--r--components/script/dom/xrrigidtransform.rs32
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())
}
}