}
cmesh_bsphere(frac->mesh, 0, &bsize);
- bsize *= 2;
+ bsize *= 8;
num = dynarr_size(frac->cells);
for(i=0; i<num; i++) {
if(i == cellidx) continue;
- midplane(&plane, &cell->pt, &frac->cells[i].pt);
- plane_poly(&plane, &poly, bsize);
- if(!(pptr = dynarr_push(polys, &poly))) {
- return -1;
+ midplane(&plane, &frac->cells[i].pt, &cell->pt, frac->cell_gap);
+ if(plane_sdist(&plane, &cell->pt) > 0.0f) {
+ plane_poly(&plane, &poly, bsize);
+ if(!(pptr = dynarr_push(polys, &poly))) {
+ return -1;
+ }
+ polys = pptr;
}
- polys = pptr;
}
num = dynarr_size(polys);
static int mesh_poly(struct poly *poly, const struct cmesh *mesh, int faceidx)
{
int i, vsz, nsz, uvsz;
- struct vertex vert, *tmpvert;
+ struct vertex *tmpvert, vert = {0};
const float *varr, *narr, *uvarr;
unsigned int vidx;
vert.pos.x = varr[vidx * vsz];
vert.pos.y = varr[vidx * vsz + 1];
vert.pos.z = varr[vidx * vsz + 2];
- vert.norm.x = narr[vidx * nsz];
- vert.norm.y = narr[vidx * nsz + 1];
- vert.norm.z = narr[vidx * nsz + 2];
- vert.uv.x = uvarr[vidx * uvsz];
- vert.uv.y = uvarr[vidx * uvsz + 1];
+ if(narr) {
+ vert.norm.x = narr[vidx * nsz];
+ vert.norm.y = narr[vidx * nsz + 1];
+ vert.norm.z = narr[vidx * nsz + 2];
+ }
+ if(uvarr) {
+ vert.uv.x = uvarr[vidx * uvsz];
+ vert.uv.y = uvarr[vidx * uvsz + 1];
+ }
if(!(tmpvert = dynarr_push(poly->verts, &vert))) {
destroy_poly(poly);
cplanes = alloca(cell->num_polys * sizeof *cplanes);
for(i=0; i<cell->num_polys; i++) {
poly_plane(cell->polys + i, cplanes + i);
+ /* flip the plane normal towards the inside of the cell, to clip everything
+ * outside the cell
+ */
+ cgm_vcons(&cplanes[i].norm, -cplanes[i].norm.x, -cplanes[i].norm.y, -cplanes[i].norm.z);
}
nfaces = cmesh_poly_count(orig);
if((clipres = clip_poly(&wallclipped, cell->polys + j, &plane)) < 0) {
/* mark for deletion */
delwall[j] = 1;
+ destroy_poly(&wallclipped);
} else if(clipres == 0) {
destroy_poly(cell->polys + j);
cell->polys[j] = wallclipped;