From d2a56f904488c95a5c95296c4b519c0adca1f629 Mon Sep 17 00:00:00 2001 From: codereader Date: Tue, 25 Jan 2022 04:56:04 +0100 Subject: [PATCH] #5584: Migrating built-in shaders --- include/irender.h | 11 +++ radiant/camera/CamWnd.cpp | 8 +-- radiantcore/patch/PatchNode.cpp | 2 +- .../rendersystem/backend/BuiltInShader.cpp | 68 +++++++++++++++++++ .../rendersystem/backend/BuiltInShader.h | 2 + .../rendersystem/backend/OpenGLShader.cpp | 10 ++- 6 files changed, 94 insertions(+), 7 deletions(-) diff --git a/include/irender.h b/include/irender.h index 21c92b82ee..734cd42262 100644 --- a/include/irender.h +++ b/include/irender.h @@ -542,6 +542,9 @@ enum class BuiltInShaderType // A bigger version of "Point" BigPoint, + // Lines connecting the patch control points + PatchLattice, + // Line shader drawing above regular things WireframeOverlay, @@ -580,6 +583,14 @@ enum class BuiltInShaderType // Line shader used for drawing the three axes at entity origins Pivot, + + // Coloured merge action highlights (camera) + CameraMergeActionOverlayAdd, + CameraMergeActionOverlayRemove, + CameraMergeActionOverlayChange, + CameraMergeActionOverlayConflict, + + }; /** diff --git a/radiant/camera/CamWnd.cpp b/radiant/camera/CamWnd.cpp index 747ebdadb1..525da8d3ac 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -971,10 +971,10 @@ void CamWnd::captureStates() { _shaders.faceHighlightShader = GlobalRenderSystem().capture(BuiltInShaderType::ColouredPolygonOverlay); _shaders.primitiveHighlightShader = GlobalRenderSystem().capture(BuiltInShaderType::HighlightedPolygonOutline); - _shaders.mergeActionShaderAdd = GlobalRenderSystem().capture("$MERGE_ACTION_ADD"); - _shaders.mergeActionShaderChange = GlobalRenderSystem().capture("$MERGE_ACTION_CHANGE"); - _shaders.mergeActionShaderRemove = GlobalRenderSystem().capture("$MERGE_ACTION_REMOVE"); - _shaders.mergeActionShaderConflict = GlobalRenderSystem().capture("$MERGE_ACTION_CONFLICT"); + _shaders.mergeActionShaderAdd = GlobalRenderSystem().capture(BuiltInShaderType::CameraMergeActionOverlayAdd); + _shaders.mergeActionShaderChange = GlobalRenderSystem().capture(BuiltInShaderType::CameraMergeActionOverlayChange); + _shaders.mergeActionShaderRemove = GlobalRenderSystem().capture(BuiltInShaderType::CameraMergeActionOverlayRemove); + _shaders.mergeActionShaderConflict = GlobalRenderSystem().capture(BuiltInShaderType::CameraMergeActionOverlayConflict); } void CamWnd::releaseStates() diff --git a/radiantcore/patch/PatchNode.cpp b/radiantcore/patch/PatchNode.cpp index 4636f0810d..e2e968be36 100644 --- a/radiantcore/patch/PatchNode.cpp +++ b/radiantcore/patch/PatchNode.cpp @@ -387,7 +387,7 @@ void PatchNode::setRenderSystem(const RenderSystemPtr& renderSystem) if (renderSystem) { _ctrlPointShader = renderSystem->capture(BuiltInShaderType::Point); - _ctrlLatticeShader = renderSystem->capture("$LATTICE"); + _ctrlLatticeShader = renderSystem->capture(BuiltInShaderType::PatchLattice); } else { diff --git a/radiantcore/rendersystem/backend/BuiltInShader.cpp b/radiantcore/rendersystem/backend/BuiltInShader.cpp index dbdaaf218f..4ac7a4447c 100644 --- a/radiantcore/rendersystem/backend/BuiltInShader.cpp +++ b/radiantcore/rendersystem/backend/BuiltInShader.cpp @@ -234,11 +234,79 @@ void BuiltInShader::construct() break; } + case BuiltInShaderType::PatchLattice: + { + pass.setColour(1, 0.5, 0, 1); + pass.setRenderFlag(RENDER_DEPTHWRITE); + pass.setSortPosition(OpenGLState::SORT_POINT_FIRST); + + enableViewType(RenderViewType::Camera); + enableViewType(RenderViewType::OrthoView); + break; + } + + case BuiltInShaderType::CameraMergeActionOverlayAdd: + { + // render additions over removals + constructCameraMergeActionOverlay(pass, { 0, 0.9f, 0, 0.5f }, + OpenGLState::SORT_OVERLAY_THIRD, OpenGLState::SORT_OVERLAY_LAST); + break; + } + + case BuiltInShaderType::CameraMergeActionOverlayRemove: + { + constructCameraMergeActionOverlay(pass, { 0.6f, 0.1f, 0, 0.5f }, + OpenGLState::SORT_OVERLAY_FIRST, OpenGLState::SORT_OVERLAY_ONE_BEFORE_LAST); + break; + } + + case BuiltInShaderType::CameraMergeActionOverlayChange: + { + constructCameraMergeActionOverlay(pass, { 0, 0.4f, 0.9f, 0.5f }, + OpenGLState::SORT_OVERLAY_SECOND, OpenGLState::SORT_OVERLAY_LAST); + break; + } + + case BuiltInShaderType::CameraMergeActionOverlayConflict: + { + constructCameraMergeActionOverlay(pass, { 0.9f, 0.5f, 0.0f, 0.5f }, + OpenGLState::SORT_OVERLAY_ONE_BEFORE_LAST, OpenGLState::SORT_OVERLAY_LAST); + break; + } + default: throw std::runtime_error("Cannot construct this shader: " + getName()); } } +void BuiltInShader::constructCameraMergeActionOverlay(OpenGLState& pass, const Colour4& colour, + OpenGLState::SortPosition sortPosition, OpenGLState::SortPosition lineSortPosition) +{ + // This is a pass drawing a coloured overlay + // over faces/polys. Its colour is configurable, + // and it has depth test activated. + pass.setRenderFlag(RENDER_FILL); + pass.setRenderFlag(RENDER_DEPTHTEST); + pass.setRenderFlag(RENDER_CULLFACE); + pass.setRenderFlag(RENDER_BLEND); + + pass.setColour(colour); + pass.setSortPosition(sortPosition); + pass.polygonOffset = 0.5f; + pass.setDepthFunc(GL_LEQUAL); + + // This is the outline pass + auto& linesOverlay = appendDefaultPass(); + auto lineOverlayColour = colour; + lineOverlayColour[3] = 0.78f; + + linesOverlay.setColour(lineOverlayColour); + linesOverlay.setRenderFlags(RENDER_OFFSETLINE | RENDER_DEPTHTEST | RENDER_BLEND); + linesOverlay.setSortPosition(lineSortPosition); + + enableViewType(RenderViewType::Camera); +} + void BuiltInShader::constructPointShader(OpenGLState& pass, float pointSize, OpenGLState::SortPosition sort) { pass.setRenderFlag(RENDER_POINT_COLOUR); diff --git a/radiantcore/rendersystem/backend/BuiltInShader.h b/radiantcore/rendersystem/backend/BuiltInShader.h index e88c2a9c40..9ebf396cb9 100644 --- a/radiantcore/rendersystem/backend/BuiltInShader.h +++ b/radiantcore/rendersystem/backend/BuiltInShader.h @@ -20,6 +20,8 @@ class BuiltInShader : void construct() override; void constructPointShader(OpenGLState& pass, float pointSize, OpenGLState::SortPosition sort); void constructWireframeSelectionOverlay(OpenGLState& pass, const std::string& schemeColourKey); + void constructCameraMergeActionOverlay(OpenGLState& pass, const Colour4& colour, + OpenGLState::SortPosition sortPosition, OpenGLState::SortPosition lineSortPosition); }; } diff --git a/radiantcore/rendersystem/backend/OpenGLShader.cpp b/radiantcore/rendersystem/backend/OpenGLShader.cpp index 57efc33b13..bf607b4ee8 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.cpp +++ b/radiantcore/rendersystem/backend/OpenGLShader.cpp @@ -919,6 +919,7 @@ void OpenGLShader::construct() } else #endif +#if 0 if (_name == "$LATTICE") { state.setColour(1, 0.5, 0, 1); @@ -928,6 +929,7 @@ void OpenGLShader::construct() enableViewType(RenderViewType::Camera); enableViewType(RenderViewType::OrthoView); } +#endif #if 0 else if (_name == "$WIREFRAME") { @@ -978,8 +980,10 @@ void OpenGLShader::construct() enableViewType(RenderViewType::Camera); } + else #endif - else if (string::starts_with(_name, "$MERGE_ACTION_")) +#if 0 + if (string::starts_with(_name, "$MERGE_ACTION_")) { Colour4 colour; auto sortPosition = OpenGLState::SORT_OVERLAY_FIRST; @@ -1028,6 +1032,7 @@ void OpenGLShader::construct() enableViewType(RenderViewType::Camera); } +#endif #if 0 else if (_name == "$XY_OVERLAY") { @@ -1059,8 +1064,9 @@ void OpenGLShader::construct() enableViewType(RenderViewType::OrthoView); } + else #endif - else if (string::starts_with(_name, "$XY_MERGE_ACTION_")) + if (string::starts_with(_name, "$XY_MERGE_ACTION_")) { Colour4 colour; auto sortPosition = OpenGLState::SORT_OVERLAY_FIRST;