more fixes for matrix transforms ... projections should be working now
This commit is contained in:
parent
9db2490989
commit
d2de6d410f
4 changed files with 34 additions and 32 deletions
|
@ -104,9 +104,9 @@ struct axisangle_ {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef axisangle_<real_t> axisangle;
|
using axisangle = axisangle_<real_t> ;
|
||||||
typedef axisangle_<double> axisangled;
|
using axisanglef = axisangle_<float> ;
|
||||||
typedef axisangle_<float> axisanglef;
|
using axisangled = axisangle_<double> ;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,12 +38,12 @@ struct matrix_transform {
|
||||||
return scale;
|
return scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static
|
inline static
|
||||||
matrix_<4,4,T> perspective_frustum(const T &left,const T &right,
|
matrix_<4,4,T> perspective_frustum(const T &left,const T &right,
|
||||||
const T &bottom,const T &top,
|
const T &bottom,const T &top,
|
||||||
const T &z_near,const T &z_far)
|
const T &z_near,const T &z_far)
|
||||||
{
|
{
|
||||||
matrix_<4,4,T> frustum; frustum.zero();
|
matrix_<4,4,T> frustum; frustum.zero();
|
||||||
|
|
||||||
frustum(0,0) = T(2) * z_near / (right - left);
|
frustum(0,0) = T(2) * z_near / (right - left);
|
||||||
frustum(1,1) = T(2) * z_near / (top - bottom);
|
frustum(1,1) = T(2) * z_near / (top - bottom);
|
||||||
|
@ -55,8 +55,8 @@ struct matrix_transform {
|
||||||
|
|
||||||
frustum(3,2) = -T(1);
|
frustum(3,2) = -T(1);
|
||||||
|
|
||||||
return frustum;
|
return frustum;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static
|
inline static
|
||||||
matrix_<4,4,T> perspective_projection(const T &field_of_view,
|
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 T &z_near,const T &z_far)
|
||||||
{
|
{
|
||||||
const auto tan_half = tan(field_of_view / T(2));
|
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 left = -right;
|
||||||
const auto top = aspect_ratio * tan_half;
|
const auto top = right / aspect_ratio;
|
||||||
const auto bottom = -top;
|
const auto bottom = -top;
|
||||||
|
|
||||||
return perspective_frustum(left,right,
|
return perspective_frustum(left,right,
|
||||||
bottom,top,
|
bottom,top,
|
||||||
z_near,z_far);
|
z_near,z_far);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -59,19 +59,19 @@ struct quaternion_ : vector4_<T> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
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, } );
|
return quaternion_( { x() / rhs, y() / rhs, z() / rhs, w() / rhs, } );
|
||||||
}
|
}
|
||||||
|
|
||||||
//! conjugate
|
//! conjugate
|
||||||
inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
|
inline auto conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
|
||||||
|
|
||||||
//! compute inverse
|
//! compute inverse
|
||||||
inline quaternion_ inverse() const {
|
inline auto inverse() const {
|
||||||
return conjugate() / this->norm();
|
return conjugate() / this->norm();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static quaternion_ identity() {
|
inline static auto identity() {
|
||||||
return quaternion_({0,0,0,1});
|
return quaternion_({0,0,0,1});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,10 +106,10 @@ struct quaternion_ : vector4_<T> {
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
static quaternion_<T> from_matrix(const matrix_<4,4,T> &m) {
|
static auto from_matrix(const matrix_<4,4,T> &m) {
|
||||||
using std::sqrt;
|
using std::sqrt;
|
||||||
const T wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2);
|
auto wtemp = sqrt(T(1) + m(0,0) + m(1,1) + m(2,2)) / T(2);
|
||||||
const T w4 = T(4.0) * wtemp;
|
auto w4 = T(4.0) * wtemp;
|
||||||
return quaternion_<T>(
|
return quaternion_<T>(
|
||||||
(m(2,1) - m(1,2)) / w4,
|
(m(2,1) - m(1,2)) / w4,
|
||||||
(m(0,2) - m(2,0)) / w4,
|
(m(0,2) - m(2,0)) / w4,
|
||||||
|
@ -117,11 +117,11 @@ struct quaternion_ : vector4_<T> {
|
||||||
wtemp);
|
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());
|
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::abs;
|
||||||
using std::sqrt;
|
using std::sqrt;
|
||||||
|
@ -160,8 +160,7 @@ struct quaternion_ : vector4_<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const quaternion_<T> from_axisangle(const axisangle_<T> &aa) {
|
static auto from_axisangle(const axisangle_<T> &aa) {
|
||||||
|
|
||||||
using std::sin;
|
using std::sin;
|
||||||
using std::cos;
|
using std::cos;
|
||||||
|
|
||||||
|
@ -180,9 +179,9 @@ struct quaternion_ : vector4_<T> {
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
typedef quaternion_<real_t> quaternion;
|
using quaternion = quaternion_<real_t>;
|
||||||
typedef quaternion_<float> quaternionf;
|
using quaternionf = quaternion_<float>;
|
||||||
typedef quaternion_<double> quaterniond;
|
using quaterniond = quaternion_<double>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -147,15 +147,18 @@ struct triangle_renderer
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
auto proj_mat = matrix_transform<float>::orthographic_projection(1.3,1.0,
|
auto proj_mat = matrix_transform<float>::orthographic_projection(1.3,1.0,
|
||||||
0.2f,100.f);
|
0.2f,100.f);
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
auto proj_mat = matrix_transform<float>::perspective_projection(deg_to_rad(60.f),
|
||||||
|
1.3f,
|
||||||
|
0.2f,1000.f);
|
||||||
|
|
||||||
// matrix4x4f proj_mat = matrix_transform<float>::perspective_projection(deg_to_rad(33.0f),
|
#endif
|
||||||
// 1.3f,
|
|
||||||
// 0.2f,1000.f);
|
|
||||||
|
|
||||||
// highly inefficient - should be cached -
|
// highly inefficient - should be cached -
|
||||||
shader_p.set("input_color",col);
|
shader_p.set("input_color",col);
|
||||||
shader_p.set("model",model_mat);
|
shader_p.set("model",model_mat);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue