summaryrefslogtreecommitdiffhomepage
path: root/pose-widget/pose-widget.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'pose-widget/pose-widget.hpp')
-rw-r--r--pose-widget/pose-widget.hpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp
new file mode 100644
index 00000000..4f50008e
--- /dev/null
+++ b/pose-widget/pose-widget.hpp
@@ -0,0 +1,95 @@
+/* Copyright (c) 2013, 2015 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.
+ */
+
+#pragma once
+
+#include <QtGlobal>
+#include <QWidget>
+#include <QThread>
+#include <QPixmap>
+#include "api/plugin-api.hpp"
+#include "compat/euler.hpp"
+
+#include <mutex>
+#include <condition_variable>
+
+#ifdef BUILD_POSE_WIDGET
+# define POSE_WIDGET_EXPORT Q_DECL_EXPORT
+#else
+# define POSE_WIDGET_EXPORT Q_DECL_IMPORT
+#endif
+
+namespace pose_widget_impl {
+
+using num = float;
+using vec3 = Mat<num, 3, 1>;
+using vec2 = Mat<num, 2, 1>;
+
+using rmat = Mat<num, 3, 3>;
+
+using namespace euler;
+
+using lock_guard = std::unique_lock<std::mutex>;
+
+using cv_status = std::cv_status;
+
+class pose_widget;
+
+class pose_transform final : private QThread
+{
+ pose_transform(QWidget* dst);
+ ~pose_transform();
+
+ friend class pose_widget;
+
+ void rotateBy(double xAngle, double yAngle, double zAngle,
+ double x, double y, double z,
+ const QSize& size);
+
+ void run() override;
+
+ vec2 project(const vec3& point);
+ vec3 project2(const vec3& point);
+ void project_quad_texture();
+
+ template<typename F>
+ inline void with_image_lock(F&& fun);
+
+ static vec3 normal(const vec3& p1, const vec3& p2, const vec3& p3);
+
+ rmat rotation;
+ vec3 translation;
+
+ std::condition_variable_any cvar;
+ std::mutex mtx, mtx2;
+
+ QWidget* dst;
+
+ QImage front, back;
+ QImage image, image2;
+
+ int width, height;
+
+ static constexpr int w = 320, h = 240;
+};
+
+class POSE_WIDGET_EXPORT pose_widget final : public QWidget
+{
+public:
+ pose_widget(QWidget *parent = nullptr);
+ ~pose_widget();
+ void rotateBy(double xAngle, double yAngle, double zAngle,
+ double x, double y, double z);
+
+private:
+ pose_transform xform;
+ void paintEvent(QPaintEvent *event) override;
+};
+
+}
+
+using pose_widget_impl::pose_widget;