Browse Source

Implement float4x4::frustum() and float4x4::perspective() to build

projection matrices.
legacy
Sam Hocevar sam 13 years ago
parent
commit
b9c013e665
2 changed files with 30 additions and 0 deletions
  1. +27
    -0
      src/matrix.cpp
  2. +3
    -0
      src/matrix.h

+ 27
- 0
src/matrix.cpp View File

@@ -62,3 +62,30 @@ template<> float4x4 float4x4::invert() const
return ret;
}

template<> float4x4 float4x4::frustum(float left, float right, float bottom,
float top, float near, float far)
{
float invrl = (right != left) ? 1.0f / right - left : 0.0f;
float invtb = (top != bottom) ? 1.0f / top - bottom : 0.0f;
float invfn = (far != near) ? 1.0f / far - near : 0.0f;

float4x4 ret(0.0f);
ret[0][0] = 2.0f * near * invrl;
ret[1][1] = 2.0f * near * invtb;
ret[2][0] = (right + left) * invrl;
ret[2][1] = (top + bottom) * invtb;
ret[2][2] = - (far + near) * invfn;
ret[2][3] = -1.0f;
ret[3][2] = -2.0f * far * near * invfn;
return ret;
}

template<> float4x4 float4x4::perspective(float theta, float width,
float height, float near, float far)
{
float t1 = tanf(theta / 2.0f);
float t2 = t1 * height / width;

return frustum(-near * t1, near * t1, -near * t2, near * t2, near, far);
}


+ 3
- 0
src/matrix.h View File

@@ -195,6 +195,9 @@ template <typename T> struct Mat4
T det() const;
Mat4<T> invert() const;

static Mat4<T> frustum(T left, T right, T bottom, T top, T near, T far);
static Mat4<T> perspective(T theta, T width, T height, T near, T far);

inline Mat4<T> operator +(Mat4<T> const val) const
{
Mat4<T> ret;


Loading…
Cancel
Save