Skip to content

Commit

Permalink
Add XRRigidTransform.matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Apr 4, 2019
1 parent 646647e commit e73920e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
2 changes: 1 addition & 1 deletion components/script/dom/webidls/XRRigidTransform.webidl
Expand Up @@ -9,6 +9,6 @@
interface XRRigidTransform { interface XRRigidTransform {
readonly attribute DOMPointReadOnly position; readonly attribute DOMPointReadOnly position;
readonly attribute DOMPointReadOnly orientation; readonly attribute DOMPointReadOnly orientation;
// readonly attribute Float32Array matrix; readonly attribute Float32Array matrix;
readonly attribute XRRigidTransform inverse; readonly attribute XRRigidTransform inverse;
}; };
17 changes: 17 additions & 0 deletions components/script/dom/xrrigidtransform.rs
Expand Up @@ -12,9 +12,12 @@ use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::dompointreadonly::DOMPointReadOnly; use crate::dom::dompointreadonly::DOMPointReadOnly;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::vrframedata::create_typed_array;
use crate::dom::window::Window; use crate::dom::window::Window;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use euclid::{RigidTransform3D, Rotation3D, Vector3D}; use euclid::{RigidTransform3D, Rotation3D, Vector3D};
use js::jsapi::{Heap, JSContext, JSObject};
use std::ptr::NonNull;


#[dom_struct] #[dom_struct]
pub struct XRRigidTransform { pub struct XRRigidTransform {
Expand All @@ -24,6 +27,7 @@ pub struct XRRigidTransform {
#[ignore_malloc_size_of = "defined in euclid"] #[ignore_malloc_size_of = "defined in euclid"]
transform: RigidTransform3D<f64>, transform: RigidTransform3D<f64>,
inverse: MutNullableDom<XRRigidTransform>, inverse: MutNullableDom<XRRigidTransform>,
matrix: Heap<*mut JSObject>,
} }


impl XRRigidTransform { impl XRRigidTransform {
Expand All @@ -34,6 +38,7 @@ impl XRRigidTransform {
orientation: MutNullableDom::default(), orientation: MutNullableDom::default(),
transform, transform,
inverse: MutNullableDom::default(), inverse: MutNullableDom::default(),
matrix: Heap::default(),
} }
} }


Expand Down Expand Up @@ -98,6 +103,18 @@ impl XRRigidTransformMethods for XRRigidTransform {
self.inverse self.inverse
.or_init(|| XRRigidTransform::new(&self.global(), self.transform.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<JSObject> {
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 { impl XRRigidTransform {
Expand Down

0 comments on commit e73920e

Please sign in to comment.