diff --git a/ChangeLog.md b/ChangeLog.md index 6914fc0ad..cca98be26 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -121,6 +121,8 @@ Nazara Development Kit: - CollisionComponent[2D|3D] and PhysicsComponent[2D|3D] now configures their internal RigidBody userdata to the entity ID they belong to (useful for callbacks). - Fixed EntityList copy/movement assignment operator which was not properly unregistering contained entities. - ListenerSystem now handles velocity in a generic way (no longer require a VelocityComponent and is compatible with physics) +- World now has const getters for systems +- Add World::ForEachSystem method, allowing iteration on every active system on a specific world # 0.4: diff --git a/SDK/include/NDK/World.hpp b/SDK/include/NDK/World.hpp index 8a0fe2648..9b1d4c970 100644 --- a/SDK/include/NDK/World.hpp +++ b/SDK/include/NDK/World.hpp @@ -50,11 +50,16 @@ namespace Ndk inline void DisableProfiler(); inline void EnableProfiler(bool enable = true); + template void ForEachSystem(const F& iterationFunc); + template void ForEachSystem(const F& iterationFunc) const; + inline const EntityHandle& GetEntity(EntityId id); inline const EntityList& GetEntities() const; inline const ProfilerData& GetProfilerData() const; inline BaseSystem& GetSystem(SystemIndex index); + inline const BaseSystem& GetSystem(SystemIndex index) const; template SystemType& GetSystem(); + template const SystemType& GetSystem() const; inline bool HasSystem(SystemIndex index) const; template bool HasSystem() const; diff --git a/SDK/include/NDK/World.inl b/SDK/include/NDK/World.inl index a9d2cc8b8..efe8b0480 100644 --- a/SDK/include/NDK/World.inl +++ b/SDK/include/NDK/World.inl @@ -133,6 +133,40 @@ namespace Ndk } } + /*! + * \brief Executes a function on every present system + * + * Calls iterationFunc on every previously added system, in the same order as their indexes + * + * \param iterationFunc Function to be called + */ + template + void World::ForEachSystem(const F& iterationFunc) + { + for (const auto& systemPtr : m_systems) + { + if (systemPtr) + iterationFunc(*systemPtr); + } + } + + /*! + * \brief Executes a function on every present system + * + * Calls iterationFunc on every previously added system, in the same order as their indexes + * + * \param iterationFunc Function to be called + */ + template + void World::ForEachSystem(const F& iterationFunc) const + { + for (const auto& systemPtr : m_systems) + { + if (systemPtr) + iterationFunc(static_cast(*systemPtr)); //< Force const reference + } + } + /*! * \brief Gets an entity * \return A constant reference to a handle of the entity @@ -177,9 +211,8 @@ namespace Ndk * * \param index Index of the system * - * \remark Produces a NazaraAssert if system is not available in this world + * \remark The world must have the system before calling this function */ - inline BaseSystem& World::GetSystem(SystemIndex index) { NazaraAssert(HasSystem(index), "This system is not part of the world"); @@ -190,13 +223,30 @@ namespace Ndk return *system; } + /*! + * \brief Gets a system in the world by index + * \return A const reference to the system + * + * \param index Index of the system + * + * \remark The world must have the system before calling this function + */ + inline const BaseSystem& World::GetSystem(SystemIndex index) const + { + NazaraAssert(HasSystem(index), "This system is not part of the world"); + + const BaseSystem* system = m_systems[index].get(); + NazaraAssert(system, "Invalid system pointer"); + + return *system; + } + /*! * \brief Gets a system in the world by type * \return A reference to the system * * \remark Produces a NazaraAssert if system is not available in this world */ - template SystemType& World::GetSystem() { @@ -206,6 +256,21 @@ namespace Ndk return static_cast(GetSystem(index)); } + /*! + * \brief Gets a system in the world by type + * \return A const reference to the system + * + * \remark Produces a NazaraAssert if system is not available in this world + */ + template + const SystemType& World::GetSystem() const + { + static_assert(std::is_base_of::value, "SystemType is not a system"); + + SystemIndex index = GetSystemIndex(); + return static_cast(GetSystem(index)); + } + /*! * \brief Checks whether or not a system is present in the world by index * \return true If it is the case @@ -361,7 +426,7 @@ namespace Ndk m_orderedSystems = std::move(world.m_orderedSystems); m_orderedSystemsUpdated = world.m_orderedSystemsUpdated; m_profilerData = std::move(world.m_profilerData); - m_isProfilerEnabled = world.m_isProfilerEnabled; + m_isProfilerEnabled = m_isProfilerEnabled; m_entities = std::move(world.m_entities); for (EntityBlock& block : m_entities)