diff --git a/include/irender.h b/include/irender.h index 0ca70154d9..e71e886091 100644 --- a/include/irender.h +++ b/include/irender.h @@ -534,6 +534,11 @@ enum class RenderViewType OrthoView = 1 << 1, }; +enum class BuiltInShaderType +{ + FlatshadeOverlay, +}; + /** * \brief * The main interface for the backend renderer. @@ -564,6 +569,12 @@ class RenderSystem */ virtual ITextRenderer::Ptr captureTextRenderer(IGLFont::Style style, std::size_t size) = 0; + /** + * Acquire one of DarkRadiant's built-in shaders, used for drawing + * things like connectors, lines, points and overlays. + */ + virtual ShaderPtr capture(BuiltInShaderType type) = 0; + /** * \brief * Main render method. diff --git a/radiantcore/CMakeLists.txt b/radiantcore/CMakeLists.txt index 08f5674ad2..a170c97ce5 100644 --- a/radiantcore/CMakeLists.txt +++ b/radiantcore/CMakeLists.txt @@ -215,6 +215,7 @@ add_library(radiantcore MODULE rendersystem/backend/glprogram/GLSLBumpProgram.cpp rendersystem/backend/glprogram/GLSLDepthFillProgram.cpp rendersystem/backend/glprogram/GLSLDepthFillAlphaProgram.cpp + rendersystem/backend/BuiltInShader.cpp rendersystem/backend/OpenGLShader.cpp rendersystem/backend/OpenGLShaderPass.cpp rendersystem/backend/DepthFillPass.cpp diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.cpp b/radiantcore/rendersystem/OpenGLRenderSystem.cpp index 5b09c6e1b6..bcf9990f89 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.cpp +++ b/radiantcore/rendersystem/OpenGLRenderSystem.cpp @@ -8,6 +8,7 @@ #include "math/Matrix4.h" #include "module/StaticModule.h" #include "backend/GLProgramFactory.h" +#include "backend/BuiltInShader.h" #include "debugging/debugging.h" #include @@ -102,7 +103,7 @@ ITextRenderer::Ptr OpenGLRenderSystem::captureTextRenderer(IGLFont::Style style, return existing->second; } -ShaderPtr OpenGLRenderSystem::capture(const std::string& name) +ShaderPtr OpenGLRenderSystem::capture(const std::string& name, const std::function& createShader) { // Usual ritual, check cache and return if found, otherwise create/ // insert/return. @@ -115,18 +116,37 @@ ShaderPtr OpenGLRenderSystem::capture(const std::string& name) // Either the shader was not found, or the weak pointer failed to lock // because the shader had been deleted. Either way, create a new shader - // and insert into the cache. - auto shd = std::make_shared(name, *this); - _shaders[name] = shd; + // using the given factory functor and insert into the cache. + auto shader = createShader(); + _shaders[name] = shader; // Realise the shader if the cache is realised if (_realised) { - shd->realise(); + shader->realise(); } - // Return the new shader - return shd; + return shader; +} + +ShaderPtr OpenGLRenderSystem::capture(const std::string& name) +{ + // Forward to the method accepting our factory method + return capture(name, [&]() + { + return std::make_shared(name, *this); + }); +} + +ShaderPtr OpenGLRenderSystem::capture(BuiltInShaderType type) +{ + // Forward to the method accepting our factory method + auto name = BuiltInShader::GetNameForType(type); + + return capture(name, [&]() + { + return std::make_shared(type, *this); + }); } /* @@ -262,13 +282,10 @@ void OpenGLRenderSystem::realise() _glProgramFactory->realise(); } - // Realise the OpenGLShader objects - for (ShaderMap::iterator i = _shaders.begin(); i != _shaders.end(); ++i) + // Realise all shaders + for (auto& [_, shader] : _shaders) { - OpenGLShaderPtr sp = i->second; - assert(sp); - - sp->realise(); + shader->realise(); } } @@ -280,13 +297,10 @@ void OpenGLRenderSystem::unrealise() _realised = false; - // Unrealise the OpenGLShader objects - for (ShaderMap::iterator i = _shaders.begin(); i != _shaders.end(); ++i) + // Unrealise all OpenGLShader objects + for (auto& [_, shader] : _shaders) { - OpenGLShaderPtr sp = i->second; - assert(sp); - - sp->unrealise(); + shader->unrealise(); } if (GlobalOpenGLContext().getSharedContext() && diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.h b/radiantcore/rendersystem/OpenGLRenderSystem.h index 9dbc09a953..f87716b0ed 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.h +++ b/radiantcore/rendersystem/OpenGLRenderSystem.h @@ -24,8 +24,7 @@ class OpenGLRenderSystem public OpenGLStateManager { // Map of named Shader objects - typedef std::map ShaderMap; - ShaderMap _shaders; + std::map _shaders; // whether this module has been realised bool _realised; @@ -68,6 +67,7 @@ class OpenGLRenderSystem ITextRenderer::Ptr captureTextRenderer(IGLFont::Style style, std::size_t size) override; ShaderPtr capture(const std::string& name) override; + ShaderPtr capture(BuiltInShaderType type) override; void render(RenderViewType renderViewType, RenderStateFlags globalstate, const Matrix4& modelview, const Matrix4& projection, @@ -108,6 +108,9 @@ class OpenGLRenderSystem virtual const StringSet& getDependencies() const override; virtual void initialiseModule(const IApplicationContext& ctx) override; virtual void shutdownModule() override; + +private: + ShaderPtr capture(const std::string& name, const std::function& createShader); }; typedef std::shared_ptr OpenGLRenderSystemPtr; diff --git a/radiantcore/rendersystem/backend/BuiltInShader.cpp b/radiantcore/rendersystem/backend/BuiltInShader.cpp new file mode 100644 index 0000000000..199e825858 --- /dev/null +++ b/radiantcore/rendersystem/backend/BuiltInShader.cpp @@ -0,0 +1,19 @@ +#include "BuiltInShader.h" + +#include "string/convert.h" + +namespace render +{ + +BuiltInShader::BuiltInShader(BuiltInShaderType type, OpenGLRenderSystem& renderSystem) : + OpenGLShader(GetNameForType(type), renderSystem) +{} + + + +std::string BuiltInShader::GetNameForType(BuiltInShaderType type) +{ + return "$BUILT_IN_SHADER[" + string::to_string(static_cast(type)) + "]"; +} + +} diff --git a/radiantcore/rendersystem/backend/BuiltInShader.h b/radiantcore/rendersystem/backend/BuiltInShader.h new file mode 100644 index 0000000000..0dc61c9148 --- /dev/null +++ b/radiantcore/rendersystem/backend/BuiltInShader.h @@ -0,0 +1,17 @@ +#pragma once + +#include "OpenGLShader.h" + +namespace render +{ + +class BuiltInShader : + public OpenGLShader +{ +public: + BuiltInShader(BuiltInShaderType type, OpenGLRenderSystem& renderSystem); + + static std::string GetNameForType(BuiltInShaderType type); +}; + +} diff --git a/radiantcore/rendersystem/backend/OpenGLShader.cpp b/radiantcore/rendersystem/backend/OpenGLShader.cpp index bb79fc2a4d..19d40524db 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.cpp +++ b/radiantcore/rendersystem/backend/OpenGLShader.cpp @@ -79,7 +79,6 @@ OpenGLRenderSystem& OpenGLShader::getRenderSystem() void OpenGLShader::destroy() { _enabledViewTypes = 0; - _vertexBuffer.reset(); _materialChanged.disconnect(); _material.reset(); _shaderPasses.clear(); @@ -141,7 +140,7 @@ void OpenGLShader::drawSurfaces(const VolumeTest& view) bool OpenGLShader::hasSurfaces() const { - return !_geometryRenderer.empty() || !_surfaceRenderer.empty() || _vertexBuffer && _vertexBuffer->getNumVertices() > 0; + return !_geometryRenderer.empty() || !_surfaceRenderer.empty(); } IGeometryRenderer::Slot OpenGLShader::addGeometry(GeometryType indexType, diff --git a/radiantcore/rendersystem/backend/OpenGLShader.h b/radiantcore/rendersystem/backend/OpenGLShader.h index ca96e9d8c3..81ff08276e 100644 --- a/radiantcore/rendersystem/backend/OpenGLShader.h +++ b/radiantcore/rendersystem/backend/OpenGLShader.h @@ -5,7 +5,6 @@ #include "irender.h" #include "ishaders.h" #include "string/string.h" -#include "render/IndexedVertexBuffer.h" #include "render/WindingRenderer.h" #include "GeometryRenderer.h" #include "SurfaceRenderer.h" @@ -21,7 +20,7 @@ class OpenGLRenderSystem; /** * Implementation of the Shader class. */ -class OpenGLShader final : +class OpenGLShader : public Shader { private: @@ -48,8 +47,6 @@ class OpenGLShader final : typedef std::set Observers; Observers _observers; - std::unique_ptr> _vertexBuffer; - std::unique_ptr _windingRenderer; GeometryRenderer _geometryRenderer; SurfaceRenderer _surfaceRenderer; @@ -99,7 +96,7 @@ class OpenGLShader final : /// Construct and initialise OpenGLShader(const std::string& name, OpenGLRenderSystem& renderSystem); - ~OpenGLShader(); + virtual ~OpenGLShader(); // Returns the owning render system OpenGLRenderSystem& getRenderSystem(); @@ -111,7 +108,6 @@ class OpenGLShader final : const LightSources* lights, const IRenderEntity* entity) override; - //void addSurface(const std::vector& vertices, const std::vector& indices) override; bool hasSurfaces() const; void drawSurfaces(const VolumeTest& view); @@ -143,11 +139,7 @@ class OpenGLShader final : bool isRealised() override; - /** - * Realise this shader - */ void realise(); - void unrealise(); // Return the Material used by this shader diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index 88d823c080..0428862ddb 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -622,6 +622,7 @@ + @@ -979,6 +980,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index 78e850ef59..07c5875603 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -1114,6 +1114,9 @@ src\entity + + src\rendersystem\backend + @@ -2280,5 +2283,8 @@ src\entity + + src\rendersystem\backend + \ No newline at end of file