66#include " inc/deviceio/deviceio_session.hpp"
77
88#include < cassert>
9+ #include < chrono>
910#include < cstring>
1011#include < iostream>
1112
@@ -26,13 +27,13 @@ class FullBodyTrackerPicoImpl : public ITrackerImpl
2627 bool update (XrTime time) override ;
2728 DeviceDataTimestamp serialize (flatbuffers::FlatBufferBuilder& builder, size_t channel_index) const override ;
2829
29- const FullBodyPosePicoT & get_body_pose () const ;
30+ const FullBodyPosePicoTrackedT & get_body_pose () const ;
3031
3132private:
3233 XrSpace base_space_;
3334 XrBodyTrackerBD body_tracker_;
34- FullBodyPosePicoT body_pose_ ;
35- DeviceDataTimestamp last_timestamp_ {};
35+ FullBodyPosePicoTrackedT tracked_ ;
36+ DeviceDataTimestamp last_record_timestamp_ {};
3637
3738 // Extension function pointers
3839 PFN_xrCreateBodyTrackerBD pfn_create_body_tracker_;
@@ -100,7 +101,10 @@ FullBodyTrackerPicoImpl::FullBodyTrackerPicoImpl(const OpenXRSessionHandles& han
100101 throw std::runtime_error (" Failed to create body tracker: " + std::to_string (result));
101102 }
102103
103- body_pose_.is_active = false ;
104+ tracked_.data = std::make_shared<FullBodyPosePicoT>();
105+ tracked_.timestamp = std::make_shared<DeviceOutputTimestamp>();
106+
107+ tracked_.data ->is_active = false ;
104108
105109 std::cout << " FullBodyTrackerPico initialized (24 joints)" << std::endl;
106110}
@@ -134,19 +138,22 @@ bool FullBodyTrackerPicoImpl::update(XrTime time)
134138 XrResult result = pfn_locate_body_joints_ (body_tracker_, &locate_info, &locations);
135139 if (XR_FAILED (result))
136140 {
137- body_pose_. is_active = false ;
141+ tracked_. data -> is_active = false ;
138142 return false ;
139143 }
140144
141145 // allJointPosesTracked indicates if all joint poses are valid
142- body_pose_. is_active = locations.allJointPosesTracked ;
146+ tracked_. data -> is_active = locations.allJointPosesTracked ;
143147
144- last_timestamp_ = DeviceDataTimestamp (time, time, 0 );
148+ auto now_ns =
149+ std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now ().time_since_epoch ()).count ();
150+ *tracked_.timestamp = DeviceOutputTimestamp (now_ns, time, 0 );
151+ last_record_timestamp_ = DeviceDataTimestamp (time, time, 0 );
145152
146153 // Ensure joints struct is allocated
147- if (!body_pose_. joints )
154+ if (!tracked_. data -> joints )
148155 {
149- body_pose_. joints = std::make_unique<BodyJointsPico>();
156+ tracked_. data -> joints = std::make_unique<BodyJointsPico>();
150157 }
151158
152159 for (uint32_t i = 0 ; i < XR_BODY_JOINT_COUNT_BD; ++i)
@@ -164,28 +171,28 @@ bool FullBodyTrackerPicoImpl::update(XrTime time)
164171
165172 // Create BodyJointPose and set it in the array
166173 BodyJointPose joint_pose (pose, is_valid);
167- body_pose_. joints ->mutable_joints ()->Mutate (i, joint_pose);
174+ tracked_. data -> joints ->mutable_joints ()->Mutate (i, joint_pose);
168175 }
169176
170177 return true ;
171178}
172179
173- const FullBodyPosePicoT & FullBodyTrackerPicoImpl::get_body_pose () const
180+ const FullBodyPosePicoTrackedT & FullBodyTrackerPicoImpl::get_body_pose () const
174181{
175- return body_pose_ ;
182+ return tracked_ ;
176183}
177184
178185DeviceDataTimestamp FullBodyTrackerPicoImpl::serialize (flatbuffers::FlatBufferBuilder& builder,
179186 size_t /* channel_index */ ) const
180187{
181- auto data_offset = FullBodyPosePico::Pack (builder, &body_pose_ );
188+ auto data_offset = FullBodyPosePico::Pack (builder, tracked_. data . get () );
182189
183190 FullBodyPosePicoRecordBuilder record_builder (builder);
184191 record_builder.add_data (data_offset);
185- record_builder.add_timestamp (&last_timestamp_ );
192+ record_builder.add_timestamp (&last_record_timestamp_ );
186193 builder.Finish (record_builder.Finish ());
187194
188- return last_timestamp_ ;
195+ return last_record_timestamp_ ;
189196}
190197
191198// ============================================================================
@@ -197,7 +204,7 @@ std::vector<std::string> FullBodyTrackerPico::get_required_extensions() const
197204 return { XR_BD_BODY_TRACKING_EXTENSION_NAME };
198205}
199206
200- const FullBodyPosePicoT & FullBodyTrackerPico::get_body_pose (const DeviceIOSession& session) const
207+ const FullBodyPosePicoTrackedT & FullBodyTrackerPico::get_body_pose (const DeviceIOSession& session) const
201208{
202209 return static_cast <const FullBodyTrackerPicoImpl&>(session.get_tracker_impl (*this )).get_body_pose ();
203210}
0 commit comments