31 constexpr vrpn_int32 HEAD_SENSOR_ID = 0;
32 constexpr vrpn_int32 FLYSTICK_SENSOR_ID = 1;
33 constexpr
double MOVING_SPEED = 1.0f;
34 const std::string DEFAULT_VRPN_NAME =
"DTrack@cave1";
35 #ifdef BRAYNSVRPN_USE_LIBUV
36 constexpr
int VRPN_IDLE_TIMEOUT_MS = 5000;
37 constexpr
int VRPN_REPEAT_TIMEOUT_MS = 16;
40 const std::string HEAD_POSITION_PROP =
"headPosition";
41 const std::string HEAD_ROTATION_PROP =
"headRotation";
43 constexpr std::array<double, 3> to_array_3d(
const vrpn_float64* pos)
45 return {{pos[0], pos[1], pos[2]}};
47 constexpr std::array<double, 4> to_array_4d(
const vrpn_float64* quat)
49 return {{quat[0], quat[1], quat[2], quat[3]}};
52 void trackerCallback(
void* userData,
const vrpn_TRACKERCB tracker)
54 auto camera =
static_cast<Camera*
>(userData);
55 camera->updateProperty(HEAD_POSITION_PROP, to_array_3d(tracker.pos));
56 camera->updateProperty(HEAD_ROTATION_PROP, to_array_4d(tracker.quat));
59 void flyStickCallback(
void* userData,
const vrpn_TRACKERCB tracker)
61 VrpnStates* states =
static_cast<VrpnStates*
>(userData);
62 states->flyStickOrientation = glm::quat(tracker.quat[3], tracker.quat[0], tracker.quat[1], tracker.quat[2]);
65 void joystickCallback(
void* userData,
const vrpn_ANALOGCB joystick)
67 VrpnStates* states =
static_cast<VrpnStates*
>(userData);
68 states->axisX = joystick.channel[0];
69 states->axisZ = joystick.channel[1];
80 _vrpnTracker->unregister_change_handler(&(
_api->
getCamera()), trackerCallback, HEAD_SENSOR_ID);
85 _vrpnTracker = std::make_unique<vrpn_Tracker_Remote>(_vrpnName.c_str());
86 if (!_vrpnTracker->connectionPtr()->doing_okay())
87 throw std::runtime_error(
"VRPN couldn't connect to: " + _vrpnName +
" tracker");
89 _vrpnAnalog = std::make_unique<vrpn_Analog_Remote>(_vrpnName.c_str());
90 if (!_vrpnAnalog->connectionPtr()->doing_okay())
91 throw std::runtime_error(
"VRPN couldn't connect to: " + _vrpnName +
" analog");
93 CORE_INFO(
"VRPN successfully connected to " << _vrpnName);
95 #ifdef BRAYNSVRPN_USE_LIBUV
99 _vrpnTracker->register_change_handler(&(
_api->
getCamera()), trackerCallback, HEAD_SENSOR_ID);
100 _vrpnTracker->register_change_handler(&_states, flyStickCallback, FLYSTICK_SENSOR_ID);
101 _vrpnAnalog->register_change_handler(&_states, joystickCallback);
107 _vrpnTracker->mainloop();
109 double frameTime = _timer.
seconds();
121 #ifdef BRAYNSVRPN_USE_LIBUV
122 void VRPNPlugin::resumeRenderingIfTrackerIsActive()
124 _vrpnTracker->mainloop();
129 void VRPNPlugin::_setupIdleTimer()
131 if (
auto uvLoop = uv_default_loop())
133 _idleTimer.reset(
new uv_timer_t);
134 uv_timer_init(uvLoop, _idleTimer.get());
135 _idleTimer->data =
this;
139 [](uv_timer_t* timer) {
140 auto plugin = static_cast<VRPNPlugin*>(timer->data);
141 plugin->resumeRenderingIfTrackerIsActive();
143 VRPN_IDLE_TIMEOUT_MS, VRPN_REPEAT_TIMEOUT_MS);
153 throw std::runtime_error(
154 "VRPN plugin expects at most one argument, the name of the VRPN "
155 "device to connect to (eg: Tracker0@localhost)");
158 const auto vrpnName = (argc >= 2) ? argv[1] : core::DEFAULT_VRPN_NAME;
core::ExtensionPlugin * brayns_plugin_create(const int argc, const char **argv)
The Camera class is an abstract interface for a camera in a 3D graphics application....
PLATFORM_API void setPosition(const Vector3d &position)
Sets the camera position.
PLATFORM_API const Vector3d & getPosition() const
Gets the camera position.
virtual Camera & getCamera()=0
virtual void triggerRender()=0
VRPNPlugin(const std::string &vrpnName)
glm::vec< 3, double > Vector3d
glm::quat flyStickOrientation