diff options
Diffstat (limited to 'pose-widget')
| -rwxr-xr-x[-rw-r--r--] | pose-widget/glwidget.cpp | 59 | ||||
| -rwxr-xr-x[-rw-r--r--] | pose-widget/glwidget.h | 9 | 
2 files changed, 38 insertions, 30 deletions
| diff --git a/pose-widget/glwidget.cpp b/pose-widget/glwidget.cpp index 8fbe046e..6da1948e 100644..100755 --- a/pose-widget/glwidget.cpp +++ b/pose-widget/glwidget.cpp @@ -12,6 +12,10 @@  #include <QPainter>  #include <QPaintEvent> +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wnarrowing" +#endif +  GLWidget::GLWidget(QWidget *parent) : QWidget(parent)  {      Q_INIT_RESOURCE(posewidget); @@ -31,17 +35,17 @@ void GLWidget::paintEvent ( QPaintEvent * event ) {      p.drawImage(event->rect(), texture);  } -void GLWidget::rotateBy(double xAngle, double yAngle, double zAngle, double x, double y, double z) +void GLWidget::rotateBy(float xAngle, float yAngle, float zAngle, float x, float y, float z)  { -    double c1 = cos(yAngle / 57.295781); -    double s1 = sin(yAngle / 57.295781); -    double c2 = cos(xAngle / 57.295781); -    double s2 = sin(xAngle / 57.295781); -    double c3 = cos(zAngle / 57.295781); -    double s3 = sin(zAngle / 57.295781); +    float c1 = cos(yAngle / 57.295781); +    float s1 = sin(yAngle / 57.295781); +    float c2 = cos(xAngle / 57.295781); +    float s2 = sin(xAngle / 57.295781); +    float c3 = cos(zAngle / 57.295781); +    float s3 = sin(zAngle / 57.295781); -    double foo[] = { +    float foo[] = {          c2*c3,  -c2*s3,  s2,          c1*s3+c3*s1*s2,  c1*c3-s1*s2*s3,  -c2*s1,          s1*s3-c1*c3*s2,  c3*s1+c1*s2*s3,  c1*c2, @@ -55,6 +59,7 @@ void GLWidget::rotateBy(double xAngle, double yAngle, double zAngle, double x, d  class Triangle { +    using num = GLWidget::num;  public:      Triangle(const vec2& p1,               const vec2& p2, @@ -71,27 +76,29 @@ public:      bool barycentric_coords(const vec2& px, vec2& uv) const      {          vec2 v2 = px - origin; -        double dot12 = v1.dot(v2); -        double dot02 = v0.dot(v2); -        double u = (dot11 * dot02 - dot01 * dot12) * invDenom; -        double v = (dot00 * dot12 - dot01 * dot02) * invDenom; +        num dot12 = v1.dot(v2); +        num dot02 = v0.dot(v2); +        num u = (dot11 * dot02 - dot01 * dot12) * invDenom; +        num v = (dot00 * dot12 - dot01 * dot02) * invDenom;          uv = vec2({u, v});          return (u >= 0) && (v >= 0) && (u + v <= 1);      }  private: -    double dot00, dot01, dot11, invDenom; +    num dot00, dot01, dot11, invDenom;      vec2 v0, v1, origin;  };  static __inline vec3 normal(const vec3& p1, const vec3& p2, const vec3& p3)  { +    using num = GLWidget::num; +      vec3 u = p2 - p1;      vec3 v = p3 - p1;      vec3 tmp = u.cross(v); -    double i = 1./sqrt(tmp.dot(tmp)); +    num i = 1./sqrt(tmp.dot(tmp));      return tmp * i;  } @@ -100,14 +107,14 @@ void GLWidget::project_quad_texture() {      const int sx = width(), sy = height();      vec2 pt[4];      const vec3 corners[] = { -        vec3({0., 0., 0.}), -        vec3({sx-1., 0., 0.}), -        vec3({0., sy-1., 0.}), -        vec3({sx-1., sy-1., 0.}) +        vec3({0., 0, 0}), +        vec3({sx-1, 0, 0}), +        vec3({0, sy-1, 0}), +        vec3({sx-1, sy-1, 0.})      };      for (int i = 0; i < 4; i++) { -        pt[i] = project(vec3({corners[i].x() - sx/2., corners[i].y() - sy/2., 0})); +        pt[i] = project(vec3({corners[i].x() - sx/2, corners[i].y() - sy/2, 0}));          pt[i].x() += sx/2.;          pt[i].y() += sy/2.;      } @@ -121,7 +128,7 @@ void GLWidget::project_quad_texture() {          normal2 = normal(foo[0], foo[1], foo[2]);      } -    double dir = normal1.dot(normal2); +    num dir = normal1.dot(normal2);      QImage& tex = dir < 0 ? back : front; @@ -137,8 +144,8 @@ void GLWidget::project_quad_texture() {      const vec2 projected[2][3] = { { p2[0], p2[1], p2[2] }, { p2[3], p2[1], p2[2] } };      const vec2 origs[2][3] = { -        { vec2({0., 0.}), vec2({ow-1., 0.}), vec2({0., oh-1.}) }, -        { vec2({ow-1., oh-1.}), vec2({ow-1., 0.}), vec2({0., oh-1.}) } +        { vec2({0, 0}), vec2({ow-1, 0}), vec2({0, oh-1}) }, +        { vec2({ow-1, oh-1}), vec2({ow-1, 0}), vec2({0, oh-1}) }      };      const Triangle triangles[2] = {          Triangle(projected[0][0], projected[0][1], projected[0][2]), @@ -160,7 +167,7 @@ void GLWidget::project_quad_texture() {      for (int y = 0; y < sy; y++)          for (int x = 0; x < sx; x++) { -            vec2 pos({(double)x, (double)y}); +            vec2 pos({(num)x, (num)y});              for (int i = 0; i < 2; i++) {                  vec2 uv;                  if (triangles[i].barycentric_coords(pos, uv)) @@ -190,12 +197,12 @@ void GLWidget::project_quad_texture() {  vec2 GLWidget::project(const vec3 &point)  {      vec3 ret = rotation * point; -    double z = std::max(.75, 1. + translation.z()/-60.); +    num z = std::max<num>(.75, 1. + translation.z()/-60);      int w = width(), h = height(); -    double x = w * translation.x() / 2. / -40.; +    num x = w * translation.x() / 2 / -40;      if (std::abs(x) > w/2)          x = x > 0 ? w/2 : w/-2; -    double y = h * translation.y() / 2. / -40.; +    num y = h * translation.y() / 2 / -40;      if (std::abs(y) > h/2)          y = y > 0 ? h/2 : h/-2;      return vec2 { z * (ret.x() + x), z * (ret.y() + y) }; diff --git a/pose-widget/glwidget.h b/pose-widget/glwidget.h index 88961fbd..aaea3e06 100644..100755 --- a/pose-widget/glwidget.h +++ b/pose-widget/glwidget.h @@ -12,16 +12,17 @@  #include "opentrack/plugin-api.hpp"  #include "opentrack/simple-mat.hpp" -typedef dmat<2, 1> vec2; -typedef dmat<3, 1> vec3; -typedef dmat<3, 3> rmat; +typedef Mat<float, 2, 1> vec2; +typedef Mat<float, 3, 1> vec3; +typedef Mat<float, 3, 3> rmat;  class GLWidget : public QWidget  {  public: +    using num = float;      GLWidget(QWidget *parent);      ~GLWidget(); -    void rotateBy(double xAngle, double yAngle, double zAngle, double x, double y, double z); +    void rotateBy(float xAngle, float yAngle, float zAngle, float x, float y, float z);  protected:      void paintEvent ( QPaintEvent * event ) override;  private: | 
