bool getentboundingbox(const extentity &e, ivec &o, ivec &r) { switch(e.type) { case ET_EMPTY: return false; case ET_DECAL: { DecalSlot &s = lookupdecalslot(e.attr[0], false); vec center, radius; decalboundbox(e, s, center, radius); center.add(e.o); radius.max(entselradius); o = vec(center).sub(radius); r = vec(center).add(radius).add(1); break; } case ET_MAPMODEL: if(model *m = entities::getmodel(e)) { vec center, radius; mmboundbox(e, m, center, radius); center.add(e.o); radius.max(entselradius); o = vec(center).sub(radius); r = vec(center).add(radius).add(1); break; } case ET_OBSTACLE: /* OF */ { int a = e.attr[3], b = e.attr[4], c = e.attr[5]; if (!a || !b || !c) { o = vec(e.o).sub(entselradius); r = vec(e.o).add(entselradius+1); break; } vec center = vec(0, 0, 0), radius = vec(a, b, c); rotatebb(center, radius, e.attr[0], e.attr[1], e.attr[2]); center.add(e.o); radius.max(entselradius); o = vec(center).sub(radius); r = vec(center).add(radius).add(1); break; } // invisible mapmodels use entselradius default: o = vec(e.o).sub(entselradius); r = vec(e.o).add(entselradius+1); break; } return true; }
bool getentboundingbox(const extentity &e, ivec &o, ivec &r) { switch(e.type) { case ET_EMPTY: return false; case ET_DECAL: { DecalSlot &s = lookupdecalslot(e.attr1, false); vec center, radius; decalboundbox(e, s, center, radius); center.add(e.o); radius.max(entselradius); o = vec(center).sub(radius); r = vec(center).add(radius).add(1); break; } case ET_MAPMODEL: if(model *m = loadmapmodel(e.attr1)) { vec center, radius; mmboundbox(e, m, center, radius); center.add(e.o); radius.max(entselradius); o = vec(center).sub(radius); r = vec(center).add(radius).add(1); break; } // invisible mapmodels use entselradius default: o = vec(e.o).sub(entselradius); r = vec(e.o).add(entselradius+1); break; } return true; }