gba-x3dtest
changeset 7:158d23956801
started adding rendering pipeline stuff
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 18 Jun 2014 06:20:07 +0300 |
parents | 73b5f2e5d18a |
children | fb0a0d6a8b52 |
files | src/fixed.h src/x3d.c src/x3d.h |
diffstat | 3 files changed, 118 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- a/src/fixed.h Wed Jun 18 04:13:02 2014 +0300 1.2 +++ b/src/fixed.h Wed Jun 18 06:20:07 2014 +0300 1.3 @@ -3,6 +3,12 @@ 1.4 1.5 #include <stdint.h> 1.6 1.7 +#define ftox16(x) (int32_t)((x) * 65536.0f) 1.8 +#define itox16(x) (int32_t)((x) << 16) 1.9 + 1.10 +#define x16tof(x) (float)((x) / 65536.0f) 1.11 +#define x16toi(x) ((x) >> 16) 1.12 + 1.13 #define x16mul(a, b) (int32_t)(((int32_t)(a) >> 8) * ((int32_t)(b) >> 8)) 1.14 /*int32_t x16div(register int32_t num, register int32_t denom);*/ 1.15
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/x3d.c Wed Jun 18 06:20:07 2014 +0300 2.3 @@ -0,0 +1,84 @@ 2.4 +#include <string.h> 2.5 +#include "x3d.h" 2.6 +#include "fixed.h" 2.7 +#include "sincos.h" 2.8 + 2.9 +#define MAT_STACK_SIZE 4 2.10 + 2.11 +struct matrix { 2.12 + int32_t m[3][4]; 2.13 +}; 2.14 + 2.15 +static int32_t proj_fov = M_PI_X16; 2.16 +static int32_t proj_aspect = 65536; 2.17 +static int32_t proj_near = ftox16(0.5); 2.18 +static int32_t proj_far = 500 << 16; 2.19 + 2.20 +static struct matrix identity = { 2.21 + {{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}} 2.22 +}; 2.23 + 2.24 +static short mtop; 2.25 +static struct matrix mstack[MAT_STACK_SIZE] = { 2.26 + {{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}}, 2.27 + {{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}} 2.28 +}; 2.29 + 2.30 +void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz) 2.31 +{ 2.32 + proj_fov = fov; 2.33 + proj_aspect = aspect; 2.34 + proj_near = nearz; 2.35 + proj_far = farz; 2.36 +} 2.37 + 2.38 +int x3d_push_matrix(void) 2.39 +{ 2.40 + short newtop = mtop + 1; 2.41 + if(newtop >= MAT_STACK_SIZE) { 2.42 + return -1; 2.43 + } 2.44 + memcpy(mstack + newtop, mstack + mtop, sizeof *mstack); 2.45 + mtop = newtop; 2.46 + return 0; 2.47 +} 2.48 + 2.49 +int x3d_pop_matrix(void) 2.50 +{ 2.51 + if(mtop <= 0) { 2.52 + return -1; 2.53 + } 2.54 + --mtop; 2.55 + return 0; 2.56 +} 2.57 + 2.58 +void x3d_load_matrix(int32_t *m) 2.59 +{ 2.60 + memcpy(mstack[mtop].m[0], m, sizeof *mstack); 2.61 +} 2.62 + 2.63 + 2.64 +#define M(i,j) (((i) << 2) + (j)) 2.65 +void x3d_mult_matrix(int32_t *m) 2.66 +{ 2.67 + int i, j; 2.68 + struct matrix tmp; 2.69 + 2.70 + memcpy(tmp.m[0], mstack[mtop].m[0], sizeof tmp); 2.71 + 2.72 + for(i=0; i<3; i++) { 2.73 + for(j=0; j<4; j++) { 2.74 + mstack[mtop].m[i][j] = x16mul(tmp.m[0][j], m[M(i, 0)]) + 2.75 + x16mul(tmp.m[1][j], m[M(i, 1)]) + 2.76 + x16mul(tmp.m[2][j], m[M(i, 2)]) + 2.77 + m[M(i, 3)]; 2.78 + } 2.79 + } 2.80 +} 2.81 + 2.82 +void x3d_load_identity(void) 2.83 +{ 2.84 + memcpy(mstack[mtop].m[0], identity.m[0], sizeof identity); 2.85 +} 2.86 + 2.87 +/* TODO cont... */
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/x3d.h Wed Jun 18 06:20:07 2014 +0300 3.3 @@ -0,0 +1,28 @@ 3.4 +#ifndef X3D_H_ 3.5 +#define X3D_H_ 3.6 + 3.7 +#include <stdint.h> 3.8 + 3.9 +enum { 3.10 + X3D_POINTS = 1, 3.11 + X3D_LINES = 2, 3.12 + X3D_TRIANGLES = 3, 3.13 + X3D_QUADS = 4 3.14 +}; 3.15 + 3.16 +void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz); 3.17 + 3.18 +int x3d_push_matrix(void); 3.19 +int x3d_pop_matrix(void); 3.20 +void x3d_load_matrix(int32_t *m); 3.21 +void x3d_mult_matrix(int32_t *m); 3.22 +void x3d_load_identity(void); 3.23 +void x3d_translate(int32_t x, int32_t y, int32_t z); 3.24 +void x3d_rotate(int32_t angle, int32_t x, int32_t y, int32_t z); 3.25 +void x3d_scale(int32_t x, int32_t y, int32_t z); 3.26 + 3.27 +void x3d_vertex_array(int count, int32_t *ptr); 3.28 +void x3d_color_array(int count, int32_t *ptr); 3.29 +int x3d_draw_arrays(int prim); 3.30 + 3.31 +#endif /* X3D_H_ */