return 0;
}
-void bsp_add_mesh(struct bsptree *bsp, struct g3d_mesh *m)
+int bsp_add_mesh(struct bsptree *bsp, struct g3d_mesh *m)
{
int i, j, nfaces;
struct g3d_vertex v[4];
v[j] = *vptr++;
}
}
- bsp_add_poly(bsp, v, m->prim);
+ if(bsp_add_poly(bsp, v, m->prim) == -1) {
+ return -1;
+ }
}
+ return 0;
}
void draw_bsp(struct bsptree *bsp, float view_x, float view_y, float view_z)
clipped = alloca((vnum + 1) * sizeof *clipped);
clipres = clip_poly(clipped, &clipped_vnum, v, vnum, &n->plane);
- if(clipres > 0) { /* polygon completely in the positive subspace */
+ if(clipres > 0) {
+ /* polygon completely in the positive subspace */
if(!(nres = add_poly_tree(n->front, v, vnum))) {
return 0;
}
n->front = nres;
- }
- if(clipres < 0) { /* polygon completely in the negative subspace */
+
+ } else if(clipres < 0) {
+ /* polygon completely in the negative subspace */
if(!(nres = add_poly_tree(n->back, v, vnum))) {
return 0;
}
n->back = nres;
- }
- /* polygon is straddling the plane */
- if(!(nres = add_poly_tree(n->front, clipped, clipped_vnum))) {
- return 0;
- }
- n->front = nres;
+ } else {
+ /* polygon is straddling the plane */
+ if(!(nres = add_poly_tree(n->front, clipped, clipped_vnum))) {
+ return 0;
+ }
+ n->front = nres;
- negplane.x = n->plane.x;
- negplane.y = n->plane.y;
- negplane.z = n->plane.z;
- negplane.nx = -n->plane.nx;
- negplane.ny = -n->plane.ny;
- negplane.nz = -n->plane.nz;
+ negplane.x = n->plane.x;
+ negplane.y = n->plane.y;
+ negplane.z = n->plane.z;
+ negplane.nx = -n->plane.nx;
+ negplane.ny = -n->plane.ny;
+ negplane.nz = -n->plane.nz;
- clipres = clip_poly(clipped, &clipped_vnum, v, vnum, &negplane);
- assert(clipres == 0);
+ clipres = clip_poly(clipped, &clipped_vnum, v, vnum, &negplane);
+ /*assert(clipres == 0);*/
- if(!(nres = add_poly_tree(n->back, clipped, clipped_vnum))) {
- return 0;
+ if(!(nres = add_poly_tree(n->back, clipped, clipped_vnum))) {
+ return 0;
+ }
+ n->back = nres;
}
- n->back = nres;
return n;
}
#include "polyfill.h" /* just for struct pimage */
#include "cfgopt.h"
#include "mesh.h"
+#include "bsptree.h"
static int init(void);
static void destroy(void);
static float cam_theta, cam_phi = 25;
static float cam_dist = 3;
static struct g3d_mesh cube, torus;
+static struct bsptree torus_bsp;
static struct pimage tex;
torus.varr[i].v *= 2.0;
}
+ init_bsp(&torus_bsp);
+ if(bsp_add_mesh(&torus_bsp, &torus) == -1) {
+ fprintf(stderr, "failed to construct torus BSP tree\n");
+ return -1;
+ }
+
gen_texture(&tex, 128, 128);
#ifdef DEBUG_POLYFILL
free(cube.varr);
free(torus.varr);
free(torus.iarr);
+ destroy_bsp(&torus_bsp);
}
static void start(long trans_time)
g3d_set_texture(tex.width, tex.height, tex.pixels);
draw_mesh(&torus);
+ /*draw_bsp(&torus_bsp);*/
/*draw_mesh(&cube);*/
swap_buffers(fb_pixels);