diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2017-03-29 19:28:20 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2017-03-29 19:28:27 +0200 |
commit | 87c02a5399abb0dfe020f3cd1c5e2337c0d8cb8f (patch) | |
tree | ed82c1509ca562b49aee7df440ce575ceb3beb88 /pose-widget/glwidget.h | |
parent | 94f510f31c3f5ca79f24f2daa085cb34d5650565 (diff) |
pose-widget: reduce latency
- project on a separate thread
- use Qt's native ARGB32
- use double buffering
- more fine-grained locks
Diffstat (limited to 'pose-widget/glwidget.h')
-rw-r--r-- | pose-widget/glwidget.h | 66 |
1 files changed, 53 insertions, 13 deletions
diff --git a/pose-widget/glwidget.h b/pose-widget/glwidget.h index 66d4289d..4f50008e 100644 --- a/pose-widget/glwidget.h +++ b/pose-widget/glwidget.h @@ -9,10 +9,14 @@ #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 @@ -25,31 +29,67 @@ using num = float; using vec3 = Mat<num, 3, 1>; using vec2 = Mat<num, 2, 1>; +using rmat = Mat<num, 3, 3>; + using namespace euler; -class POSE_WIDGET_EXPORT GLWidget : public QWidget +using lock_guard = std::unique_lock<std::mutex>; + +using cv_status = std::cv_status; + +class pose_widget; + +class pose_transform final : private QThread { -public: - using rmat = Mat<num, 3, 3>; + 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; - GLWidget(QWidget *parent); - ~GLWidget(); - void rotateBy(double xAngle, double yAngle, double zAngle, double x, double y, double z); -protected: - void paintEvent(QPaintEvent *event) override; -private: 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; - QImage front; - QImage back; - QImage image; + + 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::GLWidget; +using pose_widget_impl::pose_widget; |