Replace Listenable system by signals
Former-commit-id: 16fb0b3e703ca4b41ceb97fab938cebb05f677d4
This commit is contained in:
@@ -22,12 +22,6 @@ m_zNear(1.f)
|
||||
{
|
||||
}
|
||||
|
||||
NzCamera::~NzCamera()
|
||||
{
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
}
|
||||
|
||||
void NzCamera::EnsureFrustumUpdate() const
|
||||
{
|
||||
if (!m_frustumUpdated)
|
||||
@@ -165,12 +159,18 @@ void NzCamera::SetFOV(float fov)
|
||||
|
||||
void NzCamera::SetTarget(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
|
||||
m_target = renderTarget;
|
||||
|
||||
if (m_target)
|
||||
m_target->AddListener(this);
|
||||
{
|
||||
m_targetReleaseSlot = NazaraConnect(*m_target, OnRenderTargetRelease, OnRenderTargetRelease);
|
||||
m_targetResizeSlot = NazaraConnect(*m_target, OnRenderTargetSizeChange, OnRenderTargetSizeChange);
|
||||
}
|
||||
else
|
||||
{
|
||||
NazaraDisconnect(m_targetReleaseSlot);
|
||||
NazaraDisconnect(m_targetResizeSlot);
|
||||
}
|
||||
|
||||
m_frustumUpdated = false;
|
||||
m_projectionMatrixUpdated = false;
|
||||
@@ -266,33 +266,24 @@ void NzCamera::InvalidateNode()
|
||||
m_viewMatrixUpdated = false;
|
||||
}
|
||||
|
||||
void NzCamera::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
||||
void NzCamera::OnRenderTargetRelease(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
m_target = nullptr;
|
||||
else
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
}
|
||||
|
||||
bool NzCamera::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata)
|
||||
void NzCamera::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
{
|
||||
m_frustumUpdated = false;
|
||||
m_projectionMatrixUpdated = false;
|
||||
m_viewportUpdated = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void NzCamera::UpdateFrustum() const
|
||||
|
||||
@@ -21,7 +21,6 @@ m_verticesUpdated(false)
|
||||
|
||||
NzTextSprite::NzTextSprite(const NzTextSprite& sprite) :
|
||||
NzSceneNode(sprite),
|
||||
m_atlases(sprite.m_atlases),
|
||||
m_renderInfos(sprite.m_renderInfos),
|
||||
m_localVertices(sprite.m_localVertices),
|
||||
m_vertices(sprite.m_vertices),
|
||||
@@ -32,13 +31,15 @@ m_verticesUpdated(sprite.m_verticesUpdated)
|
||||
{
|
||||
SetParent(sprite.GetParent());
|
||||
|
||||
for (const NzAbstractAtlas* atlas : m_atlases)
|
||||
atlas->AddListener(this);
|
||||
}
|
||||
for (auto it = sprite.m_atlases.begin(); it != sprite.m_atlases.end(); ++it)
|
||||
{
|
||||
const NzAbstractAtlas* atlas = it->first;
|
||||
AtlasSlots& slots = m_atlases[atlas];
|
||||
|
||||
NzTextSprite::~NzTextSprite()
|
||||
{
|
||||
ClearAtlases();
|
||||
slots.clearSlot = NazaraConnect(*atlas, OnAtlasCleared, OnAtlasInvalidated);
|
||||
slots.layerChangeSlot = NazaraConnect(*atlas, OnAtlasLayerChange, OnAtlasLayerChange);
|
||||
slots.releaseSlot = NazaraConnect(*atlas, OnAtlasRelease, OnAtlasInvalidated);
|
||||
}
|
||||
}
|
||||
|
||||
void NzTextSprite::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const
|
||||
@@ -58,7 +59,7 @@ void NzTextSprite::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const
|
||||
|
||||
void NzTextSprite::Clear()
|
||||
{
|
||||
ClearAtlases();
|
||||
m_atlases.clear();
|
||||
m_boundingVolume.MakeNull();
|
||||
m_localVertices.clear();
|
||||
m_renderInfos.clear();
|
||||
@@ -126,7 +127,7 @@ void NzTextSprite::SetMaterial(NzMaterial* material)
|
||||
|
||||
void NzTextSprite::Update(const NzAbstractTextDrawer& drawer)
|
||||
{
|
||||
ClearAtlases();
|
||||
m_atlases.clear();
|
||||
|
||||
NzCallOnExit clearOnFail([this]()
|
||||
{
|
||||
@@ -148,8 +149,14 @@ void NzTextSprite::Update(const NzAbstractTextDrawer& drawer)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (m_atlases.insert(atlas).second)
|
||||
atlas->AddListener(this);
|
||||
if (m_atlases.find(atlas) == m_atlases.end())
|
||||
{
|
||||
AtlasSlots& slots = m_atlases[atlas];
|
||||
|
||||
slots.clearSlot = NazaraConnect(*atlas, OnAtlasCleared, OnAtlasInvalidated);
|
||||
slots.layerChangeSlot = NazaraConnect(*atlas, OnAtlasLayerChange, OnAtlasLayerChange);
|
||||
slots.releaseSlot = NazaraConnect(*atlas, OnAtlasRelease, OnAtlasInvalidated);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int glyphCount = drawer.GetGlyphCount();
|
||||
@@ -256,27 +263,31 @@ NzTextSprite& NzTextSprite::operator=(const NzTextSprite& text)
|
||||
{
|
||||
NzSceneNode::operator=(text);
|
||||
|
||||
m_atlases = text.m_atlases;
|
||||
m_atlases.clear();
|
||||
|
||||
m_color = text.m_color;
|
||||
m_material = text.m_material;
|
||||
m_renderInfos = text.m_renderInfos;
|
||||
m_localBounds = text.m_localBounds;
|
||||
m_localVertices = text.m_localVertices;
|
||||
|
||||
// Connect to the slots of the new atlases
|
||||
for (auto it = text.m_atlases.begin(); it != text.m_atlases.end(); ++it)
|
||||
{
|
||||
const NzAbstractAtlas* atlas = it->first;
|
||||
AtlasSlots& slots = m_atlases[atlas];
|
||||
|
||||
slots.clearSlot = NazaraConnect(*atlas, OnAtlasCleared, OnAtlasInvalidated);
|
||||
slots.layerChangeSlot = NazaraConnect(*atlas, OnAtlasLayerChange, OnAtlasLayerChange);
|
||||
slots.releaseSlot = NazaraConnect(*atlas, OnAtlasRelease, 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
|
||||
m_verticesUpdated = false;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void NzTextSprite::ClearAtlases()
|
||||
{
|
||||
for (const NzAbstractAtlas* atlas : m_atlases)
|
||||
atlas->RemoveListener(this);
|
||||
|
||||
m_atlases.clear();
|
||||
}
|
||||
|
||||
void NzTextSprite::InvalidateNode()
|
||||
{
|
||||
NzSceneNode::InvalidateNode();
|
||||
@@ -296,10 +307,8 @@ void NzTextSprite::MakeBoundingVolume() const
|
||||
m_boundingVolume.Set(min.x*right + min.y*down, max.x*right + max.y*down);
|
||||
}
|
||||
|
||||
bool NzTextSprite::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata)
|
||||
void NzTextSprite::OnAtlasInvalidated(const NzAbstractAtlas* atlas)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
if (m_atlases.find(atlas) == m_atlases.end())
|
||||
{
|
||||
@@ -308,16 +317,13 @@ bool NzTextSprite::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata)
|
||||
}
|
||||
#endif
|
||||
|
||||
NazaraWarning("TextSprite " + NzString::Pointer(this) + " has been cleared because atlas " + NzString::Pointer(atlas) + " that was under use has been cleared");
|
||||
NazaraWarning("TextSprite " + NzString::Pointer(this) + " has been cleared because atlas " + NzString::Pointer(atlas) + " has been invalidated (cleared or released)");
|
||||
Clear();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool NzTextSprite::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata)
|
||||
void NzTextSprite::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
if (m_atlases.find(atlas) == m_atlases.end())
|
||||
@@ -356,25 +362,6 @@ bool NzTextSprite::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractIm
|
||||
m_renderInfos.erase(it);
|
||||
m_renderInfos.insert(std::make_pair(newTexture, std::move(indices)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzTextSprite::OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
if (m_atlases.find(atlas) == m_atlases.end())
|
||||
{
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(atlas));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// L'atlas a été libéré alors que le TextSprite l'utilisait encore, notre seule option (pour éviter un crash) est de nous réinitialiser
|
||||
NazaraWarning("TextSprite " + NzString::Pointer(this) + " has been cleared because atlas " + NzString::Pointer(atlas) + " has been released");
|
||||
Clear();
|
||||
}
|
||||
|
||||
void NzTextSprite::Register()
|
||||
|
||||
@@ -29,12 +29,6 @@ NzView() // On délègue
|
||||
SetSize(size);
|
||||
}
|
||||
|
||||
NzView::~NzView()
|
||||
{
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
}
|
||||
|
||||
void NzView::EnsureFrustumUpdate() const
|
||||
{
|
||||
if (!m_frustumUpdated)
|
||||
@@ -221,12 +215,17 @@ void NzView::SetSize(float width, float height)
|
||||
|
||||
void NzView::SetTarget(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
|
||||
m_target = renderTarget;
|
||||
if (m_target)
|
||||
m_target->AddListener(this);
|
||||
{
|
||||
m_targetReleaseSlot = NazaraConnect(*m_target, OnRenderTargetRelease, OnRenderTargetRelease);
|
||||
m_targetResizeSlot = NazaraConnect(*m_target, OnRenderTargetSizeChange, OnRenderTargetSizeChange);
|
||||
}
|
||||
else
|
||||
{
|
||||
NazaraDisconnect(m_targetReleaseSlot);
|
||||
NazaraDisconnect(m_targetResizeSlot);
|
||||
}
|
||||
}
|
||||
|
||||
void NzView::SetTarget(const NzRenderTarget& renderTarget)
|
||||
@@ -318,20 +317,16 @@ void NzView::InvalidateNode()
|
||||
m_viewProjMatrixUpdated = false;
|
||||
}
|
||||
|
||||
void NzView::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
||||
void NzView::OnRenderTargetRelease(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
m_target = nullptr;
|
||||
else
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
}
|
||||
|
||||
bool NzView::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata)
|
||||
void NzView::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
{
|
||||
m_frustumUpdated = false;
|
||||
@@ -340,8 +335,6 @@ bool NzView::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void*
|
||||
}
|
||||
else
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzView::UpdateFrustum() const
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
NzRenderTarget::~NzRenderTarget()
|
||||
{
|
||||
NotifyRelease(Listener::OnRenderTargetReleased);
|
||||
OnRenderTargetRelease(this);
|
||||
}
|
||||
|
||||
bool NzRenderTarget::IsActive() const
|
||||
@@ -30,27 +30,3 @@ void NzRenderTarget::Desactivate() const
|
||||
{
|
||||
// Seuls les target sans contextes (ex: NzRenderTexture) nécessitent une désactivation
|
||||
}
|
||||
|
||||
NzRenderTarget::Listener::~Listener() = default;
|
||||
|
||||
bool NzRenderTarget::Listener::OnRenderTargetParametersChange(const NzRenderTarget* renderTarget, void* userdata)
|
||||
{
|
||||
NazaraUnused(renderTarget);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzRenderTarget::Listener::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
||||
{
|
||||
NazaraUnused(renderTarget);
|
||||
NazaraUnused(userdata);
|
||||
}
|
||||
|
||||
bool NzRenderTarget::Listener::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata)
|
||||
{
|
||||
NazaraUnused(renderTarget);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -379,8 +379,8 @@ bool NzRenderTexture::Create(bool lock)
|
||||
onExit.Reset();
|
||||
}
|
||||
|
||||
Notify(Listener::OnRenderTargetParametersChange);
|
||||
Notify(Listener::OnRenderTargetSizeChange);
|
||||
OnRenderTargetParametersChange(this);
|
||||
OnRenderTargetSizeChange(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -278,8 +278,8 @@ bool NzRenderWindow::OnWindowCreated()
|
||||
NzOpenGL::SetScissorBox(NzRecti(0, 0, size.x, size.y));
|
||||
NzOpenGL::SetViewport(NzRecti(0, 0, size.x, size.y));
|
||||
|
||||
Notify(Listener::OnRenderTargetParametersChange);
|
||||
Notify(Listener::OnRenderTargetSizeChange);
|
||||
OnRenderTargetParametersChange(this);
|
||||
OnRenderTargetSizeChange(this);
|
||||
|
||||
m_clock.Restart();
|
||||
|
||||
@@ -300,5 +300,5 @@ void NzRenderWindow::OnWindowDestroy()
|
||||
|
||||
void NzRenderWindow::OnWindowResized()
|
||||
{
|
||||
Notify(Listener::OnRenderTargetSizeChange);
|
||||
OnRenderTargetSizeChange(this);
|
||||
}
|
||||
|
||||
@@ -7,31 +7,5 @@
|
||||
|
||||
NzAbstractAtlas::~NzAbstractAtlas()
|
||||
{
|
||||
NotifyRelease(Listener::OnAtlasReleased);
|
||||
}
|
||||
|
||||
NzAbstractAtlas::Listener::~Listener() = default;
|
||||
|
||||
bool NzAbstractAtlas::Listener::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NzAbstractAtlas::Listener::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(oldLayer);
|
||||
NazaraUnused(newLayer);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzAbstractAtlas::Listener::OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(userdata);
|
||||
OnAtlasRelease(this);
|
||||
}
|
||||
|
||||
@@ -290,12 +290,19 @@ void NzFont::SetAtlas(const std::shared_ptr<NzAbstractAtlas>& atlas)
|
||||
{
|
||||
ClearGlyphCache();
|
||||
|
||||
if (m_atlas)
|
||||
m_atlas->RemoveListener(this);
|
||||
|
||||
m_atlas = atlas;
|
||||
if (m_atlas)
|
||||
m_atlas->AddListener(this);
|
||||
{
|
||||
m_atlasClearedSlot = NazaraConnect(*m_atlas, OnAtlasCleared, OnAtlasCleared);
|
||||
m_atlasLayerChangeSlot = NazaraConnect(*m_atlas, OnAtlasLayerChange, OnAtlasLayerChange);
|
||||
m_atlasReleaseSlot = NazaraConnect(*m_atlas, OnAtlasRelease, OnAtlasRelease);
|
||||
}
|
||||
else
|
||||
{
|
||||
NazaraDisconnect(m_atlasClearedSlot);
|
||||
NazaraDisconnect(m_atlasLayerChangeSlot);
|
||||
NazaraDisconnect(m_atlasReleaseSlot);
|
||||
}
|
||||
|
||||
NotifyModified(ModificationCode_AtlasChanged);
|
||||
}
|
||||
@@ -403,10 +410,9 @@ nzUInt64 NzFont::ComputeKey(unsigned int characterSize, nzUInt32 style) const
|
||||
return (stylePart << 32) | sizePart;
|
||||
}
|
||||
|
||||
bool NzFont::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata)
|
||||
void NzFont::OnAtlasCleared(const NzAbstractAtlas* atlas)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
// Est-ce qu'il s'agit bien de notre atlas ?
|
||||
@@ -420,16 +426,13 @@ bool NzFont::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata)
|
||||
// Notre atlas vient d'être vidé, détruisons le cache de glyphe
|
||||
m_glyphes.clear();
|
||||
NotifyModified(ModificationCode_GlyphCacheCleared);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NzFont::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata)
|
||||
void NzFont::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(oldLayer);
|
||||
NazaraUnused(newLayer);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
// Est-ce qu'il s'agit bien de notre atlas ?
|
||||
@@ -442,14 +445,11 @@ bool NzFont::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* o
|
||||
|
||||
// Pour faciliter le travail des ressources qui nous écoutent
|
||||
NotifyModified(ModificationCode_AtlasLayerChanged);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzFont::OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata)
|
||||
void NzFont::OnAtlasRelease(const NzAbstractAtlas* atlas)
|
||||
{
|
||||
NazaraUnused(atlas);
|
||||
NazaraUnused(userdata);
|
||||
|
||||
#ifdef NAZARA_DEBUG
|
||||
// Est-ce qu'il s'agit bien de notre atlas ?
|
||||
|
||||
@@ -22,7 +22,7 @@ NzGuillotineImageAtlas::~NzGuillotineImageAtlas() = default;
|
||||
void NzGuillotineImageAtlas::Clear()
|
||||
{
|
||||
m_layers.clear();
|
||||
Notify(Listener::OnAtlasCleared);
|
||||
OnAtlasCleared(this);
|
||||
}
|
||||
|
||||
void NzGuillotineImageAtlas::Free(NzSparsePtr<const NzRectui> rects, NzSparsePtr<unsigned int> layers, unsigned int count)
|
||||
@@ -187,7 +187,7 @@ bool NzGuillotineImageAtlas::ResizeLayer(Layer& layer, const NzVector2ui& size)
|
||||
|
||||
// On indique à ceux que ça intéresse qu'on a changé de pointeur
|
||||
// (chose très importante pour ceux qui le stockent)
|
||||
Notify(Listener::OnAtlasLayerChange, layer.image.get(), newImage.get());
|
||||
OnAtlasLayerChange(this, layer.image.get(), newImage.get());
|
||||
|
||||
// Et on ne met à jour le pointeur qu'après (car cette ligne libère également l'ancienne image)
|
||||
layer.image = std::move(newImage);
|
||||
|
||||
Reference in New Issue
Block a user