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