From 91ca6c39a340dd086d479beb56baeb67fdbf3bb4 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 7 Dec 2023 12:19:19 +0100 Subject: [PATCH] Add support for loading older custom shaders --- .../rendering/vulkan/shaders/vk_shader.cpp | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 998ae7b7e..311f55330 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -222,23 +222,67 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername FString materialname = "MaterialBlock"; FString materialBlock; + FString lightname = "LightBlock"; + FString lightBlock; + FString mateffectname = "MaterialEffectBlock"; + FString mateffectBlock; + if (material_lump) { materialname = material_lump; materialBlock = LoadPublicShaderLump(material_lump); + + // Attempt to fix old custom shaders: + + materialBlock = RemoveLegacyUserUniforms(materialBlock); + materialBlock.Substitute("gl_TexCoord[0]", "vTexCoord"); + + if (materialBlock.IndexOf("ProcessMaterial") < 0 && materialBlock.IndexOf("SetupMaterial") < 0) + { + // Old hardware shaders that implements GetTexCoord, ProcessTexel or Process + + if (materialBlock.IndexOf("GetTexCoord") >= 0) + { + mateffectBlock = "vec2 GetTexCoord();"; + } + + FString code; + if (materialBlock.IndexOf("ProcessTexel") >= 0) + { + code = LoadPrivateShaderLump("shaders/scene/material_legacy_ptexel.glsl"); + } + else if (materialBlock.IndexOf("Process") >= 0) + { + code = LoadPrivateShaderLump("shaders/scene/material_legacy_process.glsl"); + } + else + { + code = LoadPrivateShaderLump("shaders/scene/material_default.glsl"); + } + code << "\n#line 1\n"; + + materialBlock = code + materialBlock; + } + else if (materialBlock.IndexOf("SetupMaterial") < 0) + { + // Old hardware shader implementing SetupMaterial + + definesBlock << "#define LEGACY_USER_SHADER\n"; + + FString code = LoadPrivateShaderLump("shaders/scene/material_legacy_pmaterial.glsl"); + code << "\n#line 1\n"; + + materialBlock = code + materialBlock; + } } - FString lightname = "LightBlock"; - FString lightBlock; - if (light_lump) + if (light_lump && lightBlock.IsEmpty()) { lightname = light_lump; lightBlock << LoadPrivateShaderLump(light_lump).GetChars(); } - FString mateffectname = "MaterialEffectBlock"; - FString mateffectBlock; - if (mateffect_lump) + if (mateffect_lump && mateffectBlock.IsEmpty()) { mateffectname = mateffect_lump; mateffectBlock << LoadPrivateShaderLump(mateffect_lump).GetChars();