From 6a2149a9b2ef012dbc2f94a6c7127babb7701a6a Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 19 Feb 2022 09:54:50 +0100 Subject: [PATCH] #5893: Restrict LightInteractions rendering to those stages that feature a lighting (DBS) pass --- radiantcore/CMakeLists.txt | 1 + .../rendersystem/OpenGLRenderSystem.cpp | 3 ++ .../rendersystem/backend/InteractionPass.cpp | 31 ++++++++++++++++ .../rendersystem/backend/InteractionPass.h | 20 ++++++++++ .../backend/LightInteractions.cpp | 5 +++ .../rendersystem/backend/OpenGLShader.cpp | 37 ++++++++----------- .../rendersystem/backend/OpenGLShader.h | 7 ++++ tools/msvc/DarkRadiantCore.vcxproj | 2 + tools/msvc/DarkRadiantCore.vcxproj.filters | 6 +++ 9 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 radiantcore/rendersystem/backend/InteractionPass.cpp create mode 100644 radiantcore/rendersystem/backend/InteractionPass.h diff --git a/radiantcore/CMakeLists.txt b/radiantcore/CMakeLists.txt index e012eae854..01230582eb 100644 --- a/radiantcore/CMakeLists.txt +++ b/radiantcore/CMakeLists.txt @@ -222,6 +222,7 @@ add_library(radiantcore MODULE rendersystem/backend/OpenGLShader.cpp rendersystem/backend/OpenGLShaderPass.cpp rendersystem/backend/DepthFillPass.cpp + rendersystem/backend/InteractionPass.cpp rendersystem/debug/SpacePartitionRenderer.cpp rendersystem/GLFont.cpp rendersystem/OpenGLModule.cpp diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.cpp b/radiantcore/rendersystem/OpenGLRenderSystem.cpp index b38bd8baa3..2fbf140fd3 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.cpp +++ b/radiantcore/rendersystem/OpenGLRenderSystem.cpp @@ -364,6 +364,9 @@ IRenderResult::Ptr OpenGLRenderSystem::renderLitScene(RenderStateFlags globalFla result->drawCalls += interactionList.getDrawCalls(); } + // Draw non-interaction passes (like skyboxes or blend stages) + // TODO + renderText(); finishRendering(); diff --git a/radiantcore/rendersystem/backend/InteractionPass.cpp b/radiantcore/rendersystem/backend/InteractionPass.cpp new file mode 100644 index 0000000000..b3df59d100 --- /dev/null +++ b/radiantcore/rendersystem/backend/InteractionPass.cpp @@ -0,0 +1,31 @@ +#include "InteractionPass.h" + +#include "GLProgramFactory.h" +#include "../OpenGLRenderSystem.h" + +namespace render +{ + +InteractionPass::InteractionPass(OpenGLShader& owner, OpenGLRenderSystem& renderSystem) : + OpenGLShaderPass(owner) +{ + // Set render flags + _glState.setRenderFlag(RENDER_BLEND); + _glState.setRenderFlag(RENDER_FILL); + _glState.setRenderFlag(RENDER_TEXTURE_2D); + _glState.setRenderFlag(RENDER_CULLFACE); + _glState.setRenderFlag(RENDER_DEPTHTEST); + _glState.setRenderFlag(RENDER_SMOOTH); + _glState.setRenderFlag(RENDER_BUMP); + _glState.setRenderFlag(RENDER_PROGRAM); + + _glState.glProgram = renderSystem.getGLProgramFactory().getBuiltInProgram(ShaderProgram::Interaction); + + _glState.setDepthFunc(GL_LEQUAL); + _glState.polygonOffset = 0.5f; + _glState.setSortPosition(OpenGLState::SORT_INTERACTION); + _glState.m_blend_src = GL_ONE; + _glState.m_blend_dst = GL_ONE; +} + +} diff --git a/radiantcore/rendersystem/backend/InteractionPass.h b/radiantcore/rendersystem/backend/InteractionPass.h new file mode 100644 index 0000000000..1e0e5ce144 --- /dev/null +++ b/radiantcore/rendersystem/backend/InteractionPass.h @@ -0,0 +1,20 @@ +#pragma once + +#include "OpenGLShaderPass.h" + +namespace render +{ + +class OpenGLRenderSystem; + +/** + * Lighting Interaction pass (Diffuse/Bump/Specular). + */ +class InteractionPass : + public OpenGLShaderPass +{ +public: + InteractionPass(OpenGLShader& owner, OpenGLRenderSystem& renderSystem); +}; + +} diff --git a/radiantcore/rendersystem/backend/LightInteractions.cpp b/radiantcore/rendersystem/backend/LightInteractions.cpp index f45db34c33..45c99b0fc1 100644 --- a/radiantcore/rendersystem/backend/LightInteractions.cpp +++ b/radiantcore/rendersystem/backend/LightInteractions.cpp @@ -83,6 +83,11 @@ void LightInteractions::collectSurfaces(const std::set& entiti return; } + if (!glShader->getInteractionPass()) + { + return; // This material doesn't interact with lighting + } + addObject(*object, *entity, glShader); }); } diff --git a/radiantcore/rendersystem/backend/OpenGLShader.cpp b/radiantcore/rendersystem/backend/OpenGLShader.cpp index a1f3acba62..4b80551130 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.cpp +++ b/radiantcore/rendersystem/backend/OpenGLShader.cpp @@ -3,6 +3,7 @@ #include "GLProgramFactory.h" #include "../OpenGLRenderSystem.h" #include "DepthFillPass.h" +#include "InteractionPass.h" #include "icolourscheme.h" #include "ishaders.h" @@ -325,6 +326,7 @@ void OpenGLShader::removePasses() void OpenGLShader::clearPasses() { + _interactionPass.reset(); _depthFillPass.reset(); _shaderPasses.clear(); } @@ -365,6 +367,12 @@ OpenGLState& OpenGLShader::appendDepthFillPass() return _depthFillPass->state(); } +OpenGLState& OpenGLShader::appendInteractionPass() +{ + _interactionPass = _shaderPasses.emplace_back(std::make_shared(*this, _renderSystem)); + return _interactionPass->state(); +} + // Test if we can render in bump map mode bool OpenGLShader::canUseLightingMode() const { @@ -425,7 +433,7 @@ void OpenGLShader::appendInteractionLayer(const DBSTriplet& triplet) if (triplet.needDepthFill && triplet.diffuse) { // Create depth-buffer fill pass with alpha test - OpenGLState& zPass = appendDepthFillPass(); + auto& zPass = appendDepthFillPass(); // Store the alpha test value zPass.alphaThreshold = static_cast(alphaTest); @@ -436,23 +444,11 @@ void OpenGLShader::appendInteractionLayer(const DBSTriplet& triplet) } // Add the DBS pass - OpenGLState& dbsPass = appendDefaultPass(); + auto& dbsPass = appendInteractionPass(); // Populate the textures and remember the stage reference setGLTexturesFromTriplet(dbsPass, triplet); - // Set render flags - dbsPass.setRenderFlag(RENDER_BLEND); - dbsPass.setRenderFlag(RENDER_FILL); - dbsPass.setRenderFlag(RENDER_TEXTURE_2D); - dbsPass.setRenderFlag(RENDER_CULLFACE); - dbsPass.setRenderFlag(RENDER_DEPTHTEST); - dbsPass.setRenderFlag(RENDER_SMOOTH); - dbsPass.setRenderFlag(RENDER_BUMP); - dbsPass.setRenderFlag(RENDER_PROGRAM); - - dbsPass.glProgram = _renderSystem.getGLProgramFactory().getBuiltInProgram(ShaderProgram::Interaction); - if (vcolMode != IShaderLayer::VERTEX_COLOUR_NONE) { // Vertex colours allowed @@ -471,13 +467,7 @@ void OpenGLShader::appendInteractionLayer(const DBSTriplet& triplet) if (triplet.diffuse) { dbsPass.setColour(triplet.diffuse->getColour()); - } - - dbsPass.setDepthFunc(GL_LEQUAL); - dbsPass.polygonOffset = 0.5f; - dbsPass.setSortPosition(OpenGLState::SORT_INTERACTION); - dbsPass.m_blend_src = GL_ONE; - dbsPass.m_blend_dst = GL_ONE; + } } void OpenGLShader::applyAlphaTestToPass(OpenGLState& pass, double alphaTest) @@ -845,5 +835,10 @@ OpenGLShaderPass* OpenGLShader::getDepthFillPass() const return _depthFillPass.get(); } +OpenGLShaderPass* OpenGLShader::getInteractionPass() const +{ + return _interactionPass.get(); +} + } diff --git a/radiantcore/rendersystem/backend/OpenGLShader.h b/radiantcore/rendersystem/backend/OpenGLShader.h index e4ec99471e..391b2972b1 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.h +++ b/radiantcore/rendersystem/backend/OpenGLShader.h @@ -38,6 +38,9 @@ class OpenGLShader : // Lighting mode needs to have quick access to this pass OpenGLShaderPassPtr _depthFillPass; + // Interaction pass used by lighting mode + OpenGLShaderPassPtr _interactionPass; + // The Material corresponding to this OpenGLShader MaterialPtr _material; sigc::connection _materialChanged; @@ -153,6 +156,9 @@ class OpenGLShader : // Returns the depth fill pass of this shader, or null if this shader doesn't have one OpenGLShaderPass* getDepthFillPass() const; + // Returns the interaction pass of this shader, or null if this shader doesn't have one + OpenGLShaderPass* getInteractionPass() const; + protected: // Start point for constructing shader passes from the shader name virtual void construct(); @@ -182,6 +188,7 @@ class OpenGLShader : void clearPasses(); OpenGLState& appendDepthFillPass(); + OpenGLState& appendInteractionPass(); }; typedef std::shared_ptr OpenGLShaderPtr; diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index 79c5852626..3d2f1e931d 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -632,6 +632,7 @@ + @@ -995,6 +996,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index e2f88773cd..bd17219d79 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -1126,6 +1126,9 @@ src\rendersystem\backend\glprogram + + src\rendersystem\backend + @@ -2313,5 +2316,8 @@ src\rendersystem\backend\glprogram + + src\rendersystem\backend + \ No newline at end of file