From e73920ee97907683c8d60224c03b6a67c2f0f613 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 3 Apr 2019 12:32:47 -0700 Subject: [PATCH] Add XRRigidTransform.matrix --- .../script/dom/webidls/XRRigidTransform.webidl | 2 +- components/script/dom/xrrigidtransform.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/components/script/dom/webidls/XRRigidTransform.webidl b/components/script/dom/webidls/XRRigidTransform.webidl index 8d9d9a4f5bae..089dc1732a68 100644 --- a/components/script/dom/webidls/XRRigidTransform.webidl +++ b/components/script/dom/webidls/XRRigidTransform.webidl @@ -9,6 +9,6 @@ interface XRRigidTransform { readonly attribute DOMPointReadOnly position; readonly attribute DOMPointReadOnly orientation; - // readonly attribute Float32Array matrix; + readonly attribute Float32Array matrix; readonly attribute XRRigidTransform inverse; }; diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index 3c2cd955d47c..030905d84fae 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -12,9 +12,12 @@ use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::dompointreadonly::DOMPointReadOnly; use crate::dom::globalscope::GlobalScope; +use crate::dom::vrframedata::create_typed_array; use crate::dom::window::Window; use dom_struct::dom_struct; use euclid::{RigidTransform3D, Rotation3D, Vector3D}; +use js::jsapi::{Heap, JSContext, JSObject}; +use std::ptr::NonNull; #[dom_struct] pub struct XRRigidTransform { @@ -24,6 +27,7 @@ pub struct XRRigidTransform { #[ignore_malloc_size_of = "defined in euclid"] transform: RigidTransform3D, inverse: MutNullableDom, + matrix: Heap<*mut JSObject>, } impl XRRigidTransform { @@ -34,6 +38,7 @@ impl XRRigidTransform { orientation: MutNullableDom::default(), transform, inverse: MutNullableDom::default(), + matrix: Heap::default(), } } @@ -98,6 +103,18 @@ impl XRRigidTransformMethods for XRRigidTransform { self.inverse .or_init(|| XRRigidTransform::new(&self.global(), self.transform.inverse())) } + // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-matrix + #[allow(unsafe_code)] + unsafe fn Matrix(&self, _cx: *mut JSContext) -> NonNull { + if self.matrix.get().is_null() { + let cx = self.global().get_cx(); + // According to the spec all matrices are column-major, + // however euclid uses row vectors so we use .to_row_major_array() + let arr = self.transform.to_transform().cast().to_row_major_array(); + create_typed_array(cx, &arr, &self.matrix); + } + NonNull::new(self.matrix.get()).unwrap() + } } impl XRRigidTransform {