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 +}