gba-x3dtest
changeset 12:ecc022a21279
more tuff
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 23 Jun 2014 06:44:04 +0300 |
parents | c47e54796b82 |
children | 2070a81127f2 |
files | src/game.c src/ggen.c src/ggen.h src/mesh.c src/mesh.h src/x3d.c src/x3d.h |
diffstat | 7 files changed, 160 insertions(+), 12 deletions(-) [+] |
line diff
1.1 --- a/src/game.c Sun Jun 22 07:54:29 2014 +0300 1.2 +++ b/src/game.c Mon Jun 23 06:44:04 2014 +0300 1.3 @@ -9,11 +9,12 @@ 1.4 static void draw_rect(int x, int y, int w, int h, uint16_t color); 1.5 1.6 #define X16INT(x) ((x) << 16) 1.7 +#define X16FLT(x) ((int32_t)((x) * 65536.0)) 1.8 1.9 static const int32_t poly[] = { 1.10 - X16INT(120), X16INT(20), 0, 1.11 - X16INT(200), X16INT(130), 0, 1.12 - X16INT(40), X16INT(100), 0 1.13 + X16FLT(0), X16FLT(1), 0, 1.14 + X16FLT(1), X16FLT(-0.8), 0, 1.15 + X16FLT(-1), X16FLT(-0.5), 0 1.16 }; 1.17 static const short vcount = sizeof poly / sizeof *poly / 3; 1.18 1.19 @@ -24,6 +25,8 @@ 1.20 palman_init(); 1.21 #endif 1.22 1.23 + x3d_projection(45.0, (WIDTH << 16) / HEIGHT, 65536 / 2, 65536 * 500); 1.24 + 1.25 return 0; 1.26 } 1.27 1.28 @@ -37,13 +40,20 @@ 1.29 clear_buffer(back_buffer, 0); 1.30 1.31 x3d_load_identity(); 1.32 - x3d_translate(-itox16(WIDTH / 2), -itox16(HEIGHT / 2), 0); 1.33 + /*x3d_translate(-itox16(WIDTH / 2), -itox16(HEIGHT / 2), 0); 1.34 if(autorot) { 1.35 x3d_rotate((msec / 64) << 16, 0, 0, 65536); 1.36 } else { 1.37 x3d_rotate(keyrot << 16, 0, 0, 65536); 1.38 } 1.39 - x3d_translate(itox16(WIDTH / 2), itox16(HEIGHT / 2), 0); 1.40 + x3d_translate(itox16(WIDTH / 2), itox16(HEIGHT / 2), 0);*/ 1.41 + 1.42 + if(autorot) { 1.43 + x3d_rotate((msec / 64) << 16, 0, 65536, 0); 1.44 + } else { 1.45 + x3d_rotate(keyrot << 16, 0, 65536, 0); 1.46 + } 1.47 + x3d_translate(0, 0, X16INT(2)); 1.48 1.49 x3d_vertex_array(vcount, poly); 1.50 1.51 @@ -52,14 +62,14 @@ 1.52 #else 1.53 x3d_color(65536, 65536, 65536); 1.54 #endif 1.55 - x3d_draw_arrays(X3D_TRIANGLES, vcount); 1.56 + x3d_draw(X3D_TRIANGLES, vcount); 1.57 1.58 #ifdef PALMODE 1.59 x3d_color_index(RGBPAL(0, 255, 0)); 1.60 #else 1.61 x3d_color(0, 65536, 0); 1.62 #endif 1.63 - x3d_draw_arrays(X3D_POINTS, vcount); 1.64 + x3d_draw(X3D_POINTS, vcount); 1.65 x3d_vertex_array(0, 0); 1.66 1.67 draw_rect(0, 0, WIDTH, HEIGHT, RGBPAL(255, 0, 0));
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/ggen.c Mon Jun 23 06:44:04 2014 +0300 2.3 @@ -0,0 +1,63 @@ 2.4 +#include <stdlib.h> 2.5 +#include "ggen.h" 2.6 +#include "mesh.h" 2.7 + 2.8 +#define X1 65536 2.9 +#define VERTEX(x, y, z) \ 2.10 + do { \ 2.11 + *vptr++ = x; \ 2.12 + *vptr++ = y; \ 2.13 + *vptr++ = z; \ 2.14 + } while(0) 2.15 + 2.16 +int gen_box(struct mesh *m) 2.17 +{ 2.18 + int num_faces = 8; 2.19 + int num_verts = num_faces * 4; 2.20 + int32_t v[8][3] = { 2.21 + {-X1, -X1, -X1}, {X1, -X1, -X1}, {X1, -X1, X1}, {-X1, -X1, X1}, 2.22 + {-X1, X1, -X1}, {X1, X1, -X1}, {X1, X1, X1}, {-X1, X1, X1} 2.23 + }; 2.24 + int32_t *vptr; 2.25 + 2.26 + 2.27 + m->prim = X3D_QUADS; 2.28 + m->nverts = num_verts; 2.29 + if(!(m->verts = malloc(num_verts * sizeof *m->verts))) { 2.30 + return -1; 2.31 + } 2.32 + vptr = m->verts; 2.33 + 2.34 + /* -Y */ 2.35 + VERTEX(v[0][0], v[0][1], v[0][2]); 2.36 + VERTEX(v[1][0], v[1][1], v[1][2]); 2.37 + VERTEX(v[2][0], v[2][1], v[2][2]); 2.38 + VERTEX(v[3][0], v[3][1], v[3][2]); 2.39 + /* +Y */ 2.40 + VERTEX(v[4][0], v[4][1], v[4][2]); 2.41 + VERTEX(v[5][0], v[5][1], v[5][2]); 2.42 + VERTEX(v[6][0], v[6][1], v[6][2]); 2.43 + VERTEX(v[7][0], v[7][1], v[7][2]); 2.44 + /* -Z */ 2.45 + VERTEX(v[0][0], v[0][1], v[0][2]); 2.46 + VERTEX(v[4][0], v[4][1], v[4][2]); 2.47 + VERTEX(v[5][0], v[5][1], v[5][2]); 2.48 + VERTEX(v[1][0], v[1][1], v[1][2]); 2.49 + /* +Z */ 2.50 + VERTEX(v[2][0], v[2][1], v[2][2]); 2.51 + VERTEX(v[6][0], v[6][1], v[6][2]); 2.52 + VERTEX(v[7][0], v[7][1], v[7][2]); 2.53 + VERTEX(v[3][0], v[3][1], v[3][2]); 2.54 + /* +X */ 2.55 + VERTEX(v[1][0], v[1][1], v[1][2]); 2.56 + VERTEX(v[5][0], v[5][1], v[5][2]); 2.57 + VERTEX(v[6][0], v[6][1], v[6][2]); 2.58 + VERTEX(v[2][0], v[2][1], v[2][2]); 2.59 + /* -X */ 2.60 + VERTEX(v[3][0], v[3][1], v[3][2]); 2.61 + VERTEX(v[7][0], v[7][1], v[7][2]); 2.62 + VERTEX(v[4][0], v[4][1], v[4][2]); 2.63 + VERTEX(v[0][0], v[0][1], v[0][2]); 2.64 + 2.65 + return 0; 2.66 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/ggen.h Mon Jun 23 06:44:04 2014 +0300 3.3 @@ -0,0 +1,8 @@ 3.4 +#ifndef GGEN_H_ 3.5 +#define GGEN_H_ 3.6 + 3.7 +#include "mesh.h" 3.8 + 3.9 +int gen_box(struct mesh *m); 3.10 + 3.11 +#endif /* GGEN_H_ */
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/src/mesh.c Mon Jun 23 06:44:04 2014 +0300 4.3 @@ -0,0 +1,22 @@ 4.4 +#include <stdlib.h> 4.5 +#include "mesh.h" 4.6 +#include "x3d.h" 4.7 + 4.8 +void init_mesh(struct mesh *m) 4.9 +{ 4.10 + m->prim = X3D_TRIANGLES; 4.11 + m->verts = 0; 4.12 + m->nverts = 0; 4.13 +} 4.14 + 4.15 +void destroy_mesh(struct mesh *m) 4.16 +{ 4.17 + free(m->verts); 4.18 +} 4.19 + 4.20 +void draw_mesh(struct mesh *m) 4.21 +{ 4.22 + x3d_vertex_array(m->nverts, m->verts); 4.23 + x3d_draw(m->prim, m->nverts); 4.24 + x3d_vertex_array(0, 0); 4.25 +}
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/src/mesh.h Mon Jun 23 06:44:04 2014 +0300 5.3 @@ -0,0 +1,19 @@ 5.4 +#ifndef MESH_H_ 5.5 +#define MESH_H_ 5.6 + 5.7 +#include <stdint.h> 5.8 +#include "x3d.h" 5.9 + 5.10 +struct mesh { 5.11 + int prim; 5.12 + 5.13 + int32_t *verts; 5.14 + int nverts; 5.15 +}; 5.16 + 5.17 +void init_mesh(struct mesh *m); 5.18 +void destroy_mesh(struct mesh *m); 5.19 + 5.20 +void draw_mesh(struct mesh *m); 5.21 + 5.22 +#endif /* MESH_H_ */
6.1 --- a/src/x3d.c Sun Jun 22 07:54:29 2014 +0300 6.2 +++ b/src/x3d.c Mon Jun 23 06:44:04 2014 +0300 6.3 @@ -1,5 +1,6 @@ 6.4 #include "config.h" 6.5 #include <string.h> 6.6 +#include <math.h> 6.7 #include "x3d.h" 6.8 #include "fixed.h" 6.9 #include "sincos.h" 6.10 @@ -20,6 +21,7 @@ 6.11 static int32_t proj_aspect = 65536; 6.12 static int32_t proj_near = ftox16(0.5); 6.13 static int32_t proj_far = 500 << 16; 6.14 +static int32_t tan_half_xfov, tan_half_yfov; 6.15 6.16 #define ID_INIT {65536, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 65536, 0} 6.17 6.18 @@ -36,12 +38,15 @@ 6.19 static int32_t im_color[3]; 6.20 static uint8_t im_color_index; 6.21 6.22 -void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz) 6.23 +void x3d_projection(int fov, int32_t aspect, int32_t nearz, int32_t farz) 6.24 { 6.25 - proj_fov = fov; 6.26 + proj_fov = (M_PI_X16 * fov) / 180; 6.27 proj_aspect = aspect; 6.28 proj_near = nearz; 6.29 proj_far = farz; 6.30 + 6.31 + tan_half_yfov = (int32_t)(tan(0.5 * proj_fov / 65536.0) * 65536.0); 6.32 + tan_half_xfov = x16mul(tan_half_yfov, aspect); 6.33 } 6.34 6.35 int x3d_push_matrix(void) 6.36 @@ -152,7 +157,7 @@ 6.37 color_count = count; 6.38 } 6.39 6.40 -int x3d_draw_arrays(int prim, int vnum) 6.41 +int x3d_draw(int prim, int vnum) 6.42 { 6.43 int i, j, pverts = prim; 6.44 const int32_t *vptr = vertex_array; 6.45 @@ -182,6 +187,11 @@ 6.46 6.47 for(j=0; j<pverts; j++) { 6.48 proc_vertex(vptr, cptr, vpos + j, col + j); 6.49 + 6.50 + if(vpos[j].z <= proj_near) { 6.51 + goto skip_prim; 6.52 + } 6.53 + 6.54 vptr += 3; 6.55 if(cptr) cptr += 3; 6.56 } 6.57 @@ -200,6 +210,19 @@ 6.58 color = RGB(cr, cg, cb); 6.59 #endif 6.60 6.61 + /* project & viewport */ 6.62 + for(j=0; j<pverts; j++) { 6.63 + int32_t x, y; 6.64 + 6.65 + x = x16mul(vpos[j].x, tan_half_xfov); 6.66 + x = x16div(x, vpos[j].z); 6.67 + vpos[j].x = (x + 65536) * (WIDTH / 2); 6.68 + 6.69 + y = x16mul(vpos[j].y, tan_half_yfov); 6.70 + y = x16div(y, vpos[j].z); 6.71 + vpos[j].y = (65536 - y) * (HEIGHT / 2); 6.72 + } 6.73 + 6.74 switch(pverts) { 6.75 case X3D_POINTS: 6.76 draw_point(vpos, color); 6.77 @@ -213,6 +236,7 @@ 6.78 draw_poly(pverts, vpos, color); 6.79 break; 6.80 } 6.81 +skip_prim: ; 6.82 } 6.83 return 0; 6.84 }
7.1 --- a/src/x3d.h Sun Jun 22 07:54:29 2014 +0300 7.2 +++ b/src/x3d.h Mon Jun 23 06:44:04 2014 +0300 7.3 @@ -10,7 +10,7 @@ 7.4 X3D_QUADS = 4 7.5 }; 7.6 7.7 -void x3d_projection(int32_t fov, int32_t aspect, int32_t nearz, int32_t farz); 7.8 +void x3d_projection(int fov, int32_t aspect, int32_t nearz, int32_t farz); 7.9 7.10 int x3d_push_matrix(void); 7.11 int x3d_pop_matrix(void); 7.12 @@ -23,7 +23,9 @@ 7.13 7.14 void x3d_vertex_array(int count, const int32_t *ptr); 7.15 void x3d_color_array(int count, const int32_t *ptr); 7.16 -int x3d_draw_arrays(int prim, int vnum); 7.17 + 7.18 +int x3d_draw(int prim, int vnum); 7.19 +int x3d_draw_indexed(int prim, int count, uint16_t *ptr); 7.20 7.21 void x3d_color_index(int cidx); 7.22 void x3d_color(int32_t r, int32_t g, int32_t b);