void Octant::GetDrawablesOnlyInternal(RayOctreeQuery& query, PODVector<Drawable*>& drawables) const { float octantDist = query.ray_.HitDistance(cullingBox_); if (octantDist >= query.maxDistance_) return; if (drawables_.Size()) { Drawable** start = const_cast<Drawable**>(&drawables_[0]); Drawable** end = start + drawables_.Size(); while (start != end) { Drawable* drawable = *start++; if ((drawable->GetDrawableFlags() & query.drawableFlags_) && (drawable->GetViewMask() & query.viewMask_)) drawables.Push(drawable); } } for (unsigned i = 0; i < NUM_OCTANTS; ++i) { if (children_[i]) children_[i]->GetDrawablesOnlyInternal(query, drawables); } }
void Octant::GetDrawablesInternal(RayOctreeQuery& query) const { float octantDist = query.ray_.HitDistance(cullingBox_); if (octantDist >= query.maxDistance_) return; if (drawables_.Size()) { auto** start = const_cast<Drawable**>(&drawables_[0]); Drawable** end = start + drawables_.Size(); while (start != end) { Drawable* drawable = *start++; if ((drawable->GetDrawableFlags() & query.drawableFlags_) && (drawable->GetViewMask() & query.viewMask_)) drawable->ProcessRayQuery(query, query.result_); } } for (auto child : children_) { if (child) child->GetDrawablesInternal(query); } }
void BoxOctreeQuery::TestDrawables(Drawable** start, Drawable** end, bool inside) { while (start != end) { Drawable* drawable = *start++; if ((drawable->GetDrawableFlags() & drawableFlags_) && (drawable->GetViewMask() & viewMask_)) { if (inside || box_.IsInsideFast(drawable->GetWorldBoundingBox())) result_.Push(drawable); } } }