gba-trycatch

diff src/x3d.c @ 7:158d23956801

started adding rendering pipeline stuff
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 18 Jun 2014 06:20:07 +0300
parents
children fb0a0d6a8b52
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/x3d.c	Wed Jun 18 06:20:07 2014 +0300
     1.3 @@ -0,0 +1,84 @@
     1.4 +#include <string.h>
     1.5 +#include "x3d.h"
     1.6 +#include "fixed.h"
     1.7 +#include "sincos.h"
     1.8 +
     1.9 +#define MAT_STACK_SIZE	4
    1.10 +
    1.11 +struct matrix {
    1.12 +	int32_t m[3][4];
    1.13 +};
    1.14 +
    1.15 +static int32_t proj_fov = M_PI_X16;
    1.16 +static int32_t proj_aspect = 65536;
    1.17 +static int32_t proj_near = ftox16(0.5);
    1.18 +static int32_t proj_far = 500 << 16;
    1.19 +
    1.20 +static struct matrix identity = {
    1.21 +	{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}
    1.22 +};
    1.23 +
    1.24 +static short mtop;
    1.25 +static struct matrix mstack[MAT_STACK_SIZE] = {
    1.26 +	{{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}},
    1.27 +	{{{65536, 0, 0, 0}, {0, 65536, 0, 0}, {0, 0, 65536, 0}}}
    1.28 +};
    1.29 +
    1.30 +void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz)
    1.31 +{
    1.32 +	proj_fov = fov;
    1.33 +	proj_aspect = aspect;
    1.34 +	proj_near = nearz;
    1.35 +	proj_far = farz;
    1.36 +}
    1.37 +
    1.38 +int x3d_push_matrix(void)
    1.39 +{
    1.40 +	short newtop = mtop + 1;
    1.41 +	if(newtop >= MAT_STACK_SIZE) {
    1.42 +		return -1;
    1.43 +	}
    1.44 +	memcpy(mstack + newtop, mstack + mtop, sizeof *mstack);
    1.45 +	mtop = newtop;
    1.46 +	return 0;
    1.47 +}
    1.48 +
    1.49 +int x3d_pop_matrix(void)
    1.50 +{
    1.51 +	if(mtop <= 0) {
    1.52 +		return -1;
    1.53 +	}
    1.54 +	--mtop;
    1.55 +	return 0;
    1.56 +}
    1.57 +
    1.58 +void x3d_load_matrix(int32_t *m)
    1.59 +{
    1.60 +	memcpy(mstack[mtop].m[0], m, sizeof *mstack);
    1.61 +}
    1.62 +
    1.63 +
    1.64 +#define M(i,j)	(((i) << 2) + (j))
    1.65 +void x3d_mult_matrix(int32_t *m)
    1.66 +{
    1.67 +	int i, j;
    1.68 +	struct matrix tmp;
    1.69 +
    1.70 +	memcpy(tmp.m[0], mstack[mtop].m[0], sizeof tmp);
    1.71 +
    1.72 +	for(i=0; i<3; i++) {
    1.73 +		for(j=0; j<4; j++) {
    1.74 +			mstack[mtop].m[i][j] = x16mul(tmp.m[0][j], m[M(i, 0)]) +
    1.75 +				x16mul(tmp.m[1][j], m[M(i, 1)]) +
    1.76 +				x16mul(tmp.m[2][j], m[M(i, 2)]) +
    1.77 +				m[M(i, 3)];
    1.78 +		}
    1.79 +	}
    1.80 +}
    1.81 +
    1.82 +void x3d_load_identity(void)
    1.83 +{
    1.84 +	memcpy(mstack[mtop].m[0], identity.m[0], sizeof identity);
    1.85 +}
    1.86 +
    1.87 +/* TODO cont... */