Replace Listenable system by signals

Former-commit-id: 16fb0b3e703ca4b41ceb97fab938cebb05f677d4
This commit is contained in:
Lynix
2015-06-07 15:16:11 +02:00
parent 3e8d2e1e47
commit fe25249136
24 changed files with 182 additions and 348 deletions

View File

@@ -1,33 +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_LISTENABLE_HPP
#define NAZARA_LISTENABLE_HPP
#include <Nazara/Prerequesites.hpp>
#include <unordered_map>
template<typename Base>
class NzListenable
{
public:
NzListenable();
~NzListenable() = default;
template<typename L> void AddListener(L* listener, void* userdata = nullptr) const;
template<typename L> void RemoveListener(L* listener) const;
template<typename F, typename... Args> void Notify(F callback, Args&&... args);
template<typename F> void NotifyRelease(F callback);
private:
mutable std::unordered_map<void*, void*> m_listeners;
bool m_listenersLocked;
};
#include <Nazara/Core/Listenable.inl>
#endif // NAZARA_LISTENABLE_HPP

View File

@@ -1,68 +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 <Nazara/Core/Debug.hpp>
template<typename Base>
NzListenable<Base>::NzListenable() :
m_listenersLocked(false)
{
}
template<typename Base>
template<typename L>
void NzListenable<Base>::AddListener(L* listener, void* userdata) const
{
static_assert(std::is_base_of<typename Base::Listener, L>::value, "`listener` does not derive from a Listener");
if (!m_listenersLocked)
m_listeners.insert(std::make_pair(listener, userdata));
}
template<typename Base>
template<typename L>
void NzListenable<Base>::RemoveListener(L* listener) const
{
static_assert(std::is_base_of<typename Base::Listener, L>::value, "`listener` does not derive from a Listener");
if (!m_listenersLocked)
m_listeners.erase(listener);
}
template<typename Base>
template<typename F, typename... Args>
void NzListenable<Base>::Notify(F callback, Args&&... args)
{
using Listener = typename Base::Listener;
m_listenersLocked = true;
auto it = m_listeners.begin();
while (it != m_listeners.end())
{
Listener* listener = static_cast<Listener*>(it->first);
if (!(listener->*callback)(static_cast<Base*>(this), std::forward<Args>(args)..., it->second))
m_listeners.erase(it++);
else
++it;
}
m_listenersLocked = false;
}
template<typename Base>
template<typename F>
void NzListenable<Base>::NotifyRelease(F callback)
{
using Listener = typename Base::Listener;
m_listenersLocked = true;
for (auto& pair : m_listeners)
{
Listener* listener = static_cast<Listener*>(pair.first);
(listener->*callback)(static_cast<Base*>(this), pair.second);
}
}
#include <Nazara/Core/DebugOff.hpp>

View File

@@ -11,6 +11,16 @@
#include <memory>
#include <vector>
#define NazaraSignal(SignalName, ...) using SignalName ## Type = NzSignal<__VA_ARGS__>; \
mutable SignalName ## Type SignalName
#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(this, Callback)
#define NazaraDisconnect(SlotName) SlotName.GetConnection().Disconnect()
template<typename... Args>
class NzSignal
{

View File

@@ -16,11 +16,11 @@
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Utility/Node.hpp>
class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode, NzRenderTarget::Listener
class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode
{
public:
NzCamera();
~NzCamera();
~NzCamera() = default;
void EnsureFrustumUpdate() const;
void EnsureProjectionMatrixUpdate() const;
@@ -55,14 +55,17 @@ class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode, NzRenderTarg
void ApplyView() const override;
void InvalidateNode() override;
void OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata) override;
bool OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata) override;
void OnRenderTargetRelease(const NzRenderTarget* renderTarget);
void OnRenderTargetSizeChange(const NzRenderTarget* renderTarget);
void UpdateFrustum() const;
void UpdateProjectionMatrix() const;
void UpdateViewMatrix() const;
void UpdateViewport() const;
NazaraSlot(NzRenderTarget, OnRenderTargetRelease, m_targetReleaseSlot);
NazaraSlot(NzRenderTarget, OnRenderTargetSizeChange, m_targetResizeSlot);
mutable NzFrustumf m_frustum;
mutable NzMatrix4f m_projectionMatrix;
mutable NzMatrix4f m_viewMatrix;

View File

@@ -22,7 +22,7 @@
#include <map>
#include <memory>
class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique, public NzRenderTarget::Listener
class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique
{
friend class NzGraphics;

View File

@@ -16,12 +16,12 @@
#include <memory>
#include <set>
class NAZARA_API NzTextSprite : public NzSceneNode, NzAbstractAtlas::Listener
class NAZARA_API NzTextSprite : public NzSceneNode
{
public:
NzTextSprite();
NzTextSprite(const NzTextSprite& sprite);
~NzTextSprite();
~NzTextSprite() = default;
void AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const override;
@@ -46,12 +46,10 @@ class NAZARA_API NzTextSprite : public NzSceneNode, NzAbstractAtlas::Listener
NzTextSprite& operator=(const NzTextSprite& text);
private:
void ClearAtlases();
void InvalidateNode() override;
void MakeBoundingVolume() const override;
bool OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata) override;
bool OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata) override;
void OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata) override;
void OnAtlasInvalidated(const NzAbstractAtlas* atlas);
void OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer);
void Register() override;
void Unregister() override;
void UpdateVertices() const;
@@ -62,7 +60,14 @@ class NAZARA_API NzTextSprite : public NzSceneNode, NzAbstractAtlas::Listener
unsigned int count;
};
std::set<const NzAbstractAtlas*> m_atlases;
struct AtlasSlots
{
NazaraSlot(NzAbstractAtlas, OnAtlasCleared, clearSlot);
NazaraSlot(NzAbstractAtlas, OnAtlasLayerChange, layerChangeSlot);
NazaraSlot(NzAbstractAtlas, OnAtlasRelease, releaseSlot);
};
std::unordered_map<const NzAbstractAtlas*, AtlasSlots> m_atlases;
mutable std::unordered_map<NzTexture*, RenderIndices> m_renderInfos;
mutable std::vector<NzVertexStruct_XY_Color> m_localVertices;
mutable std::vector<NzVertexStruct_XYZ_Color_UV> m_vertices;

View File

@@ -16,12 +16,12 @@
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Utility/Node.hpp>
class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget::Listener
class NAZARA_API NzView : public NzAbstractViewer, public NzNode
{
public:
NzView();
NzView(const NzVector2f& size);
~NzView();
~NzView() = default;
void EnsureFrustumUpdate() const;
void EnsureProjectionMatrixUpdate() const;
@@ -62,8 +62,8 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
void ApplyView() const override;
void InvalidateNode() override;
void OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata) override;
bool OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata) override;
void OnRenderTargetRelease(const NzRenderTarget* renderTarget);
void OnRenderTargetSizeChange(const NzRenderTarget* renderTarget);
void UpdateFrustum() const;
void UpdateInvViewProjMatrix() const;
@@ -72,6 +72,9 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
void UpdateViewProjMatrix() const;
void UpdateViewport() const;
NazaraSlot(NzRenderTarget, OnRenderTargetRelease, m_targetReleaseSlot);
NazaraSlot(NzRenderTarget, OnRenderTargetSizeChange, m_targetResizeSlot);
mutable NzFrustumf m_frustum;
mutable NzMatrix4f m_invViewProjMatrix;
mutable NzMatrix4f m_projectionMatrix;

View File

@@ -8,14 +8,14 @@
#define NAZARA_RENDERTARGET_HPP
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Listenable.hpp>
#include <Nazara/Core/Signal.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/RenderTargetParameters.hpp>
#include <unordered_map>
class NzRenderer;
class NAZARA_API NzRenderTarget : public NzListenable<NzRenderTarget>
class NAZARA_API NzRenderTarget
{
friend class NzRenderer;
@@ -35,16 +35,10 @@ class NAZARA_API NzRenderTarget : public NzListenable<NzRenderTarget>
// Fonctions OpenGL
virtual bool HasContext() const = 0;
class NAZARA_API Listener
{
public:
Listener() = default;
virtual ~Listener();
virtual bool OnRenderTargetParametersChange(const NzRenderTarget* renderTarget, void* userdata);
virtual void OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata);
virtual bool OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata);
};
// Signals
NazaraSignal(OnRenderTargetParametersChange, const NzRenderTarget*); //< Args: me
NazaraSignal(OnRenderTargetRelease, const NzRenderTarget*); //< Args: me
NazaraSignal(OnRenderTargetSizeChange, const NzRenderTarget*); //< Args: me
protected:
virtual bool Activate() const = 0;

View File

@@ -8,7 +8,7 @@
#define NAZARA_ABSTRACTATLAS_HPP
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Listenable.hpp>
#include <Nazara/Core/Signal.hpp>
#include <Nazara/Core/SparsePtr.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Utility/Enums.hpp>
@@ -17,7 +17,7 @@
class NzAbstractImage;
class NzImage;
class NAZARA_API NzAbstractAtlas : public NzListenable<NzAbstractAtlas>
class NAZARA_API NzAbstractAtlas
{
public:
NzAbstractAtlas() = default;
@@ -30,16 +30,9 @@ class NAZARA_API NzAbstractAtlas : public NzListenable<NzAbstractAtlas>
virtual nzUInt32 GetStorage() const = 0;
virtual bool Insert(const NzImage& image, NzRectui* rect, bool* flipped, unsigned int* layerIndex) = 0;
class NAZARA_API Listener
{
public:
Listener() = default;
virtual ~Listener();
virtual bool OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata);
virtual bool OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata);
virtual void OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata);
};
NazaraSignal(OnAtlasCleared, const NzAbstractAtlas*); //< Args: me
NazaraSignal(OnAtlasLayerChange, const NzAbstractAtlas*, NzAbstractImage*, NzAbstractImage*); //< Args: me, oldLayer, newLayer
NazaraSignal(OnAtlasRelease, const NzAbstractAtlas*); //< Args: me
};
#endif // NAZARA_ABSTRACTATLAS_HPP

View File

@@ -37,7 +37,7 @@ using NzFontListener = NzObjectListenerWrapper<NzFont>;
using NzFontLoader = NzResourceLoader<NzFont, NzFontParams>;
using NzFontRef = NzObjectRef<NzFont>;
class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzAbstractAtlas::Listener, NzNonCopyable
class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzNonCopyable
{
friend NzFontLibrary;
friend NzFontLoader;
@@ -128,14 +128,18 @@ class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzAbstractAtla
using GlyphMap = std::unordered_map<char32_t, Glyph>;
nzUInt64 ComputeKey(unsigned int characterSize, nzUInt32 style) const;
bool OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata) override;
bool OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata) override;
void OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata) override;
void OnAtlasCleared(const NzAbstractAtlas* atlas);
void OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer);
void OnAtlasRelease(const NzAbstractAtlas* atlas);
const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, nzUInt32 style, char32_t character) const;
static bool Initialize();
static void Uninitialize();
NazaraSlot(NzAbstractAtlas, OnAtlasCleared, m_atlasClearedSlot);
NazaraSlot(NzAbstractAtlas, OnAtlasLayerChange, m_atlasLayerChangeSlot);
NazaraSlot(NzAbstractAtlas, OnAtlasRelease, m_atlasReleaseSlot);
std::shared_ptr<NzAbstractAtlas> m_atlas;
std::unique_ptr<NzFontData> m_data;
mutable std::unordered_map<nzUInt64, std::unordered_map<nzUInt64, int>> m_kerningCache;

View File

@@ -8,7 +8,7 @@
#define NAZARA_NODE_HPP
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Listenable.hpp>
#include <Nazara/Core/Signal.hpp>
#include <Nazara/Math/Matrix4.hpp>
#include <Nazara/Math/Quaternion.hpp>
#include <Nazara/Math/Vector3.hpp>
@@ -16,7 +16,7 @@
#include <unordered_map>
#include <vector>
class NAZARA_API NzNode : public NzListenable<NzNode>
class NAZARA_API NzNode
{
public:
NzNode();
@@ -90,16 +90,10 @@ class NAZARA_API NzNode : public NzListenable<NzNode>
NzNode& operator=(const NzNode& node);
class NAZARA_API Listener
{
public:
Listener() = default;
virtual ~Listener();
virtual bool OnNodeInvalidated(const NzNode* node, void* userdata);
virtual bool OnNodeParented(const NzNode* node, const NzNode* parent, void* userdata);
virtual void OnNodeReleased(const NzNode* node, void* userdata);
};
// Signals
NazaraSignal(OnNodeInvalidation, const NzNode*); //< Args: me
NazaraSignal(OnNodeNewParent, const NzNode*, const NzNode*); //< Args: me
NazaraSignal(OnNodeRelease, const NzNode*); //< Args: me
protected:
void AddChild(NzNode* node) const;
@@ -126,7 +120,6 @@ class NAZARA_API NzNode : public NzListenable<NzNode>
bool m_inheritRotation;
bool m_inheritScale;
mutable bool m_transformMatrixUpdated;
};
#endif // NAZARA_NODE_HPP