diff options
Diffstat (limited to 'pose-widget/pose-widget.hpp')
-rw-r--r-- | pose-widget/pose-widget.hpp | 83 |
1 files changed, 7 insertions, 76 deletions
diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp index 1e50b392..15dd7866 100644 --- a/pose-widget/pose-widget.hpp +++ b/pose-widget/pose-widget.hpp @@ -12,94 +12,25 @@ #include "export.hpp" -#include <tuple> -#include <mutex> -#include <atomic> -#include <vector> - #include <QWidget> -#include <QThread> #include <QImage> namespace pose_widget_impl { -using num = float; -using vec3 = Mat<num, 3, 1>; -using vec2 = Mat<num, 2, 1>; -using vec2i = Mat<int, 2, 1>; -using vec2u = Mat<int, 2, 1>; - -using rmat = Mat<num, 3, 3>; - using namespace euler; -using lock_guard = std::unique_lock<std::mutex>; - -class pose_widget; - -class Triangle { - num dot00, dot01, dot11, invDenom; - vec2 v0, v1, origin; -public: - Triangle(const vec2& p1, const vec2& p2, const vec2& p3); - bool barycentric_coords(const vec2& px, vec2& uv, int& i) const; -}; - -struct pose_transform final : QThread -{ - pose_transform(QWidget* dst, double device_pixel_ratio); - ~pose_transform() override; - - void rotate_async(double xAngle, double yAngle, double zAngle, double x, double y, double z); - void rotate_sync(double xAngle, double yAngle, double zAngle, double x, double y, double z); - - template<typename F> - void with_rotate(F&& fun, double xAngle, double yAngle, double zAngle, double x, double y, double z); - - void run() override; - - vec2 project(const vec3& point); - vec3 project2(const vec3& point); - void project_quad_texture(); - std::pair<vec2i, vec2i> get_bounds(const vec2& size); - - template<typename F> inline void with_image_lock(F&& fun); - - rmat rotation, rotation_; - vec3 translation, translation_; - - std::mutex mtx, mtx2; - - QWidget* dst; - - QImage front{QImage{":/images/side1.png"}.convertToFormat(QImage::Format_ARGB32)}; - QImage back{QImage{":/images/side6.png"}.convertToFormat(QImage::Format_ARGB32)}; - QImage image{w, h, QImage::Format_ARGB32}; - QImage image2{w, h, QImage::Format_ARGB32}; - - struct uv_ // NOLINT(cppcoreguidelines-pro-type-member-init) - { - vec2 coords; - int i; - }; - - std::vector<uv_> uv_vec; - std::atomic<bool> fresh = false; - - static constexpr int w = 320, h = 240; -}; - -class OTR_POSE_WIDGET_EXPORT pose_widget final : public QWidget +struct OTR_POSE_WIDGET_EXPORT pose_widget final : QWidget { public: pose_widget(QWidget *parent = nullptr); - ~pose_widget() override; - void rotate_async(double xAngle, double yAngle, double zAngle, double x, double y, double z); - void rotate_sync(double xAngle, double yAngle, double zAngle, double x, double y, double z); + void present(double xAngle, double yAngle, double zAngle, double x, double y, double z); private: - pose_transform xform; - void paintEvent(QPaintEvent *event) override; + void paintEvent(QPaintEvent*) override; + + euler_t R, T; + QImage front{QImage{":/images/side1.png"}.convertToFormat(QImage::Format_ARGB32)}; + QImage back{QImage{":/images/side6.png"}.convertToFormat(QImage::Format_ARGB32)}; }; } |