del struct StrBuf; CopiedString for mapShaderFile;

This commit is contained in:
Garux 2021-02-09 13:03:48 +03:00
parent 02874bebee
commit 37c11990cb
3 changed files with 37 additions and 66 deletions

View File

@ -184,36 +184,6 @@ static void parseEXfile( const char* filename, StrList* ExTextures, StrList* ExS
struct StrBuf
{
int strlen;
int max;
char s[];
};
static inline StrBuf* StrBuf_allocate( size_t strLen ){
StrBuf* ret = safe_calloc( offsetof( StrBuf, s[strLen] ) );
ret->strlen = 0;
ret->max = strLen;
return ret;
}
static inline void StrBuf_cat( StrBuf* buf, const char* string ){
buf->strlen += strcpyQ( buf->s + buf->strlen, string, buf->max - buf->strlen );
if( buf->strlen >= buf->max )
Error( "StrBuf overflow" );
}
static inline void StrBuf_cat2( StrBuf* buf, const char* string, const char* string2 ){
StrBuf_cat( buf, string );
StrBuf_cat( buf, string2 );
}
static inline void StrBuf_cpy( StrBuf* buf, const char* string ){
buf->strlen = 0;
StrBuf_cat( buf, string );
}
static bool packResource( const char* resname, const char* packname, const int compLevel ){ static bool packResource( const char* resname, const char* packname, const int compLevel ){
const bool ret = vfsPackFile( resname, packname, compLevel ); const bool ret = vfsPackFile( resname, packname, compLevel );
if ( ret ) if ( ret )
@ -1170,8 +1140,8 @@ int repackBSPMain( int argc, char **argv ){
//Parse Shader Files //Parse Shader Files
Sys_Printf( "\t\nParsing shaders....\n\n" ); Sys_Printf( "\t\nParsing shaders....\n\n" );
StrBuf* shaderText = StrBuf_allocate( 8192 ); StringOutputStream shaderText( 4096 );
StrBuf* allShaders = StrBuf_allocate( 16777216 ); StringOutputStream allShaders( 1048576 );
/* hack */ /* hack */
endofscript = true; endofscript = true;
@ -1198,7 +1168,8 @@ int repackBSPMain( int argc, char **argv ){
if( dbg ) if( dbg )
Sys_Printf( "%s\n", token ); Sys_Printf( "%s\n", token );
StrBuf_cpy( shaderText, token ); shaderText.clear();
shaderText << token;
if ( strchr( token, '\\') != NULL ){ if ( strchr( token, '\\') != NULL ){
Sys_FPrintf( SYS_WRN, "WARNING1: %s : %s : shader name with backslash\n", pk3Shaderfiles->s[i], token ); Sys_FPrintf( SYS_WRN, "WARNING1: %s : %s : shader name with backslash\n", pk3Shaderfiles->s[i], token );
@ -1219,7 +1190,7 @@ int repackBSPMain( int argc, char **argv ){
Error( "ParseShaderFile: %s, line %d: { not found!\nFound instead: %s\nFile location be: %s", Error( "ParseShaderFile: %s, line %d: { not found!\nFound instead: %s\nFile location be: %s",
scriptFile, scriptline, token, g_strLoadedFileLocation ); scriptFile, scriptline, token, g_strLoadedFileLocation );
} }
StrBuf_cat( shaderText, "\n{" ); shaderText << "\n{";
bool hasmap = false; bool hasmap = false;
while ( 1 ) while ( 1 )
@ -1230,13 +1201,13 @@ int repackBSPMain( int argc, char **argv ){
break; break;
} }
if ( strEqual( token, "}" ) ) { if ( strEqual( token, "}" ) ) {
StrBuf_cat( shaderText, "\n}\n\n" ); shaderText << "\n}\n\n";
break; break;
} }
/* parse stage directives */ /* parse stage directives */
if ( strEqual( token, "{" ) ) { if ( strEqual( token, "{" ) ) {
bool tokenready = false; bool tokenready = false;
StrBuf_cat( shaderText, "\n\t{" ); shaderText << "\n\t{";
while ( 1 ) while ( 1 )
{ {
/* detour of TokenAvailable() '~' */ /* detour of TokenAvailable() '~' */
@ -1248,11 +1219,11 @@ int repackBSPMain( int argc, char **argv ){
break; break;
} }
if ( strEqual( token, "}" ) ) { if ( strEqual( token, "}" ) ) {
StrBuf_cat( shaderText, "\n\t}" ); shaderText << "\n\t}";
break; break;
} }
if ( strEqual( token, "{" ) ) { if ( strEqual( token, "{" ) ) {
StrBuf_cat( shaderText, "\n\t{" ); shaderText << "\n\t{";
Sys_FPrintf( SYS_WRN, "WARNING9: %s : line %d : opening brace inside shader stage\n", scriptFile, scriptline ); Sys_FPrintf( SYS_WRN, "WARNING9: %s : line %d : opening brace inside shader stage\n", scriptFile, scriptline );
} }
/* skip the shader */ /* skip the shader */
@ -1262,7 +1233,7 @@ int repackBSPMain( int argc, char **argv ){
/* digest any images */ /* digest any images */
if ( striEqual( token, "map" ) || if ( striEqual( token, "map" ) ||
striEqual( token, "clampMap" ) ) { striEqual( token, "clampMap" ) ) {
StrBuf_cat2( shaderText, "\n\t\t", token ); shaderText << "\n\t\t" << token;
hasmap = true; hasmap = true;
/* get an image */ /* get an image */
@ -1270,27 +1241,27 @@ int repackBSPMain( int argc, char **argv ){
if ( token[ 0 ] != '*' && token[ 0 ] != '$' ) { if ( token[ 0 ] != '*' && token[ 0 ] != '$' ) {
tex2list( pk3Textures, ExTextures, rExTextures ); tex2list( pk3Textures, ExTextures, rExTextures );
} }
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else if ( striEqual( token, "animMap" ) || else if ( striEqual( token, "animMap" ) ||
striEqual( token, "clampAnimMap" ) ) { striEqual( token, "clampAnimMap" ) ) {
StrBuf_cat2( shaderText, "\n\t\t", token ); shaderText << "\n\t\t" << token;
hasmap = true; hasmap = true;
GetToken( false );// skip num GetToken( false );// skip num
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
while ( TokenAvailable() ){ while ( TokenAvailable() ){
GetToken( false ); GetToken( false );
tex2list( pk3Textures, ExTextures, rExTextures ); tex2list( pk3Textures, ExTextures, rExTextures );
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
tokenready = true; tokenready = true;
} }
else if ( striEqual( token, "videoMap" ) ){ else if ( striEqual( token, "videoMap" ) ){
StrBuf_cat2( shaderText, "\n\t\t", token ); shaderText << "\n\t\t" << token;
hasmap = true; hasmap = true;
GetToken( false ); GetToken( false );
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
FixDOSName( token ); FixDOSName( token );
if ( strchr( token, '/' ) == NULL ){ if ( strchr( token, '/' ) == NULL ){
strcpy( token, stream( "video/", token ) ); strcpy( token, stream( "video/", token ) );
@ -1304,17 +1275,17 @@ int repackBSPMain( int argc, char **argv ){
Sys_FPrintf( SYS_WRN, "WARNING7: %s : %s shader\n", pk3Shaders->s[shader], token ); Sys_FPrintf( SYS_WRN, "WARNING7: %s : %s shader\n", pk3Shaders->s[shader], token );
hasmap = true; hasmap = true;
if ( line == scriptline ){ if ( line == scriptline ){
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else{ else{
StrBuf_cat2( shaderText, "\n\t\t", token ); shaderText << "\n\t\t" << token;
} }
} }
else if ( line == scriptline ){ else if ( line == scriptline ){
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else{ else{
StrBuf_cat2( shaderText, "\n\t\t", token ); shaderText << "\n\t\t" << token;
} }
} }
} }
@ -1324,11 +1295,11 @@ int repackBSPMain( int argc, char **argv ){
/* skyparms <outer image> <cloud height> <inner image> */ /* skyparms <outer image> <cloud height> <inner image> */
else if ( striEqual( token, "skyParms" ) ) { else if ( striEqual( token, "skyParms" ) ) {
StrBuf_cat( shaderText, "\n\tskyParms " ); shaderText << "\n\tskyParms ";
hasmap = true; hasmap = true;
/* get image base */ /* get image base */
GetToken( false ); GetToken( false );
StrBuf_cat( shaderText, token ); shaderText << token;
/* ignore bogus paths */ /* ignore bogus paths */
if ( !strEqual( token, "-" ) && !striEqual( token, "full" ) ) { if ( !strEqual( token, "-" ) && !striEqual( token, "full" ) ) {
@ -1341,34 +1312,34 @@ int repackBSPMain( int argc, char **argv ){
} }
/* skip rest of line */ /* skip rest of line */
GetToken( false ); GetToken( false );
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
GetToken( false ); GetToken( false );
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else if ( striEqualPrefix( token, "implicit" ) ){ else if ( striEqualPrefix( token, "implicit" ) ){
Sys_FPrintf( SYS_WRN, "WARNING5: %s : %s shader\n", pk3Shaders->s[shader], token ); Sys_FPrintf( SYS_WRN, "WARNING5: %s : %s shader\n", pk3Shaders->s[shader], token );
hasmap = true; hasmap = true;
if ( line == scriptline ){ if ( line == scriptline ){
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else{ else{
StrBuf_cat2( shaderText, "\n\t", token ); shaderText << "\n\t" << token;
} }
} }
else if ( striEqual( token, "fogparms" ) ){ else if ( striEqual( token, "fogparms" ) ){
hasmap = true; hasmap = true;
if ( line == scriptline ){ if ( line == scriptline ){
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else{ else{
StrBuf_cat2( shaderText, "\n\t", token ); shaderText << "\n\t" << token;
} }
} }
else if ( line == scriptline ){ else if ( line == scriptline ){
StrBuf_cat2( shaderText, " ", token ); shaderText << " " << token;
} }
else{ else{
StrBuf_cat2( shaderText, "\n\t", token ); shaderText << "\n\t" << token;
} }
} }
@ -1385,7 +1356,7 @@ int repackBSPMain( int argc, char **argv ){
wantShader = false; wantShader = false;
} }
if ( wantShader ){ if ( wantShader ){
StrBuf_cat( allShaders, shaderText->s ); allShaders << shaderText;
strClear( pk3Shaders->s[shader] ); strClear( pk3Shaders->s[shader] );
} }
} }
@ -1429,7 +1400,7 @@ int repackBSPMain( int argc, char **argv ){
/* write shader */ /* write shader */
stream( EnginePath, "/", nameOFrepack.c_str(), "_strippedBYrepacker.shader" ); stream( EnginePath, "/", nameOFrepack.c_str(), "_strippedBYrepacker.shader" );
FILE *f = fopen( stream, "wb" ); FILE *f = fopen( stream, "wb" );
fwrite( allShaders->s, sizeof( char ), allShaders->strlen, f ); fwrite( allShaders, sizeof( char ), allShaders.end() - allShaders.begin(), f );
fclose( f ); fclose( f );
Sys_Printf( "Shaders saved to %s\n", stream.c_str() ); Sys_Printf( "Shaders saved to %s\n", stream.c_str() );

View File

@ -1973,7 +1973,7 @@ Q_EXTERN surfaceParm_t custSurfaceParms[ MAX_CUST_SURFACEPARMS ];
Q_EXTERN int numCustSurfaceParms Q_ASSIGN( 0 ); Q_EXTERN int numCustSurfaceParms Q_ASSIGN( 0 );
Q_EXTERN String64 mapName; /* ydnar: per-map custom shaders for larger lightmaps */ Q_EXTERN String64 mapName; /* ydnar: per-map custom shaders for larger lightmaps */
Q_EXTERN StringOutputStream mapShaderFile; Q_EXTERN CopiedString mapShaderFile;
Q_EXTERN bool warnImage Q_ASSIGN( true ); Q_EXTERN bool warnImage Q_ASSIGN( true );
/* ydnar: sinusoid samples */ /* ydnar: sinusoid samples */

View File

@ -308,7 +308,7 @@ bool ApplySurfaceParm( const char *name, int *contentFlags, int *surfaceFlags, i
void BeginMapShaderFile( const char *mapFile ){ void BeginMapShaderFile( const char *mapFile ){
/* dummy check */ /* dummy check */
mapName.clear(); mapName.clear();
mapShaderFile.clear(); mapShaderFile = "";
if ( strEmptyOrNull( mapFile ) ) { if ( strEmptyOrNull( mapFile ) ) {
return; return;
} }
@ -317,11 +317,11 @@ void BeginMapShaderFile( const char *mapFile ){
mapName( PathFilename( mapFile ) ); mapName( PathFilename( mapFile ) );
/* append ../scripts/q3map2_<mapname>.shader */ /* append ../scripts/q3map2_<mapname>.shader */
mapShaderFile( PathFilenameless( mapFile ), "../", game->shaderPath, "/q3map2_", mapName.c_str(), ".shader" ); mapShaderFile = StringOutputStream( 256 )( PathFilenameless( mapFile ), "../", game->shaderPath, "/q3map2_", mapName.c_str(), ".shader" );
Sys_FPrintf( SYS_VRB, "Map has shader script %s\n", mapShaderFile.c_str() ); Sys_FPrintf( SYS_VRB, "Map has shader script %s\n", mapShaderFile.c_str() );
/* remove it */ /* remove it */
remove( mapShaderFile ); remove( mapShaderFile.c_str() );
/* stop making warnings about missing images */ /* stop making warnings about missing images */
warnImage = false; warnImage = false;
@ -361,7 +361,7 @@ void WriteMapShaderFile( void ){
Sys_FPrintf( SYS_VRB, "Writing %s", mapShaderFile.c_str() ); Sys_FPrintf( SYS_VRB, "Writing %s", mapShaderFile.c_str() );
/* open shader file */ /* open shader file */
file = fopen( mapShaderFile, "w" ); file = fopen( mapShaderFile.c_str(), "w" );
if ( file == NULL ) { if ( file == NULL ) {
Sys_Warning( "Unable to open map shader file %s for writing\n", mapShaderFile.c_str() ); Sys_Warning( "Unable to open map shader file %s for writing\n", mapShaderFile.c_str() );
return; return;