rayzor

diff src/min3d.c @ 6:a68dbf80d547

finally showing something ... :)
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 07 Apr 2014 06:04:11 +0300
parents 5fcf72837b69
children 70e332156d02
line diff
     1.1 --- a/src/min3d.c	Sun Apr 06 02:43:24 2014 +0300
     1.2 +++ b/src/min3d.c	Mon Apr 07 06:04:11 2014 +0300
     1.3 @@ -3,6 +3,7 @@
     1.4  #include <math.h>
     1.5  #include "min3d.h"
     1.6  #include "m3dimpl.h"
     1.7 +#include "logger.h"
     1.8  
     1.9  #ifndef M_PI
    1.10  #define M_PI	3.141592653
    1.11 @@ -21,6 +22,8 @@
    1.12  	m3d_load_identity();
    1.13  	m3d_matrix_mode(M3D_MODELVIEW);
    1.14  	m3d_load_identity();
    1.15 +
    1.16 +	m3d_color(1, 1, 1);
    1.17  	return 0;
    1.18  }
    1.19  
    1.20 @@ -33,13 +36,33 @@
    1.21  {
    1.22  	m3dctx->cbuf = cbuf;
    1.23  	m3dctx->zbuf = zbuf;
    1.24 +
    1.25 +	m3dctx->vport[0] = m3dctx->vport[1] = 0;
    1.26 +	m3dctx->vport[2] = cbuf->xsz;
    1.27 +	m3dctx->vport[3] = cbuf->ysz;
    1.28 +}
    1.29 +
    1.30 +void m3d_clear_color(float r, float g, float b)
    1.31 +{
    1.32 +	m3dctx->clear_color[0] = (int)((r > 1.0 ? 1.0 : r) * 255.0);
    1.33 +	m3dctx->clear_color[1] = (int)((g > 1.0 ? 1.0 : g) * 255.0);
    1.34 +	m3dctx->clear_color[2] = (int)((b > 1.0 ? 1.0 : b) * 255.0);
    1.35  }
    1.36  
    1.37  void m3d_clear(unsigned int bmask)
    1.38  {
    1.39 -	int num_pixels = m3dctx->cbuf->xsz * m3dctx->cbuf->ysz;
    1.40 +	int i, num_pixels = m3dctx->cbuf->xsz * m3dctx->cbuf->ysz;
    1.41  	if(bmask & M3D_COLOR_BUFFER_BIT) {
    1.42 -		memset(m3dctx->cbuf->pixels, 0, num_pixels * 3);
    1.43 +		/*memset(m3dctx->cbuf->pixels, 0, num_pixels * 3);*/
    1.44 +		unsigned char *ptr = m3dctx->cbuf->pixels;
    1.45 +		unsigned char r = m3dctx->clear_color[0];
    1.46 +		unsigned char g = m3dctx->clear_color[1];
    1.47 +		unsigned char b = m3dctx->clear_color[2];
    1.48 +		for(i=0; i<num_pixels; i++) {
    1.49 +			*ptr++ = r;
    1.50 +			*ptr++ = g;
    1.51 +			*ptr++ = b;
    1.52 +		}
    1.53  	}
    1.54  	if(bmask & M3D_DEPTH_BUFFER_BIT) {
    1.55  		memset(m3dctx->zbuf, 0xff, num_pixels * sizeof *m3dctx->zbuf);
    1.56 @@ -64,6 +87,25 @@
    1.57  	m3dctx->mmode = mode;
    1.58  }
    1.59  
    1.60 +void m3d_push_matrix(void)
    1.61 +{
    1.62 +	int mm = m3dctx->mmode;
    1.63 +	int top = m3dctx->mstack[mm].top;
    1.64 +	if(top < MSTACK_SIZE) {
    1.65 +		float *cur = m3dctx->mstack[mm].m[top++];
    1.66 +		memcpy(m3dctx->mstack[mm].m[top], cur, 16 * sizeof *cur);
    1.67 +		m3dctx->mstack[mm].top = top;
    1.68 +	}
    1.69 +}
    1.70 +
    1.71 +void m3d_pop_matrix(void)
    1.72 +{
    1.73 +	int mm = m3dctx->mmode;
    1.74 +	if(m3dctx->mstack[mm].top > 0) {
    1.75 +		--m3dctx->mstack[mm].top;
    1.76 +	}
    1.77 +}
    1.78 +
    1.79  void m3d_load_identity(void)
    1.80  {
    1.81  	static const float mid[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
    1.82 @@ -171,10 +213,10 @@
    1.83  
    1.84  static void xform4(float *mat, float *vec)
    1.85  {
    1.86 -	float x = mat[0] * vec[0] + mat[1] * vec[1] + mat[2] * vec[2] + mat[3];
    1.87 -	float y = mat[4] * vec[0] + mat[5] * vec[1] + mat[6] * vec[2] + mat[7];
    1.88 -	float z = mat[8] * vec[0] + mat[9] * vec[1] + mat[10] * vec[2] + mat[11];
    1.89 -	float w = mat[12] * vec[0] + mat[13] * vec[1] + mat[14] * vec[2] + mat[15];
    1.90 +	float x = mat[0] * vec[0] + mat[4] * vec[1] + mat[8] * vec[2] + mat[12];
    1.91 +	float y = mat[1] * vec[0] + mat[5] * vec[1] + mat[9] * vec[2] + mat[13];
    1.92 +	float z = mat[2] * vec[0] + mat[6] * vec[1] + mat[10] * vec[2] + mat[14];
    1.93 +	float w = mat[3] * vec[0] + mat[7] * vec[1] + mat[11] * vec[2] + mat[15];
    1.94  
    1.95  	vec[0] = x;
    1.96  	vec[1] = y;
    1.97 @@ -188,6 +230,7 @@
    1.98  	int vcount = prim;
    1.99  	int mvtop, ptop;
   1.100  	float *mvmat, *pmat;
   1.101 +	int *vport = m3dctx->vport;
   1.102  
   1.103  	mvtop = m3dctx->mstack[M3D_MODELVIEW].top;
   1.104  	mvmat = m3dctx->mstack[M3D_MODELVIEW].m[mvtop];
   1.105 @@ -225,11 +268,14 @@
   1.106  		break;	/* TODO */
   1.107  	}
   1.108  
   1.109 -	/* perspective division */
   1.110 +	/* perspective division & viewport */
   1.111  	for(i=0; i<vcount; i++) {
   1.112 -		res[i].pos[0] = res[i].pos[3];
   1.113 -		res[i].pos[1] = res[i].pos[3];
   1.114 -		res[i].pos[2] = res[i].pos[3];
   1.115 +		res[i].pos[0] /= res[i].pos[3];
   1.116 +		res[i].pos[1] /= res[i].pos[3];
   1.117 +		res[i].pos[2] /= res[i].pos[3];
   1.118 +
   1.119 +		res[i].pos[0] = (res[i].pos[0] * 0.5 + 0.5) * vport[2] + vport[0];
   1.120 +		res[i].pos[1] = (res[i].pos[1] * 0.5 + 0.5) * vport[3] + vport[1];
   1.121  	}
   1.122  	return vcount;
   1.123  }
   1.124 @@ -237,22 +283,22 @@
   1.125  /* drawing */
   1.126  void m3d_vertex_array(const float *varr)
   1.127  {
   1.128 -	m3dctx->vert_array = varr;
   1.129 +	m3dctx->vert_array = (float*)varr;
   1.130  }
   1.131  
   1.132  void m3d_normal_array(const float *narr)
   1.133  {
   1.134 -	m3dctx->norm_array = narr;
   1.135 +	m3dctx->norm_array = (float*)narr;
   1.136  }
   1.137  
   1.138  void m3d_color_array(const float *carr)
   1.139  {
   1.140 -	m3dctx->col_array = carr;
   1.141 +	m3dctx->col_array = (float*)carr;
   1.142  }
   1.143  
   1.144  void m3d_texcoord_array(const float *tcarr)
   1.145  {
   1.146 -	m3dctx->tc_array = tcarr;
   1.147 +	m3dctx->tc_array = (float*)tcarr;
   1.148  }
   1.149  
   1.150  
   1.151 @@ -272,9 +318,10 @@
   1.152  		v[idx].pos[0] = *varr++;
   1.153  		v[idx].pos[1] = *varr++;
   1.154  		v[idx].pos[2] = *varr++;
   1.155 -		v[idx].color[0] = carr ? *carr++ : m3dctx->cur_color[0];
   1.156 -		v[idx].color[1] = carr ? *carr++ : m3dctx->cur_color[1];
   1.157 -		v[idx].color[2] = carr ? *carr++ : m3dctx->cur_color[2];
   1.158 +		v[idx].pos[3] = 1.0;
   1.159 +		v[idx].color[0] = carr ? *carr++ : m3dctx->im_color[0];
   1.160 +		v[idx].color[1] = carr ? *carr++ : m3dctx->im_color[1];
   1.161 +		v[idx].color[2] = carr ? *carr++ : m3dctx->im_color[2];
   1.162  
   1.163  		if(idx == prim - 1) {
   1.164  			int resnum = proc_prim(prim, resv, v);
   1.165 @@ -299,3 +346,73 @@
   1.166  	/* TODO */
   1.167  }
   1.168  
   1.169 +void m3d_begin(int prim)
   1.170 +{
   1.171 +	m3dctx->im_prim = prim;
   1.172 +	m3dctx->im_idx = 0;
   1.173 +
   1.174 +	m3dctx->vert_array = m3dctx->im_varr;
   1.175 +	m3dctx->norm_array = 0;
   1.176 +	m3dctx->col_array = 0;
   1.177 +	m3dctx->tc_array = 0;
   1.178 +}
   1.179 +
   1.180 +void m3d_end(void)
   1.181 +{
   1.182 +}
   1.183 +
   1.184 +void m3d_vertex(float x, float y, float z)
   1.185 +{
   1.186 +	int nverts = m3dctx->im_prim;
   1.187 +	int idx = m3dctx->im_idx;
   1.188 +	float *v = m3dctx->vert_array + idx * 3;
   1.189 +
   1.190 +	v[0] = x;
   1.191 +	v[1] = y;
   1.192 +	v[2] = z;
   1.193 +
   1.194 +	if(m3dctx->norm_array) {
   1.195 +		float *ptr = m3dctx->im_narr + idx * 3;
   1.196 +		ptr[0] = m3dctx->im_normal[0];
   1.197 +		ptr[1] = m3dctx->im_normal[1];
   1.198 +		ptr[2] = m3dctx->im_normal[2];
   1.199 +	}
   1.200 +	if(m3dctx->col_array) {
   1.201 +		float *ptr = m3dctx->im_carr + idx * 3;
   1.202 +		ptr[0] = m3dctx->im_color[0];
   1.203 +		ptr[1] = m3dctx->im_color[1];
   1.204 +		ptr[2] = m3dctx->im_color[2];
   1.205 +	}
   1.206 +	if(m3dctx->tc_array) {
   1.207 +		float *ptr = m3dctx->im_texcoord + idx * 2;
   1.208 +		ptr[0] = m3dctx->im_texcoord[0];
   1.209 +		ptr[1] = m3dctx->im_texcoord[1];
   1.210 +	}
   1.211 +
   1.212 +	if(++idx == nverts) {
   1.213 +		m3d_draw(m3dctx->im_prim, nverts);
   1.214 +		idx = 0;
   1.215 +	}
   1.216 +
   1.217 +	m3dctx->im_idx = idx;
   1.218 +}
   1.219 +
   1.220 +void m3d_normal(float x, float y, float z)
   1.221 +{
   1.222 +	m3dctx->im_normal[0] = x;
   1.223 +	m3dctx->im_normal[1] = y;
   1.224 +	m3dctx->im_normal[2] = z;
   1.225 +}
   1.226 +
   1.227 +void m3d_color(float x, float y, float z)
   1.228 +{
   1.229 +	m3dctx->im_color[0] = x;
   1.230 +	m3dctx->im_color[1] = y;
   1.231 +	m3dctx->im_color[2] = z;
   1.232 +}
   1.233 +
   1.234 +void m3d_texcoord(float x, float y)
   1.235 +{
   1.236 +	m3dctx->im_texcoord[0] = x;
   1.237 +	m3dctx->im_texcoord[1] = y;
   1.238 +}