summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--compat/euler.cpp118
-rw-r--r--compat/euler.hpp10
-rw-r--r--compat/macros.hpp5
-rw-r--r--filter-kalman/kalman.cpp4
-rw-r--r--installer/opentrack-installer.iss6
-rw-r--r--logic/pipeline.cpp65
-rw-r--r--logic/pipeline.hpp16
-rw-r--r--logic/runtime-libraries.cpp6
-rw-r--r--tracker-wii/wii_module.cpp3
-rw-r--r--variant/default/main-window.cpp16
-rw-r--r--variant/default/main-window.hpp2
11 files changed, 88 insertions, 163 deletions
diff --git a/compat/euler.cpp b/compat/euler.cpp
index 7c753214..39d2b116 100644
--- a/compat/euler.cpp
+++ b/compat/euler.cpp
@@ -2,113 +2,39 @@
#include "math-imports.hpp"
#include <cmath>
+// rotation order is XYZ
+
namespace euler {
euler_t OTR_COMPAT_EXPORT rmat_to_euler(const rmat& R)
{
- const double cy = sqrt(R(2,2)*R(2, 2) + R(2, 1)*R(2, 1));
- const bool large_enough = cy > 1e-10;
- if (large_enough)
- return {
- atan2(-R(1, 0), R(0, 0)),
- atan2(R(2, 0), cy),
- atan2(-R(2, 1), R(2, 2))
- };
- else
- return {
- atan2(R(0, 1), R(1, 1)),
- atan2(R(2, 0), cy),
- 0
- };
-}
-
-// tait-bryan angles, not euler
-rmat OTR_COMPAT_EXPORT euler_to_rmat(const euler_t& input)
-{
- const double H = -input(0);
- const double P = -input(1);
- const double B = -input(2);
+ double alpha, beta, gamma;
- const auto c1 = cos(H);
- const auto s1 = sin(H);
- const auto c2 = cos(P);
- const auto s2 = sin(P);
- const auto c3 = cos(B);
- const auto s3 = sin(B);
+ beta = atan2( -R(2,0), sqrt(R(2,1)*R(2,1) + R(2,2)*R(2,2)) );
+ alpha = atan2( R(1,0), R(0,0));
+ gamma = atan2( R(2,1), R(2,2));
- return {
- // z
- c1*c2,
- c1*s2*s3 - c3*s1,
- s1*s3 + c1*c3*s2,
- // y
- c2*s1,
- c1*c3 + s1*s2*s3,
- c3*s1*s2 - c1*s3,
- // x
- -s2,
- c2*s3,
- c2*c3
- };
+ return { alpha, -beta, gamma };
}
-// https://en.wikipedia.org/wiki/Davenport_chained_rotations#Tait.E2.80.93Bryan_chained_rotations
-void OTR_COMPAT_EXPORT tait_bryan_to_matrices(const euler_t& input,
- rmat& r_roll,
- rmat& r_pitch,
- rmat& r_yaw)
+rmat OTR_COMPAT_EXPORT euler_to_rmat(const euler_t& e)
{
- {
- const double phi = -input(2);
- const double sin_phi = sin(phi);
- const double cos_phi = cos(phi);
-
- r_roll = {
- 1, 0, 0,
- 0, cos_phi, -sin_phi,
- 0, sin_phi, cos_phi
- };
- }
-
- {
- const double theta = input(1);
- const double sin_theta = sin(theta);
- const double cos_theta = cos(theta);
+ const double X = e(2);
+ const double Y = -e(1);
+ const double Z = e(0);
- r_pitch = {
- cos_theta, 0, -sin_theta,
- 0, 1, 0,
- sin_theta, 0, cos_theta
- };
- }
+ const double cx = cos(X);
+ const double sx = sin(X);
+ const double cy = cos(Y);
+ const double sy = sin(Y);
+ const double cz = cos(Z);
+ const double sz = sin(Z);
- {
- const double psi = -input(0);
- const double sin_psi = sin(psi);
- const double cos_psi = cos(psi);
-
- r_yaw = {
- cos_psi, -sin_psi, 0,
- sin_psi, cos_psi, 0,
- 0, 0, 1
- };
- }
-}
-
-template<int H, int W, typename f = double>
-rmat quaternion_to_mat_(const Mat<f, H, W>& q)
-{
- const double w = q.w(), x = q.x(), y = q.y(), z = q.z();
- const double ww = w*w, xx = x*x, yy = y*y, zz = z*z;
-
- return rmat(
- ww + xx - yy - zz, 2 * (x*y - w*z), 2 * (x*z + w*y),
- 2 * (x*z - w*y), 2 * (y*z + w*x), ww - xx - yy + zz,
- 2 * (x*y + w*z), ww - xx + yy - zz, 2 * (y*z - w*x)
- );
+ return {
+ cy*cz, -cy*sz, sy,
+ cz*sx*sy + cx*sz, cx*cz - sx*sy*sz, -cy*sx,
+ -cx*cz*sy + sx*sz, cz*sx + cx*sy*sz, cx*cy,
+ };
}
-rmat OTR_COMPAT_EXPORT quaternion_to_mat(const dmat<1, 4>& q) { return quaternion_to_mat_(q); }
-//rmat OTR_COMPAT_EXPORT quaternion_to_mat(const dmat<4, 1>& q) { return quaternion_to_mat_(q); }
-
} // end ns euler
diff --git a/compat/euler.hpp b/compat/euler.hpp
index a4c58ffb..d4217a70 100644
--- a/compat/euler.hpp
+++ b/compat/euler.hpp
@@ -14,22 +14,12 @@ namespace euler {
template<int h_, int w_> using dmat = Mat<double, h_, w_>;
-using dvec2 = Mat<double, 2, 1>;
using dvec3 = Mat<double, 3, 1>;
using rmat = dmat<3, 3>;
using euler_t = dmat<3, 1>;
rmat OTR_COMPAT_EXPORT euler_to_rmat(const euler_t& input);
-
euler_t OTR_COMPAT_EXPORT rmat_to_euler(const rmat& R);
-void OTR_COMPAT_EXPORT tait_bryan_to_matrices(const euler_t& input,
- rmat& r_roll,
- rmat& r_pitch,
- rmat& r_yaw);
-
-rmat OTR_COMPAT_EXPORT quaternion_to_mat(const dmat<1, 4>& q);
-//rmat OTR_COMPAT_EXPORT quaternion_to_mat(const dmat<4, 1>& q);
-
} // end ns euler
diff --git a/compat/macros.hpp b/compat/macros.hpp
index df71b1f3..c8fbca20 100644
--- a/compat/macros.hpp
+++ b/compat/macros.hpp
@@ -47,3 +47,8 @@
# define unlikely(x) (x)
#endif
+#if defined _MSC_VER
+# define OTR_FUNNAME (__FUNCSIG__)
+#else
+# define OTR_FUNNAME (__PRETTY_FUNCTION__)
+#endif
diff --git a/filter-kalman/kalman.cpp b/filter-kalman/kalman.cpp
index 82b1b0f1..3a0da608 100644
--- a/filter-kalman/kalman.cpp
+++ b/filter-kalman/kalman.cpp
@@ -270,9 +270,9 @@ dialog_kalman::dialog_kalman()
void dialog_kalman::updateLabels(const slider_value&)
{
- // M$ hates unicode! (M$ autoconverts source code of one kind of utf-8 format,
+ // M$ hates unicode! (M$ autoconverts source code of one kind of utf-8 format,
// the one without BOM, to another kind that QT does not like)
- // Previous attempt to use c++11 utf8 strings like u8" °" now failed for unkown
+ // Previous attempt to use c++11 utf8 strings like u8" °" now failed for unknown
// reasons where it worked before. Hence fallback to QChar(0x00b0).
this->ui.noiseRotLabel->setText(
QString::number(settings::map_slider_value(s.noise_rot_slider_value), 'f', 3) + " " + QChar(0x00b0));
diff --git a/installer/opentrack-installer.iss b/installer/opentrack-installer.iss
index 8e2a5c85..e6551863 100644
--- a/installer/opentrack-installer.iss
+++ b/installer/opentrack-installer.iss
@@ -1,7 +1,7 @@
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-#include "../build-msvc17/opentrack-version.h"
+#include "../build/opentrack-version.h"
#define MyAppName "opentrack"
#define MyAppVersion OPENTRACK_VERSION
#define MyAppPublisher "opentrack"
@@ -26,7 +26,7 @@ DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename={#MyAppVersion}-win32-setup
-SetupIconFile=..\gui\opentrack.ico
+SetupIconFile=..\variant\default\opentrack.ico
Compression=lzma2/ultra64
SolidCompression=yes
DisableWelcomePage=True
@@ -45,7 +45,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
-Source: "..\build-msvc17\install\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs
+Source: "..\build\install\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
diff --git a/logic/pipeline.cpp b/logic/pipeline.cpp
index 654a9f09..0d9c2021 100644
--- a/logic/pipeline.cpp
+++ b/logic/pipeline.cpp
@@ -15,8 +15,10 @@
#include "compat/sleep.hpp"
#include "compat/math.hpp"
#include "compat/meta.hpp"
+#include "compat/macros.hpp"
#include "pipeline.hpp"
+#include "logic/shortcuts.h"
#include <cmath>
#include <algorithm>
@@ -234,22 +236,18 @@ bool maybe_nan(const char* text, const char* fun, int line, const xs&... vals)
return false;
}
-#if defined _MSC_VER
-# define OTR_FUNNAME2 (__FUNCSIG__)
-#else
-# define OTR_FUNNAME2 (__PRETTY_FUNCTION__)
-#endif
-// don't expand
-# define OTR_FUNNAME (OTR_FUNNAME2)
-
-#define nan_check(...) \
- do \
- { \
- if (maybe_nan(#__VA_ARGS__, OTR_FUNNAME, __LINE__, __VA_ARGS__)) \
- goto nan; \
+// for MSVC `else' is like `unlikely' for GNU
+
+#define nan_check(...) \
+ do \
+ { \
+ if (likely(!maybe_nan(#__VA_ARGS__, OTR_FUNNAME, __LINE__, __VA_ARGS__))) \
+ (void)0; \
+ else \
+ goto error; \
} while (false)
-void pipeline::maybe_enable_center_on_tracking_started()
+bool pipeline::maybe_enable_center_on_tracking_started()
{
if (!tracking_started)
{
@@ -261,15 +259,20 @@ void pipeline::maybe_enable_center_on_tracking_started()
}
if (tracking_started && s.center_at_startup)
+ {
set(f_center, true);
+ return true;
+ }
}
+
+ return false;
}
void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic)
{
euler_t tmp = d2r * euler_t(&value[Yaw]);
- scaled_rotation.rotation = euler_to_rmat(c_div * tmp);
- real_rotation.rotation = euler_to_rmat(tmp);
+ //scaled_rotation.rotation = euler_to_rmat(c_div * tmp);
+ rotation.rotation = euler_to_rmat(tmp);
if (get(f_center))
{
@@ -278,15 +281,15 @@ void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic)
if (own_center_logic)
{
- scaled_rotation.rot_center = rmat::eye();
- real_rotation.rot_center = rmat::eye();
+ //scaled_rotation.rot_center = rmat::eye();
+ rotation.inv_rot_center = rmat::eye();
t_center = euler_t();
}
else
{
- real_rotation.rot_center = real_rotation.rotation.t();
- scaled_rotation.rot_center = scaled_rotation.rotation.t();
+ rotation.inv_rot_center = rotation.rotation.t();
+ //scaled_rotation.rot_center = scaled_rotation.rotation.t();
t_center = euler_t(static_cast<const double*>(value));
}
@@ -316,27 +319,26 @@ Pose pipeline::clamp_value(Pose value) const
Pose pipeline::apply_center(Pose value) const
{
- rmat rotation = scaled_rotation.rotation * scaled_rotation.rot_center;
- euler_t pos = euler_t(value) - t_center;
- euler_t rot = r2d * c_mult * rmat_to_euler(rotation);
+ euler_t T = euler_t(value) - t_center;
+ euler_t R = r2d * rmat_to_euler(rotation.rotation * rotation.inv_rot_center);
- pos = rel.rotate(real_rotation.rot_center, pos, vec3_bool());
+ T = rel.rotate(rotation.inv_rot_center, T, vec3_bool());
for (int i = 0; i < 3; i++)
{
- // don't invert after t_compensate
+ // don't invert after reltrans
// inverting here doesn't break centering
if (m(i+3).opts.invert)
- rot(i) = -rot(i);
+ R(i) = -R(i);
if (m(i).opts.invert)
- pos(i) = -pos(i);
+ T(i) = -T(i);
}
for (int i = 0; i < 3; i++)
{
- value(i) = pos(i);
- value(i+3) = rot(i);
+ value(i) = T(i);
+ value(i+3) = R(i);
}
return value;
@@ -442,7 +444,8 @@ void pipeline::logic()
maybe_enable_center_on_tracking_started();
maybe_set_center_pose(value, own_center_logic);
value = apply_center(value);
- logger.write_pose(value); // "corrected" - after various transformations to account for camera position
+ // "corrected" - after various transformations to account for camera position
+ logger.write_pose(value);
}
{
@@ -470,7 +473,7 @@ void pipeline::logic()
goto ok;
-nan:
+error:
{
QMutexLocker foo(&mtx);
diff --git a/logic/pipeline.hpp b/logic/pipeline.hpp
index 5c3c3a26..d51655b3 100644
--- a/logic/pipeline.hpp
+++ b/logic/pipeline.hpp
@@ -92,22 +92,22 @@ private:
Pose newpose;
runtime_libraries const& libs;
// The owner of the reference is the main window.
- // This design might be usefull if we decide later on to swap out
+ // This design might be useful if we decide later on to swap out
// the logger while the tracker is running.
TrackLogger& logger;
struct state
{
- rmat rot_center;
+ rmat inv_rot_center;
rmat rotation;
- state() : rot_center(rmat::eye())
+ state() : inv_rot_center(rmat::eye())
{}
};
reltrans rel;
- state real_rotation, scaled_rotation;
+ state rotation;
euler_t t_center;
ns backlog_time = ns(0);
@@ -117,7 +117,7 @@ private:
double map(double pos, Map& axis);
void logic();
void run() override;
- void maybe_enable_center_on_tracking_started();
+ bool maybe_enable_center_on_tracking_started();
void maybe_set_center_pose(const Pose& value, bool own_center_logic);
Pose clamp_value(Pose value) const;
Pose apply_center(Pose value) const;
@@ -126,9 +126,9 @@ private:
Pose apply_reltrans(Pose value, vec6_bool disabled);
Pose apply_zero_pos(Pose value) const;
- // note: float exponent base is 2
- static constexpr inline double c_mult = 16;
- static constexpr inline double c_div = 1./c_mult;
+ // reminder: float exponent base is 2
+ //static constexpr inline double c_mult = 16;
+ //static constexpr inline double c_div = 1./c_mult;
public:
pipeline(Mappings& m, runtime_libraries& libs, event_handler& ev, TrackLogger& logger);
~pipeline();
diff --git a/logic/runtime-libraries.cpp b/logic/runtime-libraries.cpp
index 1dcff4a5..d05e90c2 100644
--- a/logic/runtime-libraries.cpp
+++ b/logic/runtime-libraries.cpp
@@ -19,7 +19,7 @@ runtime_libraries::runtime_libraries(QFrame* frame, dylibptr t, dylibptr p, dyli
if(status = pProtocol->initialize(), !status.is_ok())
{
- status = _("Error occured while loading protocol %1\n\n%2\n")
+ status = _("Error occurred while loading protocol %1\n\n%2\n")
.arg(p->name).arg(status.error);
goto end;
}
@@ -36,14 +36,14 @@ runtime_libraries::runtime_libraries(QFrame* frame, dylibptr t, dylibptr p, dyli
if (pFilter)
if(status = pFilter->initialize(), !status.is_ok())
{
- status = _("Error occured while loading filter %1\n\n%2\n")
+ status = _("Error occurred while loading filter %1\n\n%2\n")
.arg(f->name).arg(status.error);
goto end;
}
if (status = pTracker->start_tracker(frame), !status.is_ok())
{
- status = _("Error occured while loading tracker %1\n\n%2\n")
+ status = _("Error occurred while loading tracker %1\n\n%2\n")
.arg(t->name).arg(status.error);
goto end;
}
diff --git a/tracker-wii/wii_module.cpp b/tracker-wii/wii_module.cpp
index 40131f69..5ef75f57 100644
--- a/tracker-wii/wii_module.cpp
+++ b/tracker-wii/wii_module.cpp
@@ -76,8 +76,7 @@ using namespace pt_module;
wii_dialog_pt::wii_dialog_pt() : TrackerDialog_PT(module_name)
{
- ui.camera_settings_groupbox->hide();
- ui.groupBox_2->hide();
+ ui.tabWidget->removeTab(0);
}
OPENTRACK_DECLARE_TRACKER(wii_tracker_pt, wii_dialog_pt, wii_metadata_pt)
diff --git a/variant/default/main-window.cpp b/variant/default/main-window.cpp
index 9df36a7d..62b969e1 100644
--- a/variant/default/main-window.cpp
+++ b/variant/default/main-window.cpp
@@ -339,21 +339,16 @@ bool main_window::get_new_config_name_from_dialog(QString& ret)
main_window::~main_window()
{
- if (tray)
- tray->hide();
- tray = nullptr;
-
- const bool just_stopping = bool(work);
-
// stupid ps3 eye has LED issues
- if (just_stopping)
+ if (work)
{
stop_tracker_();
- close();
QEventLoop ev;
ev.processEvents();
portable::sleep(2000);
}
+
+ exit();
}
void main_window::set_working_directory()
@@ -842,6 +837,11 @@ bool main_window::maybe_hide_to_tray(QEvent* e)
return false;
}
+void main_window::closeEvent(QCloseEvent*)
+{
+ exit();
+}
+
void main_window::maybe_start_profile_from_executable()
{
if (!work)
diff --git a/variant/default/main-window.hpp b/variant/default/main-window.hpp
index b4b7dbb7..c28aadc4 100644
--- a/variant/default/main-window.hpp
+++ b/variant/default/main-window.hpp
@@ -115,6 +115,8 @@ class main_window : public QMainWindow, private State
template<typename t, typename F>
bool mk_window_common(std::unique_ptr<t>& d, F&& ctor);
+ void closeEvent(QCloseEvent *event) override;
+
private slots:
void save_modules();
void exit(int status = EXIT_SUCCESS);