// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_PARTICLEDECLARATION_HPP #define NAZARA_PARTICLEDECLARATION_HPP #include #include #include #include #include #include #include #include #include namespace Nz { class ParticleDeclaration; using ParticleDeclarationConstRef = ObjectRef; using ParticleDeclarationLibrary = ObjectLibrary; using ParticleDeclarationRef = ObjectRef; class NAZARA_GRAPHICS_API ParticleDeclaration : public RefCounted { friend ParticleDeclarationLibrary; friend class Graphics; public: ParticleDeclaration(); ParticleDeclaration(const ParticleDeclaration& declaration); ~ParticleDeclaration(); void DisableComponent(ParticleComponent component); void EnableComponent(ParticleComponent component, ComponentType type, std::size_t offset); void GetComponent(ParticleComponent component, bool* enabled, ComponentType* type, std::size_t* offset) const; std::size_t GetStride() const; void SetStride(unsigned int stride); ParticleDeclaration& operator=(const ParticleDeclaration& declaration); static ParticleDeclaration* Get(ParticleLayout layout); static bool IsTypeSupported(ComponentType type); template static ParticleDeclarationRef New(Args&&... args); // Signals: NazaraSignal(OnParticleDeclarationRelease, const ParticleDeclaration* /*particleDeclaration*/); private: static bool Initialize(); static void Uninitialize(); struct Component { ComponentType type; bool enabled = false; std::size_t offset; /* ** -Lynix: ** It would be also possible to precise the stride by an independant way, what I don't allow ** to decomplexify the interface of something I consider useless. ** If you think that could be useful, don't hesitate to make me aware ! */ }; std::array m_components; std::size_t m_stride; static std::array s_declarations; static ParticleDeclarationLibrary::LibraryMap s_library; }; } #include #endif // NAZARA_PARTICLEDECLARATION_HPP