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)