Skip to content

Commit

Permalink
- Make uniform removal a little bit more robust by only searching for…
Browse files Browse the repository at this point in the history
… known legacy uniforms
  • Loading branch information
dpjudas committed Feb 10, 2018
1 parent f01ef3d commit 5528d41
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions src/gl/shaders/gl_shader.cpp
Expand Up @@ -67,10 +67,26 @@ static bool IsGlslWhitespace(char c)
}
}

static FString NextGlslToken(const char *chars, long len, long &pos)
{
// Eat whitespace
long tokenStart = pos;
while (tokenStart != len && IsGlslWhitespace(chars[tokenStart]))
tokenStart++;

// Find token end
long tokenEnd = tokenStart;
while (tokenEnd != len && !IsGlslWhitespace(chars[tokenEnd]) && chars[tokenEnd] != ';')
tokenEnd++;

pos = tokenEnd;
return FString(chars + tokenStart, tokenEnd - tokenStart);
}

static FString RemoveLegacyUserUniforms(FString code)
{
// User shaders must declare their uniforms via the GLDEFS file.
// The following code searches for uniform declarations in the shader itself and replaces them with whitespace.
// The following code searches for legacy uniform declarations in the shader itself and replaces them with whitespace.

long len = (long)code.Len();
char *chars = code.LockBuffer();
Expand All @@ -82,14 +98,25 @@ static FString RemoveLegacyUserUniforms(FString code)
if (matchIndex == -1)
break;

bool isLegacyUniformName = false;

bool isKeywordStart = matchIndex == 0 || IsGlslWhitespace(chars[matchIndex - 1]);
bool isKeywordEnd = matchIndex + 7 == len || IsGlslWhitespace(chars[matchIndex + 7]);
if (isKeywordStart && isKeywordEnd)
{
long pos = matchIndex + 7;
FString type = NextGlslToken(chars, len, pos);
FString identifier = NextGlslToken(chars, len, pos);

isLegacyUniformName = type.Compare("float") == 0 && identifier.Compare("timer") == 0;
}

if (isLegacyUniformName)
{
long statementEndIndex = code.IndexOf(';', matchIndex + 7);
if (statementEndIndex == -1)
statementEndIndex = len;
for (long i = matchIndex; i < statementEndIndex; i++)
for (long i = matchIndex; i <= statementEndIndex; i++)
{
if (!IsGlslWhitespace(chars[i]))
chars[i] = ' ';
Expand Down Expand Up @@ -281,7 +308,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
FString fp_comb = vp_comb;

vp_comb << vp_data.GetString().GetChars() << "\n";
fp_comb << RemoveLegacyUserUniforms(fp_data.GetString()).GetChars() << "\n";
fp_comb << fp_data.GetString().GetChars() << "\n";

if (proc_prog_lump != NULL)
{
Expand All @@ -298,7 +325,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *

fp_comb.Substitute("vec4 frag = ProcessTexel();", "vec4 frag = Process(vec4(1.0));");
}
fp_comb << pp_data.GetString().GetChars();
fp_comb << RemoveLegacyUserUniforms(pp_data.GetString()).GetChars();
fp_comb.Substitute("gl_TexCoord[0]", "vTexCoord"); // fix old custom shaders.

if (pp_data.GetString().IndexOf("ProcessLight") < 0)
Expand Down

0 comments on commit 5528d41

Please sign in to comment.