diff options
Diffstat (limited to 'pose-widget/pose-widget.hpp')
| -rw-r--r-- | pose-widget/pose-widget.hpp | 95 | 
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; | 
