mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Add XRRigidTransform.matrix
This commit is contained in:
parent
646647e8d9
commit
e73920ee97
2 changed files with 18 additions and 1 deletions
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
@ -34,6 +38,7 @@ impl XRRigidTransform {
|
||||||
orientation: MutNullableDom::default(),
|
orientation: MutNullableDom::default(),
|
||||||
transform,
|
transform,
|
||||||
inverse: MutNullableDom::default(),
|
inverse: MutNullableDom::default(),
|
||||||
|
matrix: Heap::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue