#pragma once #include "MeshInstance.hpp" #include "../types.hpp" #include namespace amalgine { const int NUM_ENTITIES = 1024; // Should always be a power a multiple of 16, to utilize compiler auto-vectorization using Entity = int; const Entity INVALID_ENTITY = -1; using EntityMaskType = u64; enum EntityMask : EntityMaskType { ENTITY_MASK_NONE = 0, ENTITY_MASK_TRANSFORMATION = 1 << 0, ENTITY_MASK_VELOCITY = 1 << 1, ENTITY_MASK_MESH_COMPONENT = 1 << 2 }; class EntityWorld { public: EntityWorld(); // Returns @INVALID_ENTITY on failure // O(n) Entity create_entity(EntityMask type); // O(1) void remove_entity(Entity entity); glm::mat4& get_transformation(Entity entity); glm::vec3& get_velocity(Entity entity); MeshInstance& get_mesh_instance(Entity entity); void update(); private: EntityMask mask[NUM_ENTITIES]; // Components glm::mat4 transformation[NUM_ENTITIES]; glm::vec3 velocity[NUM_ENTITIES]; MeshInstance mesh_instance[NUM_ENTITIES]; }; }