From 5e4280974f1b472feb09e06d1d954c2a25550358 Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 4 Mar 2022 05:41:16 +0100 Subject: [PATCH] #5912: Notify the parent brush if any face needs a renderable update, this way the BrushNode::onPreRender method is much faster for untouched brushes. --- radiantcore/brush/Brush.cpp | 5 +++++ radiantcore/brush/Brush.h | 1 + radiantcore/brush/BrushNode.cpp | 36 +++++++++++++++++++++++---------- radiantcore/brush/BrushNode.h | 3 +++ radiantcore/brush/Face.cpp | 2 ++ 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/radiantcore/brush/Brush.cpp b/radiantcore/brush/Brush.cpp index dca3b68027..8c3adcb911 100644 --- a/radiantcore/brush/Brush.cpp +++ b/radiantcore/brush/Brush.cpp @@ -196,6 +196,11 @@ void Brush::updateFaceVisibility() _owner.updateFaceVisibility(); } +void Brush::onFaceNeedsRenderableUpdate() +{ + _owner.onFaceNeedsRenderableUpdate(); +} + Brush::DetailFlag Brush::getDetailFlag() const { return _detailFlag; diff --git a/radiantcore/brush/Brush.h b/radiantcore/brush/Brush.h index df6ef7db06..18c1737737 100644 --- a/radiantcore/brush/Brush.h +++ b/radiantcore/brush/Brush.h @@ -181,6 +181,7 @@ class Brush : void onFaceShaderChanged(); void onFaceConnectivityChanged(); void onFaceEvaluateTransform(); + void onFaceNeedsRenderableUpdate(); // Sets the shader of all faces to the given name void setShader(const std::string& newShader) override; diff --git a/radiantcore/brush/BrushNode.cpp b/radiantcore/brush/BrushNode.cpp index 9256eaed26..47478ab7c2 100644 --- a/radiantcore/brush/BrushNode.cpp +++ b/radiantcore/brush/BrushNode.cpp @@ -17,7 +17,8 @@ BrushNode::BrushNode() : m_brush(*this), _renderableComponentsNeedUpdate(true), _untransformedOriginChanged(true), - _renderableVertices(m_brush, _selectedPoints) + _renderableVertices(m_brush, _selectedPoints), + _facesNeedRenderableUpdate(true) { m_brush.attach(*this); // BrushObserver @@ -41,7 +42,8 @@ BrushNode::BrushNode(const BrushNode& other) : m_brush(*this, other.m_brush), _renderableComponentsNeedUpdate(true), _untransformedOriginChanged(true), - _renderableVertices(m_brush, _selectedPoints) + _renderableVertices(m_brush, _selectedPoints), + _facesNeedRenderableUpdate(true) { m_brush.attach(*this); // BrushObserver } @@ -340,6 +342,11 @@ void BrushNode::DEBUG_verify() { ASSERT_MESSAGE(m_faceInstances.size() == m_brush.DEBUG_size(), "FATAL: mismatch"); } +void BrushNode::onFaceNeedsRenderableUpdate() +{ + _facesNeedRenderableUpdate = true; +} + void BrushNode::onPreRender(const VolumeTest& volume) { m_brush.evaluateBRep(); @@ -347,20 +354,27 @@ void BrushNode::onPreRender(const VolumeTest& volume) assert(_renderEntity); auto brushIsSelected = isSelected(); - auto isCameraView = volume.fill(); - // Every face is asked to run the rendering preparations - // to link/unlink their geometry to/from the active shader - for (auto& faceInstance : m_faceInstances) + // Run the face updates only if requested + if (_facesNeedRenderableUpdate) { - auto& face = faceInstance.getFace(); + _facesNeedRenderableUpdate = false; - // Always update the solid renderables, even in ortho rendering, since we need the solid renderable for highlighting - face.getWindingSurfaceSolid().update(face.getFaceShader().getGLShader(), *_renderEntity); + auto isCameraView = volume.fill(); - if (!isCameraView) + // Every face is asked to run the rendering preparations + // to link/unlink their geometry to/from the active shader + for (auto& faceInstance : m_faceInstances) { - face.getWindingSurfaceWireframe().update(_renderEntity->getWireShader(), *_renderEntity); + auto& face = faceInstance.getFace(); + + // Always update the solid renderables, even in ortho rendering, since we need the solid renderable for highlighting + face.getWindingSurfaceSolid().update(face.getFaceShader().getGLShader(), *_renderEntity); + + if (!isCameraView) + { + face.getWindingSurfaceWireframe().update(_renderEntity->getWireShader(), *_renderEntity); + } } } diff --git a/radiantcore/brush/BrushNode.h b/radiantcore/brush/BrushNode.h index 1cf6e271e7..f83c5b6e65 100644 --- a/radiantcore/brush/BrushNode.h +++ b/radiantcore/brush/BrushNode.h @@ -60,6 +60,8 @@ class BrushNode : brush::RenderableBrushVertices _renderableVertices; + bool _facesNeedRenderableUpdate; + public: // Constructor BrushNode(); @@ -138,6 +140,7 @@ class BrushNode : void renderHighlights(IRenderableCollector& collector, const VolumeTest& volume) override; void setRenderSystem(const RenderSystemPtr& renderSystem) override; std::size_t getHighlightFlags() override; + void onFaceNeedsRenderableUpdate(); void evaluateTransform(); diff --git a/radiantcore/brush/Face.cpp b/radiantcore/brush/Face.cpp index 14c87d9a24..49c852d696 100644 --- a/radiantcore/brush/Face.cpp +++ b/radiantcore/brush/Face.cpp @@ -355,6 +355,8 @@ void Face::updateRenderables() { _windingSurfaceSolid.queueUpdate(); _windingSurfaceWireframe.queueUpdate(); + + _owner.onFaceNeedsRenderableUpdate(); } void Face::updateWinding()