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)