nuclear@10: #include nuclear@10: #include "vmath/vmath.h" nuclear@10: #include "gfxstate.h" nuclear@10: nuclear@10: static std::stack mstack[NUM_MATRICES]; nuclear@10: nuclear@10: static bool init_stack(int midx) nuclear@10: { nuclear@10: if(mstack[midx].empty()) { nuclear@10: mstack[midx].push(Matrix4x4::identity); nuclear@10: return true; nuclear@10: } nuclear@10: return false; nuclear@10: } nuclear@10: nuclear@10: void push_matrix(int midx) nuclear@10: { nuclear@10: init_stack(midx); nuclear@10: mstack[midx].push(mstack[midx].top()); nuclear@10: } nuclear@10: nuclear@10: void pop_matrix(int midx) nuclear@10: { nuclear@10: if(!mstack[midx].empty()) { nuclear@10: mstack[midx].pop(); nuclear@10: } nuclear@10: } nuclear@10: nuclear@10: void set_identity_matrix(int midx) nuclear@10: { nuclear@10: set_matrix4x4(midx, Matrix4x4::identity); nuclear@10: } nuclear@10: nuclear@10: void set_matrix(int midx, const float *m) nuclear@10: { nuclear@10: Matrix4x4 tmp; nuclear@10: memcpy(tmp[0], m, 16 * sizeof *m); nuclear@10: set_matrix4x4(midx, tmp.transposed()); nuclear@10: } nuclear@10: nuclear@10: void mult_matrix(int midx, const float *m) nuclear@10: { nuclear@10: Matrix4x4 tmp; nuclear@10: memcpy(tmp[0], m, 16 * sizeof *m); nuclear@10: mult_matrix4x4(midx, tmp.transposed()); nuclear@10: } nuclear@10: nuclear@10: void get_matrix(int midx, float *m) nuclear@10: { nuclear@10: Matrix4x4 tmp = get_matrix4x4(midx); nuclear@10: tmp.transpose(); nuclear@10: memcpy(m, tmp[0], 16 * sizeof *m); nuclear@10: } nuclear@10: nuclear@10: void set_matrix4x4(int midx, const Matrix4x4 &m) nuclear@10: { nuclear@10: mstack[midx].top() = m; nuclear@10: } nuclear@10: nuclear@10: void mult_matrix4x4(int midx, const Matrix4x4 &m) nuclear@10: { nuclear@10: mstack[midx].top() *= m; nuclear@10: } nuclear@10: nuclear@10: Matrix4x4 &get_matrix4x4(int midx) nuclear@10: { nuclear@10: return mstack[midx].top(); nuclear@10: }