diff options
author | tannal <149947508+tannal@users.noreply.github.com> | 2024-01-16 23:56:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-16 15:56:32 +0000 |
commit | 8c53a8c745ab2a5b660d6f170e74b4fecca189c1 (patch) | |
tree | 54cca81038d47ce01e14822f69e04061929e578c /components/script | |
parent | 9654363c187ee549b82bca8c4e3098e4c20c7287 (diff) | |
download | servo-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.py | 2 | ||||
-rw-r--r-- | components/script/dom/xrview.rs | 22 |
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 |