reflection
[dosrtxon] / src / parts / rtxonoff.c
index 0f44854..bab4d98 100644 (file)
@@ -9,7 +9,6 @@
 #include "imago2.h"
 #include "gfxutil.h"
 #include "mesh.h"
-#include "bsptree.h"
 
 static int init(void);
 static void destroy(void);
@@ -29,13 +28,14 @@ static struct screen scr = {
 static float cam_theta = -29, cam_phi = 35;
 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];
+
+static int shading = G3D_TEX_GOURAUD;
+static int do_clip = 1;
+
 
 struct screen *rtxonoff_screen(void)
 {
@@ -60,13 +60,6 @@ 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;
@@ -79,7 +72,6 @@ static void destroy(void)
        for(i=0; i<2; i++) {
                free(mesh_car[i].varr);
                free(mesh_car[i].iarr);
-               destroy_bsp(&bsp_car[i]);
        }
 }
 
@@ -92,6 +84,8 @@ static void start(long trans_time)
        g3d_enable(G3D_CULL_FACE);
        g3d_enable(G3D_LIGHTING);
        g3d_enable(G3D_LIGHT0);
+
+       g3d_polygon_mode(shading);
 }
 
 static void update(void)
@@ -115,38 +109,50 @@ 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_set_texture(tex_car[0].width, tex_car[0].height, tex_car[0].pixels);
+       zsort_mesh(&mesh_car[0]);
 
-       g3d_polygon_mode(G3D_TEX_GOURAUD);
+       g3d_light_color(0, 0.3, 0.3, 0.3);
+       g3d_push_matrix();
+       g3d_scale(1, -1, 1);
+       g3d_front_face(G3D_CW);
+       draw_mesh(&mesh_car[0]);
+       g3d_front_face(G3D_CCW);
+       g3d_pop_matrix();
 
-       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);
-
-                       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]);
-                       }
-               }
-       }
+       g3d_light_color(0, 1, 1, 1);
+       draw_mesh(&mesh_car[0]);
 
        swap_buffers(fb_pixels);
 }
 
 static void keypress(int key)
 {
+       static int lighting = 1;
+       static int clipping = 1;
+
        switch(key) {
-       case 'b':
-               use_bsp = !use_bsp;
-               printf("drawing with %s\n", use_bsp ? "BSP tree" : "z-sorting");
+       case ' ':
+               shading = (shading + 1) % 5;
+               g3d_polygon_mode(shading);
+               break;
+
+       case 'l':
+               lighting = !lighting;
+               if(lighting) {
+                       g3d_enable(G3D_LIGHTING);
+               } else {
+                       g3d_disable(G3D_LIGHTING);
+               }
+               break;
+
+       case 'c':
+               clipping = !clipping;
+               if(clipping) {
+                       g3d_enable(G3D_CLIP_FRUSTUM);
+               } else {
+                       g3d_disable(G3D_CLIP_FRUSTUM);
+               }
                break;
        }
 }