Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/engine/renderer/tr_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -1163,6 +1163,8 @@ enum
int autoSpriteMode;
bool autoSpriteWarned = false;

bool shaderRemapWarned;

uint8_t numDeforms;
deformStage_t deforms[ MAX_SHADER_DEFORMS ];

Expand Down Expand Up @@ -3000,7 +3002,6 @@ void GL_CompressedTexSubImage3D( GLenum target, GLint level, GLint xOffset, GLin

shader_t *R_FindShader( const char *name, int flags );
shader_t *R_GetShaderByHandle( qhandle_t hShader );
shader_t *R_FindShaderByName( const char *name );
const char *RE_GetShaderNameFromHandle( qhandle_t shader );
void R_InitShaders();
void R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset );
Expand Down
115 changes: 40 additions & 75 deletions src/engine/renderer/tr_shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,51 +134,35 @@ void R_RemapShader( const char *shaderName, const char *newShaderName, const cha
{
char strippedName[ MAX_QPATH ];
int hash;
shader_t *sh, *sh2;
qhandle_t h;

sh = R_FindShaderByName( shaderName );

if ( sh == nullptr || sh == tr.defaultShader )
{
h = RE_RegisterShader( shaderName, RSF_DEFAULT );
sh = R_GetShaderByHandle( h );
}

if ( sh == nullptr || sh == tr.defaultShader )
{
Log::Warn("R_RemapShader: shader %s not found", shaderName );
return;
}

sh2 = R_FindShaderByName( newShaderName );

if ( sh2 == nullptr || sh2 == tr.defaultShader )
{
h = RE_RegisterShader( newShaderName, RSF_DEFAULT );
sh2 = R_GetShaderByHandle( h );
}

if ( sh2 == nullptr || sh2 == tr.defaultShader )
{
Log::Warn("R_RemapShader: new shader %s not found", newShaderName );
return;
}

if ( sh->autoSpriteMode != sh2->autoSpriteMode ) {
Log::Warn("R_RemapShader: shaders %s and %s have different autoSprite modes", shaderName, newShaderName );
return;
}

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

for ( sh = shaderHashTable[ hash ]; sh; sh = sh->next )
for ( shader_t *sh = shaderHashTable[ hash ]; sh; sh = sh->next )
{
if ( Q_stricmp( sh->name, strippedName ) == 0 )
{
found = true;
shader_t *sh2 = R_FindShader( newShaderName, sh->registerFlags );

if ( sh2->defaultShader )
{
if ( !sh2->shaderRemapWarned )
{
Log::Warn( "R_RemapShader: new shader %s not found", newShaderName );
sh2->shaderRemapWarned = true;
}
return;
}

if ( sh->autoSpriteMode != sh2->autoSpriteMode ) {
Log::Warn( "R_RemapShader: shaders %s and %s have different autoSprite modes", shaderName, newShaderName );
return;
}

if ( sh != sh2 )
{
sh->remappedShader = sh2;
Expand All @@ -189,6 +173,17 @@ void R_RemapShader( const char *shaderName, const char *newShaderName, const cha
}
}
}

if ( !found )
{
// try registering it to detect typos
shader_t *test = R_FindShader( shaderName, RSF_DEFAULT );

if ( test->defaultShader )
{
Log::Warn( "R_RemapShader: shader %s not found", shaderName );
}
}
}

/*
Expand Down Expand Up @@ -5988,43 +5983,6 @@ static const char *FindShaderInShaderText( const char *shaderName )
return nullptr;
}

/*
==================
R_FindShaderByName

Will always return a valid shader, but it might be the
default shader if the real one can't be found.
==================
*/
shader_t *R_FindShaderByName( const char *name )
{
char strippedName[ MAX_QPATH ];
int hash;
shader_t *sh;

if ( ( name == nullptr ) || ( name[ 0 ] == 0 ) )
{
// bk001205
return tr.defaultShader;
}

COM_StripExtension3( name, strippedName, sizeof( strippedName ) );

hash = generateHashValue( strippedName, FILE_HASH_SIZE );

// see if the shader is already loaded
for ( sh = shaderHashTable[ hash ]; sh; sh = sh->next )
{
if ( Q_stricmp( sh->name, strippedName ) == 0 )
{
// match found
return sh;
}
}

return tr.defaultShader;
}

static void ClearGlobalShader()
{
ResetStruct( shader );
Expand Down Expand Up @@ -6070,6 +6028,8 @@ shader_t *R_FindShader( const char *name, int flags )

hash = generateHashValue( strippedName, FILE_HASH_SIZE );

const shader_t *firstRegistration = nullptr;

// see if the shader is already loaded
for ( sh = shaderHashTable[ hash ]; sh; sh = sh->next )
{
Expand All @@ -6085,11 +6045,16 @@ shader_t *R_FindShader( const char *name, int flags )
return sh;
}

Log::Verbose( "shader %s registered with varying flags: previously with 0x%X, now with 0x%X",
strippedName, sh->registerFlags, flags );
firstRegistration = sh;
}
}

if ( firstRegistration != nullptr )
{
Log::Verbose( "shader %s registered with varying flags: first time with 0x%X, now with 0x%X",
strippedName, firstRegistration->registerFlags, flags );
}

shader.altShader[ 0 ].index = flags; // save for later use (in case of alternative shaders)

// make sure the render thread is stopped, because we are probably
Expand Down