summaryrefslogtreecommitdiffhomepage
path: root/tracker-fusion/fusion.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-05-24 17:26:05 +0200
committerStanislaw Halik <sthalik@misaki.pl>2017-05-24 17:26:05 +0200
commitf79bdb633abf5d6925b2851adab48ed24d3ab30a (patch)
treefe7008693ad14d3136af515d958e5865dcf2b5f1 /tracker-fusion/fusion.cpp
parenta6c8eafcd439a9f2c10dac025ac4c58d1393a226 (diff)
tracker/fusion: add back "second tracker" functionality
It only took us five years to implement again, following removal after the fork from facetracknoir.
Diffstat (limited to 'tracker-fusion/fusion.cpp')
-rw-r--r--tracker-fusion/fusion.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/tracker-fusion/fusion.cpp b/tracker-fusion/fusion.cpp
new file mode 100644
index 00000000..e8e48372
--- /dev/null
+++ b/tracker-fusion/fusion.cpp
@@ -0,0 +1,182 @@
+/* Copyright (c) 2017 Stanislaw Halik <sthalik@misaki.pl>
+
+ * Permission to use, copy, modify, and/or distribute this
+ * software for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice and this permission
+ * notice appear in all copies.
+ */
+
+#include "compat/ndebug-guard.hpp"
+#include "fusion.h"
+
+#include "opentrack-library-path.h"
+
+#include <QDebug>
+#include <QMessageBox>
+#include <QApplication>
+
+static const QString own_name = fusion_metadata().name();
+
+fusion_tracker::fusion_tracker() :
+ rot_tracker_data{},
+ pos_tracker_data{},
+ other_frame(new QFrame)
+{
+}
+
+fusion_tracker::~fusion_tracker()
+{
+ rot_tracker = nullptr;
+ pos_tracker = nullptr;
+ rot_dylib = nullptr;
+ pos_dylib = nullptr;
+
+ if (other_frame)
+ {
+ assert(other_frame->layout());
+ delete other_frame->layout();
+ other_frame = nullptr;
+ }
+}
+
+void fusion_tracker::start_tracker(QFrame* frame)
+{
+ assert(!rot_tracker && !pos_tracker);
+ assert(!rot_dylib && !pos_dylib);
+
+ fusion_settings s;
+ const QString rot_tracker_name = s.rot_tracker_name;
+ const QString pos_tracker_name = s.pos_tracker_name;
+
+ assert(rot_tracker_name != own_name);
+ assert(pos_tracker_name != own_name);
+
+ if (rot_tracker_name.isEmpty() || pos_tracker_name.isEmpty())
+ {
+ QMessageBox::warning(nullptr,
+ "Fusion tracker", "Select rotation and position trackers.",
+ QMessageBox::Close);
+ other_frame = nullptr;
+ return;
+ }
+
+ if (rot_tracker_name == pos_tracker_name)
+ {
+ QMessageBox::warning(nullptr,
+ "Fusion tracker", "Select different trackers for rotation and position.",
+ QMessageBox::Close);
+ other_frame = nullptr;
+ return;
+ }
+
+ for (auto& t : modules.trackers())
+ {
+ if (t->name == rot_tracker_name)
+ {
+ assert(!rot_dylib);
+ rot_dylib = t;
+ }
+ if (t->name == pos_tracker_name)
+ {
+ assert(!pos_dylib);
+ pos_dylib = t;
+ }
+ }
+
+ rot_tracker = make_dylib_instance<ITracker>(rot_dylib);
+ pos_tracker = make_dylib_instance<ITracker>(pos_dylib);
+
+ pos_tracker->start_tracker(frame);
+
+ if (frame->layout() == nullptr)
+ {
+ rot_tracker->start_tracker(frame);
+ other_frame = nullptr;
+ }
+ else
+ {
+ rot_tracker->start_tracker(other_frame.get());
+ if (!other_frame->layout())
+ other_frame = nullptr;
+ }
+
+
+}
+
+void fusion_tracker::data(double *data)
+{
+ if (pos_tracker && rot_tracker)
+ {
+ rot_tracker->data(rot_tracker_data);
+ pos_tracker->data(pos_tracker_data);
+
+ for (unsigned k = 0; k < 3; k++)
+ data[k] = pos_tracker_data[k];
+ for (unsigned k = 3; k < 6; k++)
+ data[k] = rot_tracker_data[k];
+ }
+}
+
+fusion_dialog::fusion_dialog()
+{
+ ui.setupUi(this);
+
+ connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
+ connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
+
+ ui.rot_tracker->addItem("");
+ ui.pos_tracker->addItem("");
+
+ for (auto &m : modules.trackers())
+ {
+ if (m->name == own_name)
+ continue;
+
+ ui.rot_tracker->addItem(m->icon, m->name);
+ ui.pos_tracker->addItem(m->icon, m->name);
+ }
+
+ ui.rot_tracker->setCurrentIndex(0);
+ ui.pos_tracker->setCurrentIndex(0);
+
+ tie_setting(s.rot_tracker_name, ui.rot_tracker);
+ tie_setting(s.pos_tracker_name, ui.pos_tracker);
+}
+
+void fusion_dialog::doOK()
+{
+ const int rot_idx = ui.rot_tracker->currentIndex() - 1;
+ const int pos_idx = ui.pos_tracker->currentIndex() - 1;
+
+ if (rot_idx == -1 || pos_idx == -1 || rot_idx == pos_idx)
+ {
+ QMessageBox::warning(this,
+ "Fusion tracker",
+ "Fusion tracker only works when distinct trackers are selected "
+ "for rotation and position.",
+ QMessageBox::Close);
+ }
+
+ s.b->save();
+ close();
+}
+
+void fusion_dialog::doCancel()
+{
+ close();
+}
+
+fusion_settings::fusion_settings() :
+ opts("fusion-tracker"),
+ rot_tracker_name(b, "rot-tracker", ""),
+ pos_tracker_name(b, "pos-tracker", "")
+{
+}
+
+has_modules::has_modules() :
+ modules(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH)
+{
+}
+
+
+OPENTRACK_DECLARE_TRACKER(fusion_tracker, fusion_dialog, fusion_metadata) \ No newline at end of file