rayzor
diff src/min3d.c @ 9:70e332156d02
moving along
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 10 Apr 2014 02:31:31 +0300 |
parents | a68dbf80d547 |
children | 79609d482762 |
line diff
1.1 --- a/src/min3d.c Mon Apr 07 08:46:06 2014 +0300 1.2 +++ b/src/min3d.c Thu Apr 10 02:31:31 2014 +0300 1.3 @@ -37,9 +37,7 @@ 1.4 m3dctx->cbuf = cbuf; 1.5 m3dctx->zbuf = zbuf; 1.6 1.7 - m3dctx->vport[0] = m3dctx->vport[1] = 0; 1.8 - m3dctx->vport[2] = cbuf->xsz; 1.9 - m3dctx->vport[3] = cbuf->ysz; 1.10 + m3d_viewport(0, 0, cbuf->xsz, cbuf->ysz); 1.11 } 1.12 1.13 void m3d_clear_color(float r, float g, float b) 1.14 @@ -51,9 +49,11 @@ 1.15 1.16 void m3d_clear(unsigned int bmask) 1.17 { 1.18 - int i, num_pixels = m3dctx->cbuf->xsz * m3dctx->cbuf->ysz; 1.19 + int num_pixels = m3dctx->cbuf->xsz * m3dctx->cbuf->ysz; 1.20 if(bmask & M3D_COLOR_BUFFER_BIT) { 1.21 - /*memset(m3dctx->cbuf->pixels, 0, num_pixels * 3);*/ 1.22 + memset(m3dctx->cbuf->pixels, 0, num_pixels * 4); 1.23 + /* 1.24 + int i; 1.25 unsigned char *ptr = m3dctx->cbuf->pixels; 1.26 unsigned char r = m3dctx->clear_color[0]; 1.27 unsigned char g = m3dctx->clear_color[1]; 1.28 @@ -62,7 +62,7 @@ 1.29 *ptr++ = r; 1.30 *ptr++ = g; 1.31 *ptr++ = b; 1.32 - } 1.33 + }*/ 1.34 } 1.35 if(bmask & M3D_DEPTH_BUFFER_BIT) { 1.36 memset(m3dctx->zbuf, 0xff, num_pixels * sizeof *m3dctx->zbuf); 1.37 @@ -80,6 +80,14 @@ 1.38 m3dctx->state &= ~(1 << bit); 1.39 } 1.40 1.41 +void m3d_viewport(int x, int y, int xsz, int ysz) 1.42 +{ 1.43 + m3dctx->vport[0] = x; 1.44 + m3dctx->vport[1] = y; 1.45 + m3dctx->vport[2] = xsz; 1.46 + m3dctx->vport[3] = ysz; 1.47 +} 1.48 + 1.49 1.50 /* matrix stack */ 1.51 void m3d_matrix_mode(int mode) 1.52 @@ -275,7 +283,7 @@ 1.53 res[i].pos[2] /= res[i].pos[3]; 1.54 1.55 res[i].pos[0] = (res[i].pos[0] * 0.5 + 0.5) * vport[2] + vport[0]; 1.56 - res[i].pos[1] = (res[i].pos[1] * 0.5 + 0.5) * vport[3] + vport[1]; 1.57 + res[i].pos[1] = (-res[i].pos[1] * 0.5 + 0.5) * vport[3] + vport[1]; 1.58 } 1.59 return vcount; 1.60 } 1.61 @@ -313,37 +321,76 @@ 1.62 if(!varr) return; 1.63 1.64 for(i=0; i<vcount; i++) { 1.65 + int r, g, b; 1.66 int idx = i % prim; 1.67 1.68 v[idx].pos[0] = *varr++; 1.69 v[idx].pos[1] = *varr++; 1.70 v[idx].pos[2] = *varr++; 1.71 v[idx].pos[3] = 1.0; 1.72 - v[idx].color[0] = carr ? *carr++ : m3dctx->im_color[0]; 1.73 - v[idx].color[1] = carr ? *carr++ : m3dctx->im_color[1]; 1.74 - v[idx].color[2] = carr ? *carr++ : m3dctx->im_color[2]; 1.75 + r = (carr ? *carr++ : m3dctx->im_color[0]) * 255.0; 1.76 + g = (carr ? *carr++ : m3dctx->im_color[1]) * 255.0; 1.77 + b = (carr ? *carr++ : m3dctx->im_color[2]) * 255.0; 1.78 + v[idx].color = (r << 16) | (g << 8) | b; 1.79 1.80 if(idx == prim - 1) { 1.81 int resnum = proc_prim(prim, resv, v); 1.82 switch(resnum) { 1.83 case 1: 1.84 - draw_point(resv); 1.85 + m3d_draw_point(resv); 1.86 break; 1.87 1.88 - case '2': 1.89 - draw_line(resv); 1.90 + case 2: 1.91 + m3d_draw_line(resv); 1.92 break; 1.93 1.94 default: 1.95 - draw_poly(resv, resnum); 1.96 + m3d_draw_poly(resv, resnum); 1.97 } 1.98 } 1.99 } 1.100 } 1.101 1.102 -void m3d_draw_indexed(int prim, const int *idxarr, int icount) 1.103 +void m3d_draw_indexed(int prim, const unsigned int *idxarr, int icount) 1.104 { 1.105 - /* TODO */ 1.106 + int i, vcount = prim; 1.107 + struct min3d_vertex v[4]; 1.108 + struct min3d_vertex resv[16]; 1.109 + const float *varr = m3dctx->vert_array; 1.110 + const float *carr = m3dctx->col_array; 1.111 + 1.112 + if(!varr) return; 1.113 + 1.114 + for(i=0; i<icount; i++) { 1.115 + int r, g, b; 1.116 + int vnum = i % vcount; 1.117 + int index = idxarr[i]; 1.118 + 1.119 + v[vnum].pos[0] = varr[index * 3]; 1.120 + v[vnum].pos[1] = varr[index * 3 + 1]; 1.121 + v[vnum].pos[2] = varr[index * 3 + 2]; 1.122 + v[vnum].pos[3] = 1.0; 1.123 + r = (carr ? carr[index * 3] : m3dctx->im_color[0]) * 255.0; 1.124 + g = (carr ? carr[index * 3 + 1] : m3dctx->im_color[1]) * 255.0; 1.125 + b = (carr ? carr[index * 3 + 2] : m3dctx->im_color[2]) * 255.0; 1.126 + v[vnum].color = (r << 16) | (g << 8) | b; 1.127 + 1.128 + if(vnum == vcount - 1) { 1.129 + int resnum = proc_prim(prim, resv, v); 1.130 + switch(resnum) { 1.131 + case 1: 1.132 + m3d_draw_point(resv); 1.133 + break; 1.134 + 1.135 + case 2: 1.136 + m3d_draw_line(resv); 1.137 + break; 1.138 + 1.139 + default: 1.140 + m3d_draw_poly(resv, resnum); 1.141 + } 1.142 + } 1.143 + } 1.144 } 1.145 1.146 void m3d_begin(int prim)