From a069b105e680948200bcf686d48d6e2aee40b0ee Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jun 2015 20:42:41 +0200 Subject: [PATCH] Fully replace listener system by signals Former-commit-id: 032dfddd12cc3a792c71426148c758ffac3621f9 --- include/Nazara/Audio/SoundBuffer.hpp | 8 +- include/Nazara/Core.hpp | 2 - include/Nazara/Core/ObjectListener.hpp | 26 ---- include/Nazara/Core/ObjectListenerWrapper.hpp | 45 ------ include/Nazara/Core/ObjectListenerWrapper.inl | 108 -------------- include/Nazara/Core/RefCounted.hpp | 21 +-- .../Nazara/Graphics/DeferredRenderQueue.hpp | 1 - .../Nazara/Graphics/ForwardRenderQueue.hpp | 1 - include/Nazara/Graphics/Material.hpp | 4 +- .../Nazara/Graphics/ParticleController.hpp | 7 +- .../Nazara/Graphics/ParticleDeclaration.hpp | 7 +- include/Nazara/Graphics/ParticleGenerator.hpp | 7 +- include/Nazara/Graphics/ParticleRenderer.hpp | 7 +- include/Nazara/Graphics/Renderable.hpp | 7 +- include/Nazara/Graphics/SkinningManager.hpp | 3 + include/Nazara/Physics/Geom.hpp | 22 +-- include/Nazara/Renderer/Context.hpp | 6 +- include/Nazara/Renderer/RenderBuffer.hpp | 8 +- include/Nazara/Renderer/RenderTexture.hpp | 13 +- include/Nazara/Renderer/Shader.hpp | 4 +- include/Nazara/Renderer/Texture.hpp | 4 +- include/Nazara/Renderer/UberShader.hpp | 5 +- .../Renderer/UberShaderPreprocessor.hpp | 8 +- include/Nazara/Utility/Animation.hpp | 8 +- include/Nazara/Utility/Buffer.hpp | 8 +- include/Nazara/Utility/Font.hpp | 4 +- include/Nazara/Utility/Image.hpp | 8 +- include/Nazara/Utility/IndexBuffer.hpp | 5 +- include/Nazara/Utility/Mesh.hpp | 7 +- include/Nazara/Utility/SimpleTextDrawer.hpp | 3 +- include/Nazara/Utility/SkeletalMesh.hpp | 8 +- include/Nazara/Utility/Skeleton.hpp | 9 +- include/Nazara/Utility/StaticMesh.hpp | 9 +- include/Nazara/Utility/SubMesh.hpp | 6 +- include/Nazara/Utility/VertexBuffer.hpp | 5 +- include/Nazara/Utility/VertexDeclaration.hpp | 5 +- src/Nazara/Audio/SoundBuffer.cpp | 5 +- src/Nazara/Core/ObjectListener.cpp | 39 ----- src/Nazara/Core/RefCounted.cpp | 91 +----------- src/Nazara/Graphics/Material.cpp | 2 +- src/Nazara/Graphics/ParticleController.cpp | 5 +- src/Nazara/Graphics/ParticleDeclaration.cpp | 2 +- src/Nazara/Graphics/ParticleGenerator.cpp | 5 +- src/Nazara/Graphics/ParticleRenderer.cpp | 5 +- src/Nazara/Graphics/Renderable.cpp | 5 +- src/Nazara/Graphics/SkinningManager.cpp | 136 +++++++----------- src/Nazara/Renderer/Context.cpp | 4 +- src/Nazara/Renderer/RenderBuffer.cpp | 5 +- src/Nazara/Renderer/RenderTexture.cpp | 104 +++++++------- src/Nazara/Renderer/Shader.cpp | 9 +- src/Nazara/Renderer/Texture.cpp | 4 +- src/Nazara/Renderer/UberShader.cpp | 5 +- .../Renderer/UberShaderPreprocessor.cpp | 5 + src/Nazara/Utility/Animation.cpp | 5 +- src/Nazara/Utility/Buffer.cpp | 5 +- src/Nazara/Utility/Font.cpp | 14 +- src/Nazara/Utility/Image.cpp | 5 +- src/Nazara/Utility/Mesh.cpp | 6 +- src/Nazara/Utility/SimpleTextDrawer.cpp | 2 + src/Nazara/Utility/SkeletalMesh.cpp | 4 +- src/Nazara/Utility/Skeleton.cpp | 7 +- src/Nazara/Utility/StaticMesh.cpp | 4 +- src/Nazara/Utility/SubMesh.cpp | 5 +- 63 files changed, 291 insertions(+), 606 deletions(-) delete mode 100644 include/Nazara/Core/ObjectListener.hpp delete mode 100644 include/Nazara/Core/ObjectListenerWrapper.hpp delete mode 100644 include/Nazara/Core/ObjectListenerWrapper.inl delete mode 100644 src/Nazara/Core/ObjectListener.cpp diff --git a/include/Nazara/Audio/SoundBuffer.hpp b/include/Nazara/Audio/SoundBuffer.hpp index ba226e40b..d7eb0809d 100644 --- a/include/Nazara/Audio/SoundBuffer.hpp +++ b/include/Nazara/Audio/SoundBuffer.hpp @@ -13,11 +13,11 @@ #include #include #include -#include #include #include #include #include +#include struct NzSoundBufferParams { @@ -29,10 +29,8 @@ struct NzSoundBufferParams class NzSound; class NzSoundBuffer; -using NzSoundBufferConstListener = NzObjectListenerWrapper; using NzSoundBufferConstRef = NzObjectRef; using NzSoundBufferLibrary = NzObjectLibrary; -using NzSoundBufferListener = NzObjectListenerWrapper; using NzSoundBufferLoader = NzResourceLoader; using NzSoundBufferManager = NzResourceManager; using NzSoundBufferRef = NzObjectRef; @@ -70,6 +68,10 @@ class NAZARA_API NzSoundBuffer : public NzRefCounted, public NzResource, NzNonCo static bool IsFormatSupported(nzAudioFormat format); template static NzSoundBufferRef New(Args&&... args); + // Signals: + NazaraSignal(OnSoundBufferDestroy, const NzSoundBuffer*); //< Args: me + NazaraSignal(OnSoundBufferRelease, const NzSoundBuffer*); //< Args: me + private: unsigned int GetOpenALBuffer() const; diff --git a/include/Nazara/Core.hpp b/include/Nazara/Core.hpp index fb9be1863..5db5c3007 100644 --- a/include/Nazara/Core.hpp +++ b/include/Nazara/Core.hpp @@ -64,8 +64,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/include/Nazara/Core/ObjectListener.hpp b/include/Nazara/Core/ObjectListener.hpp deleted file mode 100644 index f534f24c5..000000000 --- a/include/Nazara/Core/ObjectListener.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// 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_OBJECTLISTENER_HPP -#define NAZARA_OBJECTLISTENER_HPP - -#include - -class NzRefCounted; - -class NAZARA_API NzObjectListener -{ - public: - NzObjectListener() = default; - virtual ~NzObjectListener(); - - virtual bool OnObjectCreated(const NzRefCounted* object, int index); - virtual bool OnObjectDestroy(const NzRefCounted* object, int index); - virtual bool OnObjectModified(const NzRefCounted* object, int index, unsigned int code); - virtual void OnObjectReleased(const NzRefCounted* object, int index); -}; - -#endif // NAZARA_OBJECTLISTENER_HPP diff --git a/include/Nazara/Core/ObjectListenerWrapper.hpp b/include/Nazara/Core/ObjectListenerWrapper.hpp deleted file mode 100644 index e44476a16..000000000 --- a/include/Nazara/Core/ObjectListenerWrapper.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// 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_OBJECTLISTENERWRAPPER_HPP -#define NAZARA_OBJECTLISTENERWRAPPER_HPP - -#include -#include -#include -#include - -template -class NzObjectListenerWrapper -{ - static_assert(std::is_base_of::value, "ObjListenerWrapper should only be used with RefCounted-derived type"); - - public: - NzObjectListenerWrapper(NzObjectListener* listener, int index = 0, T* object = nullptr); - NzObjectListenerWrapper(const NzObjectListenerWrapper& listener); - NzObjectListenerWrapper(NzObjectListenerWrapper&& listener); - ~NzObjectListenerWrapper(); - - bool IsValid() const; - void Reset(T* object = nullptr); - - operator bool() const; - operator T*() const; - T* operator->() const; - - NzObjectListenerWrapper& operator=(T* object); - NzObjectListenerWrapper& operator=(const NzObjectListenerWrapper& listener); - NzObjectListenerWrapper& operator=(NzObjectListenerWrapper&& listener); - - private: - T* m_object; - NzObjectListener* m_listener; - int m_index; -}; - -#include - -#endif // NAZARA_OBJECTLISTENERWRAPPER_HPP diff --git a/include/Nazara/Core/ObjectListenerWrapper.inl b/include/Nazara/Core/ObjectListenerWrapper.inl deleted file mode 100644 index aa72db910..000000000 --- a/include/Nazara/Core/ObjectListenerWrapper.inl +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Core module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include - -template -NzObjectListenerWrapper::NzObjectListenerWrapper(NzObjectListener* listener, int index, T* object) : -m_object(nullptr), -m_listener(listener), -m_index(index) -{ - Reset(object); -} - -template -NzObjectListenerWrapper::NzObjectListenerWrapper(const NzObjectListenerWrapper& listener) : -m_object(nullptr), -m_listener(listener.m_listener), -m_index(listener.m_index) -{ - Reset(listener.m_object); -} - -template -NzObjectListenerWrapper::NzObjectListenerWrapper(NzObjectListenerWrapper&& listener) : -m_object(listener.m_object), -m_listener(listener.m_listener), -m_index(listener.m_index) -{ - listener.m_object = nullptr; -} - -template -NzObjectListenerWrapper::~NzObjectListenerWrapper() -{ - Reset(nullptr); -} - -template -bool NzObjectListenerWrapper::IsValid() const -{ - return m_object != nullptr; -} - -template -void NzObjectListenerWrapper::Reset(T* object) -{ - if (object) - object->AddObjectListener(m_listener, m_index); - - if (m_object) - m_object->RemoveObjectListener(m_listener); - - m_object = object; -} - -template -NzObjectListenerWrapper::operator bool() const -{ - return IsValid(); -} - -template -NzObjectListenerWrapper::operator T*() const -{ - return m_object; -} - -template -T* NzObjectListenerWrapper::operator->() const -{ - return m_object; -} - -template -NzObjectListenerWrapper& NzObjectListenerWrapper::operator=(T* object) -{ - Reset(object); - - return *this; -} - -template -NzObjectListenerWrapper& NzObjectListenerWrapper::operator=(const NzObjectListenerWrapper& listener) -{ - m_index = listener.m_index; - m_listener = listener.m_listener; - Reset(listener.m_object); - - return *this; -} - -template -NzObjectListenerWrapper& NzObjectListenerWrapper::operator=(NzObjectListenerWrapper&& listener) -{ - Reset(); - - m_index = listener.m_index; - m_listener = listener.m_listener; - m_object = listener.m_object; - - listener.m_object = nullptr; - - return *this; -} - -#include diff --git a/include/Nazara/Core/RefCounted.hpp b/include/Nazara/Core/RefCounted.hpp index 70b1c1c15..b67fc2c2b 100644 --- a/include/Nazara/Core/RefCounted.hpp +++ b/include/Nazara/Core/RefCounted.hpp @@ -17,45 +17,30 @@ #include #endif -class NzObjectListener; - class NAZARA_API NzRefCounted { public: NzRefCounted(bool persistent = true); NzRefCounted(const NzRefCounted&) = delete; - NzRefCounted(NzRefCounted&&) = delete; + NzRefCounted(NzRefCounted&&) = default; virtual ~NzRefCounted(); - void AddObjectListener(NzObjectListener* listener, int index = 0) const; void AddReference() const; unsigned int GetReferenceCount() const; bool IsPersistent() const; - void RemoveObjectListener(NzObjectListener* listener) const; bool RemoveReference() const; bool SetPersistent(bool persistent = true, bool checkReferenceCount = false); NzRefCounted& operator=(const NzRefCounted&) = delete; - NzRefCounted& operator=(NzRefCounted&&) = delete; - - protected: - void NotifyCreated(); - void NotifyDestroy(); - void NotifyModified(unsigned int code); + NzRefCounted& operator=(NzRefCounted&&) = default; private: - using ObjectListenerMap = std::unordered_map>; - - NazaraMutexAttrib(m_mutex, mutable) - - mutable ObjectListenerMap m_objectListeners; - std::atomic_bool m_persistent; + std::atomic_bool m_persistent; mutable std::atomic_uint m_referenceCount; - bool m_objectListenersLocked; }; #endif // NAZARA_RESOURCE_HPP diff --git a/include/Nazara/Graphics/DeferredRenderQueue.hpp b/include/Nazara/Graphics/DeferredRenderQueue.hpp index 1d37c1162..f013f077e 100644 --- a/include/Nazara/Graphics/DeferredRenderQueue.hpp +++ b/include/Nazara/Graphics/DeferredRenderQueue.hpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/include/Nazara/Graphics/ForwardRenderQueue.hpp b/include/Nazara/Graphics/ForwardRenderQueue.hpp index ba214ee34..49013ab83 100644 --- a/include/Nazara/Graphics/ForwardRenderQueue.hpp +++ b/include/Nazara/Graphics/ForwardRenderQueue.hpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 7410ea448..648c778fc 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -39,10 +38,8 @@ struct NAZARA_API NzMaterialParams class NzMaterial; -using NzMaterialConstListener = NzObjectListenerWrapper; using NzMaterialConstRef = NzObjectRef; using NzMaterialLibrary = NzObjectLibrary; -using NzMaterialListener = NzObjectListenerWrapper; using NzMaterialLoader = NzResourceLoader; using NzMaterialManager = NzResourceManager; using NzMaterialRef = NzObjectRef; @@ -145,6 +142,7 @@ class NAZARA_API NzMaterial : public NzRefCounted, public NzResource // Signals NazaraSignal(OnMaterialRelease, const NzMaterial*); //< Args: me + NazaraSignal(OnMaterialReset, const NzMaterial*); //< Args: me private: struct ShaderInstance diff --git a/include/Nazara/Graphics/ParticleController.hpp b/include/Nazara/Graphics/ParticleController.hpp index d033d742e..b560569a0 100644 --- a/include/Nazara/Graphics/ParticleController.hpp +++ b/include/Nazara/Graphics/ParticleController.hpp @@ -9,18 +9,16 @@ #include #include -#include #include #include +#include class NzParticleController; class NzParticleMapper; class NzParticleSystem; -using NzParticleControllerConstListener = NzObjectListenerWrapper; using NzParticleControllerConstRef = NzObjectRef; using NzParticleControllerLibrary = NzObjectLibrary; -using NzParticleControllerListener = NzObjectListenerWrapper; using NzParticleControllerRef = NzObjectRef; class NAZARA_API NzParticleController : public NzRefCounted @@ -35,6 +33,9 @@ class NAZARA_API NzParticleController : public NzRefCounted virtual void Apply(NzParticleSystem& system, NzParticleMapper& mapper, unsigned int startId, unsigned int endId, float elapsedTime) = 0; + // Signals: + NazaraSignal(OnParticleControllerRelease, const NzParticleController*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Graphics/ParticleDeclaration.hpp b/include/Nazara/Graphics/ParticleDeclaration.hpp index 1f9b1e35e..d53ef1628 100644 --- a/include/Nazara/Graphics/ParticleDeclaration.hpp +++ b/include/Nazara/Graphics/ParticleDeclaration.hpp @@ -9,18 +9,16 @@ #include #include -#include #include #include +#include #include #include class NzParticleDeclaration; -using NzParticleDeclarationConstListener = NzObjectListenerWrapper; using NzParticleDeclarationConstRef = NzObjectRef; using NzParticleDeclarationLibrary = NzObjectLibrary; -using NzParticleDeclarationListener = NzObjectListenerWrapper; using NzParticleDeclarationRef = NzObjectRef; class NAZARA_API NzParticleDeclaration : public NzRefCounted @@ -46,6 +44,9 @@ class NAZARA_API NzParticleDeclaration : public NzRefCounted static NzParticleDeclaration* Get(nzParticleLayout layout); static bool IsTypeSupported(nzComponentType type); + // Signals + NazaraSignal(OnParticleDeclarationRelease, const NzParticleDeclaration*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Graphics/ParticleGenerator.hpp b/include/Nazara/Graphics/ParticleGenerator.hpp index c5cc54554..1025f4e04 100644 --- a/include/Nazara/Graphics/ParticleGenerator.hpp +++ b/include/Nazara/Graphics/ParticleGenerator.hpp @@ -9,18 +9,16 @@ #include #include -#include #include #include +#include class NzParticleGenerator; class NzParticleMapper; class NzParticleSystem; -using NzParticleGeneratorConstListener = NzObjectListenerWrapper; using NzParticleGeneratorConstRef = NzObjectRef; using NzParticleGeneratorLibrary = NzObjectLibrary; -using NzParticleGeneratorListener = NzObjectListenerWrapper; using NzParticleGeneratorRef = NzObjectRef; class NAZARA_API NzParticleGenerator : public NzRefCounted @@ -35,6 +33,9 @@ class NAZARA_API NzParticleGenerator : public NzRefCounted virtual void Generate(NzParticleSystem& system, NzParticleMapper& mapper, unsigned int startId, unsigned int endId) = 0; + // Signals: + NazaraSignal(OnParticleGeneratorRelease, const NzParticleGenerator*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Graphics/ParticleRenderer.hpp b/include/Nazara/Graphics/ParticleRenderer.hpp index 0bd5d7879..535b3d9c1 100644 --- a/include/Nazara/Graphics/ParticleRenderer.hpp +++ b/include/Nazara/Graphics/ParticleRenderer.hpp @@ -9,19 +9,17 @@ #include #include -#include #include #include +#include class NzAbstractRenderQueue; class NzParticleMapper; class NzParticleRenderer; class NzParticleSystem; -using NzParticleRendererConstListener = NzObjectListenerWrapper; using NzParticleRendererConstRef = NzObjectRef; using NzParticleRendererLibrary = NzObjectLibrary; -using NzParticleRendererListener = NzObjectListenerWrapper; using NzParticleRendererRef = NzObjectRef; class NAZARA_API NzParticleRenderer : public NzRefCounted @@ -36,6 +34,9 @@ class NAZARA_API NzParticleRenderer : public NzRefCounted virtual void Render(const NzParticleSystem& system, const NzParticleMapper& mapper, unsigned int startId, unsigned int endId, NzAbstractRenderQueue* renderQueue) = 0; + // Signals: + NazaraSignal(OnParticleRendererRelease, const NzParticleRenderer*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Graphics/Renderable.hpp b/include/Nazara/Graphics/Renderable.hpp index 5545b978d..0d807a7b1 100644 --- a/include/Nazara/Graphics/Renderable.hpp +++ b/include/Nazara/Graphics/Renderable.hpp @@ -10,9 +10,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -20,10 +20,8 @@ class NzAbstractRenderQueue; class NzRenderable; -using NzRenderableConstListener = NzObjectListenerWrapper; using NzRenderableConstRef = NzObjectRef; using NzRenderableLibrary = NzObjectLibrary; -using NzRenderableListener = NzObjectListenerWrapper; using NzRenderableRef = NzObjectRef; class NAZARA_API NzRenderable : public NzRefCounted @@ -42,6 +40,9 @@ class NAZARA_API NzRenderable : public NzRefCounted inline NzRenderable& operator=(const NzRenderable& renderable); + // Signals: + NazaraSignal(OnRenderableRelease, const NzRenderable*); //< Args: me + protected: virtual void MakeBoundingVolume() const = 0; void InvalidateBoundingVolume(); diff --git a/include/Nazara/Graphics/SkinningManager.hpp b/include/Nazara/Graphics/SkinningManager.hpp index 550fddc9a..14b19d92a 100644 --- a/include/Nazara/Graphics/SkinningManager.hpp +++ b/include/Nazara/Graphics/SkinningManager.hpp @@ -28,6 +28,9 @@ class NAZARA_API NzSkinningManager private: static bool Initialize(); + static void OnSkeletalMeshDestroy(const NzSkeletalMesh* mesh); + static void OnSkeletonInvalidated(const NzSkeleton* skeleton); + static void OnSkeletonRelease(const NzSkeleton* skeleton); static void Uninitialize(); static SkinFunction s_skinFunc; diff --git a/include/Nazara/Physics/Geom.hpp b/include/Nazara/Physics/Geom.hpp index 81319d713..5f3a79f27 100644 --- a/include/Nazara/Physics/Geom.hpp +++ b/include/Nazara/Physics/Geom.hpp @@ -11,9 +11,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -30,10 +30,8 @@ class NzPhysGeom; class NzPhysWorld; struct NewtonCollision; -using NzPhysGeomConstListener = NzObjectListenerWrapper; using NzPhysGeomConstRef = NzObjectRef; using NzPhysGeomLibrary = NzObjectLibrary; -using NzPhysGeomListener = NzObjectListenerWrapper; using NzPhysGeomRef = NzObjectRef; class NAZARA_API NzPhysGeom : public NzRefCounted, NzNonCopyable @@ -52,6 +50,8 @@ class NAZARA_API NzPhysGeom : public NzRefCounted, NzNonCopyable static NzPhysGeomRef Build(const NzPrimitiveList& list); + NazaraSignal(OnPhysGeomRelease, const NzPhysGeom*); //< Args: me + protected: virtual NewtonCollision* CreateHandle(NzPhysWorld* world) const = 0; @@ -62,9 +62,7 @@ class NAZARA_API NzPhysGeom : public NzRefCounted, NzNonCopyable class NzBoxGeom; -using NzBoxGeomConstListener = NzObjectListenerWrapper; using NzBoxGeomConstRef = NzObjectRef; -using NzBoxGeomListener = NzObjectListenerWrapper; using NzBoxGeomRef = NzObjectRef; class NAZARA_API NzBoxGeom : public NzPhysGeom @@ -90,9 +88,7 @@ class NAZARA_API NzBoxGeom : public NzPhysGeom class NzCapsuleGeom; -using NzCapsuleGeomConstListener = NzObjectListenerWrapper; using NzCapsuleGeomConstRef = NzObjectRef; -using NzCapsuleGeomListener = NzObjectListenerWrapper; using NzCapsuleGeomRef = NzObjectRef; class NAZARA_API NzCapsuleGeom : public NzPhysGeom @@ -117,9 +113,7 @@ class NAZARA_API NzCapsuleGeom : public NzPhysGeom class NzCompoundGeom; -using NzCompoundGeomConstListener = NzObjectListenerWrapper; using NzCompoundGeomConstRef = NzObjectRef; -using NzCompoundGeomListener = NzObjectListenerWrapper; using NzCompoundGeomRef = NzObjectRef; class NAZARA_API NzCompoundGeom : public NzPhysGeom @@ -140,9 +134,7 @@ class NAZARA_API NzCompoundGeom : public NzPhysGeom class NzConeGeom; -using NzConeGeomConstListener = NzObjectListenerWrapper; using NzConeGeomConstRef = NzObjectRef; -using NzConeGeomListener = NzObjectListenerWrapper; using NzConeGeomRef = NzObjectRef; class NAZARA_API NzConeGeom : public NzPhysGeom @@ -167,9 +159,7 @@ class NAZARA_API NzConeGeom : public NzPhysGeom class NzConvexHullGeom; -using NzConvexHullGeomConstListener = NzObjectListenerWrapper; using NzConvexHullGeomConstRef = NzObjectRef; -using NzConvexHullGeomListener = NzObjectListenerWrapper; using NzConvexHullGeomRef = NzObjectRef; class NAZARA_API NzConvexHullGeom : public NzPhysGeom @@ -193,9 +183,7 @@ class NAZARA_API NzConvexHullGeom : public NzPhysGeom class NzCylinderGeom; -using NzCylinderGeomConstListener = NzObjectListenerWrapper; using NzCylinderGeomConstRef = NzObjectRef; -using NzCylinderGeomListener = NzObjectListenerWrapper; using NzCylinderGeomRef = NzObjectRef; class NAZARA_API NzCylinderGeom : public NzPhysGeom @@ -220,9 +208,7 @@ class NAZARA_API NzCylinderGeom : public NzPhysGeom class NzNullGeom; -using NzNullGeomConstListener = NzObjectListenerWrapper; using NzNullGeomConstRef = NzObjectRef; -using NzNullGeomListener = NzObjectListenerWrapper; using NzNullGeomRef = NzObjectRef; class NAZARA_API NzNullGeom : public NzPhysGeom @@ -240,9 +226,7 @@ class NAZARA_API NzNullGeom : public NzPhysGeom class NzSphereGeom; -using NzSphereGeomConstListener = NzObjectListenerWrapper; using NzSphereGeomConstRef = NzObjectRef; -using NzSphereGeomListener = NzObjectListenerWrapper; using NzSphereGeomRef = NzObjectRef; class NAZARA_API NzSphereGeom : public NzPhysGeom diff --git a/include/Nazara/Renderer/Context.hpp b/include/Nazara/Renderer/Context.hpp index 1d9e353cc..da4a67d88 100644 --- a/include/Nazara/Renderer/Context.hpp +++ b/include/Nazara/Renderer/Context.hpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -19,10 +18,8 @@ class NzContext; -using NzContextConstListener = NzObjectListenerWrapper; using NzContextConstRef = NzObjectRef; using NzContextLibrary = NzObjectLibrary; -using NzContextListener = NzObjectListenerWrapper; using NzContextRef = NzObjectRef; class NzContextImpl; @@ -51,7 +48,8 @@ class NAZARA_API NzContext : public NzRefCounted static const NzContext* GetThreadContext(); // Signals - NazaraSignal(OnContextRelease, const NzContext*); //< me + NazaraSignal(OnContextDestroy, const NzContext*); //< Args: me + NazaraSignal(OnContextRelease, const NzContext*); //< Args: me private: static bool Initialize(); diff --git a/include/Nazara/Renderer/RenderBuffer.hpp b/include/Nazara/Renderer/RenderBuffer.hpp index 69a76aa6a..1cf177be1 100644 --- a/include/Nazara/Renderer/RenderBuffer.hpp +++ b/include/Nazara/Renderer/RenderBuffer.hpp @@ -10,17 +10,15 @@ #include #include #include -#include #include #include +#include #include class NzRenderBuffer; -using NzRenderBufferConstListener = NzObjectListenerWrapper; using NzRenderBufferConstRef = NzObjectRef; using NzRenderBufferLibrary = NzObjectLibrary; -using NzRenderBufferListener = NzObjectListenerWrapper; using NzRenderBufferRef = NzObjectRef; class NAZARA_API NzRenderBuffer : public NzRefCounted, NzNonCopyable @@ -47,6 +45,10 @@ class NAZARA_API NzRenderBuffer : public NzRefCounted, NzNonCopyable static bool IsSupported(); template static NzRenderBufferRef New(Args&&... args); + // Signals + NazaraSignal(OnRenderBufferDestroy, const NzRenderBuffer*); //< Args: me + NazaraSignal(OnRenderBufferRelease, const NzRenderBuffer*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Renderer/RenderTexture.hpp b/include/Nazara/Renderer/RenderTexture.hpp index 43c5b0cd0..9414e6331 100644 --- a/include/Nazara/Renderer/RenderTexture.hpp +++ b/include/Nazara/Renderer/RenderTexture.hpp @@ -9,18 +9,21 @@ #include #include -#include +#include #include +#include #include -#include +#include ///TODO: Faire fonctionner les RenderTexture indépendamment du contexte (un FBO par instance et par contexte l'utilisant) +class NzContext; class NzRenderBuffer; +class NzTexture; struct NzRenderTextureImpl; -class NAZARA_API NzRenderTexture : public NzRenderTarget, NzObjectListener, NzNonCopyable +class NAZARA_API NzRenderTexture : public NzRenderTarget, NzNonCopyable { public: NzRenderTexture() = default; @@ -66,7 +69,9 @@ class NAZARA_API NzRenderTexture : public NzRenderTarget, NzObjectListener, NzNo void EnsureTargetUpdated() const override; private: - bool OnObjectDestroy(const NzRefCounted* object, int index) override; + void OnContextDestroy(const NzContext* context); + void OnRenderBufferDestroy(const NzRenderBuffer* renderBuffer, int attachmentIndex); + void OnTextureDestroy(const NzTexture* texture, int attachmentIndex); void UpdateDrawBuffers() const; void UpdateSize() const; void UpdateTargets() const; diff --git a/include/Nazara/Renderer/Shader.hpp b/include/Nazara/Renderer/Shader.hpp index 4e393649d..e34eeaeea 100644 --- a/include/Nazara/Renderer/Shader.hpp +++ b/include/Nazara/Renderer/Shader.hpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -26,10 +25,8 @@ class NzShader; class NzShaderStage; -using NzShaderConstListener = NzObjectListenerWrapper; using NzShaderConstRef = NzObjectRef; using NzShaderLibrary = NzObjectLibrary; -using NzShaderListener = NzObjectListenerWrapper; using NzShaderRef = NzObjectRef; class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable @@ -104,6 +101,7 @@ class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable template static NzShaderRef New(Args&&... args); // Signals + NazaraSignal(OnShaderDestroy, const NzShader*); //< Args: me NazaraSignal(OnShaderRelease, const NzShader*); //< Args: me NazaraSignal(OnShaderUniformInvalidated, const NzShader*); //< Args: me diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index e4d9e0d3a..ccd710ee6 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -23,10 +22,8 @@ class NzTexture; -using NzTextureConstListener = NzObjectListenerWrapper; using NzTextureConstRef = NzObjectRef; using NzTextureLibrary = NzObjectLibrary; -using NzTextureListener = NzObjectListenerWrapper; using NzTextureManager = NzResourceManager; using NzTextureRef = NzObjectRef; @@ -111,6 +108,7 @@ class NAZARA_API NzTexture : public NzAbstractImage, public NzRefCounted, public template static NzTextureRef New(Args&&... args); // Signals + NazaraSignal(OnTextureDestroy, const NzTexture*); //< Args: me NazaraSignal(OnTextureRelease, const NzTexture*); //< Args: me private: diff --git a/include/Nazara/Renderer/UberShader.hpp b/include/Nazara/Renderer/UberShader.hpp index 8df9f54f0..aabe20bed 100644 --- a/include/Nazara/Renderer/UberShader.hpp +++ b/include/Nazara/Renderer/UberShader.hpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -18,10 +17,8 @@ class NzUberShader; -using NzUberShaderConstListener = NzObjectListenerWrapper; using NzUberShaderConstRef = NzObjectRef; using NzUberShaderLibrary = NzObjectLibrary; -using NzUberShaderListener = NzObjectListenerWrapper; using NzUberShaderRef = NzObjectRef; class NAZARA_API NzUberShader : public NzRefCounted @@ -35,6 +32,8 @@ class NAZARA_API NzUberShader : public NzRefCounted virtual NzUberShaderInstance* Get(const NzParameterList& parameters) const = 0; + NazaraSignal(OnUberShaderRelease, const NzUberShader*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Renderer/UberShaderPreprocessor.hpp b/include/Nazara/Renderer/UberShaderPreprocessor.hpp index 8e8c47af1..42a33cfbe 100644 --- a/include/Nazara/Renderer/UberShaderPreprocessor.hpp +++ b/include/Nazara/Renderer/UberShaderPreprocessor.hpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -19,16 +18,14 @@ class NzUberShaderPreprocessor; -using NzUberShaderPreprocessorConstListener = NzObjectListenerWrapper; using NzUberShaderPreprocessorConstRef = NzObjectRef; -using NzUberShaderPreprocessorListener = NzObjectListenerWrapper; using NzUberShaderPreprocessorRef = NzObjectRef; class NAZARA_API NzUberShaderPreprocessor : public NzUberShader { public: NzUberShaderPreprocessor() = default; - ~NzUberShaderPreprocessor() = default; + ~NzUberShaderPreprocessor(); NzUberShaderInstance* Get(const NzParameterList& parameters) const; @@ -38,6 +35,9 @@ class NAZARA_API NzUberShaderPreprocessor : public NzUberShader static bool IsSupported(); template static NzUberShaderPreprocessorRef New(Args&&... args); + // Signals: + NazaraSignal(OnUberShaderPreprocessorRelease, const NzUberShaderPreprocessor*); //< Args: me + private: struct Shader { diff --git a/include/Nazara/Utility/Animation.hpp b/include/Nazara/Utility/Animation.hpp index f6ef35445..694f04361 100644 --- a/include/Nazara/Utility/Animation.hpp +++ b/include/Nazara/Utility/Animation.hpp @@ -9,12 +9,12 @@ #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -33,10 +33,8 @@ struct NAZARA_API NzAnimationParams class NzAnimation; class NzSkeleton; -using NzAnimationConstListener = NzObjectListenerWrapper; using NzAnimationConstRef = NzObjectRef; using NzAnimationLibrary = NzObjectLibrary; -using NzAnimationListener = NzObjectListenerWrapper; using NzAnimationLoader = NzResourceLoader; using NzAnimationManager = NzResourceManager; using NzAnimationRef = NzObjectRef; @@ -89,6 +87,10 @@ class NAZARA_API NzAnimation : public NzRefCounted, public NzResource template static NzAnimationRef New(Args&&... args); + // Signals + NazaraSignal(OnAnimationDestroy, const NzAnimation*); //< Args: me + NazaraSignal(OnAnimationRelease, const NzAnimation*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Utility/Buffer.hpp b/include/Nazara/Utility/Buffer.hpp index bd994cb0c..b34e76e54 100644 --- a/include/Nazara/Utility/Buffer.hpp +++ b/include/Nazara/Utility/Buffer.hpp @@ -9,16 +9,14 @@ #include #include -#include #include #include +#include #include class NzBuffer; -using NzBufferConstListener = NzObjectListenerWrapper; using NzBufferConstRef = NzObjectRef; -using NzBufferListener = NzObjectListenerWrapper; using NzBufferRef = NzObjectRef; class NzAbstractBuffer; @@ -61,6 +59,10 @@ class NAZARA_API NzBuffer : public NzRefCounted, NzNonCopyable template static NzBufferRef New(Args&&... args); static void SetBufferFactory(nzUInt32 storage, BufferFactory func); + // Signals: + NazaraSignal(OnBufferDestroy, const NzBuffer*); //< Args: me + NazaraSignal(OnBufferRelease, const NzBuffer*); //< Args: me + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index 8cbe649f8..944df8eff 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -30,10 +29,8 @@ class NzFontData; struct NzFontGlyph; -using NzFontConstListener = NzObjectListenerWrapper; using NzFontConstRef = NzObjectRef; using NzFontLibrary = NzObjectLibrary; -using NzFontListener = NzObjectListenerWrapper; using NzFontLoader = NzResourceLoader; using NzFontRef = NzObjectRef; @@ -117,6 +114,7 @@ class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzNonCopyable NazaraSignal(OnFontAtlasChanged, const NzFont*); //< Args: me NazaraSignal(OnFontAtlasLayerChanged, const NzFont*); //< Args: me + NazaraSignal(OnFontDestroy, const NzFont*); //< Args: me NazaraSignal(OnFontGlyphCacheCleared, const NzFont*); //< Args: me NazaraSignal(OnFontKerningCacheCleared, const NzFont*); //< Args: me NazaraSignal(OnFontRelease, const NzFont*); //< Args: me diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index d5376d5da..9cf8a6cfd 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -11,12 +11,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -36,10 +36,8 @@ struct NAZARA_API NzImageParams class NzImage; -using NzImageConstListener = NzObjectListenerWrapper; using NzImageConstRef = NzObjectRef; using NzImageLibrary = NzObjectLibrary; -using NzImageListener = NzObjectListenerWrapper; using NzImageLoader = NzResourceLoader; using NzImageManager = NzResourceManager; using NzImageRef = NzObjectRef; @@ -148,6 +146,10 @@ class NAZARA_API NzImage : public NzAbstractImage, public NzRefCounted, public N static SharedImage emptyImage; + // Signals: + NazaraSignal(OnImageDestroy, const NzImage*); //< Args: me + NazaraSignal(OnImageRelease, const NzImage*); //< Args: me + private: void EnsureOwnership(); void ReleaseImage(); diff --git a/include/Nazara/Utility/IndexBuffer.hpp b/include/Nazara/Utility/IndexBuffer.hpp index d4c02e506..809b81453 100644 --- a/include/Nazara/Utility/IndexBuffer.hpp +++ b/include/Nazara/Utility/IndexBuffer.hpp @@ -8,16 +8,13 @@ #define NAZARA_INDEXBUFFER_HPP #include -#include #include #include #include class NzIndexBuffer; -using NzIndexBufferConstListener = NzObjectListenerWrapper; using NzIndexBufferConstRef = NzObjectRef; -using NzIndexBufferListener = NzObjectListenerWrapper; using NzIndexBufferRef = NzObjectRef; class NAZARA_API NzIndexBuffer : public NzRefCounted @@ -68,7 +65,7 @@ class NAZARA_API NzIndexBuffer : public NzRefCounted template static NzIndexBufferRef New(Args&&... args); // Signals - NazaraSignal(OnIndexBufferRelease, const NzIndexBuffer*); //< me + NazaraSignal(OnIndexBufferRelease, const NzIndexBuffer*); //< Args: me private: NzBufferRef m_buffer; diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index cf96790e7..e4e64a323 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -54,10 +53,8 @@ class NzPrimitiveList; typedef NzVertexStruct_XYZ_Normal_UV_Tangent NzMeshVertex; typedef NzVertexStruct_XYZ_Normal_UV_Tangent_Skinning NzSkeletalMeshVertex; -using NzMeshConstListener = NzObjectListenerWrapper; using NzMeshConstRef = NzObjectRef; using NzMeshLibrary = NzObjectLibrary; -using NzMeshListener = NzObjectListenerWrapper; using NzMeshLoader = NzResourceLoader; using NzMeshManager = NzResourceManager; using NzMeshRef = NzObjectRef; @@ -131,6 +128,10 @@ class NAZARA_API NzMesh : public NzRefCounted, public NzResource template static NzMeshRef New(Args&&... args); + // Signals: + NazaraSignal(OnMeshDestroy, const NzMesh*); //< Args: me + NazaraSignal(OnMeshRelease, const NzMesh*); //< Args: me + private: NzMeshImpl* m_impl = nullptr; diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index a66ff6469..92dfb240e 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -8,7 +8,6 @@ #define NAZARA_SIMPLETEXTDRAWER_HPP #include -#include #include #include #include @@ -21,7 +20,7 @@ class NAZARA_API NzSimpleTextDrawer : public NzAbstractTextDrawer NzSimpleTextDrawer(); NzSimpleTextDrawer(const NzSimpleTextDrawer& drawer); NzSimpleTextDrawer(NzSimpleTextDrawer&&) = default; - virtual ~NzSimpleTextDrawer() = default; + virtual ~NzSimpleTextDrawer(); const NzRectui& GetBounds() const; unsigned int GetCharacterSize() const; diff --git a/include/Nazara/Utility/SkeletalMesh.hpp b/include/Nazara/Utility/SkeletalMesh.hpp index 3d3ade40b..7a916ac4a 100644 --- a/include/Nazara/Utility/SkeletalMesh.hpp +++ b/include/Nazara/Utility/SkeletalMesh.hpp @@ -8,15 +8,13 @@ #define NAZARA_SKELETALMESH_HPP #include -#include #include +#include #include class NzSkeletalMesh; -using NzSkeletalMeshConstListener = NzObjectListenerWrapper; using NzSkeletalMeshConstRef = NzObjectRef; -using NzSkeletalMeshListener = NzObjectListenerWrapper; using NzSkeletalMeshRef = NzObjectRef; class NAZARA_API NzSkeletalMesh final : public NzSubMesh @@ -43,6 +41,10 @@ class NAZARA_API NzSkeletalMesh final : public NzSubMesh template static NzSkeletalMeshRef New(Args&&... args); + // Signals: + NazaraSignal(OnSkeletalMeshDestroy, const NzSkeletalMesh*); //< Args: me + NazaraSignal(OnSkeletalMeshRelease, const NzSkeletalMesh*); //< Args: me + private: NzBoxf m_aabb; NzIndexBufferConstRef m_indexBuffer = nullptr; diff --git a/include/Nazara/Utility/Skeleton.hpp b/include/Nazara/Utility/Skeleton.hpp index e91dc897f..001145213 100644 --- a/include/Nazara/Utility/Skeleton.hpp +++ b/include/Nazara/Utility/Skeleton.hpp @@ -9,19 +9,17 @@ #include #include -#include #include #include +#include #include #include #include class NzSkeleton; -using NzSkeletonConstListener = NzObjectListenerWrapper; using NzSkeletonConstRef = NzObjectRef; using NzSkeletonLibrary = NzObjectLibrary; -using NzSkeletonListener = NzObjectListenerWrapper; using NzSkeletonRef = NzObjectRef; struct NzSkeletonImpl; @@ -59,6 +57,11 @@ class NAZARA_API NzSkeleton : public NzRefCounted template static NzSkeletonRef New(Args&&... args); + // Signals: + NazaraSignal(OnSkeletonDestroy, const NzSkeleton*); //< Args: me + NazaraSignal(OnSkeletonJointsInvalidated, const NzSkeleton*); //< Args: me + NazaraSignal(OnSkeletonRelease, const NzSkeleton*); //< Args: me + private: void InvalidateJoints(); void InvalidateJointMap(); diff --git a/include/Nazara/Utility/StaticMesh.hpp b/include/Nazara/Utility/StaticMesh.hpp index b991507cd..a3c9fb6bf 100644 --- a/include/Nazara/Utility/StaticMesh.hpp +++ b/include/Nazara/Utility/StaticMesh.hpp @@ -8,15 +8,12 @@ #define NAZARA_STATICMESH_HPP #include -#include -#include +#include #include class NzStaticMesh; -using NzStaticMeshConstListener = NzObjectListenerWrapper; using NzStaticMeshConstRef = NzObjectRef; -using NzStaticMeshListener = NzObjectListenerWrapper; using NzStaticMeshRef = NzObjectRef; class NAZARA_API NzStaticMesh final : public NzSubMesh @@ -47,6 +44,10 @@ class NAZARA_API NzStaticMesh final : public NzSubMesh template static NzStaticMeshRef New(Args&&... args); + // Signals: + NazaraSignal(OnStaticMeshDestroy, const NzStaticMesh*); //< Args: me + NazaraSignal(OnStaticMeshRelease, const NzStaticMesh*); //< Args: me + private: NzBoxf m_aabb; NzIndexBufferConstRef m_indexBuffer = nullptr; diff --git a/include/Nazara/Utility/SubMesh.hpp b/include/Nazara/Utility/SubMesh.hpp index c14391e00..74f67467e 100644 --- a/include/Nazara/Utility/SubMesh.hpp +++ b/include/Nazara/Utility/SubMesh.hpp @@ -8,7 +8,6 @@ #define NAZARA_SUBMESH_HPP #include -#include #include #include #include @@ -20,9 +19,7 @@ class NzMesh; class NzSubMesh; -using NzSubMeshConstListener = NzObjectListenerWrapper; using NzSubMeshConstRef = NzObjectRef; -using NzSubMeshListener = NzObjectListenerWrapper; using NzSubMeshRef = NzObjectRef; class NAZARA_API NzSubMesh : public NzRefCounted @@ -51,6 +48,9 @@ class NAZARA_API NzSubMesh : public NzRefCounted void SetMaterialIndex(unsigned int matIndex); void SetPrimitiveMode(nzPrimitiveMode mode); + // Signals: + NazaraSignal(OnSubMeshRelease, const NzSubMesh*); //< Args: me + protected: nzPrimitiveMode m_primitiveMode; const NzMesh* m_parent; diff --git a/include/Nazara/Utility/VertexBuffer.hpp b/include/Nazara/Utility/VertexBuffer.hpp index 3f7b24654..e10f701b0 100644 --- a/include/Nazara/Utility/VertexBuffer.hpp +++ b/include/Nazara/Utility/VertexBuffer.hpp @@ -8,7 +8,6 @@ #define NAZARA_VERTEXBUFFER_HPP #include -#include #include #include #include @@ -17,9 +16,7 @@ class NzVertexBuffer; -using NzVertexBufferConstListener = NzObjectListenerWrapper; using NzVertexBufferConstRef = NzObjectRef; -using NzVertexBufferListener = NzObjectListenerWrapper; using NzVertexBufferRef = NzObjectRef; class NAZARA_API NzVertexBuffer : public NzRefCounted @@ -66,7 +63,7 @@ class NAZARA_API NzVertexBuffer : public NzRefCounted template static NzVertexBufferRef New(Args&&... args); // Signals - NazaraSignal(OnVertexBufferRelease, const NzVertexBuffer*); //< me + NazaraSignal(OnVertexBufferRelease, const NzVertexBuffer*); //< Args: me private: NzBufferRef m_buffer; diff --git a/include/Nazara/Utility/VertexDeclaration.hpp b/include/Nazara/Utility/VertexDeclaration.hpp index fcfd2e70a..68d73ad4a 100644 --- a/include/Nazara/Utility/VertexDeclaration.hpp +++ b/include/Nazara/Utility/VertexDeclaration.hpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -17,10 +16,8 @@ class NzVertexDeclaration; -using NzVertexDeclarationConstListener = NzObjectListenerWrapper; using NzVertexDeclarationConstRef = NzObjectRef; using NzVertexDeclarationLibrary = NzObjectLibrary; -using NzVertexDeclarationListener = NzObjectListenerWrapper; using NzVertexDeclarationRef = NzObjectRef; class NAZARA_API NzVertexDeclaration : public NzRefCounted @@ -48,7 +45,7 @@ class NAZARA_API NzVertexDeclaration : public NzRefCounted template static NzVertexDeclarationRef New(Args&&... args); // Signals - NazaraSignal(OnVertexDeclarationRelease, const NzVertexDeclaration*); //< me + NazaraSignal(OnVertexDeclarationRelease, const NzVertexDeclaration*); //< Args: me private: static bool Initialize(); diff --git a/src/Nazara/Audio/SoundBuffer.cpp b/src/Nazara/Audio/SoundBuffer.cpp index dc83b2380..d1d02cd65 100644 --- a/src/Nazara/Audio/SoundBuffer.cpp +++ b/src/Nazara/Audio/SoundBuffer.cpp @@ -44,6 +44,8 @@ NzSoundBuffer::NzSoundBuffer(nzAudioFormat format, unsigned int sampleCount, uns NzSoundBuffer::~NzSoundBuffer() { + OnSoundBufferRelease(this); + Destroy(); } @@ -108,7 +110,6 @@ bool NzSoundBuffer::Create(nzAudioFormat format, unsigned int sampleCount, unsig m_impl->samples.reset(new nzInt16[sampleCount]); std::memcpy(&m_impl->samples[0], samples, sampleCount*sizeof(nzInt16)); - NotifyCreated(); return true; } @@ -116,7 +117,7 @@ void NzSoundBuffer::Destroy() { if (m_impl) { - NotifyDestroy(); + OnSoundBufferDestroy(this); delete m_impl; m_impl = nullptr; diff --git a/src/Nazara/Core/ObjectListener.cpp b/src/Nazara/Core/ObjectListener.cpp deleted file mode 100644 index bedca61c2..000000000 --- a/src/Nazara/Core/ObjectListener.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Core module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -NzObjectListener::~NzObjectListener() = default; - -bool NzObjectListener::OnObjectCreated(const NzRefCounted* object, int index) -{ - NazaraUnused(object); - NazaraUnused(index); - - return true; -} - -bool NzObjectListener::OnObjectDestroy(const NzRefCounted* object, int index) -{ - NazaraUnused(object); - NazaraUnused(index); - - return true; -} - -bool NzObjectListener::OnObjectModified(const NzRefCounted* object, int index, unsigned int code) -{ - NazaraUnused(object); - NazaraUnused(index); - NazaraUnused(code); - - return true; -} - -void NzObjectListener::OnObjectReleased(const NzRefCounted* object, int index) -{ - NazaraUnused(object); - NazaraUnused(index); -} diff --git a/src/Nazara/Core/RefCounted.cpp b/src/Nazara/Core/RefCounted.cpp index 55c487c0d..0598fc5d1 100644 --- a/src/Nazara/Core/RefCounted.cpp +++ b/src/Nazara/Core/RefCounted.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_REFCOUNTED #include @@ -17,36 +16,18 @@ NzRefCounted::NzRefCounted(bool persistent) : m_persistent(persistent), -m_referenceCount(0), -m_objectListenersLocked(false) +m_referenceCount(0) { } NzRefCounted::~NzRefCounted() { - m_objectListenersLocked = true; - for (auto& pair : m_objectListeners) - pair.first->OnObjectReleased(this, pair.second.first); - #if NAZARA_CORE_SAFE if (m_referenceCount > 0) NazaraWarning("Resource destroyed while still referenced " + NzString::Number(m_referenceCount) + " time(s)"); #endif } -void NzRefCounted::AddObjectListener(NzObjectListener* listener, int index) const -{ - ///DOC: Est ignoré si appelé depuis un évènement - NazaraLock(m_mutex) - - if (!m_objectListenersLocked) - { - auto pair = m_objectListeners.insert(std::make_pair(listener, std::make_pair(index, 1U))); - if (!pair.second) - pair.first->second.second++; - } -} - void NzRefCounted::AddReference() const { m_referenceCount++; @@ -62,23 +43,6 @@ bool NzRefCounted::IsPersistent() const return m_persistent; } -void NzRefCounted::RemoveObjectListener(NzObjectListener* listener) const -{ - ///DOC: Est ignoré si appelé depuis un évènement - NazaraLock(m_mutex); - - if (!m_objectListenersLocked) - { - ObjectListenerMap::iterator it = m_objectListeners.find(listener); - if (it != m_objectListeners.end()) - { - unsigned int& referenceCount = it->second.second; - if (--referenceCount == 0) - m_objectListeners.erase(it); - } - } -} - bool NzRefCounted::RemoveReference() const { #if NAZARA_CORE_SAFE @@ -113,56 +77,3 @@ bool NzRefCounted::SetPersistent(bool persistent, bool checkReferenceCount) return false; } -void NzRefCounted::NotifyCreated() -{ - NazaraLock(m_mutex) - - m_objectListenersLocked = true; - - auto it = m_objectListeners.begin(); - while (it != m_objectListeners.end()) - { - if (!it->first->OnObjectCreated(this, it->second.first)) - m_objectListeners.erase(it++); - else - ++it; - } - - m_objectListenersLocked = false; -} - -void NzRefCounted::NotifyDestroy() -{ - NazaraLock(m_mutex) - - m_objectListenersLocked = true; - - auto it = m_objectListeners.begin(); - while (it != m_objectListeners.end()) - { - if (!it->first->OnObjectDestroy(this, it->second.first)) - m_objectListeners.erase(it++); - else - ++it; - } - - m_objectListenersLocked = false; -} - -void NzRefCounted::NotifyModified(unsigned int code) -{ - NazaraLock(m_mutex) - - m_objectListenersLocked = true; - - auto it = m_objectListeners.begin(); - while (it != m_objectListeners.end()) - { - if (!it->first->OnObjectModified(this, it->second.first, code)) - m_objectListeners.erase(it++); - else - ++it; - } - - m_objectListenersLocked = false; -} diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index abd5ac816..ce569a127 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -375,7 +375,7 @@ bool NzMaterial::LoadFromStream(NzInputStream& stream, const NzMaterialParams& p void NzMaterial::Reset() { - NotifyDestroy(); + OnMaterialReset(this); m_alphaMap.Reset(); m_diffuseMap.Reset(); diff --git a/src/Nazara/Graphics/ParticleController.cpp b/src/Nazara/Graphics/ParticleController.cpp index 45173aa0c..53f43e175 100644 --- a/src/Nazara/Graphics/ParticleController.cpp +++ b/src/Nazara/Graphics/ParticleController.cpp @@ -11,7 +11,10 @@ NzRefCounted() NazaraUnused(controller); } -NzParticleController::~NzParticleController() = default; +NzParticleController::~NzParticleController() +{ + OnParticleControllerRelease(this); +} bool NzParticleController::Initialize() { diff --git a/src/Nazara/Graphics/ParticleDeclaration.cpp b/src/Nazara/Graphics/ParticleDeclaration.cpp index 9804826c2..fc2c55c39 100644 --- a/src/Nazara/Graphics/ParticleDeclaration.cpp +++ b/src/Nazara/Graphics/ParticleDeclaration.cpp @@ -27,7 +27,7 @@ m_stride(declaration.m_stride) NzParticleDeclaration::~NzParticleDeclaration() { - NotifyDestroy(); + OnParticleDeclarationRelease(this); } void NzParticleDeclaration::DisableComponent(nzParticleComponent component) diff --git a/src/Nazara/Graphics/ParticleGenerator.cpp b/src/Nazara/Graphics/ParticleGenerator.cpp index 6dc83a6c0..4f12d7e95 100644 --- a/src/Nazara/Graphics/ParticleGenerator.cpp +++ b/src/Nazara/Graphics/ParticleGenerator.cpp @@ -11,7 +11,10 @@ NzRefCounted() NazaraUnused(generator); } -NzParticleGenerator::~NzParticleGenerator() = default; +NzParticleGenerator::~NzParticleGenerator() +{ + OnParticleGeneratorRelease(this); +} bool NzParticleGenerator::Initialize() { diff --git a/src/Nazara/Graphics/ParticleRenderer.cpp b/src/Nazara/Graphics/ParticleRenderer.cpp index 8ef7cd31b..3102671ce 100644 --- a/src/Nazara/Graphics/ParticleRenderer.cpp +++ b/src/Nazara/Graphics/ParticleRenderer.cpp @@ -11,7 +11,10 @@ NzRefCounted() NazaraUnused(renderer); } -NzParticleRenderer::~NzParticleRenderer() = default; +NzParticleRenderer::~NzParticleRenderer() +{ + OnParticleRendererRelease(this); +} bool NzParticleRenderer::Initialize() { diff --git a/src/Nazara/Graphics/Renderable.cpp b/src/Nazara/Graphics/Renderable.cpp index ee6b95b27..59956362b 100644 --- a/src/Nazara/Graphics/Renderable.cpp +++ b/src/Nazara/Graphics/Renderable.cpp @@ -5,7 +5,10 @@ #include #include -NzRenderable::~NzRenderable() = default; +NzRenderable::~NzRenderable() +{ + OnRenderableRelease(this); +} bool NzRenderable::Cull(const NzFrustumf& frustum, const NzBoundingVolumef& volume, const NzMatrix4f& transformMatrix) const { diff --git a/src/Nazara/Graphics/SkinningManager.cpp b/src/Nazara/Graphics/SkinningManager.cpp index 103c41b70..b9189f7cd 100644 --- a/src/Nazara/Graphics/SkinningManager.cpp +++ b/src/Nazara/Graphics/SkinningManager.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -16,92 +15,35 @@ namespace { - enum ObjectType - { - ObjectType_SkeletalMesh, - ObjectType_Skeleton, - }; - struct BufferData { + NazaraSlot(NzSkeletalMesh, OnSkeletalMeshDestroy, skeletalMeshDestroySlot); + NzVertexBufferRef buffer; bool updated; }; - struct SkinningData - { - const NzSkeletalMesh* mesh; - const NzSkeleton* skeleton; - NzVertexBuffer* buffer; - }; + using MeshMap = std::unordered_map; - using MeshMap = std::unordered_map>; - using SkeletonMap = std::unordered_map>; + struct MeshData + { + NazaraSlot(NzSkeleton, OnSkeletonDestroy, skeletonDestroySlot); + NazaraSlot(NzSkeleton, OnSkeletonJointsInvalidated, skeletonJointsInvalidatedSlot); + + MeshMap meshMap; + }; + + struct SkinningData + { + const NzSkeletalMesh* mesh; + const NzSkeleton* skeleton; + NzVertexBuffer* buffer; + }; + + using SkeletonMap = std::unordered_map; SkeletonMap s_cache; std::vector s_skinningQueue; - class ObjectListener : public NzObjectListener - { - public: - bool OnObjectDestroy(const NzRefCounted* object, int index) override - { - switch (index) - { - case ObjectType_SkeletalMesh: - { - for (auto& pair : s_cache) - { - MeshMap& meshMap = pair.second.second; - meshMap.erase(static_cast(object)); - } - break; - } - - case ObjectType_Skeleton: - s_cache.erase(static_cast(object)); - break; - } - - return false; - } - - bool OnObjectModified(const NzRefCounted* object, int index, unsigned int code) override - { - NazaraUnused(code); - - switch (index) - { - case ObjectType_SkeletalMesh: - { - for (auto& pair : s_cache) - { - MeshMap& meshMap = pair.second.second; - for (auto& pair2 : meshMap) - pair2.second.second.updated = false; - } - break; - } - - case ObjectType_Skeleton: - { - const NzSkeleton* skeleton = static_cast(object); - for (auto& pair : s_cache.at(skeleton).second) - pair.second.second.updated = false; - - break; - } - } - - return true; - } - - void OnObjectReleased(const NzRefCounted* resource, int index) override - { - OnObjectDestroy(resource, index); - } - }; - - ObjectListener listener; void Skin_MonoCPU(const NzSkeletalMesh* mesh, const NzSkeleton* skeleton, NzVertexBuffer* buffer) { @@ -163,18 +105,28 @@ NzVertexBuffer* NzSkinningManager::GetBuffer(const NzSkeletalMesh* mesh, const N SkeletonMap::iterator it = s_cache.find(skeleton); if (it == s_cache.end()) - it = s_cache.insert(std::make_pair(skeleton, std::make_pair(NzSkeletonConstListener(&listener, ObjectType_Skeleton, skeleton), MeshMap{}))).first; + { + MeshData meshData; + meshData.skeletonDestroySlot.Connect(skeleton->OnSkeletonDestroy, OnSkeletonRelease); + meshData.skeletonJointsInvalidatedSlot.Connect(skeleton->OnSkeletonJointsInvalidated, OnSkeletonInvalidated); + + it = s_cache.insert(std::make_pair(skeleton, std::move(meshData))).first; + } NzVertexBuffer* buffer; - MeshMap& meshMap = it->second.second; + MeshMap& meshMap = it->second.meshMap; MeshMap::iterator it2 = meshMap.find(mesh); if (it2 == meshMap.end()) { NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), mesh->GetVertexCount(), nzDataStorage_Hardware, nzBufferUsage_Dynamic); - BufferData data({vertexBuffer, true}); - meshMap.insert(std::make_pair(mesh, std::make_pair(NzSkeletalMeshConstListener(&listener, ObjectType_SkeletalMesh, mesh), data))); + BufferData data; + data.skeletalMeshDestroySlot.Connect(mesh->OnSkeletalMeshDestroy, OnSkeletalMeshDestroy); + data.buffer = vertexBuffer; + data.updated = true; + + meshMap.insert(std::make_pair(mesh, std::move(data))); s_skinningQueue.push_back(SkinningData{mesh, skeleton, vertexBuffer}); @@ -182,7 +134,7 @@ NzVertexBuffer* NzSkinningManager::GetBuffer(const NzSkeletalMesh* mesh, const N } else { - BufferData& data = it2->second.second; + BufferData& data = it2->second; if (!data.updated) { s_skinningQueue.push_back(SkinningData{mesh, skeleton, data.buffer}); @@ -214,6 +166,26 @@ bool NzSkinningManager::Initialize() return true; // Rien de particulier à faire } +void NzSkinningManager::OnSkeletalMeshDestroy(const NzSkeletalMesh* mesh) +{ + for (auto& pair : s_cache) + { + MeshMap& meshMap = pair.second.meshMap; + meshMap.erase(mesh); + } +} + +void NzSkinningManager::OnSkeletonInvalidated(const NzSkeleton* skeleton) +{ + for (auto& pair : s_cache.at(skeleton).meshMap) + pair.second.updated = false; +} + +void NzSkinningManager::OnSkeletonRelease(const NzSkeleton* skeleton) +{ + s_cache.erase(skeleton); +} + void NzSkinningManager::Uninitialize() { s_cache.clear(); diff --git a/src/Nazara/Renderer/Context.cpp b/src/Nazara/Renderer/Context.cpp index b66f35a6b..78b8c9ac4 100644 --- a/src/Nazara/Renderer/Context.cpp +++ b/src/Nazara/Renderer/Context.cpp @@ -176,8 +176,6 @@ bool NzContext::Create(const NzContextParameters& parameters) onExit.Reset(); - NotifyCreated(); - return true; } @@ -185,7 +183,7 @@ void NzContext::Destroy() { if (m_impl) { - NotifyDestroy(); + OnContextDestroy(this); NzOpenGL::OnContextDestruction(this); SetActive(false); diff --git a/src/Nazara/Renderer/RenderBuffer.cpp b/src/Nazara/Renderer/RenderBuffer.cpp index 9e6cdb79f..f03bc2f62 100644 --- a/src/Nazara/Renderer/RenderBuffer.cpp +++ b/src/Nazara/Renderer/RenderBuffer.cpp @@ -16,6 +16,8 @@ m_id(0) NzRenderBuffer::~NzRenderBuffer() { + OnRenderBufferRelease(this); + Destroy(); } @@ -67,7 +69,6 @@ bool NzRenderBuffer::Create(nzPixelFormat format, unsigned int width, unsigned i m_id = renderBuffer; m_width = width; - NotifyCreated(); return true; } @@ -75,7 +76,7 @@ void NzRenderBuffer::Destroy() { if (m_id) { - NotifyDestroy(); + OnRenderBufferDestroy(this); NzContext::EnsureContext(); diff --git a/src/Nazara/Renderer/RenderTexture.cpp b/src/Nazara/Renderer/RenderTexture.cpp index af1b136cc..89d0b0d2c 100644 --- a/src/Nazara/Renderer/RenderTexture.cpp +++ b/src/Nazara/Renderer/RenderTexture.cpp @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -19,17 +21,11 @@ namespace { struct Attachment { - Attachment(NzObjectListener* listener, int bufferIndex = 0, int textureIndex = 0) : - bufferListener(listener, bufferIndex), - textureListener(listener, textureIndex) - { - } + NazaraSlot(NzRenderBuffer, OnRenderBufferDestroy, renderBufferDestroySlot); + NazaraSlot(NzTexture, OnTextureDestroy, textureDestroySlot); NzRenderBufferRef buffer; NzTextureRef texture; - // Les listeners doivent se trouver après les références (pour être libérés avant elles) - NzRenderBufferListener bufferListener; - NzTextureListener textureListener; nzAttachmentPoint attachmentPoint; bool isBuffer; @@ -60,16 +56,13 @@ namespace struct NzRenderTextureImpl { - NzRenderTextureImpl(NzObjectListener* listener, int contextIndex = 0) : - context(listener, contextIndex) - { - } + NazaraSlot(NzContext, OnContextDestroy, contextDestroySlot); GLuint fbo; std::vector attachments; std::vector colorTargets; mutable std::vector drawBuffers; - NzContextConstListener context; + const NzContext* context; bool checked = false; bool complete = false; bool userDefinedTargets = false; @@ -155,17 +148,10 @@ bool NzRenderTexture::AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 in Unlock(); unsigned int attachIndex = attachmentIndex[attachmentPoint] + index; - // On créé les attachements si ça n'a pas déjà été fait - for (unsigned int i = m_impl->attachments.size(); i <= attachIndex; ++i) - { - Attachment attachment(this, attachIndex, attachIndex); - m_impl->attachments.emplace_back(std::move(attachment)); - } - Attachment& attachment = m_impl->attachments[attachIndex]; attachment.attachmentPoint = attachmentPoint; attachment.buffer = buffer; - attachment.bufferListener = buffer; + attachment.renderBufferDestroySlot.Connect(buffer->OnRenderBufferDestroy, std::bind(OnRenderBufferDestroy, this, std::placeholders::_1, attachIndex)); attachment.isBuffer = true; attachment.isUsed = true; attachment.height = buffer->GetHeight(); @@ -300,21 +286,13 @@ bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 i Unlock(); unsigned int attachIndex = attachmentIndex[attachmentPoint] + index; - - // On créé les attachements si ça n'a pas déjà été fait - for (unsigned int i = m_impl->attachments.size(); i <= attachIndex; ++i) - { - Attachment attachment(this, attachIndex, attachIndex); - m_impl->attachments.emplace_back(std::move(attachment)); - } - Attachment& attachment = m_impl->attachments[attachIndex]; attachment.attachmentPoint = attachmentPoint; attachment.isBuffer = false; attachment.isUsed = true; attachment.height = texture->GetHeight(); attachment.texture = texture; - attachment.textureListener = texture; + attachment.textureDestroySlot.Connect(texture->OnTextureDestroy, std::bind(OnTextureDestroy, this, std::placeholders::_1, attachIndex)); attachment.width = texture->GetWidth(); m_impl->checked = false; @@ -348,7 +326,7 @@ bool NzRenderTexture::Create(bool lock) } #endif - std::unique_ptr impl(new NzRenderTextureImpl(this)); + std::unique_ptr impl(new NzRenderTextureImpl); impl->fbo = 0; glGenFramebuffers(1, &impl->fbo); @@ -361,6 +339,7 @@ bool NzRenderTexture::Create(bool lock) m_impl = impl.release(); m_impl->context = NzContext::GetCurrent(); + m_impl->contextDestroySlot.Connect(m_impl->context->OnContextDestroy, this, OnContextDestroy); if (lock) { @@ -437,8 +416,8 @@ void NzRenderTexture::Detach(nzAttachmentPoint attachmentPoint, nzUInt8 index) { glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, GL_RENDERBUFFER, 0); - attachement.bufferListener = nullptr; attachement.buffer = nullptr; + attachement.renderBufferDestroySlot.Disconnect(); } else { @@ -447,8 +426,8 @@ void NzRenderTexture::Detach(nzAttachmentPoint attachmentPoint, nzUInt8 index) else glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0, 0); - attachement.textureListener = nullptr; attachement.texture = nullptr; + attachement.textureDestroySlot.Disconnect(); } m_impl->sizeUpdated = false; @@ -887,27 +866,52 @@ void NzRenderTexture::EnsureTargetUpdated() const } } -bool NzRenderTexture::OnObjectDestroy(const NzRefCounted* object, int index) +void NzRenderTexture::OnContextDestroy(const NzContext* context) { - if (object == m_impl->context) - // Notre contexte va être détruit, libérons la RenderTexture pour éviter un éventuel leak - Destroy(); - else // Sinon, c'est une texture + NazaraAssert(m_impl, "Invalid internal state"); + NazaraUnused(context); + + #ifdef NAZARA_DEBUG + if (m_impl->context != context) { - // La ressource n'est plus, du coup nous mettons à jour - Attachment& attachment = m_impl->attachments[index]; - if (attachment.isBuffer) - attachment.buffer = nullptr; - else - attachment.texture = nullptr; - - attachment.isUsed = false; - - m_impl->checked = false; - m_impl->targetsUpdated = false; + NazaraInternalError("Not listening to " + NzString::Pointer(font)); + return; } + #endif - return false; + Destroy(); +} + +void NzRenderTexture::OnRenderBufferDestroy(const NzRenderBuffer* renderBuffer, int attachmentIndex) +{ + NazaraAssert(m_impl, "Invalid internal state"); + NazaraAssert(attachmentIndex < m_impl->attachments.size(), "Invalid attachment index"); + NazaraAssert(m_impl->attachments[attachmentIndex].isBuffer, "Invalid attachment state"); + NazaraUnused(renderBuffer); + + Attachment& attachment = m_impl->attachments[attachmentIndex]; + attachment.buffer = nullptr; + attachment.isUsed = false; + attachment.renderBufferDestroySlot.Disconnect(); + + m_impl->checked = false; + m_impl->targetsUpdated = false; +} + +void NzRenderTexture::OnTextureDestroy(const NzTexture* texture, int attachmentIndex) +{ + NazaraAssert(m_impl, "Invalid internal state"); + NazaraAssert(attachmentIndex < m_impl->attachments.size(), "Invalid attachment index"); + NazaraAssert(!m_impl->attachments[attachmentIndex].isBuffer, "Invalid attachment state"); + NazaraUnused(texture); + + Attachment& attachment = m_impl->attachments[attachmentIndex]; + attachment.isUsed = false; + attachment.texture = nullptr; + attachment.textureDestroySlot.Disconnect(); + + m_impl->checked = false; + m_impl->targetsUpdated = false; } void NzRenderTexture::UpdateDrawBuffers() const diff --git a/src/Nazara/Renderer/Shader.cpp b/src/Nazara/Renderer/Shader.cpp index a865e690e..1b45b9789 100644 --- a/src/Nazara/Renderer/Shader.cpp +++ b/src/Nazara/Renderer/Shader.cpp @@ -178,9 +178,14 @@ bool NzShader::Create() void NzShader::Destroy() { - NzContext::EnsureContext(); + if (m_program) + { + OnShaderDestroy(this); - NzOpenGL::DeleteProgram(m_program); + NzContext::EnsureContext(); + NzOpenGL::DeleteProgram(m_program); + m_program = 0; + } } NzByteArray NzShader::GetBinary() const diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index 330171f28..303b983fa 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -202,8 +202,6 @@ bool NzTexture::Create(nzImageType type, nzPixelFormat format, unsigned int widt } onExit.Reset(); - - NotifyCreated(); return true; } @@ -211,7 +209,7 @@ void NzTexture::Destroy() { if (m_impl) { - NotifyDestroy(); + OnTextureDestroy(this); NzContext::EnsureContext(); NzOpenGL::DeleteTexture(m_impl->id); diff --git a/src/Nazara/Renderer/UberShader.cpp b/src/Nazara/Renderer/UberShader.cpp index ac2b23d3a..3477354d0 100644 --- a/src/Nazara/Renderer/UberShader.cpp +++ b/src/Nazara/Renderer/UberShader.cpp @@ -5,7 +5,10 @@ #include #include -NzUberShader::~NzUberShader() = default; +NzUberShader::~NzUberShader() +{ + OnUberShaderRelease(this); +} bool NzUberShader::Initialize() { diff --git a/src/Nazara/Renderer/UberShaderPreprocessor.cpp b/src/Nazara/Renderer/UberShaderPreprocessor.cpp index efcc492c5..430181678 100644 --- a/src/Nazara/Renderer/UberShaderPreprocessor.cpp +++ b/src/Nazara/Renderer/UberShaderPreprocessor.cpp @@ -10,6 +10,11 @@ #include #include +NzUberShaderPreprocessor::~NzUberShaderPreprocessor() +{ + OnUberShaderPreprocessorRelease(this); +} + NzUberShaderInstance* NzUberShaderPreprocessor::Get(const NzParameterList& parameters) const { // Première étape, transformer les paramètres en un flag diff --git a/src/Nazara/Utility/Animation.cpp b/src/Nazara/Utility/Animation.cpp index 2c1995afc..9e0047442 100644 --- a/src/Nazara/Utility/Animation.cpp +++ b/src/Nazara/Utility/Animation.cpp @@ -34,7 +34,7 @@ bool NzAnimationParams::IsValid() const NzAnimation::~NzAnimation() { - Destroy(); + OnAnimationRelease(this); } bool NzAnimation::AddSequence(const NzSequence& sequence) @@ -172,7 +172,6 @@ bool NzAnimation::CreateSkeletal(unsigned int frameCount, unsigned int jointCoun m_impl->sequenceJoints.resize(frameCount*jointCount); m_impl->type = nzAnimationType_Skeletal; - NotifyCreated(); return true; } @@ -180,7 +179,7 @@ void NzAnimation::Destroy() { if (m_impl) { - NotifyDestroy(); + OnAnimationDestroy(this); delete m_impl; m_impl = nullptr; diff --git a/src/Nazara/Utility/Buffer.cpp b/src/Nazara/Utility/Buffer.cpp index dae34312e..82eee5e88 100644 --- a/src/Nazara/Utility/Buffer.cpp +++ b/src/Nazara/Utility/Buffer.cpp @@ -40,6 +40,8 @@ m_impl(nullptr) NzBuffer::~NzBuffer() { + OnBufferRelease(this); + Destroy(); } @@ -86,7 +88,6 @@ bool NzBuffer::Create(unsigned int size, nzUInt32 storage, nzBufferUsage usage) m_storage = storage; m_usage = usage; - NotifyCreated(); return true; // Si on arrive ici c'est que tout s'est bien passé. } @@ -94,7 +95,7 @@ void NzBuffer::Destroy() { if (m_impl) { - NotifyDestroy(); + OnBufferDestroy(this); m_impl->Destroy(); delete m_impl; diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 7d9935b2b..f30473531 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -90,17 +90,21 @@ bool NzFont::Create(NzFontData* data) #endif m_data.reset(data); - return true; } void NzFont::Destroy() { - ClearGlyphCache(); + if (m_data) + { + OnFontDestroy(this); - m_data.reset(); - m_kerningCache.clear(); - m_sizeInfoCache.clear(); + ClearGlyphCache(); + + m_data.reset(); + m_kerningCache.clear(); + m_sizeInfoCache.clear(); + } } bool NzFont::ExtractGlyph(unsigned int characterSize, char32_t character, nzUInt32 style, NzFontGlyph* glyph) const diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index 7b3f43bda..02abed154 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -65,6 +65,8 @@ m_sharedImage(sharedImage) NzImage::~NzImage() { + OnImageRelease(this); + Destroy(); } @@ -306,7 +308,6 @@ bool NzImage::Create(nzImageType type, nzPixelFormat format, unsigned int width, m_sharedImage = new SharedImage(1, type, format, levelCount, levels, width, height, depth); - NotifyCreated(); return true; } @@ -314,7 +315,7 @@ void NzImage::Destroy() { if (m_sharedImage != &emptyImage) { - NotifyDestroy(); + OnImageDestroy(this); ReleaseImage(); } } diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 6194cdc53..b0ff758aa 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -66,6 +66,8 @@ struct NzMeshImpl NzMesh::~NzMesh() { + OnMeshRelease(this); + Destroy(); } @@ -359,7 +361,6 @@ bool NzMesh::CreateSkeletal(unsigned int jointCount) return false; } - NotifyCreated(); return true; } @@ -370,7 +371,6 @@ bool NzMesh::CreateStatic() m_impl = new NzMeshImpl; m_impl->animationType = nzAnimationType_Static; - NotifyCreated(); return true; } @@ -378,7 +378,7 @@ void NzMesh::Destroy() { if (m_impl) { - NotifyDestroy(); + OnMeshDestroy(this); delete m_impl; m_impl = nullptr; diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 1b5f89d3f..1b38c42a8 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -24,6 +24,8 @@ m_characterSize(drawer.m_characterSize) SetFont(drawer.m_font); } +NzSimpleTextDrawer::~NzSimpleTextDrawer() = default; + const NzRectui& NzSimpleTextDrawer::GetBounds() const { if (!m_glyphUpdated) diff --git a/src/Nazara/Utility/SkeletalMesh.cpp b/src/Nazara/Utility/SkeletalMesh.cpp index 5604bb4d8..6660a4c33 100644 --- a/src/Nazara/Utility/SkeletalMesh.cpp +++ b/src/Nazara/Utility/SkeletalMesh.cpp @@ -16,6 +16,8 @@ NzSubMesh(parent) NzSkeletalMesh::~NzSkeletalMesh() { + OnSkeletalMeshRelease(this); + Destroy(); } @@ -39,7 +41,7 @@ void NzSkeletalMesh::Destroy() { if (m_vertexBuffer) { - NotifyDestroy(); + OnSkeletalMeshDestroy(this); m_indexBuffer.Reset(); m_vertexBuffer.Reset(); diff --git a/src/Nazara/Utility/Skeleton.cpp b/src/Nazara/Utility/Skeleton.cpp index a12fe4ae9..7a5cea3a2 100644 --- a/src/Nazara/Utility/Skeleton.cpp +++ b/src/Nazara/Utility/Skeleton.cpp @@ -24,6 +24,8 @@ m_impl(nullptr) NzSkeleton::~NzSkeleton() { + OnSkeletonRelease(this); + Destroy(); } @@ -47,6 +49,8 @@ void NzSkeleton::Destroy() { if (m_impl) { + OnSkeletonDestroy(this); + delete m_impl; m_impl = nullptr; } @@ -372,7 +376,8 @@ NzSkeleton& NzSkeleton::operator=(const NzSkeleton& skeleton) void NzSkeleton::InvalidateJoints() { m_impl->aabbUpdated = false; - NotifyModified(0); + + OnSkeletonJointsInvalidated(this); } void NzSkeleton::InvalidateJointMap() diff --git a/src/Nazara/Utility/StaticMesh.cpp b/src/Nazara/Utility/StaticMesh.cpp index 14d5459d1..8beebd356 100644 --- a/src/Nazara/Utility/StaticMesh.cpp +++ b/src/Nazara/Utility/StaticMesh.cpp @@ -18,6 +18,8 @@ NzSubMesh(parent) NzStaticMesh::~NzStaticMesh() { + OnStaticMeshRelease(this); + Destroy(); } @@ -57,7 +59,7 @@ void NzStaticMesh::Destroy() { if (m_vertexBuffer) { - NotifyDestroy(); + OnStaticMeshDestroy(this); m_indexBuffer.Reset(); m_vertexBuffer.Reset(); diff --git a/src/Nazara/Utility/SubMesh.cpp b/src/Nazara/Utility/SubMesh.cpp index 224a89e94..c0deae362 100644 --- a/src/Nazara/Utility/SubMesh.cpp +++ b/src/Nazara/Utility/SubMesh.cpp @@ -20,7 +20,10 @@ m_matIndex(0) { } -NzSubMesh::~NzSubMesh() = default; +NzSubMesh::~NzSubMesh() +{ + OnSubMeshRelease(this); +} void NzSubMesh::GenerateNormals() {