#pragma once #include #include struct World; struct EntityTemplate; struct Entity; struct Class; struct typed_entity_array { Arena* arena; EntityTemplate* array; size_t count; }; struct EntityManager { static EntityID ID; uint64 next_local_counter = 1ULL; // TODO: Should be a pool VectorArena Entities; typed_entity_array by_type[ENTITY(Count)]; }; void InitEntityManager(NonNullPtr world); void ShutdownEntityManager(); EntityManager& GetEntityManager(); EntityTemplate* RegisterEntity(EntityManager& manager, Entity* base, DerivedType entity); [[nodiscard]] Entity* allocate_entity(EntityManager& manager, NonNullPtr derived_type_class); void UpdateEntityManager(EntityManager& manager); [[nodiscard]] Entity* deserialize_entity(Archive& archive, EntityManager& manager); void update_local_counter(EntityManager& manager, EntityID entity_id);