From 21c10aee41b3ee046c4ed471a345d09ba3885d08 Mon Sep 17 00:00:00 2001 From: codereader Date: Wed, 26 Jan 2022 12:53:59 +0100 Subject: [PATCH] #5893: Fix NullModel rendering --- libs/render/RenderableSurface.h | 13 +++++++++++-- radiantcore/model/NullModelNode.cpp | 15 ++++----------- radiantcore/model/StaticModelNode.cpp | 2 +- radiantcore/model/md5/MD5ModelNode.cpp | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/libs/render/RenderableSurface.h b/libs/render/RenderableSurface.h index 7dd5459013..8d28bb8f4e 100644 --- a/libs/render/RenderableSurface.h +++ b/libs/render/RenderableSurface.h @@ -39,7 +39,7 @@ class RenderableSurface : virtual ~RenderableSurface() { - clear(); + detach(); } // (Non-virtual) update method handling any possible shader change @@ -47,14 +47,22 @@ class RenderableSurface : // to be different from the last update. void attachToShader(const ShaderPtr& shader, IRenderEntity* entity) { + if (entity && _entity != entity) + { + // Detach if the render entity is changin + detach(); + } + if (_shaders.count(shader) > 0) { return; // already attached } + _entity = entity; _shaders[shader] = shader->addSurface(*this, entity); } +#if 0 // seems to be unneeded void detachFromShader(const ShaderPtr& shader) { auto handle = _shaders.find(shader); @@ -64,6 +72,7 @@ class RenderableSurface : detachFromShader(handle); } } +#endif // Notifies all the attached shaders that the surface geometry changed void queueUpdate() @@ -75,7 +84,7 @@ class RenderableSurface : } // Removes the surface from all shaders - void clear() + void detach() { while (!_shaders.empty()) { diff --git a/radiantcore/model/NullModelNode.cpp b/radiantcore/model/NullModelNode.cpp index abef047535..19afeda1d1 100644 --- a/radiantcore/model/NullModelNode.cpp +++ b/radiantcore/model/NullModelNode.cpp @@ -101,22 +101,15 @@ void NullModelNode::attachToShaders() if (!renderSystem) return; - if (_fillShader) - { - _fillShader->addSurface(_renderableBox, _renderEntity); - } - - if (_wireShader) - { - _wireShader->addSurface(_renderableBox, _renderEntity); - } + _renderableBox.attachToShader(_fillShader, _renderEntity); + _renderableBox.attachToShader(_wireShader, _renderEntity); _attachedToShaders = true; } void NullModelNode::detachFromShaders() { - _renderableBox.clear(); + _renderableBox.detach(); _attachedToShaders = false; } @@ -144,7 +137,7 @@ void NullModelNode::onRemoveFromScene(scene::IMapRootNode& root) { Node::onRemoveFromScene(root); - _renderableBox.clear(); + _renderableBox.detach(); } void NullModelNode::onVisibilityChanged(bool isVisibleNow) diff --git a/radiantcore/model/StaticModelNode.cpp b/radiantcore/model/StaticModelNode.cpp index 5947f4909a..6941cb55a7 100644 --- a/radiantcore/model/StaticModelNode.cpp +++ b/radiantcore/model/StaticModelNode.cpp @@ -127,7 +127,7 @@ void StaticModelNode::detachFromShaders() // the node will re-attach in the next pre-render phase for (auto& surface : _renderableSurfaces) { - surface->clear(); + surface->detach(); } _attachedToShaders = false; diff --git a/radiantcore/model/md5/MD5ModelNode.cpp b/radiantcore/model/md5/MD5ModelNode.cpp index f66126a810..919ae37da9 100644 --- a/radiantcore/model/md5/MD5ModelNode.cpp +++ b/radiantcore/model/md5/MD5ModelNode.cpp @@ -143,7 +143,7 @@ void MD5ModelNode::detachFromShaders() // the node will re-attach in the next pre-render phase for (auto& surface : _renderableSurfaces) { - surface->clear(); + surface->detach(); } _attachedToShaders = false;