9#include <unordered_map>
21 BSPTree2D(
float minX,
float minY,
float maxX,
float maxY,
int maxDepth = 12,
32 bool insert(
int id,
float minX,
float minY,
float maxX,
float maxY);
36 bool update(
int id,
float minX,
float minY,
float maxX,
float maxY);
38 bool contains(
int id)
const;
40 int getCount()
const {
return static_cast<int>(items_.size()); }
43 int queryPoint(
float x,
float y);
45 int queryRect(
float minX,
float minY,
float maxX,
float maxY);
47 int queryCircle(
float cx,
float cy,
float radius);
55 float getMinX()
const {
return rootBounds_.minX; }
57 float getMinY()
const {
return rootBounds_.minY; }
59 float getMaxX()
const {
return rootBounds_.maxX; }
61 float getMaxY()
const {
return rootBounds_.maxY; }
73 std::vector<int> itemIds;
74 std::unique_ptr<Node>
left;
75 std::unique_ptr<Node>
right;
76 bool isLeaf()
const {
return left ==
nullptr; }
80 bool insertInto(Node &
node,
int id,
const AABB2 &
bounds);
82 void collect(Node &
node,
const AABB2 *rect,
float cx,
float cy,
float radius,
bool useCircle);
88 std::unique_ptr<Node> root_;
89 std::unordered_map<int, AABB2> items_;
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Binary space partition tree (kd-style AABB splits) for 2D culling. Alternating X/Y splits at node mid...
~BSPTree2D()=default
Releases tree nodes.
float getMinX() const
Root/world minimum X.
int getResultId(int index) const
Hit id at dense index from the last query*, or -1.
int getCount() const
Number of stored ids.
float getMaxY() const
Root/world maximum Y.
BSPTree2D & operator=(const BSPTree2D &)=delete
int getMaxDepth() const
Maximum subdivision depth.
float getMaxX() const
Root/world maximum X.
int getMaxPerNode() const
Item capacity before a node splits.
int getResultCount() const
Number of hits from the last query*.
BSPTree2D(const BSPTree2D &)=delete
float getMinY() const
Root/world minimum Y.
Axis-aligned 2D bounding box (min/max inclusive).