diff --git a/include/Nazara/Core/Components.hpp b/include/Nazara/Core/Components.hpp new file mode 100644 index 000000000..230da2f39 --- /dev/null +++ b/include/Nazara/Core/Components.hpp @@ -0,0 +1,34 @@ +// this file was automatically generated and should not be edited + +/* + Nazara Engine - Core module + + Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once + +#ifndef NAZARA_CORE_COMPONENTS_HPP +#define NAZARA_CORE_COMPONENTS_HPP + +#include + +#endif // NAZARA_CORE_COMPONENTS_HPP diff --git a/include/Nazara/Core/Components/LifetimeComponent.hpp b/include/Nazara/Core/Components/LifetimeComponent.hpp new file mode 100644 index 000000000..02fb89baa --- /dev/null +++ b/include/Nazara/Core/Components/LifetimeComponent.hpp @@ -0,0 +1,39 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_CORE_COMPONENTS_LIFETIMECOMPONENT_HPP +#define NAZARA_CORE_COMPONENTS_LIFETIMECOMPONENT_HPP + +#include +#include + +namespace Nz +{ + class LifetimeComponent + { + public: + inline LifetimeComponent(float lifetime); + LifetimeComponent(const LifetimeComponent&) = default; + LifetimeComponent(LifetimeComponent&&) = default; + ~LifetimeComponent() = default; + + inline void DecreaseLifetime(float elapsedTime); + + inline float GetRemainingLifeTime() const; + + inline bool IsAlive() const; + + LifetimeComponent& operator=(const LifetimeComponent&) = default; + LifetimeComponent& operator=(LifetimeComponent&&) = default; + + private: + float m_remainingLifetime; + }; +} + +#include + +#endif // NAZARA_CORE_COMPONENTS_LIFETIMECOMPONENT_HPP diff --git a/include/Nazara/Core/Components/LifetimeComponent.inl b/include/Nazara/Core/Components/LifetimeComponent.inl new file mode 100644 index 000000000..bf664cb49 --- /dev/null +++ b/include/Nazara/Core/Components/LifetimeComponent.inl @@ -0,0 +1,31 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline LifetimeComponent::LifetimeComponent(float lifetime) : + m_remainingLifetime(lifetime) + { + } + + inline void LifetimeComponent::DecreaseLifetime(float elapsedTime) + { + m_remainingLifetime -= elapsedTime; + } + + inline float LifetimeComponent::GetRemainingLifeTime() const + { + return m_remainingLifetime; + } + + inline bool LifetimeComponent::IsAlive() const + { + return m_remainingLifetime >= 0.f; + } +} + +#include diff --git a/include/Nazara/Core/Systems.hpp b/include/Nazara/Core/Systems.hpp new file mode 100644 index 000000000..269bf0b46 --- /dev/null +++ b/include/Nazara/Core/Systems.hpp @@ -0,0 +1,34 @@ +// this file was automatically generated and should not be edited + +/* + Nazara Engine - Core module + + Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once + +#ifndef NAZARA_CORE_SYSTEMS_HPP +#define NAZARA_CORE_SYSTEMS_HPP + +#include + +#endif // NAZARA_CORE_SYSTEMS_HPP diff --git a/include/Nazara/Core/Systems/LifetimeSystem.hpp b/include/Nazara/Core/Systems/LifetimeSystem.hpp new file mode 100644 index 000000000..3ad93cdf5 --- /dev/null +++ b/include/Nazara/Core/Systems/LifetimeSystem.hpp @@ -0,0 +1,41 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_CORE_SYSTEMS_LIFETIMESYSTEM_HPP +#define NAZARA_CORE_SYSTEMS_LIFETIMESYSTEM_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class NAZARA_CORE_API LifetimeSystem + { + public: + static constexpr bool AllowConcurrent = false; + static constexpr Int64 ExecutionOrder = 1'000'000; + using Components = TypeList; + + inline LifetimeSystem(entt::registry& registry); + LifetimeSystem(const LifetimeSystem&) = delete; + LifetimeSystem(LifetimeSystem&&) = delete; + ~LifetimeSystem() = default; + + void Update(float elapsedTime); + + LifetimeSystem& operator=(const LifetimeSystem&) = delete; + LifetimeSystem& operator=(LifetimeSystem&&) = delete; + + private: + entt::registry& m_registry; + }; +} + +#include + +#endif // NAZARA_CORE_SYSTEMS_LIFETIMESYSTEM_HPP diff --git a/include/Nazara/Core/Systems/LifetimeSystem.inl b/include/Nazara/Core/Systems/LifetimeSystem.inl new file mode 100644 index 000000000..b37865165 --- /dev/null +++ b/include/Nazara/Core/Systems/LifetimeSystem.inl @@ -0,0 +1,16 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline LifetimeSystem::LifetimeSystem(entt::registry& registry) : + m_registry(registry) + { + } +} + +#include diff --git a/src/Nazara/Core/Systems/LifetimeSystem.cpp b/src/Nazara/Core/Systems/LifetimeSystem.cpp new file mode 100644 index 000000000..fe39efc5a --- /dev/null +++ b/src/Nazara/Core/Systems/LifetimeSystem.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + void LifetimeSystem::Update(float elapsedTime) + { + auto view = m_registry.view(); + for (auto [entity, lifetimeComponent] : view.each()) + { + lifetimeComponent.DecreaseLifetime(elapsedTime); + if (!lifetimeComponent.IsAlive()) + m_registry.destroy(entity); + } + } +} diff --git a/xmake.lua b/xmake.lua index 7701ce69d..e2858d1c2 100644 --- a/xmake.lua +++ b/xmake.lua @@ -18,6 +18,7 @@ local modules = { add_syslinks("dl", "pthread", "uuid") end end, + Packages = { "entt" }, PublicPackages = { "nazarautils" } }, Graphics = {