#include #include "oct.h" #include "entity.h" octant world(0, 0); octant::octant (octant *parent, int subindex) : parent(parent) { for (fill = 8; fill--; ) sub[fill] = 0; if (parent) { extent = (parent->extent + 1) >> 1; orig = parent->orig; orig.offset (subindex, extent); } else { extent = MAXEXTENT; orig.x = orig.y = orig.z = SOFFS_MIN; } } octant::~octant () { for (fill = 8; fill--; ) delete sub[fill]; } static bool overlap (const sector &o1, uoffs ea, const sector &o2, const box &bbox) { sector a2; ea /= 2; a2.x = o1.x + ea; a2.y = o1.y + ea; a2.z = o1.z + ea; sector b2; sector eb; b2.x = o2.x + (soffs)bbox.a.x; b2.y = o2.y + (soffs)bbox.a.y; b2.z = o2.z + (soffs)bbox.a.z; eb.x = (soffs)(bbox.b.x - bbox.a.x) / 2; eb.y = (soffs)(bbox.b.y - bbox.a.y) / 2; eb.z = (soffs)(bbox.b.z - bbox.a.z) / 2; b2.x += eb.x; b2.y += eb.y; b2.z += eb.z; return abs (a2.x - b2.x) <= ea + eb.x && abs (a2.y - b2.y) <= ea + eb.y && abs (a2.z - b2.z) <= ea + eb.z; } void octant::add (entity_base *e) { printf ("OCTANT %d,%d,%d+%d\n", orig.x, orig.y, orig.z, extent); if (overlap (orig, extent, e->orig, e->bbox)) { printf ("overlap, add\n"); push_back (e); e->o.push_back (this); #if 0 uoffs extent2 = extent / 2; for (int si = 8; i--; ) { e->orig sub = orig; sub.offset (si, extent2); if (overlap (sub, extent2, e->orig, e->bbox)) { } #endif } else printf ("no overlap\n"); } void octant::remove (entity_base *e) { } void octant::draw (draw_context &ctx) { for (iterator i = end (); i-- != begin (); ) (*i)->display (ctx); }