// 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 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, unsigned int offset); void GetComponent(ParticleComponent component, bool* enabled, ComponentType* type, unsigned int* offset) const; unsigned int GetStride() const; void SetStride(unsigned int stride); ParticleDeclaration& operator=(const ParticleDeclaration& declaration); static ParticleDeclaration* Get(ParticleLayout layout); static bool IsTypeSupported(ComponentType type); // Signals: NazaraSignal(OnParticleDeclarationRelease, const ParticleDeclaration* /*particleDeclaration*/); private: static bool Initialize(); static void Uninitialize(); struct Component { ComponentType type; bool enabled = false; unsigned int 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 ! */ }; Component m_components[ParticleComponent_Max + 1]; unsigned int m_stride; static ParticleDeclaration s_declarations[ParticleLayout_Max + 1]; static ParticleDeclarationLibrary::LibraryMap s_library; }; } #endif // NAZARA_PARTICLEDECLARATION_HPP