script/dom/webxr/
xrboundedreferencespace.rs1use dom_struct::dom_struct;
6use js::context::JSContext;
7use js::rust::MutableHandleValue;
8use script_bindings::reflector::reflect_dom_object_with_cx;
9
10use crate::dom::bindings::codegen::Bindings::XRBoundedReferenceSpaceBinding::XRBoundedReferenceSpaceMethods;
11use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType;
12use crate::dom::bindings::reflector::DomGlobal;
13use crate::dom::bindings::root::{Dom, DomRoot};
14use crate::dom::bindings::utils::to_frozen_array;
15use crate::dom::dompointreadonly::DOMPointReadOnly;
16use crate::dom::globalscope::GlobalScope;
17use crate::dom::window::Window;
18use crate::dom::xrreferencespace::XRReferenceSpace;
19use crate::dom::xrrigidtransform::XRRigidTransform;
20use crate::dom::xrsession::XRSession;
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 cx: &mut JSContext,
45 window: &Window,
46 session: &XRSession,
47 ) -> DomRoot<XRBoundedReferenceSpace> {
48 let offset = XRRigidTransform::identity(cx, window);
49 let global = window.global();
50 Self::new_offset(cx, &global, session, &offset)
51 }
52
53 pub(crate) fn new_offset(
54 cx: &mut JSContext,
55 global: &GlobalScope,
56 session: &XRSession,
57 offset: &XRRigidTransform,
58 ) -> DomRoot<XRBoundedReferenceSpace> {
59 reflect_dom_object_with_cx(
60 Box::new(XRBoundedReferenceSpace::new_inherited(session, offset)),
61 global,
62 cx,
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 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(cx, &points, retval)
90 } else {
91 to_frozen_array::<DomRoot<DOMPointReadOnly>>(cx, &[], retval)
92 }
93 }
94}