script/dom/webxr/
xrboundedreferencespace.rs1use dom_struct::dom_struct;
6use js::rust::MutableHandleValue;
7
8use crate::dom::bindings::codegen::Bindings::XRBoundedReferenceSpaceBinding::XRBoundedReferenceSpaceMethods;
9use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType;
10use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object};
11use crate::dom::bindings::root::{Dom, DomRoot};
12use crate::dom::bindings::utils::to_frozen_array;
13use crate::dom::dompointreadonly::DOMPointReadOnly;
14use crate::dom::globalscope::GlobalScope;
15use crate::dom::window::Window;
16use crate::dom::xrreferencespace::XRReferenceSpace;
17use crate::dom::xrrigidtransform::XRRigidTransform;
18use crate::dom::xrsession::XRSession;
19use crate::script_runtime::{CanGc, JSContext};
20
21#[dom_struct]
22pub(crate) struct XRBoundedReferenceSpace {
23 reference_space: XRReferenceSpace,
24 offset: Dom<XRRigidTransform>,
25}
26
27impl XRBoundedReferenceSpace {
28 pub(crate) fn new_inherited(
29 session: &XRSession,
30 offset: &XRRigidTransform,
31 ) -> XRBoundedReferenceSpace {
32 XRBoundedReferenceSpace {
33 reference_space: XRReferenceSpace::new_inherited(
34 session,
35 offset,
36 XRReferenceSpaceType::Bounded_floor,
37 ),
38 offset: Dom::from_ref(offset),
39 }
40 }
41
42 pub(crate) fn new(
43 window: &Window,
44 session: &XRSession,
45 can_gc: CanGc,
46 ) -> DomRoot<XRBoundedReferenceSpace> {
47 let offset = XRRigidTransform::identity(window, can_gc);
48 let global = window.global();
49 Self::new_offset(&global, session, &offset, can_gc)
50 }
51
52 pub(crate) fn new_offset(
53 global: &GlobalScope,
54 session: &XRSession,
55 offset: &XRRigidTransform,
56 can_gc: CanGc,
57 ) -> DomRoot<XRBoundedReferenceSpace> {
58 reflect_dom_object(
59 Box::new(XRBoundedReferenceSpace::new_inherited(session, offset)),
60 global,
61 can_gc,
62 )
63 }
64
65 pub(crate) fn reference_space(&self) -> &XRReferenceSpace {
66 &self.reference_space
67 }
68}
69
70impl XRBoundedReferenceSpaceMethods<crate::DomTypeHolder> for XRBoundedReferenceSpace {
71 fn BoundsGeometry(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) {
73 if let Some(bounds) = self.reference_space.get_bounds() {
74 let points: Vec<DomRoot<DOMPointReadOnly>> = bounds
75 .into_iter()
76 .map(|point| {
77 DOMPointReadOnly::new(
78 &self.global(),
79 point.x.into(),
80 0.0,
81 point.y.into(),
82 1.0,
83 can_gc,
84 )
85 })
86 .collect();
87
88 to_frozen_array(&points, cx, retval, can_gc)
89 } else {
90 to_frozen_array::<DomRoot<DOMPointReadOnly>>(&[], cx, retval, can_gc)
91 }
92 }
93}