#pragma once #include #include typedef struct World World; typedef struct EntityTemplate EntityTemplate; typedef struct Entity Entity; typedef struct Class Class; typedef struct Archive Archive; typedef struct typed_entity_array typed_entity_array; struct typed_entity_array { Arena* arena; EntityTemplate* array; size_t count; }; typedef struct EntityManager EntityManager; struct EntityManager { uint64 next_local_counter; // TODO: Should be a pool VectorArena Entities; typed_entity_array by_type[Entity_Type_Count]; }; extern EntityID g_entity_manager_id; void InitEntityManager(World* world); void ShutdownEntityManager(void); EntityManager* GetEntityManager(void); EntityTemplate* RegisterEntity(EntityManager* manager, Entity* base, DerivedType entity); Entity* allocate_entity(EntityManager* manager, const Class* derived_type_class); void UpdateEntityManager(EntityManager* manager); Entity* deserialize_entity(Archive* archive, EntityManager* manager); void update_local_counter(EntityManager* manager, EntityID entity_id);