From af71efc0e6611599b4ed16a99be124f285d38c68 Mon Sep 17 00:00:00 2001 From: Garux Date: Sun, 25 Oct 2020 09:07:29 +0300 Subject: [PATCH] * no shaderlist.txt or empty one = load all shaders --- plugins/shaders/shaders.cpp | 8 ++++- tools/quake3/q3map2/shaders.c | 55 ++++++++++++++++++++++++++--------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/plugins/shaders/shaders.cpp b/plugins/shaders/shaders.cpp index 19383851..ce1b803a 100644 --- a/plugins/shaders/shaders.cpp +++ b/plugins/shaders/shaders.cpp @@ -1676,7 +1676,13 @@ void Shaders_Load(){ } GlobalFileSystem().forEachArchive( AddShaderListFromArchiveCaller(), false, true ); - DumpUnreferencedShaders(); + if( l_shaderfiles != nullptr ){ + DumpUnreferencedShaders(); + } + else{ + globalOutputStream() << "No shaderlist.txt found: loading all shaders\n"; + GlobalFileSystem().forEachFile( path.c_str(), g_shadersExtension, AddShaderFileCaller(), 1 ); + } } else { diff --git a/tools/quake3/q3map2/shaders.c b/tools/quake3/q3map2/shaders.c index 4b7833d1..4393257c 100644 --- a/tools/quake3/q3map2/shaders.c +++ b/tools/quake3/q3map2/shaders.c @@ -2053,6 +2053,33 @@ static void ParseCustomInfoParms( void ){ +#define MAX_SHADER_FILES 1024 + +typedef struct StrList_s +{ + int n; + char* s[MAX_SHADER_FILES]; +} +StrList; + +void pushShaderCallback( StrList* list, const char* string ){ + char* shader = copystring( string ); + strClear( shader + strlen( shader ) - strlen( ".shader" ) ); + /* check for duplicate entries */ + for ( int i = 0; i < list->n; i++ ) + if ( striEqual( list->s[ i ], shader ) ){ + free( shader ); + return; + } + + /* test limit */ + if ( list->n >= MAX_SHADER_FILES ) + Error( "MAX_SHADER_FILES (%d) reached!", (int) MAX_SHADER_FILES ); + + /* new shader file */ + list->s[ list->n++ ] = shader; +} + /* LoadShaderInfo() the shaders are parsed out of shaderlist.txt from a main directory @@ -2060,12 +2087,10 @@ static void ParseCustomInfoParms( void ){ on linux there's an additional twist, we actually merge the stuff from ~/.q3a/ and from the base dir */ -#define MAX_SHADER_FILES 1024 - void LoadShaderInfo( void ){ - int i, j, numShaderFiles, count; + int i, j, count; char filename[ 1024 ]; - char *shaderFiles[ MAX_SHADER_FILES ]; + StrList shaderFiles = { .n = 0 }; /* rr2do2: parse custom infoparms first */ @@ -2073,9 +2098,6 @@ void LoadShaderInfo( void ){ ParseCustomInfoParms(); } - /* start with zero */ - numShaderFiles = 0; - /* we can pile up several shader files, the one in baseq3 and ones in the mod dir or other spots */ sprintf( filename, "%s/shaderlist.txt", game->shaderPath ); count = vfsGetFileCount( filename ); @@ -2091,8 +2113,8 @@ void LoadShaderInfo( void ){ while ( GetToken( true ) ) { /* check for duplicate entries */ - for ( j = 0; j < numShaderFiles; j++ ) - if ( strEqual( shaderFiles[ j ], token ) ) { + for ( j = 0; j < shaderFiles.n; j++ ) + if ( strEqual( shaderFiles.s[ j ], token ) ) { break; } @@ -2102,18 +2124,23 @@ void LoadShaderInfo( void ){ } /* new shader file */ - if ( j == numShaderFiles ) { - shaderFiles[ numShaderFiles++ ] = copystring( token ); + if ( j == shaderFiles.n ) { + shaderFiles.s[ shaderFiles.n++ ] = copystring( token ); } } } + if( shaderFiles.n == 0 ){ + Sys_Printf( "%s", "No shaderlist.txt found: loading all shaders\n" ); + vfsListShaderFiles( &shaderFiles, pushShaderCallback ); + } + /* parse the shader files */ - for ( i = 0; i < numShaderFiles; i++ ) + for ( i = 0; i < shaderFiles.n; i++ ) { - sprintf( filename, "%s/%s.shader", game->shaderPath, shaderFiles[ i ] ); + sprintf( filename, "%s/%s.shader", game->shaderPath, shaderFiles.s[ i ] ); ParseShaderFile( filename ); - free( shaderFiles[ i ] ); + free( shaderFiles.s[ i ] ); } /* emit some statistics */