X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosrtxon;a=blobdiff_plain;f=src%2Fparts%2Frtxonoff.c;h=0f44854001262a995cd65c664d285ead66974806;hp=4c5f35e1ea420e6f07a40b03a094c5208fe7afcc;hb=ac1dd983cb211904ca6c74ca28ceb5e83aa09527;hpb=4621a049a4889c5a6845a08e9c0a4d6634ab8556 diff --git a/src/parts/rtxonoff.c b/src/parts/rtxonoff.c index 4c5f35e..0f44854 100644 --- a/src/parts/rtxonoff.c +++ b/src/parts/rtxonoff.c @@ -9,27 +9,33 @@ #include "imago2.h" #include "gfxutil.h" #include "mesh.h" +#include "bsptree.h" static int init(void); static void destroy(void); static void start(long trans_time); static void draw(void); +static void keypress(int key); static struct screen scr = { "rtxonoff", init, destroy, start, 0, - draw + draw, + keypress }; static float cam_theta = -29, cam_phi = 35; -static float cam_dist = 6; +static float cam_dist = 10; + +static int use_bsp = 1; static const char *car_fname[2] = {"data/ldiablo.obj", 0}; static const char *cartex_fname[2] = {"data/ldiablo.png", 0}; static struct g3d_mesh mesh_car[2]; static struct pimage tex_car[2]; +static struct bsptree bsp_car[2]; struct screen *rtxonoff_screen(void) { @@ -45,6 +51,7 @@ static int init(void) if(!(tex_car[i].pixels = img_load_pixels(cartex_fname[i], &tex_car[i].width, &tex_car[i].height, IMG_FMT_RGB24))) { fprintf(stderr, "failed to load car texture: %s\n", cartex_fname[i]); + return -1; } convimg_rgb24_rgb16(tex_car[i].pixels, (unsigned char*)tex_car[i].pixels, tex_car[i].width, tex_car[i].height); @@ -53,6 +60,13 @@ static int init(void) if(load_mesh(&mesh_car[i], car_fname[i]) == -1) { return -1; } + + init_bsp(&bsp_car[i]); + if(bsp_add_mesh(&bsp_car[i], &mesh_car[i]) == -1) { + fprintf(stderr, "failed to construct BSP tree %d\n", i); + return -1; + } + bsp_build(&bsp_car[i]); } } return 0; @@ -60,6 +74,13 @@ static int init(void) static void destroy(void) { + int i; + + for(i=0; i<2; i++) { + free(mesh_car[i].varr); + free(mesh_car[i].iarr); + destroy_bsp(&bsp_car[i]); + } } static void start(long trans_time) @@ -81,6 +102,7 @@ static void update(void) static void draw(void) { int i; + static float vdir[3]; float t = (float)time_msec / 16.0f; update(); @@ -93,16 +115,38 @@ static void draw(void) g3d_rotate(cam_phi, 1, 0, 0); g3d_rotate(cam_theta, 0, 1, 0); + if(use_bsp) { + const float *mat = g3d_get_matrix(G3D_MODELVIEW, 0); + /* transform (0, 0, -1) with transpose(mat3x3) */ + vdir[0] = -mat[2]; + vdir[1] = -mat[6]; + vdir[2] = -mat[10]; + } + g3d_polygon_mode(G3D_TEX_GOURAUD); for(i=0; i