I need to go deeper
[dosdemo] / src / bsptree.c
index e9353d1..334e530 100644 (file)
@@ -18,6 +18,7 @@ static void free_tree(struct bspnode *n);
 
 static struct bspnode *new_node(struct g3d_vertex *v, int vnum);
 static struct bspnode *add_poly_tree(struct bspnode *n, struct g3d_vertex *v, int vnum);
+static void draw_bsp_tree(struct bspnode *n, const vec3_t *vdir);
 
 static void save_bsp_tree(struct bspnode *n, FILE *fp);
 static struct bspnode *load_bsp_tree(FILE *fp);
@@ -118,6 +119,11 @@ int bsp_add_mesh(struct bsptree *bsp, struct g3d_mesh *m)
 
 void draw_bsp(struct bsptree *bsp, float view_x, float view_y, float view_z)
 {
+       vec3_t vdir;
+       vdir.x = view_x;
+       vdir.y = view_y;
+       vdir.z = view_z;
+       draw_bsp_tree(bsp->root, &vdir);
 }
 
 static int count_nodes(struct bspnode *n)
@@ -233,6 +239,42 @@ static struct bspnode *add_poly_tree(struct bspnode *n, struct g3d_vertex *v, in
        return n;
 }
 
+void debug_draw_poly(struct g3d_vertex *varr, int vcount)
+{
+       int i, nfaces = vcount - 2;
+       int vbuf_size = nfaces * 3;
+       struct g3d_vertex *vbuf = alloca(vbuf_size * sizeof *vbuf);
+       struct g3d_vertex *vptr = varr + 1;
+
+       for(i=0; i<nfaces; i++) {
+               vbuf[i * 3] = varr[0];
+               vbuf[i * 3 + 1] = *vptr++;
+               vbuf[i * 3 + 2] = *vptr;
+       }
+
+       g3d_draw_indexed(G3D_TRIANGLES, vbuf, vbuf_size, 0, 0);
+}
+
+static void draw_bsp_tree(struct bspnode *n, const vec3_t *vdir)
+{
+       float dot;
+
+       if(!n) return;
+
+       dot = vdir->x * n->plane.nx + vdir->y * n->plane.ny + vdir->z * n->plane.nz;
+       if(dot >= 0.0f) {
+               draw_bsp_tree(n->front, vdir);
+               //g3d_draw_indexed(n->vcount, n->verts, n->vcount, 0, 0);
+               debug_draw_poly(n->verts, n->vcount);
+               draw_bsp_tree(n->back, vdir);
+       } else {
+               draw_bsp_tree(n->back, vdir);
+               //g3d_draw_indexed(n->vcount, n->verts, n->vcount, 0, 0);
+               debug_draw_poly(n->verts, n->vcount);
+               draw_bsp_tree(n->front, vdir);
+       }
+}
+
 static void save_bsp_tree(struct bspnode *n, FILE *fp)
 {
        /* TODO */