rayzor

diff src/min3d.c @ 3:9035507275d6

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 05 Apr 2014 20:53:44 +0300
parents c273c6f799a4
children 5fcf72837b69
line diff
     1.1 --- a/src/min3d.c	Sat Apr 05 18:31:00 2014 +0300
     1.2 +++ b/src/min3d.c	Sat Apr 05 20:53:44 2014 +0300
     1.3 @@ -6,6 +6,8 @@
     1.4  #define M_PI	3.141592653
     1.5  #endif
     1.6  
     1.7 +struct min3d_context *m3dctx;
     1.8 +
     1.9  int m3d_init(void)
    1.10  {
    1.11  	if(!(m3dctx = malloc(sizeof *m3dctx))) {
    1.12 @@ -178,15 +180,88 @@
    1.13  	vec[3] = w;
    1.14  }
    1.15  
    1.16 -static void proc_vertex(struct min3d_vertex *v)
    1.17 +static int proc_prim(int prim, struct min3d_vertex *res, struct min3d_vertex *v)
    1.18  {
    1.19 -	struct min3d_vertex *tv;
    1.20 +	int i;
    1.21 +	int vcount = prim;
    1.22 +	int mvtop, ptop;
    1.23 +	float *mvmat, *pmat;
    1.24 +
    1.25 +	mvtop = m3dctx->mstack[M3D_MODELVIEW].top;
    1.26 +	mvmat = m3dctx->mstack[M3D_MODELVIEW].m[mvtop];
    1.27 +	ptop = m3dctx->mstack[M3D_PROJECTION].top;
    1.28 +	pmat = m3dctx->mstack[M3D_PROJECTION].m[ptop];
    1.29 +
    1.30 +	/* transform to view space */
    1.31 +	for(i=0; i<vcount; i++) {
    1.32 +		res[i] = v[i];
    1.33 +		xform4(mvmat, res[i].pos);
    1.34 +		/* TODO: normal */
    1.35 +	}
    1.36 +
    1.37 +	/* TODO: lighting */
    1.38 +
    1.39 +	/* project */
    1.40 +	for(i=0; i<vcount; i++) {
    1.41 +		xform4(pmat, res[i].pos);
    1.42 +	}
    1.43 +
    1.44 +	/* clip */
    1.45 +	switch(prim) {
    1.46 +	case M3D_POINTS:
    1.47 +		{
    1.48 +			float w = res[0].pos[3];
    1.49 +			if(res[0].pos[2] < -w || res[0].pos[2] >= w ||
    1.50 +					res[0].pos[0] / w < -1 || res[0].pos[0] / w >= 1 ||
    1.51 +					res[0].pos[1] / w < -1 || res[0].pos[1] / w >= 1) {
    1.52 +				vcount = 0;
    1.53 +			}
    1.54 +		}
    1.55 +		break;
    1.56 +
    1.57 +	default:
    1.58 +		break;	/* TODO */
    1.59 +	}
    1.60 +
    1.61 +	/* perspective division */
    1.62 +	for(i=0; i<vcount; i++) {
    1.63 +		res[i].pos[0] = res[i].pos[3];
    1.64 +		res[i].pos[1] = res[i].pos[3];
    1.65 +		res[i].pos[2] = res[i].pos[3];
    1.66 +	}
    1.67 +	return vcount;
    1.68  }
    1.69  
    1.70  /* drawing */
    1.71  void m3d_draw(int prim, const float *varr, int vcount)
    1.72  {
    1.73 -	/* TODO */
    1.74 +	int i;
    1.75 +	struct min3d_vertex v[4];
    1.76 +	struct min3d_vertex resv[16];
    1.77 +
    1.78 +	for(i=0; i<vcount; i++) {
    1.79 +		int idx = i % prim;
    1.80 +
    1.81 +		v[idx].pos[0] = *varr++;
    1.82 +		v[idx].pos[1] = *varr++;
    1.83 +		v[idx].pos[2] = *varr++;
    1.84 +
    1.85 +		if(idx == prim - 1) {
    1.86 +			int resnum = proc_prim(prim, resv, v);
    1.87 +			switch(resnum) {
    1.88 +			case 1:
    1.89 +				draw_point(resv);
    1.90 +				break;
    1.91 +
    1.92 +			case '2':
    1.93 +				draw_line(resv);
    1.94 +				break;
    1.95 +
    1.96 +			default:
    1.97 +				draw_poly(resv, resnum);
    1.98 +			}
    1.99 +		}
   1.100 +	}
   1.101  }
   1.102  
   1.103  void m3d_draw_indexed(int prim, const float *varr, const int *idxarr, int icount)