diff options
Diffstat (limited to 'pose-widget/pose-widget.hpp')
-rw-r--r-- | pose-widget/pose-widget.hpp | 95 |
1 files changed, 16 insertions, 79 deletions
diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp index fa956b47..9152e960 100644 --- a/pose-widget/pose-widget.hpp +++ b/pose-widget/pose-widget.hpp @@ -12,96 +12,33 @@ #include "export.hpp" -#include <tuple> -#include <mutex> -#include <atomic> -#include <vector> - #include <QWidget> -#include <QThread> #include <QImage> +#include <QCheckBox> +//#define TEST 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); - ~pose_transform(); - - 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, back; - QImage image, image2; - - struct uv_ - { - vec2 coords; - int i; - }; - - std::vector<uv_> uv_vec; - - std::atomic<bool> fresh; - - static constexpr inline 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(); - 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); - + explicit pose_widget(QWidget *parent = nullptr); + void present(double xAngle, double yAngle, double zAngle, double x, double y, double z); + QCheckBox mirror{"Mirror", this}; private: - pose_transform xform; - void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void paintEvent(QPaintEvent*) override; + + Pose_ R, T; + QImage front{QImage{":/images/side1.png"}.convertToFormat(QImage::Format_ARGB32)}; + QImage back {QImage{":/images/side6.png"}.convertToFormat(QImage::Format_ARGB32) + .mirrored(true,false)}; + QImage shine {QImage{front.width(), front.height(), QImage::Format_ARGB32}}; + QImage shadow{QImage{front.width(), front.height(), QImage::Format_ARGB32}}; }; } -using pose_widget_impl::pose_widget; +using pose_widget = pose_widget_impl::pose_widget; |