diff --git a/rts/Lua/LuaConstEngine.cpp b/rts/Lua/LuaConstEngine.cpp index 579a07102f..ce9defc5e5 100644 --- a/rts/Lua/LuaConstEngine.cpp +++ b/rts/Lua/LuaConstEngine.cpp @@ -28,6 +28,7 @@ * @field noHandicapForReclaim boolean Whether handicap is applied to income from reclaim * @field groupAddDoesntSelect boolean Whether 'group add' also selects the group (does both if false) * @field deadTeamsKeepUnitLimit boolean Whether engine redistributes dead team unitlimit to allies (false) or keeps it as-is (true) + * @field reliableLuaMapShaders boolean Whether forward-only Lua map shaders activate without a deferred draw and Spring.SetMapShader program swaps refresh cached uniform locations */ /*** @@ -83,6 +84,7 @@ bool LuaConstEngine::PushEntries(lua_State* L) LuaPushNamedBool(L, "noHandicapForReclaim", true); LuaPushNamedBool(L, "groupAddDoesntSelect", true); LuaPushNamedBool(L, "deadTeamsKeepUnitLimit", false); + LuaPushNamedBool(L, "reliableLuaMapShaders", true); lua_rawset(L, -3); lua_pushliteral(L, "textColorCodes"); diff --git a/rts/Map/SMF/SMFRenderState.cpp b/rts/Map/SMF/SMFRenderState.cpp index b116563bd8..67ec03ff6e 100644 --- a/rts/Map/SMF/SMFRenderState.cpp +++ b/rts/Map/SMF/SMFRenderState.cpp @@ -94,6 +94,12 @@ void SMFRenderStateGLSL::Update( for (uint32_t n = GLSL_SHADER_FWD_ADV; n <= GLSL_SHADER_DFR_ADV; n++) { glslShaders[n]->LoadFromID(luaMapShaderData->shaderIDs[n - 1]); } + + // currShader is null from Init() (GLSL_SHADER_FWD_STD is never created for + // the Lua state), so re-evaluate it now that program IDs changed; otherwise + // HasValidShader(Normal) stays false and a forward-only Lua map shader is + // never selected until a deferred Lua draw happens to run first + SetCurrentShader(smfGroundDrawer, DrawPass::Normal); } else { assert(luaMapShaderData == nullptr); diff --git a/rts/Rendering/Shaders/Shader.h b/rts/Rendering/Shaders/Shader.h index 90fa492d76..8f0945ce65 100644 --- a/rts/Rendering/Shaders/Shader.h +++ b/rts/Rendering/Shaders/Shader.h @@ -131,6 +131,10 @@ namespace Shader { // not needed for pre-compiled programs shaderObjs.clear(); + // cached locations/values belong to the previous program; without this, + // uniforms set by name (e.g. texSquare) target stale locations after a + // Spring.SetMapShader program swap + uniformStates.clear(); } /// create the whole shader from a lua file