nuclear@7: #include nuclear@7: #include "x3d.h" nuclear@7: #include "fixed.h" nuclear@7: #include "sincos.h" nuclear@7: nuclear@7: #define MAT_STACK_SIZE 4 nuclear@7: nuclear@7: struct matrix { nuclear@7: int32_t m[3][4]; nuclear@7: }; nuclear@7: nuclear@7: static int32_t proj_fov = M_PI_X16; nuclear@7: static int32_t proj_aspect = 65536; nuclear@7: static int32_t proj_near = ftox16(0.5); nuclear@7: static int32_t proj_far = 500 << 16; nuclear@7: nuclear@7: static struct matrix identity = { nuclear@7: {{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}} nuclear@7: }; nuclear@7: nuclear@7: static short mtop; nuclear@7: static struct matrix mstack[MAT_STACK_SIZE] = { nuclear@7: {{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}}, nuclear@7: {{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}} nuclear@7: }; nuclear@7: nuclear@7: void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz) nuclear@7: { nuclear@7: proj_fov = fov; nuclear@7: proj_aspect = aspect; nuclear@7: proj_near = nearz; nuclear@7: proj_far = farz; nuclear@7: } nuclear@7: nuclear@7: int x3d_push_matrix(void) nuclear@7: { nuclear@7: short newtop = mtop + 1; nuclear@7: if(newtop >= MAT_STACK_SIZE) { nuclear@7: return -1; nuclear@7: } nuclear@7: memcpy(mstack + newtop, mstack + mtop, sizeof *mstack); nuclear@7: mtop = newtop; nuclear@7: return 0; nuclear@7: } nuclear@7: nuclear@7: int x3d_pop_matrix(void) nuclear@7: { nuclear@7: if(mtop <= 0) { nuclear@7: return -1; nuclear@7: } nuclear@7: --mtop; nuclear@7: return 0; nuclear@7: } nuclear@7: nuclear@7: void x3d_load_matrix(int32_t *m) nuclear@7: { nuclear@7: memcpy(mstack[mtop].m[0], m, sizeof *mstack); nuclear@7: } nuclear@7: nuclear@7: nuclear@7: #define M(i,j) (((i) << 2) + (j)) nuclear@7: void x3d_mult_matrix(int32_t *m) nuclear@7: { nuclear@7: int i, j; nuclear@7: struct matrix tmp; nuclear@7: nuclear@7: memcpy(tmp.m[0], mstack[mtop].m[0], sizeof tmp); nuclear@7: nuclear@7: for(i=0; i<3; i++) { nuclear@7: for(j=0; j<4; j++) { nuclear@7: mstack[mtop].m[i][j] = x16mul(tmp.m[0][j], m[M(i, 0)]) + nuclear@7: x16mul(tmp.m[1][j], m[M(i, 1)]) + nuclear@7: x16mul(tmp.m[2][j], m[M(i, 2)]) + nuclear@7: m[M(i, 3)]; nuclear@7: } nuclear@7: } nuclear@7: } nuclear@7: nuclear@7: void x3d_load_identity(void) nuclear@7: { nuclear@7: memcpy(mstack[mtop].m[0], identity.m[0], sizeof identity); nuclear@7: } nuclear@7: nuclear@7: /* TODO cont... */