/* This Source Code Form is subject to the terms of the Mozilla Public * 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 dom_struct::dom_struct; use euclid::RigidTransform3D; use webxr_api::{BaseSpace, Frame, InputId, Joint, JointFrame, Space}; use crate::dom::bindings::codegen::Bindings::XRHandBinding::XRHandJoint; use crate::dom::bindings::codegen::Bindings::XRJointSpaceBinding::XRJointSpaceMethods; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use crate::dom::xrsession::{ApiPose, XRSession}; use crate::dom::xrspace::XRSpace; use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct XRJointSpace { xrspace: XRSpace, #[ignore_malloc_size_of = "defined in rust-webxr"] #[no_trace] input: InputId, #[ignore_malloc_size_of = "defined in rust-webxr"] #[no_trace] joint: Joint, hand_joint: XRHandJoint, } impl XRJointSpace { pub(crate) fn new_inherited( session: &XRSession, input: InputId, joint: Joint, hand_joint: XRHandJoint, ) -> XRJointSpace { XRJointSpace { xrspace: XRSpace::new_inherited(session), input, joint, hand_joint, } } #[allow(unused)] pub(crate) fn new( global: &GlobalScope, session: &XRSession, input: InputId, joint: Joint, hand_joint: XRHandJoint, can_gc: CanGc, ) -> DomRoot { reflect_dom_object( Box::new(Self::new_inherited(session, input, joint, hand_joint)), global, can_gc, ) } pub(crate) fn space(&self) -> Space { let base = BaseSpace::Joint(self.input, self.joint); let offset = RigidTransform3D::identity(); Space { base, offset } } pub(crate) fn frame<'a>(&self, frame: &'a Frame) -> Option<&'a JointFrame> { frame .inputs .iter() .find(|i| i.id == self.input) .and_then(|i| i.hand.as_ref()) .and_then(|h| h.get(self.joint)) } pub(crate) fn get_pose(&self, frame: &Frame) -> Option { self.frame(frame).map(|f| f.pose).map(|t| t.cast_unit()) } } impl XRJointSpaceMethods for XRJointSpace { /// fn JointName(&self) -> XRHandJoint { self.hand_joint } }