VMatrix SetupMatrixIdentity() { return VMatrix( 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); }
// Transpose upper-left 3x3. VMatrix VMatrix::Transpose3x3() const { return VMatrix( m[0][0], m[1][0], m[2][0], m[0][3], m[0][1], m[1][1], m[2][1], m[1][3], m[0][2], m[1][2], m[2][2], m[2][3], m[3][0], m[3][1], m[3][2], m[3][3]); }
static int luasrc_VMatrix (lua_State *L) { if (lua_gettop(L) < 1) { VMatrix matrix = VMatrix(); memset( &matrix, 0, sizeof( VMatrix ) ); lua_pushvmatrix(L, matrix); } else if (lua_gettop(L) < 3) { VMatrix matrix = VMatrix(luaL_checkmatrix(L, 1)); lua_pushvmatrix(L, matrix); } else if (lua_gettop(L) < 16) { VMatrix matrix = VMatrix(luaL_checkvector(L, 1), luaL_checkvector(L, 2), luaL_checkvector(L, 3)); lua_pushvmatrix(L, matrix); } else { VMatrix matrix = VMatrix(luaL_checknumber(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3), luaL_checknumber(L, 4), luaL_checknumber(L, 5), luaL_checknumber(L, 6), luaL_checknumber(L, 7), luaL_checknumber(L, 8), luaL_checknumber(L, 9), luaL_checknumber(L, 10), luaL_checknumber(L, 11), luaL_checknumber(L, 12), luaL_checknumber(L, 13), luaL_checknumber(L, 14), luaL_checknumber(L, 15), luaL_checknumber(L, 16)); lua_pushvmatrix(L, matrix); } return 1; }
VMatrix VMatrix::Scale(const Vector &vScale) { return VMatrix( m[0][0]*vScale.x, m[0][1]*vScale.y, m[0][2]*vScale.z, m[0][3], m[1][0]*vScale.x, m[1][1]*vScale.y, m[1][2]*vScale.z, m[1][3], m[2][0]*vScale.x, m[2][1]*vScale.y, m[2][2]*vScale.z, m[2][3], m[3][0]*vScale.x, m[3][1]*vScale.y, m[3][2]*vScale.z, 1.0f ); }
VMatrix SetupMatrixScale(const Vector &vScale) { return VMatrix( vScale.x, 0.0f, 0.0f, 0.0f, 0.0f, vScale.y, 0.0f, 0.0f, 0.0f, 0.0f, vScale.z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); }
VMatrix SetupMatrixTranslation(const Vector &vTranslation) { return VMatrix( 1.0f, 0.0f, 0.0f, vTranslation.x, 0.0f, 1.0f, 0.0f, vTranslation.y, 0.0f, 0.0f, 1.0f, vTranslation.z, 0.0f, 0.0f, 0.0f, 1.0f ); }
VMatrix SetupMatrixAxisRot(const Vector &vAxis, vec_t fDegrees) { vec_t s, c, t; vec_t tx, ty, tz; vec_t sx, sy, sz; vec_t fRadians; fRadians = fDegrees * (M_PI / 180.0f); s = (vec_t)sin(fRadians); c = (vec_t)cos(fRadians); t = 1.0f - c; tx = t * vAxis.x; ty = t * vAxis.y; tz = t * vAxis.z; sx = s * vAxis.x; sy = s * vAxis.y; sz = s * vAxis.z; return VMatrix( tx*vAxis.x + c, tx*vAxis.y - sz, tx*vAxis.z + sy, 0.0f, tx*vAxis.y + sz, ty*vAxis.y + c, ty*vAxis.z - sx, 0.0f, tx*vAxis.z - sy, ty*vAxis.z + sx, tz*vAxis.z + c, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); }