EEntityDeleted and EComponentDeleted events published by World
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef EComponentDeleted_h__
|
||||||
|
#define EComponentDeleted_h__
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "Event.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct ComponentDeleted : Event
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
std::string ComponentType;
|
||||||
|
// True if the component was deleted as a result of the entity it was attached to being deleted
|
||||||
|
bool Cascaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef EEntityDeleted_h__
|
||||||
|
#define EEntityDeleted_h__
|
||||||
|
|
||||||
|
#include "Event.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct EntityDeleted : Event
|
||||||
|
{
|
||||||
|
EntityID DeletedEntity;
|
||||||
|
// True if the entity deletion was triggered because the entity's parent was deleted before it
|
||||||
|
bool Cascaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -5,11 +5,15 @@
|
|||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "ObjectPool.h"
|
#include "ObjectPool.h"
|
||||||
#include "ComponentPool.h"
|
#include "ComponentPool.h"
|
||||||
|
#include "EventBroker.h"
|
||||||
|
|
||||||
class World
|
class World
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
World() = default;
|
World() = default;
|
||||||
|
World(EventBroker* eventBroker)
|
||||||
|
: m_EventBroker(eventBroker)
|
||||||
|
{ }
|
||||||
~World();
|
~World();
|
||||||
|
|
||||||
// Create empty entity
|
// Create empty entity
|
||||||
@@ -46,6 +50,7 @@ public:
|
|||||||
std::string GetName(EntityID entity) const;
|
std::string GetName(EntityID entity) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
EventBroker* m_EventBroker = nullptr;
|
||||||
EntityID m_CurrentEntityID = 0;
|
EntityID m_CurrentEntityID = 0;
|
||||||
|
|
||||||
std::unordered_map<EntityID, EntityID> m_EntityParents;
|
std::unordered_map<EntityID, EntityID> m_EntityParents;
|
||||||
@@ -55,6 +60,7 @@ private:
|
|||||||
std::unordered_map<EntityID, std::string> m_EntityNames;
|
std::unordered_map<EntityID, std::string> m_EntityNames;
|
||||||
|
|
||||||
EntityID generateEntityID();
|
EntityID generateEntityID();
|
||||||
|
void deleteEntityRecursive(EntityID entity, bool cascaded = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+61
-32
@@ -1,4 +1,6 @@
|
|||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
|
#include "Core/EEntityDeleted.h"
|
||||||
|
#include "Core/EComponentDeleted.h"
|
||||||
|
|
||||||
World::~World()
|
World::~World()
|
||||||
{
|
{
|
||||||
@@ -21,37 +23,7 @@ EntityID World::CreateEntity(EntityID parent /*= 0*/)
|
|||||||
|
|
||||||
void World::DeleteEntity(EntityID entity)
|
void World::DeleteEntity(EntityID entity)
|
||||||
{
|
{
|
||||||
// Delete components
|
deleteEntityRecursive(entity, false);
|
||||||
for (auto& pair : m_ComponentPools) {
|
|
||||||
auto& pool = pair.second;
|
|
||||||
if (pool->KnowsEntity(entity)) {
|
|
||||||
auto& c = pool->GetByEntity(entity);
|
|
||||||
pool->Delete(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop through children
|
|
||||||
std::vector<EntityID> childrenToDelete;
|
|
||||||
auto children = m_EntityChildren.equal_range(entity);
|
|
||||||
for (auto it = children.first; it != children.second; ++it) {
|
|
||||||
childrenToDelete.push_back(it->second);
|
|
||||||
}
|
|
||||||
for (auto& child : childrenToDelete) {
|
|
||||||
DeleteEntity(child);
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityID parent = m_EntityParents.at(entity);
|
|
||||||
m_EntityParents.erase(entity);
|
|
||||||
auto parentChildren = m_EntityChildren.equal_range(parent);
|
|
||||||
for (auto it = parentChildren.first; it != parentChildren.second; ++it) {
|
|
||||||
if (it->second == entity) {
|
|
||||||
m_EntityChildren.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Erase potential name
|
|
||||||
m_EntityNames.erase(entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::ValidEntity(EntityID entity) const
|
bool World::ValidEntity(EntityID entity) const
|
||||||
@@ -96,7 +68,15 @@ void World::DeleteComponent(EntityID entity, const std::string& componentType)
|
|||||||
{
|
{
|
||||||
ComponentPool* pool = m_ComponentPools.at(componentType);
|
ComponentPool* pool = m_ComponentPools.at(componentType);
|
||||||
ComponentWrapper c = pool->GetByEntity(entity);
|
ComponentWrapper c = pool->GetByEntity(entity);
|
||||||
return pool->Delete(c);
|
pool->Delete(c);
|
||||||
|
|
||||||
|
if (m_EventBroker != nullptr) {
|
||||||
|
Events::ComponentDeleted e;
|
||||||
|
e.Entity = entity;
|
||||||
|
e.ComponentType = componentType;
|
||||||
|
e.Cascaded = false;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const ComponentPool* World::GetComponents(const std::string& componentType)
|
const ComponentPool* World::GetComponents(const std::string& componentType)
|
||||||
@@ -155,3 +135,52 @@ EntityID World::generateEntityID()
|
|||||||
return m_CurrentEntityID++;
|
return m_CurrentEntityID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::deleteEntityRecursive(EntityID entity, bool cascaded /*= false*/)
|
||||||
|
{
|
||||||
|
if (m_EventBroker != nullptr) {
|
||||||
|
Events::EntityDeleted e;
|
||||||
|
e.DeletedEntity = entity;
|
||||||
|
e.Cascaded = cascaded;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete components
|
||||||
|
for (auto& pair : m_ComponentPools) {
|
||||||
|
auto& pool = pair.second;
|
||||||
|
if (pool->KnowsEntity(entity)) {
|
||||||
|
auto& c = pool->GetByEntity(entity);
|
||||||
|
pool->Delete(c);
|
||||||
|
if (m_EventBroker != nullptr) {
|
||||||
|
Events::ComponentDeleted e;
|
||||||
|
e.Entity = entity;
|
||||||
|
e.ComponentType = pair.first;
|
||||||
|
e.Cascaded = true;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through children
|
||||||
|
std::vector<EntityID> childrenToDelete;
|
||||||
|
auto children = m_EntityChildren.equal_range(entity);
|
||||||
|
for (auto it = children.first; it != children.second; ++it) {
|
||||||
|
childrenToDelete.push_back(it->second);
|
||||||
|
}
|
||||||
|
for (auto& child : childrenToDelete) {
|
||||||
|
deleteEntityRecursive(child, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityID parent = m_EntityParents.at(entity);
|
||||||
|
m_EntityParents.erase(entity);
|
||||||
|
auto parentChildren = m_EntityChildren.equal_range(parent);
|
||||||
|
for (auto it = parentChildren.first; it != parentChildren.second; ++it) {
|
||||||
|
if (it->second == entity) {
|
||||||
|
m_EntityChildren.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erase potential name
|
||||||
|
m_EntityNames.erase(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ Game::Game(int argc, char* argv[])
|
|||||||
m_FrameStack->Height = m_Renderer->Resolution().Height;
|
m_FrameStack->Height = m_Renderer->Resolution().Height;
|
||||||
|
|
||||||
// Create a world
|
// Create a world
|
||||||
m_World = new World();
|
m_World = new World(m_EventBroker);
|
||||||
std::string mapToLoad = m_Config->Get<std::string>("Debug.LoadMap", "");
|
std::string mapToLoad = m_Config->Get<std::string>("Debug.LoadMap", "");
|
||||||
if (!mapToLoad.empty()) {
|
if (!mapToLoad.empty()) {
|
||||||
auto file = ResourceManager::Load<EntityFile>(mapToLoad);
|
auto file = ResourceManager::Load<EntityFile>(mapToLoad);
|
||||||
|
|||||||
Reference in New Issue
Block a user