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 #[allow(unused)]
43 pub(crate) fn new(
44 window: &Window,
45 session: &XRSession,
46 can_gc: CanGc,
47 ) -> DomRoot<XRBoundedReferenceSpace> {
48 let offset = XRRigidTransform::identity(window, can_gc);
49 let global = window.global();
50 Self::new_offset(&global, session, &offset, can_gc)
51 }
52
53 #[allow(unused)]
54 pub(crate) fn new_offset(
55 global: &GlobalScope,
56 session: &XRSession,
57 offset: &XRRigidTransform,
58 can_gc: CanGc,
59 ) -> DomRoot<XRBoundedReferenceSpace> {
60 reflect_dom_object(
61 Box::new(XRBoundedReferenceSpace::new_inherited(session, offset)),
62 global,
63 can_gc,
64 )
65 }
66
67 pub(crate) fn reference_space(&self) -> &XRReferenceSpace {
68 &self.reference_space
69 }
70}
71
72impl XRBoundedReferenceSpaceMethods<crate::DomTypeHolder> for XRBoundedReferenceSpace {
73 fn BoundsGeometry(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) {
75 if let Some(bounds) = self.reference_space.get_bounds() {
76 let points: Vec<DomRoot<DOMPointReadOnly>> = bounds
77 .into_iter()
78 .map(|point| {
79 DOMPointReadOnly::new(
80 &self.global(),
81 point.x.into(),
82 0.0,
83 point.y.into(),
84 1.0,
85 can_gc,
86 )
87 })
88 .collect();
89
90 to_frozen_array(&points, cx, retval, can_gc)
91 } else {
92 to_frozen_array::<DomRoot<DOMPointReadOnly>>(&[], cx, retval, can_gc)
93 }
94 }
95}