diff --git a/SDK/include/NDK/Components/CameraComponent.inl b/SDK/include/NDK/Components/CameraComponent.inl index 89dab5c8f..65732e285 100644 --- a/SDK/include/NDK/Components/CameraComponent.inl +++ b/SDK/include/NDK/Components/CameraComponent.inl @@ -140,9 +140,9 @@ namespace Ndk { m_target = renderTarget; if (m_target) - m_targetReleaseSlot = NazaraConnectThis(*m_target, OnRenderTargetRelease, OnRenderTargetRelease); + m_targetReleaseSlot.Connect(m_target->OnRenderTargetRelease, this, OnRenderTargetRelease); else - NazaraDisconnect(m_targetReleaseSlot); + m_targetReleaseSlot.Disconnect(); } inline void CameraComponent::SetTargetRegion(const NzRectf& region) diff --git a/SDK/src/NDK/Components/CameraComponent.cpp b/SDK/src/NDK/Components/CameraComponent.cpp index ae32ef04d..d46ff1d9a 100644 --- a/SDK/src/NDK/Components/CameraComponent.cpp +++ b/SDK/src/NDK/Components/CameraComponent.cpp @@ -47,7 +47,7 @@ namespace Ndk void CameraComponent::OnAttached() { if (m_entity->HasComponent()) - m_nodeInvalidationSlot = NazaraConnectThis(m_entity->GetComponent(), OnNodeInvalidation, OnNodeInvalidated); + m_nodeInvalidationSlot.Connect(m_entity->GetComponent().OnNodeInvalidation, this, OnNodeInvalidated); InvalidateViewMatrix(); } @@ -57,7 +57,7 @@ namespace Ndk if (IsComponent(component)) { NodeComponent& nodeComponent = static_cast(component); - m_nodeInvalidationSlot = NazaraConnectThis(nodeComponent, OnNodeInvalidation, OnNodeInvalidated); + m_nodeInvalidationSlot.Connect(nodeComponent.OnNodeInvalidation, this, OnNodeInvalidated); InvalidateViewMatrix(); } @@ -67,8 +67,7 @@ namespace Ndk { if (IsComponent(component)) { - NodeComponent& nodeComponent = static_cast(component); - NazaraDisconnect(m_nodeInvalidationSlot); + m_nodeInvalidationSlot.Disconnect(); InvalidateViewMatrix(); } @@ -76,7 +75,7 @@ namespace Ndk void CameraComponent::OnDetached() { - NazaraDisconnect(m_nodeInvalidationSlot); + m_nodeInvalidationSlot.Disconnect(); InvalidateViewMatrix(); } diff --git a/include/Nazara/Core/Signal.hpp b/include/Nazara/Core/Signal.hpp index 5cde5fdc5..bcb1d4be8 100644 --- a/include/Nazara/Core/Signal.hpp +++ b/include/Nazara/Core/Signal.hpp @@ -17,10 +17,6 @@ #define NazaraSlotType(Class, SignalName) Class::SignalName ## Type::ConnectionGuard #define NazaraSlot(Class, SignalName, SlotName) NazaraSlotType(Class, SignalName) SlotName -#define NazaraConnect(Instance, SignalName, Callback) (Instance).SignalName.Connect(Callback) -#define NazaraConnectThis(Instance, SignalName, Callback) (Instance).SignalName.Connect(this, Callback) -#define NazaraDisconnect(SlotName) SlotName.GetConnection().Disconnect() - template class NzSignal @@ -82,6 +78,8 @@ class NzSignal::Connection Connection(Connection&& connection) = default; ~Connection() = default; + template + void Connect(BaseClass& signal, ConnectArgs&&... args); void Disconnect(); bool IsConnected() const; @@ -109,8 +107,14 @@ class NzSignal::ConnectionGuard ConnectionGuard(ConnectionGuard&& connection) = default; ~ConnectionGuard(); + template + void Connect(BaseClass& signal, ConnectArgs&&... args); + void Disconnect(); + Connection& GetConnection(); + bool IsConnected() const; + ConnectionGuard& operator=(const Connection& connection); ConnectionGuard& operator=(const ConnectionGuard& connection) = delete; ConnectionGuard& operator=(Connection&& connection); diff --git a/include/Nazara/Core/Signal.inl b/include/Nazara/Core/Signal.inl index 6022329a7..45fd740d8 100644 --- a/include/Nazara/Core/Signal.inl +++ b/include/Nazara/Core/Signal.inl @@ -100,6 +100,13 @@ m_ptr(slot) { } +template +template +void NzSignal::Connection::Connect(BaseClass& signal, ConnectArgs&&... args) +{ + operator=(signal.Connect(std::forward(args)...)); +} + template void NzSignal::Connection::Disconnect() { @@ -132,12 +139,32 @@ NzSignal::ConnectionGuard::~ConnectionGuard() m_connection.Disconnect(); } +template +template +void NzSignal::ConnectionGuard::Connect(BaseClass& signal, ConnectArgs&&... args) +{ + m_connection.Disconnect(); + m_connection.Connect(signal, std::forward(args)...); +} + +template +void NzSignal::ConnectionGuard::Disconnect() +{ + m_connection.Disconnect(); +} + template typename NzSignal::Connection& NzSignal::ConnectionGuard::GetConnection() { return m_connection; } +template +bool NzSignal::ConnectionGuard::IsConnected() const +{ + return m_connection.IsConnected(); +} + template typename NzSignal::ConnectionGuard& NzSignal::ConnectionGuard::operator=(const Connection& connection) { diff --git a/src/Nazara/Graphics/Camera.cpp b/src/Nazara/Graphics/Camera.cpp index 57890903a..5d985fe41 100644 --- a/src/Nazara/Graphics/Camera.cpp +++ b/src/Nazara/Graphics/Camera.cpp @@ -163,13 +163,13 @@ void NzCamera::SetTarget(const NzRenderTarget* renderTarget) if (m_target) { - m_targetReleaseSlot = NazaraConnectThis(*m_target, OnRenderTargetRelease, OnRenderTargetRelease); - m_targetResizeSlot = NazaraConnectThis(*m_target, OnRenderTargetSizeChange, OnRenderTargetSizeChange); + m_targetReleaseSlot.Connect(m_target->OnRenderTargetRelease, this, OnRenderTargetRelease); + m_targetResizeSlot.Connect(m_target->OnRenderTargetSizeChange, this, OnRenderTargetSizeChange); } else { - NazaraDisconnect(m_targetReleaseSlot); - NazaraDisconnect(m_targetResizeSlot); + m_targetReleaseSlot.Disconnect(); + m_targetResizeSlot.Disconnect(); } m_frustumUpdated = false; diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 7b2769b07..6bdcbe67d 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -36,9 +36,9 @@ m_verticesUpdated(sprite.m_verticesUpdated) const NzAbstractAtlas* atlas = it->first; AtlasSlots& slots = m_atlases[atlas]; - slots.clearSlot = NazaraConnectThis(*atlas, OnAtlasCleared, OnAtlasInvalidated); - slots.layerChangeSlot = NazaraConnectThis(*atlas, OnAtlasLayerChange, OnAtlasLayerChange); - slots.releaseSlot = NazaraConnectThis(*atlas, OnAtlasRelease, OnAtlasInvalidated); + slots.clearSlot.Connect(atlas->OnAtlasCleared, this, OnAtlasInvalidated); + slots.layerChangeSlot.Connect(atlas->OnAtlasLayerChange, this, OnAtlasLayerChange); + slots.releaseSlot.Connect(atlas->OnAtlasRelease, this, OnAtlasInvalidated); } } @@ -153,9 +153,9 @@ void NzTextSprite::Update(const NzAbstractTextDrawer& drawer) { AtlasSlots& slots = m_atlases[atlas]; - slots.clearSlot = NazaraConnectThis(*atlas, OnAtlasCleared, OnAtlasInvalidated); - slots.layerChangeSlot = NazaraConnectThis(*atlas, OnAtlasLayerChange, OnAtlasLayerChange); - slots.releaseSlot = NazaraConnectThis(*atlas, OnAtlasRelease, OnAtlasInvalidated); + slots.clearSlot.Connect(atlas->OnAtlasCleared, this, OnAtlasInvalidated); + slots.layerChangeSlot.Connect(atlas->OnAtlasLayerChange, this, OnAtlasLayerChange); + slots.releaseSlot.Connect(atlas->OnAtlasRelease, this, OnAtlasInvalidated); } } @@ -277,9 +277,9 @@ NzTextSprite& NzTextSprite::operator=(const NzTextSprite& text) const NzAbstractAtlas* atlas = it->first; AtlasSlots& slots = m_atlases[atlas]; - slots.clearSlot = NazaraConnectThis(*atlas, OnAtlasCleared, OnAtlasInvalidated); - slots.layerChangeSlot = NazaraConnectThis(*atlas, OnAtlasLayerChange, OnAtlasLayerChange); - slots.releaseSlot = NazaraConnectThis(*atlas, OnAtlasRelease, OnAtlasInvalidated); + slots.clearSlot.Connect(atlas->OnAtlasCleared, this, OnAtlasInvalidated); + slots.layerChangeSlot.Connect(atlas->OnAtlasLayerChange, this, OnAtlasLayerChange); + slots.releaseSlot.Connect(atlas->OnAtlasRelease, this, OnAtlasInvalidated); } // On ne copie pas les sommets finaux car il est très probable que nos paramètres soient modifiés et qu'ils doivent être régénérés de toute façon diff --git a/src/Nazara/Graphics/View.cpp b/src/Nazara/Graphics/View.cpp index 08cd6fbd7..fbd141967 100644 --- a/src/Nazara/Graphics/View.cpp +++ b/src/Nazara/Graphics/View.cpp @@ -218,13 +218,13 @@ void NzView::SetTarget(const NzRenderTarget* renderTarget) m_target = renderTarget; if (m_target) { - m_targetReleaseSlot = NazaraConnectThis(*m_target, OnRenderTargetRelease, OnRenderTargetRelease); - m_targetResizeSlot = NazaraConnectThis(*m_target, OnRenderTargetSizeChange, OnRenderTargetSizeChange); + m_targetReleaseSlot.Connect(m_target->OnRenderTargetRelease, this, OnRenderTargetRelease); + m_targetResizeSlot.Connect(m_target->OnRenderTargetSizeChange, this, OnRenderTargetSizeChange); } else { - NazaraDisconnect(m_targetReleaseSlot); - NazaraDisconnect(m_targetResizeSlot); + m_targetReleaseSlot.Disconnect(); + m_targetResizeSlot.Disconnect(); } } diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 08e4bce12..df9d6d177 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -1621,7 +1621,7 @@ bool NzRenderer::EnsureStateUpdate() if (it == s_vaos.end()) { Context_Entry entry; - entry.onReleaseSlot = context->OnContextRelease.Connect(OnContextRelease); + entry.onReleaseSlot.Connect(context->OnContextRelease, OnContextRelease); it = s_vaos.insert(std::make_pair(context, std::move(entry))).first; } @@ -1647,13 +1647,13 @@ bool NzRenderer::EnsureStateUpdate() // Connect the slots if (s_indexBuffer) - entry.onIndexBufferReleaseSlot = s_indexBuffer->OnIndexBufferRelease.Connect(OnIndexBufferRelease); + entry.onIndexBufferReleaseSlot.Connect(s_indexBuffer->OnIndexBufferRelease, OnIndexBufferRelease); if (instancingDeclaration) - entry.onInstancingDeclarationReleaseSlot = instancingDeclaration->OnVertexDeclarationRelease.Connect(OnVertexDeclarationRelease); + entry.onInstancingDeclarationReleaseSlot.Connect(instancingDeclaration->OnVertexDeclarationRelease, OnVertexDeclarationRelease); - entry.onVertexBufferReleaseSlot = s_vertexBuffer->OnVertexBufferRelease.Connect(OnVertexBufferRelease); - entry.onVertexDeclarationReleaseSlot = vertexDeclaration->OnVertexDeclarationRelease.Connect(OnVertexDeclarationRelease); + entry.onVertexBufferReleaseSlot.Connect(s_vertexBuffer->OnVertexBufferRelease, OnVertexBufferRelease); + entry.onVertexDeclarationReleaseSlot.Connect(vertexDeclaration->OnVertexDeclarationRelease, OnVertexDeclarationRelease); vaoIt = vaoMap.insert(std::make_pair(key, std::move(entry))).first; diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 4e5b97ff3..7d9935b2b 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -298,15 +298,15 @@ void NzFont::SetAtlas(const std::shared_ptr& atlas) m_atlas = atlas; if (m_atlas) { - m_atlasClearedSlot = NazaraConnectThis(*m_atlas, OnAtlasCleared, OnAtlasCleared); - m_atlasLayerChangeSlot = NazaraConnectThis(*m_atlas, OnAtlasLayerChange, OnAtlasLayerChange); - m_atlasReleaseSlot = NazaraConnectThis(*m_atlas, OnAtlasRelease, OnAtlasRelease); + m_atlasClearedSlot.Connect(m_atlas->OnAtlasCleared, this, OnAtlasCleared); + m_atlasLayerChangeSlot.Connect(m_atlas->OnAtlasLayerChange, this, OnAtlasLayerChange); + m_atlasReleaseSlot.Connect(m_atlas->OnAtlasRelease, this, OnAtlasRelease); } else { - NazaraDisconnect(m_atlasClearedSlot); - NazaraDisconnect(m_atlasLayerChangeSlot); - NazaraDisconnect(m_atlasReleaseSlot); + m_atlasClearedSlot.Disconnect(); + m_atlasLayerChangeSlot.Disconnect(); + m_atlasReleaseSlot.Disconnect(); } OnFontAtlasChanged(this); diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 1a9a8b97b..1b5f89d3f 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -112,17 +112,17 @@ void NzSimpleTextDrawer::SetFont(NzFont* font) m_font = font; if (m_font) { - m_atlasChangedSlot = NazaraConnectThis(*m_font, OnFontAtlasChanged, OnFontInvalidated); - m_atlasLayerChangedSlot = NazaraConnectThis(*m_font, OnFontAtlasLayerChanged, OnFontInvalidated); - m_fontReleaseSlot = NazaraConnectThis(*m_font, OnFontRelease, OnFontRelease); - m_glyphCacheClearedSlot = NazaraConnectThis(*m_font, OnFontGlyphCacheCleared, OnFontInvalidated); + m_atlasChangedSlot.Connect(m_font->OnFontAtlasChanged, this, OnFontInvalidated); + m_atlasLayerChangedSlot.Connect(m_font->OnFontAtlasLayerChanged, this, OnFontInvalidated); + m_fontReleaseSlot.Connect(m_font->OnFontRelease, this, OnFontRelease); + m_glyphCacheClearedSlot.Connect(m_font->OnFontAtlasChanged, this, OnFontInvalidated); } else { - NazaraDisconnect(m_atlasChangedSlot); - NazaraDisconnect(m_atlasLayerChangedSlot); - NazaraDisconnect(m_fontReleaseSlot); - NazaraDisconnect(m_glyphCacheClearedSlot); + m_atlasChangedSlot.Disconnect(); + m_atlasLayerChangedSlot.Disconnect(); + m_fontReleaseSlot.Disconnect(); + m_glyphCacheClearedSlot.Disconnect(); } m_glyphUpdated = false;