aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authortannal <149947508+tannal@users.noreply.github.com>2024-01-16 23:56:32 +0800
committerGitHub <noreply@github.com>2024-01-16 15:56:32 +0000
commit8c53a8c745ab2a5b660d6f170e74b4fecca189c1 (patch)
tree54cca81038d47ce01e14822f69e04061929e578c /components/script
parent9654363c187ee549b82bca8c4e3098e4c20c7287 (diff)
downloadservo-8c53a8c745ab2a5b660d6f170e74b4fecca189c1.tar.gz
servo-8c53a8c745ab2a5b660d6f170e74b4fecca189c1.zip
use FLoat32Array in XRView (#31077)
* use FLoat32Array in XRView * handle error when calling set_data Yes, we should handle this. Co-authored-by: Taym Haddadi <haddadi.taym@gmail.com> * fix: error handling * chore: error message --------- Co-authored-by: Taym Haddadi <haddadi.taym@gmail.com>
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py2
-rw-r--r--components/script/dom/xrview.rs22
2 files changed, 13 insertions, 11 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index a4e2bb01a81..8f341e0d8bc 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1461,7 +1461,7 @@ def getConversionConfigForType(type, isEnforceRange, isClamp, treatNullAs):
def todo_switch_float_32(des):
- return des.interface.identifier.name in ['XRView', 'XRRigidTransform', 'XRRay', 'GamepadPose']
+ return des.interface.identifier.name in ['XRRigidTransform', 'XRRay', 'GamepadPose']
def builtin_return_type(returnType):
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