aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrview.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/xrview.rs')
-rw-r--r--components/script/dom/xrview.rs22
1 files changed, 12 insertions, 10 deletions
diff --git a/components/script/dom/xrview.rs b/components/script/dom/xrview.rs
index 747bee2fd8f..663906e92f5 100644
--- a/components/script/dom/xrview.rs
+++ b/components/script/dom/xrview.rs
@@ -2,17 +2,15 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::ptr::NonNull;
-
use dom_struct::dom_struct;
use euclid::RigidTransform3D;
-use js::jsapi::{Heap, JSObject};
+use js::typedarray::Float32Array;
use webxr_api::{ApiSpace, View};
use crate::dom::bindings::codegen::Bindings::XRViewBinding::{XREye, XRViewMethods};
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
-use crate::dom::bindings::utils::create_typed_array;
+use crate::dom::bindings::typedarrays::HeapFloat32Array;
use crate::dom::globalscope::GlobalScope;
use crate::dom::xrrigidtransform::XRRigidTransform;
use crate::dom::xrsession::{cast_transform, BaseSpace, BaseTransform, XRSession};
@@ -25,7 +23,7 @@ pub struct XRView {
eye: XREye,
viewport_index: usize,
#[ignore_malloc_size_of = "mozjs"]
- proj: Heap<*mut JSObject>,
+ proj: HeapFloat32Array,
#[ignore_malloc_size_of = "defined in rust-webxr"]
#[no_trace]
view: View<ApiSpace>,
@@ -45,7 +43,7 @@ impl XRView {
session: Dom::from_ref(session),
eye,
viewport_index,
- proj: Heap::default(),
+ proj: HeapFloat32Array::default(),
view,
transform: Dom::from_ref(transform),
}
@@ -90,14 +88,18 @@ impl XRViewMethods for XRView {
}
/// https://immersive-web.github.io/webxr/#dom-xrview-projectionmatrix
- fn ProjectionMatrix(&self, _cx: JSContext) -> NonNull<JSObject> {
- if self.proj.get().is_null() {
+ fn ProjectionMatrix(&self, _cx: JSContext) -> Float32Array {
+ if !self.proj.is_initialized() {
let cx = GlobalScope::get_cx();
// row_major since euclid uses row vectors
let proj = self.view.projection.to_array();
- create_typed_array(cx, &proj, &self.proj);
+ self.proj
+ .set_data(cx, &proj)
+ .expect("Failed to set projection matrix.")
}
- NonNull::new(self.proj.get()).unwrap()
+ self.proj
+ .get_internal()
+ .expect("Failed to get projection matrix.")
}
/// https://immersive-web.github.io/webxr/#dom-xrview-transform