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;
|
||||
typedef axisangle_<double> axisangled;
|
||||
typedef axisangle_<float> axisanglef;
|
||||
using axisangle = axisangle_<real_t> ;
|
||||
using axisanglef = axisangle_<float> ;
|
||||
using axisangled = axisangle_<double> ;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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, } );
|
||||
}
|
||||
|
||||
//! 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_<T> {
|
|||
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;
|
||||
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_<T>(
|
||||
(m(2,1) - m(1,2)) / w4,
|
||||
(m(0,2) - m(2,0)) / w4,
|
||||
|
@ -117,11 +117,11 @@ struct quaternion_ : vector4_<T> {
|
|||
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_<T> {
|
|||
}
|
||||
|
||||
|
||||
static const quaternion_<T> from_axisangle(const axisangle_<T> &aa) {
|
||||
|
||||
static auto from_axisangle(const axisangle_<T> &aa) {
|
||||
using std::sin;
|
||||
using std::cos;
|
||||
|
||||
|
@ -180,9 +179,9 @@ struct quaternion_ : vector4_<T> {
|
|||
//
|
||||
//
|
||||
//
|
||||
typedef quaternion_<real_t> quaternion;
|
||||
typedef quaternion_<float> quaternionf;
|
||||
typedef quaternion_<double> quaterniond;
|
||||
using quaternion = quaternion_<real_t>;
|
||||
using quaternionf = quaternion_<float>;
|
||||
using quaterniond = quaternion_<double>;
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -147,15 +147,18 @@ struct triangle_renderer
|
|||
glFrontFace(GL_CCW);
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
auto proj_mat = matrix_transform<float>::orthographic_projection(1.3,1.0,
|
||||
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),
|
||||
// 1.3f,
|
||||
// 0.2f,1000.f);
|
||||
|
||||
#endif
|
||||
// highly inefficient - should be cached -
|
||||
shader_p.set("input_color",col);
|
||||
shader_p.set("model",model_mat);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue