7 #include <unordered_map>
8 #include <unordered_set>
28 using std::unordered_map;
29 using std::unordered_set;
46 std::size_t
operator()(
const tuple<int32_t, int32_t, int32_t>& k)
const {
47 std::hash<uint64_t> hashVal;
48 return hashVal(get<0>(k) ^ get<1>(k) ^ get<2>(k));
91 void reset()
override;
109 tuple<int32_t, int32_t, int32_t> key = { x, y, z };
111 auto storedNode = storedNodeIt != parent->
subNodesByCoordinate.end()?storedNodeIt->second:
nullptr;
114 if (storedNode ==
nullptr) {
128 x * partitionSize + partitionSize,
129 y * partitionSize + partitionSize,
130 z * partitionSize + partitionSize
135 storedNode = &parent->
subNodes.back();
145 auto minXPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMin().getX() - x * partitionSize) / (partitionSize / 2.0f)));
146 auto minYPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMin().getY() - y * partitionSize) / (partitionSize / 2.0f)));
147 auto minZPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMin().getZ() - z * partitionSize) / (partitionSize / 2.0f)));
148 auto maxXPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMax().getX() - x * partitionSize) / (partitionSize / 2.0f)));
149 auto maxYPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMax().getY() - y * partitionSize) / (partitionSize / 2.0f)));
150 auto maxZPartition =
static_cast<int32_t
>((Math::floor(boundingBox->getMax().getZ() - z * partitionSize) / (partitionSize / 2.0f)));
151 minXPartition = Math::clamp(minXPartition, 0, 1);
152 minYPartition = Math::clamp(minYPartition, 0, 1);
153 minZPartition = Math::clamp(minZPartition, 0, 1);
154 maxXPartition = Math::clamp(maxXPartition, 0, 1);
155 maxYPartition = Math::clamp(maxYPartition, 0, 1);
156 maxZPartition = Math::clamp(maxZPartition, 0, 1);
157 for (
auto yPartition = minYPartition; yPartition <= maxYPartition; yPartition++)
158 for (
auto xPartition = minXPartition; xPartition <= maxXPartition; xPartition++)
159 for (
auto zPartition = minZPartition; zPartition <= maxZPartition; zPartition++) {
162 static_cast<int32_t
>((x * partitionSize) / (partitionSize / 2.0f) + xPartition),
163 static_cast<int32_t
>((y * partitionSize) / (partitionSize / 2.0f) + yPartition),
164 static_cast<int32_t
>((z * partitionSize) / (partitionSize / 2.0f) + zPartition),
165 partitionSize / 2.0f, entity
169 storedNode->partitionEntities.push_back(entity);
184 for (
auto& subNode: node->
subNodes) {
200 Console::println(
"OctTreePartition::removePartitionNode(): partition has objects attached!!!");
204 for (
auto& subNode: node->
subNodes) {
226 for (
auto& subNode: node->
subNodes) {
238 if (frustum->
isVisible(entity->getWorldBoundingBox()) ==
false)
continue;
241 auto uniquePartitionId = entity->getUniquePartitionId();
261 void dumpNode(PartitionTreeNode* node,
int indent);
virtual BoundingBox * getWorldBoundingBox()=0
static constexpr int UNIQUEPARTITIONID_NONE
int getUniquePartitionId()
bool isVisible(const Vector3 &vertex)
Checks if given vertex is in frustum.
Oct tree partition implementation.
unordered_map< Entity *, vector< PartitionTreeNode * > > entityPartitionNodes
bool isPartitionNodeEmpty(PartitionTreeNode *node)
Is partition empty.
void removeEntity(Entity *entity) override
Removes a entity.
void dumpNode(PartitionTreeNode *node, int indent)
Dump node to console.
const vector< Entity * > & getVisibleEntities(Frustum *frustum) override
Get visible entities.
vector< int > freeEntityUniquePartitionIds
PartitionTreeNode treeRoot
unordered_map< Entity *, int > entityUniquePartitionIdMapping
void removePartitionNode(PartitionTreeNode *node)
Remove partition node, should be empty.
void updateEntity(Entity *entity) override
Updates a entity.
static constexpr float PARTITION_SIZE_MIN
void addEntity(Entity *entity) override
Adds a entity.
void dump()
Dump oct tree to console.
bitset< 1024 *512 > visibleEntitiesBitSet
void updatePartitionTree(PartitionTreeNode *parent, int32_t x, int32_t y, int32_t z, float partitionSize, Entity *entity)
Update partition tree.
int32_t doPartitionTreeLookUpVisibleObjects(Frustum *frustum, PartitionTreeNode *node)
Do partition tree lookup.
void findEntity(PartitionTreeNode *node, Entity *entity)
Find entity.
static constexpr float PARTITION_SIZE_MAX
bool isVisibleEntity(Entity *entity) override
Check if entity is visible.
void reset() override
Reset.
OctTreePartition()
Public constructor.
vector< Entity * > visibleEntities
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
void update()
Updates this bounding box.
Vector3 & set(float x, float y, float z)
Sets this vector3 by its components.
std::size_t operator()(const tuple< int32_t, int32_t, int32_t > &k) const
list< PartitionTreeNode > subNodes
unordered_map< tuple< int32_t, int32_t, int32_t >, PartitionTreeNode *, PartitionTreeNodeId_Hash > subNodesByCoordinate
PartitionTreeNode * parent
vector< Entity * > partitionEntities
#define FORBID_CLASS_COPY(CLASS)