Skip to content

Commit b206e5f

Browse files
committed
Refactor tracker creation pattern
1 parent 9e815c0 commit b206e5f

25 files changed

+563
-297
lines changed

src/core/deviceio/cpp/CMakeLists.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,20 @@ add_library(deviceio_core STATIC
2727
full_body_tracker_pico.cpp
2828
deviceio_session.cpp
2929
inc/deviceio/tracker.hpp
30-
inc/deviceio/hand_tracker.hpp
30+
inc/deviceio/tracker_factory.hpp
3131
inc/deviceio/head_tracker.hpp
32+
inc/deviceio/hand_tracker.hpp
3233
inc/deviceio/controller_tracker.hpp
34+
inc/deviceio/full_body_tracker_pico.hpp
3335
inc/deviceio/schema_tracker.hpp
3436
inc/deviceio/generic_3axis_pedal_tracker.hpp
3537
inc/deviceio/frame_metadata_tracker_oak.hpp
38+
inc/deviceio/live_head_tracker_impl.hpp
39+
inc/deviceio/live_hand_tracker_impl.hpp
40+
inc/deviceio/live_controller_tracker_impl.hpp
41+
inc/deviceio/live_full_body_tracker_pico_impl.hpp
42+
inc/deviceio/live_generic_3axis_pedal_tracker_impl.hpp
43+
inc/deviceio/live_frame_metadata_tracker_oak_impl.hpp
3644
inc/deviceio/deviceio_session.hpp
3745
)
3846
target_include_directories(deviceio_core

src/core/deviceio/cpp/controller_tracker.cpp

Lines changed: 12 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
#include "inc/deviceio/controller_tracker.hpp"
5-
64
#include "inc/deviceio/deviceio_session.hpp"
5+
#include "inc/deviceio/live_controller_tracker_impl.hpp"
6+
#include "inc/deviceio/tracker_factory.hpp"
77

88
#include <oxr_utils/oxr_funcs.hpp>
99
#include <oxr_utils/oxr_time.hpp>
@@ -146,60 +146,10 @@ XrAction create_action(const OpenXRCoreFunctions& funcs,
146146
} // anonymous namespace
147147

148148
// ============================================================================
149-
// ControllerTracker::Impl
149+
// LiveControllerTrackerImpl
150150
// ============================================================================
151151

152-
class ControllerTracker::Impl : public ITrackerImpl
153-
{
154-
public:
155-
explicit Impl(const OpenXRSessionHandles& handles);
156-
~Impl() = default;
157-
158-
Impl(const Impl&) = delete;
159-
Impl& operator=(const Impl&) = delete;
160-
161-
bool update(XrTime time) override;
162-
void serialize_all(size_t channel_index, const RecordCallback& callback) const override;
163-
164-
const ControllerSnapshotTrackedT& get_left_controller() const;
165-
const ControllerSnapshotTrackedT& get_right_controller() const;
166-
167-
private:
168-
const OpenXRCoreFunctions core_funcs_;
169-
XrTimeConverter time_converter_;
170-
171-
XrSession session_;
172-
XrSpace base_space_;
173-
174-
XrPath left_hand_path_;
175-
XrPath right_hand_path_;
176-
177-
// Action context — declared before action_set_ so it outlives it.
178-
ActionContextFunctions action_ctx_funcs_;
179-
XrInstanceActionContextPtr instance_action_context_;
180-
XrSessionActionContextPtr session_action_context_;
181-
182-
XrActionSetPtr action_set_;
183-
XrAction grip_pose_action_;
184-
XrAction aim_pose_action_;
185-
XrAction primary_click_action_;
186-
XrAction secondary_click_action_;
187-
XrAction thumbstick_action_;
188-
XrAction thumbstick_click_action_;
189-
XrAction squeeze_value_action_;
190-
XrAction trigger_value_action_;
191-
192-
XrSpacePtr left_grip_space_;
193-
XrSpacePtr right_grip_space_;
194-
XrSpacePtr left_aim_space_;
195-
XrSpacePtr right_aim_space_;
196-
197-
ControllerSnapshotTrackedT left_tracked_;
198-
ControllerSnapshotTrackedT right_tracked_;
199-
XrTime last_update_time_ = 0;
200-
};
201-
202-
ControllerTracker::Impl::Impl(const OpenXRSessionHandles& handles)
152+
LiveControllerTrackerImpl::LiveControllerTrackerImpl(const OpenXRSessionHandles& handles)
203153
: core_funcs_(OpenXRCoreFunctions::load(handles.instance, handles.xrGetInstanceProcAddr)),
204154
time_converter_(handles),
205155
session_(handles.session),
@@ -333,7 +283,7 @@ ControllerTracker::Impl::Impl(const OpenXRSessionHandles& handles)
333283
std::cout << "ControllerTracker initialized (left + right) with action context" << std::endl;
334284
}
335285

336-
bool ControllerTracker::Impl::update(XrTime time)
286+
bool LiveControllerTrackerImpl::update(XrTime time)
337287
{
338288
last_update_time_ = time;
339289

@@ -430,17 +380,17 @@ bool ControllerTracker::Impl::update(XrTime time)
430380
return left_tracked_.data || right_tracked_.data;
431381
}
432382

433-
const ControllerSnapshotTrackedT& ControllerTracker::Impl::get_left_controller() const
383+
const ControllerSnapshotTrackedT& LiveControllerTrackerImpl::get_left_controller() const
434384
{
435385
return left_tracked_;
436386
}
437387

438-
const ControllerSnapshotTrackedT& ControllerTracker::Impl::get_right_controller() const
388+
const ControllerSnapshotTrackedT& LiveControllerTrackerImpl::get_right_controller() const
439389
{
440390
return right_tracked_;
441391
}
442392

443-
void ControllerTracker::Impl::serialize_all(size_t channel_index, const RecordCallback& callback) const
393+
void LiveControllerTrackerImpl::serialize_all(size_t channel_index, const RecordCallback& callback) const
444394
{
445395
if (channel_index > 1)
446396
{
@@ -482,17 +432,17 @@ std::string_view ControllerTracker::get_schema_text() const
482432

483433
const ControllerSnapshotTrackedT& ControllerTracker::get_left_controller(const DeviceIOSession& session) const
484434
{
485-
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_left_controller();
435+
return static_cast<const ControllerTrackerImpl&>(session.get_tracker_impl(*this)).get_left_controller();
486436
}
487437

488438
const ControllerSnapshotTrackedT& ControllerTracker::get_right_controller(const DeviceIOSession& session) const
489439
{
490-
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_right_controller();
440+
return static_cast<const ControllerTrackerImpl&>(session.get_tracker_impl(*this)).get_right_controller();
491441
}
492442

493-
std::shared_ptr<ITrackerImpl> ControllerTracker::create_tracker(const OpenXRSessionHandles& handles) const
443+
std::unique_ptr<ITrackerImpl> ControllerTracker::create_tracker_impl(TrackerFactory& factory) const
494444
{
495-
return std::make_shared<Impl>(handles);
445+
return factory.create_controller_tracker_impl();
496446
}
497447

498448
} // namespace core

src/core/deviceio/cpp/deviceio_session.cpp

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
#include "inc/deviceio/deviceio_session.hpp"
55

6+
#include "inc/deviceio/live_controller_tracker_impl.hpp"
7+
#include "inc/deviceio/live_frame_metadata_tracker_oak_impl.hpp"
8+
#include "inc/deviceio/live_full_body_tracker_pico_impl.hpp"
9+
#include "inc/deviceio/live_generic_3axis_pedal_tracker_impl.hpp"
10+
#include "inc/deviceio/live_hand_tracker_impl.hpp"
11+
#include "inc/deviceio/live_head_tracker_impl.hpp"
12+
#include "inc/deviceio/tracker_factory.hpp"
13+
614
#include <cassert>
715
#include <iostream>
816
#include <set>
@@ -11,6 +19,53 @@
1119
namespace core
1220
{
1321

22+
// ============================================================================
23+
// LiveDeviceIOFactory -- TrackerFactory implementation for live OpenXR sessions
24+
// ============================================================================
25+
26+
class LiveDeviceIOFactory : public TrackerFactory
27+
{
28+
public:
29+
explicit LiveDeviceIOFactory(const OpenXRSessionHandles& handles) : handles_(handles)
30+
{
31+
}
32+
33+
std::unique_ptr<HeadTrackerImpl> create_head_tracker_impl() override
34+
{
35+
return std::make_unique<LiveHeadTrackerImpl>(handles_);
36+
}
37+
38+
std::unique_ptr<HandTrackerImpl> create_hand_tracker_impl() override
39+
{
40+
return std::make_unique<LiveHandTrackerImpl>(handles_);
41+
}
42+
43+
std::unique_ptr<ControllerTrackerImpl> create_controller_tracker_impl() override
44+
{
45+
return std::make_unique<LiveControllerTrackerImpl>(handles_);
46+
}
47+
48+
std::unique_ptr<FullBodyTrackerPicoImpl> create_full_body_tracker_pico_impl() override
49+
{
50+
return std::make_unique<LiveFullBodyTrackerPicoImpl>(handles_);
51+
}
52+
53+
std::unique_ptr<Generic3AxisPedalTrackerImpl> create_generic_3axis_pedal_tracker_impl(
54+
const SchemaTrackerConfig& config) override
55+
{
56+
return std::make_unique<LiveGeneric3AxisPedalTrackerImpl>(handles_, config);
57+
}
58+
59+
std::unique_ptr<FrameMetadataTrackerOakImpl> create_frame_metadata_tracker_oak_impl(
60+
std::vector<SchemaTrackerConfig> configs) override
61+
{
62+
return std::make_unique<LiveFrameMetadataTrackerOakImpl>(handles_, std::move(configs));
63+
}
64+
65+
private:
66+
const OpenXRSessionHandles& handles_;
67+
};
68+
1469
// ============================================================================
1570
// DeviceIOSession Implementation
1671
// ============================================================================
@@ -19,10 +74,26 @@ DeviceIOSession::DeviceIOSession(const std::vector<std::shared_ptr<ITracker>>& t
1974
const OpenXRSessionHandles& handles)
2075
: handles_(handles), time_converter_(handles)
2176
{
22-
// Initialize all trackers and collect their implementations
77+
LiveDeviceIOFactory factory(handles_);
78+
2379
for (const auto& tracker : trackers)
2480
{
25-
tracker_impls_.emplace(tracker.get(), tracker->create_tracker(handles_));
81+
if (!tracker)
82+
{
83+
throw std::invalid_argument("DeviceIOSession: null tracker in trackers list");
84+
}
85+
auto impl = tracker->create_tracker_impl(factory);
86+
if (!impl)
87+
{
88+
std::cerr << "DeviceIOSession: tracker '" << tracker->get_name() << "' returned null impl, skipping"
89+
<< std::endl;
90+
continue;
91+
}
92+
tracker_impls_.emplace(tracker.get(), std::move(impl));
93+
}
94+
if (!trackers.empty() && tracker_impls_.empty())
95+
{
96+
throw std::runtime_error("DeviceIOSession: failed to initialize any requested trackers");
2697
}
2798
}
2899

src/core/deviceio/cpp/frame_metadata_tracker_oak.cpp

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
#include "inc/deviceio/frame_metadata_tracker_oak.hpp"
5-
64
#include "inc/deviceio/deviceio_session.hpp"
5+
#include "inc/deviceio/live_frame_metadata_tracker_oak_impl.hpp"
6+
#include "inc/deviceio/tracker_factory.hpp"
77

88
#include <flatbuffers/flatbuffers.h>
99
#include <oxr_utils/oxr_time.hpp>
@@ -16,34 +16,11 @@ namespace core
1616
{
1717

1818
// ============================================================================
19-
// FrameMetadataTrackerOak::Impl
19+
// LiveFrameMetadataTrackerOakImpl
2020
// ============================================================================
2121

22-
class FrameMetadataTrackerOak::Impl : public ITrackerImpl
23-
{
24-
public:
25-
Impl(const OpenXRSessionHandles& handles, std::vector<SchemaTrackerConfig> configs);
26-
27-
bool update(XrTime time) override;
28-
void serialize_all(size_t channel_index, const RecordCallback& callback) const override;
29-
30-
const FrameMetadataOakTrackedT& get_stream_data(size_t stream_index) const;
31-
32-
private:
33-
struct StreamState
34-
{
35-
std::unique_ptr<SchemaTracker> reader;
36-
FrameMetadataOakTrackedT tracked;
37-
bool collection_present = false;
38-
std::vector<SchemaTracker::SampleResult> pending_records;
39-
};
40-
41-
XrTimeConverter m_time_converter_;
42-
XrTime m_last_update_time_ = 0;
43-
std::vector<StreamState> m_streams;
44-
};
45-
46-
FrameMetadataTrackerOak::Impl::Impl(const OpenXRSessionHandles& handles, std::vector<SchemaTrackerConfig> configs)
22+
LiveFrameMetadataTrackerOakImpl::LiveFrameMetadataTrackerOakImpl(const OpenXRSessionHandles& handles,
23+
std::vector<SchemaTrackerConfig> configs)
4724
: m_time_converter_(handles)
4825
{
4926
for (auto& config : configs)
@@ -54,7 +31,7 @@ FrameMetadataTrackerOak::Impl::Impl(const OpenXRSessionHandles& handles, std::ve
5431
}
5532
}
5633

57-
bool FrameMetadataTrackerOak::Impl::update(XrTime time)
34+
bool LiveFrameMetadataTrackerOakImpl::update(XrTime time)
5835
{
5936
m_last_update_time_ = time;
6037
for (auto& stream : m_streams)
@@ -90,7 +67,7 @@ bool FrameMetadataTrackerOak::Impl::update(XrTime time)
9067
return true;
9168
}
9269

93-
void FrameMetadataTrackerOak::Impl::serialize_all(size_t channel_index, const RecordCallback& callback) const
70+
void LiveFrameMetadataTrackerOakImpl::serialize_all(size_t channel_index, const RecordCallback& callback) const
9471
{
9572
if (channel_index >= m_streams.size())
9673
{
@@ -148,7 +125,7 @@ void FrameMetadataTrackerOak::Impl::serialize_all(size_t channel_index, const Re
148125
}
149126
}
150127

151-
const FrameMetadataOakTrackedT& FrameMetadataTrackerOak::Impl::get_stream_data(size_t stream_index) const
128+
const FrameMetadataOakTrackedT& LiveFrameMetadataTrackerOakImpl::get_stream_data(size_t stream_index) const
152129
{
153130
if (stream_index >= m_streams.size())
154131
{
@@ -197,12 +174,12 @@ std::string_view FrameMetadataTrackerOak::get_schema_text() const
197174
const FrameMetadataOakTrackedT& FrameMetadataTrackerOak::get_stream_data(const DeviceIOSession& session,
198175
size_t stream_index) const
199176
{
200-
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_stream_data(stream_index);
177+
return static_cast<const FrameMetadataTrackerOakImpl&>(session.get_tracker_impl(*this)).get_stream_data(stream_index);
201178
}
202179

203-
std::shared_ptr<ITrackerImpl> FrameMetadataTrackerOak::create_tracker(const OpenXRSessionHandles& handles) const
180+
std::unique_ptr<ITrackerImpl> FrameMetadataTrackerOak::create_tracker_impl(TrackerFactory& factory) const
204181
{
205-
return std::make_shared<Impl>(handles, m_configs);
182+
return factory.create_frame_metadata_tracker_oak_impl(m_configs);
206183
}
207184

208185
} // namespace core

0 commit comments

Comments
 (0)