Extra2D/Easy2D/include/easy2d/spatial/spatial_manager.h

62 lines
1.7 KiB
C++

#pragma once
#include <easy2d/spatial/spatial_index.h>
#include <memory>
#include <functional>
namespace easy2d {
class SpatialManager {
public:
using QueryCallback = std::function<bool(Node*)>;
SpatialManager();
explicit SpatialManager(const Rect& worldBounds);
~SpatialManager() = default;
void setStrategy(SpatialStrategy strategy);
void setAutoThresholds(size_t quadTreeThreshold, size_t hashThreshold);
void setWorldBounds(const Rect& bounds);
Rect getWorldBounds() const { return worldBounds_; }
void insert(Node* node, const Rect& bounds);
void remove(Node* node);
void update(Node* node, const Rect& newBounds);
std::vector<Node*> query(const Rect& area) const;
std::vector<Node*> query(const Vec2& point) const;
std::vector<std::pair<Node*, Node*>> queryCollisions() const;
void query(const Rect& area, const QueryCallback& callback) const;
void query(const Vec2& point, const QueryCallback& callback) const;
void clear();
size_t size() const;
bool empty() const;
void rebuild();
void optimize();
SpatialStrategy getCurrentStrategy() const;
const char* getStrategyName() const;
static std::unique_ptr<ISpatialIndex> createIndex(SpatialStrategy strategy, const Rect& bounds);
private:
void selectOptimalStrategy();
SpatialStrategy currentStrategy_ = SpatialStrategy::Auto;
SpatialStrategy activeStrategy_ = SpatialStrategy::QuadTree;
std::unique_ptr<ISpatialIndex> index_;
Rect worldBounds_;
size_t quadTreeThreshold_ = 1000;
size_t hashThreshold_ = 5000;
mutable size_t queryCount_ = 0;
mutable size_t totalQueryTime_ = 0;
};
}