#include #include #include #include #include #include EntityID EntityManager::ID = 0; void InitEntityManager(NonNullPtr world) { EntityManager* newManager = ArenaPushStruct(world->WorldArena); world->EntityManager = newManager; newManager->Entities.Create(world->WorldArena JULIET_DEBUG_PARAM("Entities")); ArenaParams by_type_params{ .ReserveSize = Kilobytes(1), .CommitSize = Kilobytes(1), .Name = "" JULIET_DEBUG_ONLY(, .CanReserveMore = false) }; for (uint8 i = 0; i < ENTITY(Count); ++i) { by_type_params.Name = kEntity_type_names[i]; newManager->by_type[i].arena = ArenaAllocate(by_type_params); newManager->by_type[i].array = nullptr; } } void ShutdownEntityManager() { auto& manager = GetEntityManager(); for (typed_entity_array& type : manager.by_type) { ArenaRelease(type.arena); } manager.Entities.Destroy(); } EntityManager& GetEntityManager() { NonNullPtr entityManager = GetGameState()->World->EntityManager; return *entityManager; } entity_template* 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->Kind->kind].arena, base->Kind->size_of, base->Kind->alignment, false JULIET_DEBUG_PARAM(kEntity_type_names[base->Kind->kind])); MemCopy(ptr, entity, base->Kind->size_of); manager.by_type[base->Kind->kind].count += 1; ptr->Base = manager.Entities.Back(); if (manager.by_type[base->Kind->kind].array == nullptr) { manager.by_type[base->Kind->kind].array = ptr; } return ptr; } void RegisterBaseEntity(EntityManager& manager, Entity&& base) { GetEntityManager().Entities.PushBack(std::move(base)); } void UpdateEntityManager(EntityManager& manager) { // Todo : inert by definition dont move, but this is for test auto& by_type = manager.by_type[ENTITY(Inert)]; for (index_t i = 0; i < by_type.count; ++i) { Inert* inert = reinterpret_cast(by_type.array) + i; if (inert->MeshInstance != indexMax) { SetMeshInstanceTransform(inert->MeshInstance, MatrixTranslation(inert->Base->X, inert->Base->Y, inert->Base->Z)); } } }