static void addface( /* add a face to a cube */ register CUBE *cu, OBJECT obj ) { if (o_face(objptr(obj), cu) == O_MISS) return; if (istree(cu->cutree)) { CUBE cukid; /* do children */ int i, j; cukid.cusize = cu->cusize * 0.5; for (i = 0; i < 8; i++) { cukid.cutree = octkid(cu->cutree, i); for (j = 0; j < 3; j++) { cukid.cuorg[j] = cu->cuorg[j]; if ((1<<j) & i) cukid.cuorg[j] += cukid.cusize; } addface(&cukid, obj); octkid(cu->cutree, i) = cukid.cutree; } return; } if (isempty(cu->cutree)) { OBJECT oset[2]; /* singular set */ oset[0] = 1; oset[1] = obj; cu->cutree = fullnode(oset); return; } /* add to full node */ add2full(cu, obj); }
static void addobject( /* add an object to a cube */ register CUBE *cu, OBJECT obj ) { int inc; inc = (*ofun[objptr(obj)->otype].funp)(objptr(obj), cu); if (inc == O_MISS) return; /* no intersection */ if (istree(cu->cutree)) { CUBE cukid; /* do children */ int i, j; cukid.cusize = cu->cusize * 0.5; for (i = 0; i < 8; i++) { cukid.cutree = octkid(cu->cutree, i); for (j = 0; j < 3; j++) { cukid.cuorg[j] = cu->cuorg[j]; if ((1<<j) & i) cukid.cuorg[j] += cukid.cusize; } addobject(&cukid, obj); octkid(cu->cutree, i) = cukid.cutree; } return; } if (isempty(cu->cutree)) { OBJECT oset[2]; /* singular set */ oset[0] = 1; oset[1] = obj; cu->cutree = fullnode(oset); return; } /* add to full node */ add2full(cu, obj, inc); }