From d2de6d410fb8974632d178e6cddc524fe6f8c803 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Tue, 19 Feb 2019 22:30:17 +0100 Subject: [PATCH] more fixes for matrix transforms ... projections should be working now --- src/core/include/pw/core/axisangle.hpp | 6 ++--- src/core/include/pw/core/matrix_transform.hpp | 22 +++++++-------- src/core/include/pw/core/quaternion.hpp | 27 +++++++++---------- src/visual/src/pipeline.cpp | 11 +++++--- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/core/include/pw/core/axisangle.hpp b/src/core/include/pw/core/axisangle.hpp index fcc5fdb..211aade 100644 --- a/src/core/include/pw/core/axisangle.hpp +++ b/src/core/include/pw/core/axisangle.hpp @@ -104,9 +104,9 @@ struct axisangle_ { }; -typedef axisangle_ axisangle; -typedef axisangle_ axisangled; -typedef axisangle_ axisanglef; +using axisangle = axisangle_ ; +using axisanglef = axisangle_ ; +using axisangled = axisangle_ ; } diff --git a/src/core/include/pw/core/matrix_transform.hpp b/src/core/include/pw/core/matrix_transform.hpp index cf8e7c2..a3a6520 100644 --- a/src/core/include/pw/core/matrix_transform.hpp +++ b/src/core/include/pw/core/matrix_transform.hpp @@ -38,12 +38,12 @@ struct matrix_transform { return scale; } - inline static + inline static matrix_<4,4,T> perspective_frustum(const T &left,const T &right, - const T &bottom,const T &top, - const T &z_near,const T &z_far) - { - matrix_<4,4,T> frustum; frustum.zero(); + const T &bottom,const T &top, + const T &z_near,const T &z_far) + { + matrix_<4,4,T> frustum; frustum.zero(); frustum(0,0) = T(2) * z_near / (right - left); frustum(1,1) = T(2) * z_near / (top - bottom); @@ -55,8 +55,8 @@ struct matrix_transform { frustum(3,2) = -T(1); - return frustum; - } + return frustum; + } inline static matrix_<4,4,T> perspective_projection(const T &field_of_view, @@ -64,14 +64,14 @@ struct matrix_transform { const T &z_near,const T &z_far) { const auto tan_half = tan(field_of_view / T(2)); - const auto right = aspect_ratio * tan_half * z_near; + const auto right = tan_half * z_near / aspect_ratio; const auto left = -right; - const auto top = aspect_ratio * tan_half; + const auto top = right / aspect_ratio; const auto bottom = -top; return perspective_frustum(left,right, - bottom,top, - z_near,z_far); + bottom,top, + z_near,z_far); } diff --git a/src/core/include/pw/core/quaternion.hpp b/src/core/include/pw/core/quaternion.hpp index 08c4fbc..7252a23 100644 --- a/src/core/include/pw/core/quaternion.hpp +++ b/src/core/include/pw/core/quaternion.hpp @@ -59,19 +59,19 @@ struct quaternion_ : vector4_ { ); } - inline const quaternion_ operator / (const T& rhs) const { + inline auto operator / (const T& rhs) const { return quaternion_( { x() / rhs, y() / rhs, z() / rhs, w() / rhs, } ); } //! conjugate - inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); } + inline auto conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); } //! compute inverse - inline quaternion_ inverse() const { + inline auto inverse() const { return conjugate() / this->norm(); } - inline static quaternion_ identity() { + inline static auto identity() { return quaternion_({0,0,0,1}); } @@ -106,10 +106,10 @@ struct quaternion_ : vector4_ { return m; } - static quaternion_ from_matrix(const matrix_<4,4,T> &m) { + static auto from_matrix(const matrix_<4,4,T> &m) { using std::sqrt; - const T wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2); - const T w4 = T(4.0) * wtemp; + auto wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2); + auto w4 = T(4.0) * wtemp; return quaternion_( (m(2,1) - m(1,2)) / w4, (m(0,2) - m(2,0)) / w4, @@ -117,11 +117,11 @@ struct quaternion_ : vector4_ { wtemp); } - static const quaternion_ normalized_lerp(const quaternion_ &a,const quaternion_ &b,const T &t) { + static auto normalized_lerp(const quaternion_ &a,const quaternion_ &b,const T &t) { return quaternion_(lerp(a,b,t).normalized()); } - const quaternion_ slerp(const quaternion_& qa,const quaternion_& qb,const T& t) + static auto slerp(const quaternion_& qa,const quaternion_& qb,const T& t) { using std::abs; using std::sqrt; @@ -160,8 +160,7 @@ struct quaternion_ : vector4_ { } - static const quaternion_ from_axisangle(const axisangle_ &aa) { - + static auto from_axisangle(const axisangle_ &aa) { using std::sin; using std::cos; @@ -180,9 +179,9 @@ struct quaternion_ : vector4_ { // // // -typedef quaternion_ quaternion; -typedef quaternion_ quaternionf; -typedef quaternion_ quaterniond; +using quaternion = quaternion_; +using quaternionf = quaternion_; +using quaterniond = quaternion_; diff --git a/src/visual/src/pipeline.cpp b/src/visual/src/pipeline.cpp index 22ab49d..522e663 100644 --- a/src/visual/src/pipeline.cpp +++ b/src/visual/src/pipeline.cpp @@ -147,15 +147,18 @@ struct triangle_renderer glFrontFace(GL_CCW); #endif + +#if 0 auto proj_mat = matrix_transform::orthographic_projection(1.3,1.0, 0.2f,100.f); +#else + auto proj_mat = matrix_transform::perspective_projection(deg_to_rad(60.f), + 1.3f, + 0.2f,1000.f); -// matrix4x4f proj_mat = matrix_transform::perspective_projection(deg_to_rad(33.0f), -// 1.3f, -// 0.2f,1000.f); - +#endif // highly inefficient - should be cached - shader_p.set("input_color",col); shader_p.set("model",model_mat);