BSP tree test
[dosrtxon] / src / parts / rtxonoff.c
index 4c5f35e..0f44854 100644 (file)
@@ -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<sizeof mesh_car / sizeof mesh_car[0]; i++) {
                if(mesh_car[i].varr) {
                        g3d_set_texture(tex_car[i].width, tex_car[i].height, tex_car[i].pixels);
 
-                       zsort_mesh(&mesh_car[i]);
-                       draw_mesh(&mesh_car[i]);
+                       if(use_bsp) {
+                               draw_bsp(&bsp_car[i], vdir[0], vdir[1], vdir[2]);
+                       } else {
+                               zsort_mesh(&mesh_car[i]);
+                               draw_mesh(&mesh_car[i]);
+                       }
                }
        }
 
        swap_buffers(fb_pixels);
 }
+
+static void keypress(int key)
+{
+       switch(key) {
+       case 'b':
+               use_bsp = !use_bsp;
+               printf("drawing with %s\n", use_bsp ? "BSP tree" : "z-sorting");
+               break;
+       }
+}