@@ -116,3 +116,35 @@ template<> float4x4 float4x4::translate(float x, float y, float z) | |||||
return ret; | return ret; | ||||
} | } | ||||
template<> float4x4 float4x4::rotate(float theta, float x, float y, float z) | |||||
{ | |||||
float st = sinf(theta); | |||||
float ct = cosf(theta); | |||||
float len = sqrtf(x * x + y * y + z * z); | |||||
float invlen = len ? 1.0f / len : 0.0f; | |||||
x *= invlen; | |||||
y *= invlen; | |||||
z *= invlen; | |||||
float mtx = (1.0f - ct) * x; | |||||
float mty = (1.0f - ct) * y; | |||||
float mtz = (1.0f - ct) * z; | |||||
float4x4 ret(1.0f); | |||||
ret[0][0] = x * mtx + ct; | |||||
ret[0][1] = x * mty + st * z; | |||||
ret[0][2] = x * mtz - st * y; | |||||
ret[1][0] = y * mtx - st * z; | |||||
ret[1][1] = y * mty + ct; | |||||
ret[1][2] = y * mtz + st * x; | |||||
ret[2][0] = z * mtx + st * y; | |||||
ret[2][1] = z * mty - st * x; | |||||
ret[2][2] = z * mtz + ct; | |||||
return ret; | |||||
} | |||||
@@ -199,6 +199,7 @@ template <typename T> struct Mat4 | |||||
static Mat4<T> frustum(T left, T right, T bottom, T top, T near, T far); | 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); | static Mat4<T> perspective(T theta, T width, T height, T near, T far); | ||||
static Mat4<T> translate(T x, T y, T z); | static Mat4<T> translate(T x, T y, T z); | ||||
static Mat4<T> rotate(T theta, T x, T y, T z); | |||||
inline Mat4<T> operator +(Mat4<T> const val) const | inline Mat4<T> operator +(Mat4<T> const val) const | ||||
{ | { | ||||