Skip to content

Commit cb4b034

Browse files
committed
Make R_RemapShader multiple registration-aware
Make R_RemapShader handle shader registration flags correctly. For each version of the shader, register the replacement shader with a matching set of flags, instead of always using RSF_DEFAULT. Also this fixes a bug that when the replacement shader was not found, the 'defaulted' shader (one that was not found or failed parsing) for rendering. New behavior is to not change the replacement state. Note that Thunder has recently been relying on this bug - see UnvanquishedAssets/map-thunder_src.dpkdir#7
1 parent 70c1142 commit cb4b034

File tree

2 files changed

+33
-74
lines changed

2 files changed

+33
-74
lines changed

src/engine/renderer/tr_local.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,8 @@ enum
11631163
int autoSpriteMode;
11641164
bool autoSpriteWarned = false;
11651165

1166+
bool shaderRemapWarned;
1167+
11661168
uint8_t numDeforms;
11671169
deformStage_t deforms[ MAX_SHADER_DEFORMS ];
11681170

@@ -2999,7 +3001,6 @@ void GL_CompressedTexSubImage3D( GLenum target, GLint level, GLint xOffset, GLin
29993001

30003002
shader_t *R_FindShader( const char *name, int flags );
30013003
shader_t *R_GetShaderByHandle( qhandle_t hShader );
3002-
shader_t *R_FindShaderByName( const char *name );
30033004
const char *RE_GetShaderNameFromHandle( qhandle_t shader );
30043005
void R_InitShaders();
30053006
void R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset );

src/engine/renderer/tr_shader.cpp

Lines changed: 31 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -134,51 +134,35 @@ void R_RemapShader( const char *shaderName, const char *newShaderName, const cha
134134
{
135135
char strippedName[ MAX_QPATH ];
136136
int hash;
137-
shader_t *sh, *sh2;
138-
qhandle_t h;
139-
140-
sh = R_FindShaderByName( shaderName );
141-
142-
if ( sh == nullptr || sh == tr.defaultShader )
143-
{
144-
h = RE_RegisterShader( shaderName, RSF_DEFAULT );
145-
sh = R_GetShaderByHandle( h );
146-
}
147-
148-
if ( sh == nullptr || sh == tr.defaultShader )
149-
{
150-
Log::Warn("R_RemapShader: shader %s not found", shaderName );
151-
return;
152-
}
153-
154-
sh2 = R_FindShaderByName( newShaderName );
155-
156-
if ( sh2 == nullptr || sh2 == tr.defaultShader )
157-
{
158-
h = RE_RegisterShader( newShaderName, RSF_DEFAULT );
159-
sh2 = R_GetShaderByHandle( h );
160-
}
161-
162-
if ( sh2 == nullptr || sh2 == tr.defaultShader )
163-
{
164-
Log::Warn("R_RemapShader: new shader %s not found", newShaderName );
165-
return;
166-
}
167-
168-
if ( sh->autoSpriteMode != sh2->autoSpriteMode ) {
169-
Log::Warn("R_RemapShader: shaders %s and %s have different autoSprite modes", shaderName, newShaderName );
170-
return;
171-
}
172137

173138
// remap all the shaders with the given name
174139
// even tho they might have different lightmaps
175140
COM_StripExtension3( shaderName, strippedName, sizeof( strippedName ) );
176141
hash = generateHashValue( strippedName, FILE_HASH_SIZE );
142+
bool found = false;
177143

178-
for ( sh = shaderHashTable[ hash ]; sh; sh = sh->next )
144+
for ( shader_t *sh = shaderHashTable[ hash ]; sh; sh = sh->next )
179145
{
180146
if ( Q_stricmp( sh->name, strippedName ) == 0 )
181147
{
148+
found = true;
149+
shader_t *sh2 = R_FindShader( newShaderName, sh->registerFlags );
150+
151+
if ( sh2->defaultShader )
152+
{
153+
if ( !sh2->shaderRemapWarned )
154+
{
155+
Log::Warn( "R_RemapShader: new shader %s not found", newShaderName );
156+
sh2->shaderRemapWarned = true;
157+
}
158+
return;
159+
}
160+
161+
if ( sh->autoSpriteMode != sh2->autoSpriteMode ) {
162+
Log::Warn( "R_RemapShader: shaders %s and %s have different autoSprite modes", shaderName, newShaderName );
163+
return;
164+
}
165+
182166
if ( sh != sh2 )
183167
{
184168
sh->remappedShader = sh2;
@@ -189,6 +173,17 @@ void R_RemapShader( const char *shaderName, const char *newShaderName, const cha
189173
}
190174
}
191175
}
176+
177+
if ( !found )
178+
{
179+
// try registering it to detect typos
180+
shader_t *test = R_FindShader( shaderName, RSF_DEFAULT );
181+
182+
if ( test->defaultShader )
183+
{
184+
Log::Warn( "R_RemapShader: shader %s not found", shaderName );
185+
}
186+
}
192187
}
193188

194189
/*
@@ -5987,43 +5982,6 @@ static const char *FindShaderInShaderText( const char *shaderName )
59875982
return nullptr;
59885983
}
59895984

5990-
/*
5991-
==================
5992-
R_FindShaderByName
5993-
5994-
Will always return a valid shader, but it might be the
5995-
default shader if the real one can't be found.
5996-
==================
5997-
*/
5998-
shader_t *R_FindShaderByName( const char *name )
5999-
{
6000-
char strippedName[ MAX_QPATH ];
6001-
int hash;
6002-
shader_t *sh;
6003-
6004-
if ( ( name == nullptr ) || ( name[ 0 ] == 0 ) )
6005-
{
6006-
// bk001205
6007-
return tr.defaultShader;
6008-
}
6009-
6010-
COM_StripExtension3( name, strippedName, sizeof( strippedName ) );
6011-
6012-
hash = generateHashValue( strippedName, FILE_HASH_SIZE );
6013-
6014-
// see if the shader is already loaded
6015-
for ( sh = shaderHashTable[ hash ]; sh; sh = sh->next )
6016-
{
6017-
if ( Q_stricmp( sh->name, strippedName ) == 0 )
6018-
{
6019-
// match found
6020-
return sh;
6021-
}
6022-
}
6023-
6024-
return tr.defaultShader;
6025-
}
6026-
60275985
static void ClearGlobalShader()
60285986
{
60295987
ResetStruct( shader );

0 commit comments

Comments
 (0)