deepstone
changeset 17:1e9f0b3616fa
fixed the matrix multiplication order
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 30 Nov 2011 00:04:16 +0200 |
parents | cb676ff89e69 |
children | 777be77b6432 |
files | firstp/firstp.c src/mingl.c src/scantmpl.h src/scene.c src/scene.h |
diffstat | 5 files changed, 114 insertions(+), 28 deletions(-) [+] |
line diff
1.1 --- a/firstp/firstp.c Tue Nov 29 07:23:57 2011 +0200 1.2 +++ b/firstp/firstp.c Wed Nov 30 00:04:16 2011 +0200 1.3 @@ -23,7 +23,7 @@ 1.4 static void sighandler(int s); 1.5 1.6 1.7 -static float cam_x, cam_y, cam_z = 10; 1.8 +static float cam_x, cam_y, cam_z; 1.9 static float cam_theta, cam_phi; 1.10 1.11 static float walk_speed = 0.1; 1.12 @@ -111,9 +111,10 @@ 1.13 1.14 mgl_matrix_mode(MGL_MODELVIEW); 1.15 mgl_load_identity(); 1.16 + mgl_rotate(cam_phi, 1, 0, 0); 1.17 mgl_rotate(cam_theta, 0, 1, 0); 1.18 - mgl_rotate(cam_phi, 1, 0, 0); 1.19 mgl_translate(-cam_x, -cam_y, -cam_z); 1.20 + mgl_translate(0, -2.0, 0); 1.21 1.22 mgl_light_intensity(0, 1.0); 1.23 mgl_light_position(0, 0, 5, 0, 1); 1.24 @@ -124,6 +125,14 @@ 1.25 copy_frame(fbuf); 1.26 } 1.27 1.28 +#define DEG_TO_RAD(x) (M_PI * (x) / 180.0) 1.29 +void cam_move(float dx, float dy) 1.30 +{ 1.31 + float angle = DEG_TO_RAD(cam_theta); 1.32 + cam_x += cos(angle) * dx + sin(angle) * dy; 1.33 + cam_z -= -sin(angle) * dx + cos(angle) * dy; 1.34 +} 1.35 + 1.36 static int proc_events(void) 1.37 { 1.38 static int prev_mx, prev_my, prev_bnmask; 1.39 @@ -150,35 +159,24 @@ 1.40 1.41 static int keyb(int key) 1.42 { 1.43 - float dir_x, dir_y, right_x, right_y; 1.44 - 1.45 - dir_x = sin(DEG2RAD(cam_theta)) * walk_speed; 1.46 - dir_y = cos(DEG2RAD(cam_theta)) * walk_speed; 1.47 - right_x = dir_y; 1.48 - right_y = -dir_x; 1.49 - 1.50 switch(key) { 1.51 case 27: 1.52 return 0; 1.53 1.54 case 'w': 1.55 - cam_x += dir_x; 1.56 - cam_z -= dir_y; 1.57 + cam_move(0, walk_speed); 1.58 break; 1.59 1.60 case 's': 1.61 - cam_x -= dir_x; 1.62 - cam_z += dir_y; 1.63 + cam_move(0, -walk_speed); 1.64 break; 1.65 1.66 case 'a': 1.67 - cam_x -= right_x; 1.68 - cam_z += right_y; 1.69 + cam_move(-walk_speed, 0); 1.70 break; 1.71 1.72 case 'd': 1.73 - cam_x += right_x; 1.74 - cam_z -= right_y; 1.75 + cam_move(walk_speed, 0); 1.76 break; 1.77 1.78 case '`':
2.1 --- a/src/mingl.c Tue Nov 29 07:23:57 2011 +0200 2.2 +++ b/src/mingl.c Wed Nov 30 00:04:16 2011 +0200 2.3 @@ -19,6 +19,7 @@ 2.4 #include <stdlib.h> 2.5 #include <string.h> 2.6 #include <math.h> 2.7 +#include <limits.h> 2.8 #include <assert.h> 2.9 #include "mingl.h" 2.10 #include "mglimpl.h" 2.11 @@ -412,7 +413,7 @@ 2.12 memcpy(dest, mat, 16 * sizeof *dest); 2.13 } 2.14 2.15 -#define M(i,j) (((j) << 2) + (i)) 2.16 +#define M(i,j) (((i) << 2) + (j)) 2.17 void mgl_mult_matrix(float *m2) 2.18 { 2.19 int i, j; 2.20 @@ -557,7 +558,7 @@ 2.21 for(i=0; i<MAX_SHIFT; i++) { 2.22 if((val >> i) == 1) { 2.23 *shiftp = i; 2.24 - *maskp = ~(0xffff << i); 2.25 + *maskp = ~(UINT_MAX << i); 2.26 return 0; 2.27 } 2.28 }
3.1 --- a/src/scantmpl.h Tue Nov 29 07:23:57 2011 +0200 3.2 +++ b/src/scantmpl.h Wed Nov 30 00:04:16 2011 +0200 3.3 @@ -141,7 +141,7 @@ 3.4 float e, de, dfde; 3.5 #endif 3.6 #ifdef INTERP_TEX 3.7 - int tx, ty; 3.8 + unsigned int tx, ty; 3.9 float u, v, du, dv, dfdu, dfdv; 3.10 #endif 3.11 struct vertex *left, *right; 3.12 @@ -253,8 +253,8 @@ 3.13 z += dfdz; 3.14 #endif 3.15 #ifdef INTERP_TEX 3.16 - tx = (int)(u * st->tex.width) & st->tex.xmask; 3.17 - ty = (int)(v * st->tex.height) & st->tex.ymask; 3.18 + tx = (unsigned int)(u * st->tex.width) & st->tex.xmask; 3.19 + ty = (unsigned int)(v * st->tex.height) & st->tex.ymask; 3.20 c = st->tex.pixels[(ty << st->tex.xshift) + tx]; 3.21 3.22 u += dfdu;
4.1 --- a/src/scene.c Tue Nov 29 07:23:57 2011 +0200 4.2 +++ b/src/scene.c Wed Nov 30 00:04:16 2011 +0200 4.3 @@ -5,7 +5,13 @@ 4.4 #include <errno.h> 4.5 #include "scene.h" 4.6 #include "cvec.h" 4.7 +#include "palman.h" 4.8 + 4.9 +#ifdef USE_GL 4.10 +#include <GL/gl.h> 4.11 +#else 4.12 #include "mingl.h" 4.13 +#endif 4.14 4.15 4.16 struct face { 4.17 @@ -231,6 +237,9 @@ 4.18 4.19 if(strcmp(tok, "newmtl") == 0) { 4.20 if(m) { 4.21 + if(!m->tex) { 4.22 + palm_add_color(m->kd[0], m->kd[1], m->kd[2]); 4.23 + } 4.24 scn_add_material(scn, m); 4.25 } 4.26 if(!(m = malloc(sizeof *m)) || mtl_init(m) == -1) { 4.27 @@ -239,15 +248,25 @@ 4.28 mtl_set_name(m, rest); 4.29 4.30 } else if(strcmp(tok, "Kd") == 0) { 4.31 - if(sscanf(rest, "%f %f %f", &m->kd.x, &m->kd.y, &m->kd.z) != 3) { 4.32 + float r, g, b; 4.33 + if(sscanf(rest, "%f %f %f", &r, &g, &b) != 3) { 4.34 continue; 4.35 } 4.36 + m->kd[0] = (int)(r * 255.0); 4.37 + m->kd[1] = (int)(g * 255.0); 4.38 + m->kd[2] = (int)(b * 255.0); 4.39 + 4.40 } else if(strcmp(tok, "map_Kd") == 0) { 4.41 - printf("ignoring texture: `%s'\n", rest); 4.42 + if(!(m->tex = load_texture(rest))) { 4.43 + fprintf(stderr, "failed to load texture: `%s'\n", rest); 4.44 + } 4.45 } 4.46 } 4.47 4.48 if(m) { 4.49 + if(!m->tex) { 4.50 + palm_add_color(m->kd[0], m->kd[1], m->kd[2]); 4.51 + } 4.52 scn_add_material(scn, m); 4.53 } 4.54 4.55 @@ -282,8 +301,39 @@ 4.56 4.57 void scn_render(struct scene *scn) 4.58 { 4.59 - struct mesh *m = scn->meshlist; 4.60 + struct mesh *m; 4.61 4.62 + if(!scn->ready) { 4.63 + struct material *mtl = scn->matlist; 4.64 + while(mtl) { 4.65 + if(mtl->tex) { 4.66 + get_texture_pixels(mtl->tex); 4.67 +#ifdef USE_GL 4.68 + { 4.69 + int i, npix = mtl->tex->width * mtl->tex->height; 4.70 + int range = palm_color_range(); 4.71 + unsigned char *rgb = malloc(npix * 3); 4.72 + struct palm_color *pal = palm_palette(); 4.73 + 4.74 + for(i=0; i<npix; i++) { 4.75 + int idx = mtl->tex->pixels[i] + range - 1; 4.76 + rgb[i * 3] = pal[idx].r; 4.77 + rgb[i * 3 + 1] = pal[idx].g; 4.78 + rgb[i * 3 + 2] = pal[idx].b; 4.79 + } 4.80 + free(mtl->tex->pixels); 4.81 + mtl->tex->pixels = rgb; 4.82 + } 4.83 +#endif /* USE_GL */ 4.84 + } else { 4.85 + mtl->kd_base = palm_color_base(mtl->kd[0], mtl->kd[1], mtl->kd[2]); 4.86 + } 4.87 + mtl = mtl->next; 4.88 + } 4.89 + scn->ready = 1; 4.90 + } 4.91 + 4.92 + m = scn->meshlist; 4.93 while(m) { 4.94 mesh_draw(m); 4.95 m = m->next; 4.96 @@ -365,15 +415,51 @@ 4.97 void mesh_draw(struct mesh *m) 4.98 { 4.99 int i, numv; 4.100 + struct material *mtl = m->mtl; 4.101 + 4.102 + numv = cvec_size(m->vert); 4.103 + 4.104 +#ifdef USE_GL 4.105 + if(mtl->tex) { 4.106 + glEnable(GL_TEXTURE_2D); 4.107 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 4.108 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 4.109 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 4.110 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 4.111 + 4.112 + glTexImage2D(GL_TEXTURE_2D, 0, 3, mtl->tex->width, mtl->tex->height, 0, GL_RGB, GL_UNSIGNED_BYTE, mtl->tex->pixels); 4.113 + } 4.114 + 4.115 + glBegin(GL_TRIANGLES); 4.116 + for(i=0; i<numv; i++) { 4.117 + glNormal3f(m->norm[i].x, m->norm[i].y, m->norm[i].z); 4.118 + glTexCoord2f(m->texcoord[i].x, m->texcoord[i].y); 4.119 + glVertex3f(m->vert[i].x, m->vert[i].y, m->vert[i].z); 4.120 + } 4.121 + glEnd(); 4.122 + 4.123 + if(mtl->tex) { 4.124 + glDisable(GL_TEXTURE_2D); 4.125 + } 4.126 +#else 4.127 + if(mtl->tex) { 4.128 + /*mgl_enable(MGL_TEXTURE_2D);*/ 4.129 + mgl_teximage(mtl->tex->width, mtl->tex->height, mtl->tex->pixels); 4.130 + } else { 4.131 + mgl_index(mtl->kd_base); 4.132 + } 4.133 4.134 mgl_begin(MGL_TRIANGLES); 4.135 4.136 - numv = cvec_size(m->vert); 4.137 for(i=0; i<numv; i++) { 4.138 mgl_normal(m->norm[i].x, m->norm[i].y, m->norm[i].z); 4.139 mgl_texcoord2f(m->texcoord[i].x, m->texcoord[i].y); 4.140 mgl_vertex3f(m->vert[i].x, m->vert[i].y, m->vert[i].z); 4.141 } 4.142 + mgl_end(); 4.143 4.144 - mgl_end(); 4.145 + if(mtl->tex) { 4.146 + mgl_disable(MGL_TEXTURE_2D); 4.147 + } 4.148 +#endif 4.149 }
5.1 --- a/src/scene.h Tue Nov 29 07:23:57 2011 +0200 5.2 +++ b/src/scene.h Wed Nov 30 00:04:16 2011 +0200 5.3 @@ -7,7 +7,7 @@ 5.4 5.5 struct material { 5.6 char *name; 5.7 - vec3_t kd; 5.8 + int kd[3]; 5.9 int kd_base; 5.10 struct texture *tex; 5.11 5.12 @@ -25,6 +25,7 @@ 5.13 }; 5.14 5.15 struct scene { 5.16 + int ready; 5.17 struct material *matlist; 5.18 struct mesh *meshlist; 5.19 };