Serialization : started to unify how to allocate entity whether its from MakeEntity or during deserialization.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include <Core/Common/EnumUtils.h>
|
||||
#include <Data/World.h>
|
||||
#include <Entity/Entity.h>
|
||||
#include <Entity/entity_types.h>
|
||||
#include <game.h>
|
||||
#include <Graphics/MeshRenderer.h>
|
||||
|
||||
@@ -43,16 +44,16 @@ EntityManager& GetEntityManager()
|
||||
return *entityManager;
|
||||
}
|
||||
|
||||
entity_template* RegisterEntity(EntityManager& manager, Entity* base, DerivedType entity)
|
||||
EntityTemplate* RegisterEntity(EntityManager& manager, Entity* base, DerivedType entity)
|
||||
{
|
||||
base->ID = EntityManager::ID++;
|
||||
base->derived = entity;
|
||||
|
||||
manager.Entities.PushBack(*base);
|
||||
|
||||
auto* ptr = (entity_template*)ArenaPushSize(manager.by_type[base->derived_kind->kind].arena,
|
||||
base->derived_kind->size_of, base->derived_kind->alignment,
|
||||
false JULIET_DEBUG_PARAM(kEntity_type_names[base->derived_kind->kind]));
|
||||
auto* ptr = (EntityTemplate*)ArenaPushSize(manager.by_type[base->derived_kind->kind].arena,
|
||||
base->derived_kind->size_of, base->derived_kind->alignment,
|
||||
false JULIET_DEBUG_PARAM(kEntity_type_names[base->derived_kind->kind]));
|
||||
MemCopy(ptr, entity, base->derived_kind->size_of);
|
||||
manager.by_type[base->derived_kind->kind].count += 1;
|
||||
|
||||
@@ -66,6 +67,42 @@ entity_template* RegisterEntity(EntityManager& manager, Entity* base, DerivedTyp
|
||||
return ptr;
|
||||
}
|
||||
|
||||
Entity* allocate_entity(EntityManager& manager, NonNullPtr<Class> derived_type_class)
|
||||
{
|
||||
Assert(derived_type_class->kind < ENTITY(Count));
|
||||
Assert(derived_type_class->size_of >= sizeof(EntityTemplate));
|
||||
Assert(derived_type_class->alignment > 0);
|
||||
Assert(derived_type_class->initialize_fct);
|
||||
|
||||
Entity base_template = {};
|
||||
base_template.derived_kind = derived_type_class;
|
||||
|
||||
manager.Entities.PushBack(base_template);
|
||||
Entity* base_ptr = manager.Entities.Back();
|
||||
Assert(base_ptr);
|
||||
|
||||
typed_entity_array& typed_array = manager.by_type[derived_type_class->kind];
|
||||
Assert(typed_array.arena);
|
||||
|
||||
void* derived = ArenaPushSize(typed_array.arena, derived_type_class->size_of, derived_type_class->alignment,
|
||||
false JULIET_DEBUG_PARAM(kEntity_type_names[derived_type_class->kind]));
|
||||
Assert(derived);
|
||||
derived_type_class->initialize_fct(derived);
|
||||
|
||||
auto* derived_template = (EntityTemplate*)derived;
|
||||
|
||||
base_ptr->derived = derived;
|
||||
derived_template->base = base_ptr;
|
||||
|
||||
if (typed_array.array == nullptr)
|
||||
{
|
||||
typed_array.array = derived_template;
|
||||
}
|
||||
typed_array.count += 1;
|
||||
|
||||
return base_ptr;
|
||||
}
|
||||
|
||||
void UpdateEntityManager(EntityManager& manager)
|
||||
{
|
||||
// Todo : inert by definition dont move, but this is for test
|
||||
|
||||
Reference in New Issue
Block a user