From: Thomas Debesse Date: Mon, 11 Feb 2019 08:12:50 +0000 (+0100) Subject: Merge commit 'eef39952025db1375e33b6e314692ac76badb93c' into garux-merge X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=11c140ba5e462d14fc1708c60e099746d4c1fded;p=xonotic%2Fnetradiant.git Merge commit 'eef39952025db1375e33b6e314692ac76badb93c' into garux-merge --- 11c140ba5e462d14fc1708c60e099746d4c1fded diff --cc Makefile index f3cb0012,911e5ff0..7082519c --- a/Makefile +++ b/Makefile @@@ -502,7 -495,9 +502,8 @@@ $(INSTALLDIR)/q3map2.$(EXE): tools/quake3/common/polylib.o \ tools/quake3/common/scriplib.o \ tools/quake3/common/threads.o \ - tools/quake3/common/unzip.o \ tools/quake3/common/vfs.o \ + tools/quake3/common/miniz.o \ tools/quake3/q3map2/brush.o \ tools/quake3/q3map2/brush_primit.o \ tools/quake3/q3map2/bspfile_abstract.o \ @@@ -615,7 -597,9 +616,8 @@@ $(INSTALLDIR)/q3data.$(EXE): tools/quake3/common/md4.o \ tools/quake3/common/scriplib.o \ tools/quake3/common/trilib.o \ - tools/quake3/common/unzip.o \ tools/quake3/common/vfs.o \ + tools/quake3/common/miniz.o \ tools/quake3/q3data/3dslib.o \ tools/quake3/q3data/compress.o \ tools/quake3/q3data/images.o \ diff --cc tools/quake3/common/vfs.c index 16a78289,b7a9bbbc..7e1fd6d8 --- a/tools/quake3/common/vfs.c +++ b/tools/quake3/common/vfs.c @@@ -50,8 -50,8 +50,9 @@@ #include "mathlib.h" #include "inout.h" #include "vfs.h" -#include "unzip.h" +#include +#include + #include "miniz.h" typedef struct { @@@ -420,6 -473,93 +487,91 @@@ int vfsLoadFile( const char *filename, count++; } - + g_free( lower ); return -1; } + + - - + qboolean vfsPackFile( const char *filename, const char *packname ){ + int i; + char tmp[NAME_MAX], fixed[NAME_MAX]; + GSList *lst; + + byte *bufferptr = NULL; + strcpy( fixed, filename ); + vfsFixDOSName( fixed ); + g_strdown( fixed ); + + for ( i = 0; i < g_numDirs; i++ ) + { + strcpy( tmp, g_strDirs[i] ); + strcat( tmp, filename ); + if ( access( tmp, R_OK ) == 0 ) { + if ( access( packname, R_OK ) == 0 ) { + mz_zip_archive zip; + memset( &zip, 0, sizeof(zip) ); + mz_zip_reader_init_file( &zip, packname, 0 ); + mz_zip_writer_init_from_reader( &zip, packname ); + + mz_bool success = MZ_TRUE; + success &= mz_zip_writer_add_file( &zip, filename, tmp, 0, 0, 10 ); + if ( !success || !mz_zip_writer_finalize_archive( &zip ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_zip_reader_end( &zip); + mz_zip_writer_end( &zip ); + } + else{ + mz_zip_archive zip; + memset( &zip, 0, sizeof(zip) ); + if( !mz_zip_writer_init_file( &zip, packname, 0 ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_bool success = MZ_TRUE; + success &= mz_zip_writer_add_file( &zip, filename, tmp, 0, 0, 10 ); + if ( !success || !mz_zip_writer_finalize_archive( &zip ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_zip_writer_end( &zip ); + } + + return qtrue; + } + } + + for ( lst = g_pakFiles; lst != NULL; lst = g_slist_next( lst ) ) + { + VFS_PAKFILE* file = (VFS_PAKFILE*)lst->data; + + if ( strcmp( file->name, fixed ) != 0 ) { + continue; + } + + memcpy( file->zipfile, &file->zipinfo, sizeof( unz_s ) ); + + if ( unzOpenCurrentFile( file->zipfile ) != UNZ_OK ) { + return qfalse; + } + + bufferptr = safe_malloc( file->size + 1 ); + // we need to end the buffer with a 0 + ( (char*) ( bufferptr ) )[file->size] = 0; + + i = unzReadCurrentFile( file->zipfile, bufferptr, file->size ); + unzCloseCurrentFile( file->zipfile ); + if ( i < 0 ) { + return qfalse; + } + else{ + mz_bool success = MZ_TRUE; + success &= mz_zip_add_mem_to_archive_file_in_place( packname, filename, bufferptr, i, 0, 0, 10 ); + if ( !success ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + free( bufferptr ); + return qtrue; + } + } + + return qfalse; + } diff --cc tools/quake3/q3map2/main.c index 57ecb894,41b2683d..75bc4608 --- a/tools/quake3/q3map2/main.c +++ b/tools/quake3/q3map2/main.c @@@ -269,7 -1645,915 +269,678 @@@ int ShiftBSPMain( int argc, char **arg } + void FixDOSName( char *src ){ + if ( src == NULL ) { + return; + } + + while ( *src ) + { + if ( *src == '\\' ) { + *src = '/'; + } + src++; + } + } + + /* + Check if newcoming texture is unique and not excluded + */ + void tex2list( char texlist[512][MAX_QPATH], int *texnum, char EXtex[2048][MAX_QPATH], int *EXtexnum ){ + int i; + if ( token[0] == '\0') return; + StripExtension( token ); + FixDOSName( token ); + for ( i = 0; i < *texnum; i++ ){ + if ( !stricmp( texlist[i], token ) ) return; + } + for ( i = 0; i < *EXtexnum; i++ ){ + if ( !stricmp( EXtex[i], token ) ) return; + } + strcpy ( texlist[*texnum], token ); + (*texnum)++; + return; + } + + + /* + Check if newcoming res is unique + */ + void res2list( char data[512][MAX_QPATH], int *num ){ + int i; + if ( data[*num][0] == '\0') return; + for ( i = 0; i < *num; i++ ){ + if ( !stricmp( data[i], data[*num] ) ) return; + } + (*num)++; + return; + } + + void parseEXblock ( char data[512][MAX_QPATH], int *num, const char *exName ){ + if ( !GetToken( qtrue ) || strcmp( token, "{" ) ) { + Error( "ReadExclusionsFile: %s, line %d: { not found", exName, scriptline ); + } + while ( 1 ) + { + if ( !GetToken( qtrue ) ) { + break; + } + if ( !strcmp( token, "}" ) ) { + break; + } + if ( token[0] == '{' ) { + Error( "ReadExclusionsFile: %s, line %d: brace, opening twice in a row.", exName, scriptline ); + } + + /* add to list */ + strcpy( data[*num], token ); + (*num)++; + } + return; + } + + char q3map2path[1024]; + /* + pk3BSPMain() + map autopackager, works for Q3 type of shaders and ents + */ + + int pk3BSPMain( int argc, char **argv ){ + int i, j; + qboolean dbg = qfalse, png = qfalse; + + /* process arguments */ + for ( i = 1; i < ( argc - 1 ); i++ ){ + if ( !strcmp( argv[ i ], "-dbg" ) ) { + dbg = qtrue; + } + else if ( !strcmp( argv[ i ], "-png" ) ) { + png = qtrue; + } + } + + + + /* do some path mangling */ + strcpy( source, ExpandArg( argv[ argc - 1 ] ) ); + StripExtension( source ); + DefaultExtension( source, ".bsp" ); + + /* load the bsp */ + Sys_Printf( "Loading %s\n", source ); + LoadBSPFile( source ); + ParseEntities(); + + + char packname[ 1024 ], base[ 1024 ], nameOFmap[ 1024 ]; + int len; + strcpy( packname, EnginePath ); + + + /* copy map name */ + strcpy( base, source ); + StripExtension( base ); + + /* extract map name */ + len = strlen( base ) - 1; + while ( len > 0 && base[ len ] != '/' && base[ len ] != '\\' ) + len--; + strcpy( nameOFmap, &base[ len + 1 ] ); + + + qboolean dsSHs[512] = {qfalse}; + + for ( i = 0; i < numBSPDrawSurfaces; i++ ){ + /* can't exclude nodraw patches here (they want shaders :0!) */ + //if ( !( bspDrawSurfaces[i].surfaceType == 2 && bspDrawSurfaces[i].numIndexes == 0 ) ) dsSHs[bspDrawSurfaces[i].shaderNum] = qtrue; + dsSHs[bspDrawSurfaces[i].shaderNum] = qtrue; + //Sys_Printf( "%s\n", bspShaders[bspDrawSurfaces[i].shaderNum].shader ); + } + + int pk3ShadersN = 0; + char pk3Shaders[512][MAX_QPATH]; + int pk3SoundsN = 0; + char pk3Sounds[512][MAX_QPATH]; + int pk3ShaderfilesN = 0; + char pk3Shaderfiles[512][MAX_QPATH]; + int pk3TexturesN = 0; + char pk3Textures[512][MAX_QPATH]; + int pk3VideosN = 0; + char pk3Videos[512][MAX_QPATH]; + + + + for ( i = 0; i < numBSPShaders; i++ ){ + if ( dsSHs[i] ){ + strcpy( pk3Shaders[pk3ShadersN], bspShaders[i].shader ); + res2list( pk3Shaders, &pk3ShadersN ); + //pk3ShadersN++; + //Sys_Printf( "%s\n", bspShaders[i].shader ); + } + } + + //ent keys + epair_t *ep; + for ( ep = entities[0].epairs; ep != NULL; ep = ep->next ) + { + if ( !strnicmp( ep->key, "vertexremapshader", 17 ) ) { + sscanf( ep->value, "%*[^;] %*[;] %s", pk3Shaders[pk3ShadersN] ); + res2list( pk3Shaders, &pk3ShadersN ); + } + } + strcpy( pk3Sounds[pk3SoundsN], ValueForKey( &entities[0], "music" ) ); + res2list( pk3Sounds, &pk3SoundsN ); + + for ( i = 0; i < numBSPEntities && i < numEntities; i++ ) + { + strcpy( pk3Sounds[pk3SoundsN], ValueForKey( &entities[i], "noise" ) ); + if ( pk3Sounds[pk3SoundsN][0] != '*' ) res2list( pk3Sounds, &pk3SoundsN ); + + if ( !stricmp( ValueForKey( &entities[i], "classname" ), "func_plat" ) ){ + strcpy( pk3Sounds[pk3SoundsN], "sound/movers/plats/pt1_strt.wav"); + res2list( pk3Sounds, &pk3SoundsN ); + strcpy( pk3Sounds[pk3SoundsN], "sound/movers/plats/pt1_end.wav"); + res2list( pk3Sounds, &pk3SoundsN ); + } + if ( !stricmp( ValueForKey( &entities[i], "classname" ), "target_push" ) ){ + if ( !(IntForKey( &entities[i], "spawnflags") & 1) ){ + strcpy( pk3Sounds[pk3SoundsN], "sound/misc/windfly.wav"); + res2list( pk3Sounds, &pk3SoundsN ); + } + } + strcpy( pk3Shaders[pk3ShadersN], ValueForKey( &entities[i], "targetShaderNewName" ) ); + res2list( pk3Shaders, &pk3ShadersN ); + } + + //levelshot + sprintf( pk3Shaders[ pk3ShadersN ], "levelshots/%s", nameOFmap ); + res2list( pk3Shaders, &pk3ShadersN ); + + + if( dbg ){ + Sys_Printf( "\tDrawsurface+ent calls....%i\n", pk3ShadersN ); + for ( i = 0; i < pk3ShadersN; i++ ){ + Sys_Printf( "%s\n", pk3Shaders[i] ); + } + Sys_Printf( "\tSounds....%i\n", pk3SoundsN ); + for ( i = 0; i < pk3SoundsN; i++ ){ + Sys_Printf( "%s\n", pk3Sounds[i] ); + } + } + + vfsListShaderFiles( pk3Shaderfiles, &pk3ShaderfilesN ); + + if( dbg ){ + Sys_Printf( "\tSchroider fileses.....%i\n", pk3ShaderfilesN ); + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + Sys_Printf( "%s\n", pk3Shaderfiles[i] ); + } + } + + + /* load exclusions file */ + int EXpk3TexturesN = 0; + char EXpk3Textures[2048][MAX_QPATH]; + int EXpk3ShadersN = 0; + char EXpk3Shaders[2048][MAX_QPATH]; + int EXpk3SoundsN = 0; + char EXpk3Sounds[2048][MAX_QPATH]; + int EXpk3ShaderfilesN = 0; + char EXpk3Shaderfiles[512][MAX_QPATH]; + int EXpk3VideosN = 0; + char EXpk3Videos[512][MAX_QPATH]; + + char exName[ 1024 ]; + byte *buffer; + int size; + + strcpy( exName, q3map2path ); + char *cut = strrchr( exName, '\\' ); + char *cut2 = strrchr( exName, '/' ); + if ( cut == NULL && cut2 == NULL ){ + Sys_Printf( "WARNING: Unable to load exclusions file.\n" ); + goto skipEXfile; + } + if ( cut2 > cut ) cut = cut2; + //cut++; + cut[1] = '\0'; + strcat( exName, game->arg ); + strcat( exName, ".exclude" ); + + Sys_Printf( "Loading %s\n", exName ); + size = TryLoadFile( exName, (void**) &buffer ); + if ( size <= 0 ) { + Sys_Printf( "WARNING: Unable to find exclusions file %s.\n", exName ); + goto skipEXfile; + } + + /* parse the file */ + ParseFromMemory( (char *) buffer, size ); + + /* blocks pointers */ + //int *exptrN; + //char *exptr[512][64]; + + + /* tokenize it */ + while ( 1 ) + { + /* test for end of file */ + if ( !GetToken( qtrue ) ) { + break; + } + + /* blocks */ + if ( !stricmp( token, "textures" ) ){ + parseEXblock ( EXpk3Textures, &EXpk3TexturesN, exName ); + } + else if ( !stricmp( token, "shaders" ) ){ + parseEXblock ( EXpk3Shaders, &EXpk3ShadersN, exName ); + } + else if ( !stricmp( token, "shaderfiles" ) ){ + parseEXblock ( EXpk3Shaderfiles, &EXpk3ShaderfilesN, exName ); + } + else if ( !stricmp( token, "sounds" ) ){ + parseEXblock ( EXpk3Sounds, &EXpk3SoundsN, exName ); + } + else if ( !stricmp( token, "videos" ) ){ + parseEXblock ( EXpk3Videos, &EXpk3VideosN, exName ); + } + else{ + Error( "ReadExclusionsFile: %s, line %d: unknown block name!\nValid ones are: textures, shaders, shaderfiles, sounds, videos.", exName, scriptline ); + } + } + + /* free the buffer */ + free( buffer ); + + skipEXfile: + + if( dbg ){ + Sys_Printf( "\tEXpk3Textures....%i\n", EXpk3TexturesN ); + for ( i = 0; i < EXpk3TexturesN; i++ ) Sys_Printf( "%s\n", EXpk3Textures[i] ); + Sys_Printf( "\tEXpk3Shaders....%i\n", EXpk3ShadersN ); + for ( i = 0; i < EXpk3ShadersN; i++ ) Sys_Printf( "%s\n", EXpk3Shaders[i] ); + Sys_Printf( "\tEXpk3Shaderfiles....%i\n", EXpk3ShaderfilesN ); + for ( i = 0; i < EXpk3ShaderfilesN; i++ ) Sys_Printf( "%s\n", EXpk3Shaderfiles[i] ); + Sys_Printf( "\tEXpk3Sounds....%i\n", EXpk3SoundsN ); + for ( i = 0; i < EXpk3SoundsN; i++ ) Sys_Printf( "%s\n", EXpk3Sounds[i] ); + Sys_Printf( "\tEXpk3Videos....%i\n", EXpk3VideosN ); + for ( i = 0; i < EXpk3VideosN; i++ ) Sys_Printf( "%s\n", EXpk3Videos[i] ); + } + + char temp[ 1024 ]; + + //Parse Shader Files + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + qboolean wantShader = qfalse; + qboolean wantShaderFile = qfalse; + char shadername[ 1024 ]; + char lastwantedShader[ 1024 ]; + + + /* load the shader */ + sprintf( temp, "%s/%s", game->shaderPath, pk3Shaderfiles[ i ] ); + LoadScriptFile( temp, 0 ); + + /* tokenize it */ + while ( 1 ) + { + /* test for end of file */ + if ( !GetToken( qtrue ) ) { + break; + } + //dump shader names + if( dbg ) Sys_Printf( "%s\n", token ); + + /* do wanna le shader? */ + wantShader = qfalse; + for ( j = 0; j < pk3ShadersN; j++ ){ + if ( !stricmp( pk3Shaders[j], token) ){ + strcpy ( shadername, pk3Shaders[j] ); + pk3Shaders[j][0] = '\0'; + wantShader = qtrue; + break; + } + } + + /* handle { } section */ + if ( !GetToken( qtrue ) ) { + break; + } + if ( strcmp( token, "{" ) ) { + Error( "ParseShaderFile: %s, line %d: { not found!\nFound instead: %s", + temp, scriptline, token ); + } + + while ( 1 ) + { + /* get the next token */ + if ( !GetToken( qtrue ) ) { + break; + } + if ( !strcmp( token, "}" ) ) { + break; + } + + + /* ----------------------------------------------------------------- + shader stages (passes) + ----------------------------------------------------------------- */ + + /* parse stage directives */ + if ( !strcmp( token, "{" ) ) { + while ( 1 ) + { + if ( !GetToken( qtrue ) ) { + break; + } + if ( !strcmp( token, "}" ) ) { + break; + } + if ( !wantShader ) continue; + + /* digest any images */ + if ( !stricmp( token, "map" ) || + !stricmp( token, "clampMap" ) ) { + + /* get an image */ + GetToken( qfalse ); + if ( token[ 0 ] != '*' && token[ 0 ] != '$' ) { + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + } + } + else if ( !stricmp( token, "animMap" ) || + !stricmp( token, "clampAnimMap" ) ) { + GetToken( qfalse );// skip num + while ( TokenAvailable() ){ + GetToken( qfalse ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + } + } + else if ( !stricmp( token, "videoMap" ) ){ + GetToken( qfalse ); + FixDOSName( token ); + if ( strchr( token, "/" ) == NULL ){ + sprintf( temp, "video/%s", token ); + strcpy( token, temp ); + } + for ( j = 0; j < pk3VideosN; j++ ){ + if ( !stricmp( pk3Videos[j], token ) ){ + goto away; + } + } + for ( j = 0; j < EXpk3VideosN; j++ ){ + if ( !stricmp( EXpk3Videos[j], token ) ){ + goto away; + } + } + strcpy ( pk3Videos[pk3VideosN], token ); + pk3VideosN++; + away: + j = 0; + } + } + } + /* skip to the next shader */ + else if ( !wantShader ) continue; + + /* ----------------------------------------------------------------- + surfaceparm * directives + ----------------------------------------------------------------- */ + + /* match surfaceparm */ + else if ( !stricmp( token, "surfaceparm" ) ) { + GetToken( qfalse ); + if ( !stricmp( token, "nodraw" ) ) { + wantShader = qfalse; + } + } + + /* skyparms */ + else if ( !stricmp( token, "skyParms" ) ) { + /* get image base */ + GetToken( qfalse ); + + /* ignore bogus paths */ + if ( stricmp( token, "-" ) && stricmp( token, "full" ) ) { + strcpy ( temp, token ); + sprintf( token, "%s_up", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + sprintf( token, "%s_dn", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + sprintf( token, "%s_lf", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + sprintf( token, "%s_rt", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + sprintf( token, "%s_bk", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + sprintf( token, "%s_ft", temp ); + tex2list( pk3Textures, &pk3TexturesN, EXpk3Textures, &EXpk3TexturesN ); + } + /* skip rest of line */ + GetToken( qfalse ); + GetToken( qfalse ); + } + } + //exclude shader + if ( wantShader ){ + for ( j = 0; j < EXpk3ShadersN; j++ ){ + if ( !stricmp( EXpk3Shaders[j], shadername ) ){ + wantShader = qfalse; + break; + } + } + /* shouldnt make shaders for shipped with the game textures aswell */ + if ( wantShader ){ + for ( j = 0; j < EXpk3TexturesN; j++ ){ + if ( !stricmp( EXpk3Textures[j], shadername ) ){ + wantShader = qfalse; + break; + } + } + } + if ( wantShader ){ + wantShaderFile = qtrue; + strcpy( lastwantedShader, shadername ); + } + } + } + //exclude shader file + if ( wantShaderFile ){ + for ( j = 0; j < EXpk3ShaderfilesN; j++ ){ + if ( !stricmp( EXpk3Shaderfiles[j], pk3Shaderfiles[ i ] ) ){ + Sys_Printf( "WARNING: excluded shader %s, since it was located in restricted shader file: %s\n", lastwantedShader, pk3Shaderfiles[i] ); + pk3Shaderfiles[ i ][0] = '\0'; + break; + } + } + } + else { + pk3Shaderfiles[ i ][0] = '\0'; + } + + } + + + + /* exclude stuff */ + //pure textures (shader ones are done) + for ( i = 0; i < pk3ShadersN; i++ ){ + if ( pk3Shaders[i][0] != '\0' ){ + FixDOSName( pk3Shaders[i] ); + for ( j = 0; j < pk3TexturesN; j++ ){ + if ( !stricmp( pk3Shaders[i], pk3Textures[j] ) ){ + pk3Shaders[i][0] = '\0'; + break; + } + } + if ( pk3Shaders[i][0] == '\0' ) continue; + for ( j = 0; j < EXpk3TexturesN; j++ ){ + if ( !stricmp( pk3Shaders[i], EXpk3Textures[j] ) ){ + pk3Shaders[i][0] = '\0'; + break; + } + } + } + } + + //snds + for ( i = 0; i < pk3SoundsN; i++ ){ + FixDOSName( pk3Sounds[i] ); + for ( j = 0; j < EXpk3SoundsN; j++ ){ + if ( !stricmp( pk3Sounds[i], EXpk3Sounds[j] ) ){ + pk3Sounds[i][0] = '\0'; + break; + } + } + } + + if( dbg ){ + Sys_Printf( "\tShader referenced textures....%i\n", pk3TexturesN ); + for ( i = 0; i < pk3TexturesN; i++ ){ + Sys_Printf( "%s\n", pk3Textures[i] ); + } + Sys_Printf( "\tShader files....\n" ); + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + if ( pk3Shaderfiles[i][0] != '\0' ) Sys_Printf( "%s\n", pk3Shaderfiles[i] ); + } + Sys_Printf( "\tPure textures....\n" ); + for ( i = 0; i < pk3ShadersN; i++ ){ + if ( pk3Shaders[i][0] != '\0' ) Sys_Printf( "%s\n", pk3Shaders[i] ); + } + } + + + + sprintf( packname, "%s/%s_autopacked.pk3", EnginePath, nameOFmap ); + remove( packname ); + + Sys_Printf( "--- ZipZip ---\n" ); + + Sys_Printf( "\n\tShader referenced textures....\n" ); + + for ( i = 0; i < pk3TexturesN; i++ ){ + if ( png ){ + sprintf( temp, "%s.png", pk3Textures[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + } + sprintf( temp, "%s.tga", pk3Textures[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + sprintf( temp, "%s.jpg", pk3Textures[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + Sys_Printf( " !FAIL! %s\n", pk3Textures[i] ); + } + + Sys_Printf( "\n\tPure textures....\n" ); + + for ( i = 0; i < pk3ShadersN; i++ ){ + if ( pk3Shaders[i][0] != '\0' ){ + if ( png ){ + sprintf( temp, "%s.png", pk3Shaders[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + } + sprintf( temp, "%s.tga", pk3Shaders[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + sprintf( temp, "%s.jpg", pk3Shaders[i] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + Sys_Printf( " !FAIL! %s\n", pk3Shaders[i] ); + } + } + + Sys_Printf( "\n\tShaizers....\n" ); + + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + if ( pk3Shaderfiles[i][0] != '\0' ){ + sprintf( temp, "%s/%s", game->shaderPath, pk3Shaderfiles[ i ] ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + continue; + } + Sys_Printf( " !FAIL! %s\n", pk3Shaders[i] ); + } + } + + Sys_Printf( "\n\tSounds....\n" ); + + for ( i = 0; i < pk3SoundsN; i++ ){ + if ( pk3Sounds[i][0] != '\0' ){ + if ( vfsPackFile( pk3Sounds[ i ], packname ) ){ + Sys_Printf( "++%s\n", pk3Sounds[ i ] ); + continue; + } + Sys_Printf( " !FAIL! %s\n", pk3Sounds[i] ); + } + } + + Sys_Printf( "\n\tVideos....\n" ); + + for ( i = 0; i < pk3VideosN; i++ ){ + if ( vfsPackFile( pk3Videos[i], packname ) ){ + Sys_Printf( "++%s\n", pk3Videos[i] ); + continue; + } + Sys_Printf( " !FAIL! %s\n", pk3Videos[i] ); + } + + Sys_Printf( "\n\t.\n" ); + + sprintf( temp, "maps/%s.bsp", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); + } + + sprintf( temp, "maps/%s.aas", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); + } + + sprintf( temp, "scripts/%s.arena", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); + } + + sprintf( temp, "scripts/%s.defi", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); + } + + Sys_Printf( "\nSaved to %s\n", packname ); + /* return to sender */ + return 0; + } + -/* - PseudoCompileBSP() - a stripped down ProcessModels - */ -void PseudoCompileBSP( qboolean need_tree ){ - int models; - char modelValue[10]; - entity_t *entity; - face_t *faces; - tree_t *tree; - node_t *node; - brush_t *brush; - side_t *side; - int i; - - SetDrawSurfacesBuffer(); - mapDrawSurfs = safe_malloc( sizeof( mapDrawSurface_t ) * MAX_MAP_DRAW_SURFS ); - memset( mapDrawSurfs, 0, sizeof( mapDrawSurface_t ) * MAX_MAP_DRAW_SURFS ); - numMapDrawSurfs = 0; - - BeginBSPFile(); - models = 1; - for ( mapEntityNum = 0; mapEntityNum < numEntities; mapEntityNum++ ) - { - /* get entity */ - entity = &entities[ mapEntityNum ]; - if ( entity->brushes == NULL && entity->patches == NULL ) { - continue; - } - - if ( mapEntityNum != 0 ) { - sprintf( modelValue, "*%d", models++ ); - SetKeyValue( entity, "model", modelValue ); - } - - /* process the model */ - Sys_FPrintf( SYS_VRB, "############### model %i ###############\n", numBSPModels ); - BeginModel(); - - entity->firstDrawSurf = numMapDrawSurfs; - - ClearMetaTriangles(); - PatchMapDrawSurfs( entity ); - - if ( mapEntityNum == 0 && need_tree ) { - faces = MakeStructuralBSPFaceList( entities[0].brushes ); - tree = FaceBSP( faces ); - node = tree->headnode; - } - else - { - node = AllocNode(); - node->planenum = PLANENUM_LEAF; - tree = AllocTree(); - tree->headnode = node; - } - - /* a minimized ClipSidesIntoTree */ - for ( brush = entity->brushes; brush; brush = brush->next ) - { - /* walk the brush sides */ - for ( i = 0; i < brush->numsides; i++ ) - { - /* get side */ - side = &brush->sides[ i ]; - if ( side->winding == NULL ) { - continue; - } - /* shader? */ - if ( side->shaderInfo == NULL ) { - continue; - } - /* save this winding as a visible surface */ - DrawSurfaceForSide( entity, brush, side, side->winding ); - } - } - - if ( meta ) { - ClassifyEntitySurfaces( entity ); - MakeEntityDecals( entity ); - MakeEntityMetaTriangles( entity ); - SmoothMetaTriangles(); - MergeMetaTriangles(); - } - FilterDrawsurfsIntoTree( entity, tree ); - - FilterStructuralBrushesIntoTree( entity, tree ); - FilterDetailBrushesIntoTree( entity, tree ); - - EmitBrushes( entity->brushes, &entity->firstBrush, &entity->numBrushes ); - EndModel( entity, node ); - } - EndBSPFile( qfalse ); -} - -/* - ConvertBSPMain() - main argument processing function for bsp conversion - */ - -int ConvertBSPMain( int argc, char **argv ){ - int i; - int ( *convertFunc )( char * ); - game_t *convertGame; - char ext[1024]; - qboolean map_allowed, force_bsp, force_map; - - - /* set default */ - convertFunc = ConvertBSPToASE; - convertGame = NULL; - map_allowed = qfalse; - force_bsp = qfalse; - force_map = qfalse; - - /* arg checking */ - if ( argc < 1 ) { - Sys_Printf( "Usage: q3map -convert [-format ] [-shadersasbitmap|-lightmapsastexcoord|-deluxemapsastexcoord] [-readbsp|-readmap [-meta|-patchmeta]] [-v] \n" ); - return 0; - } - - /* process arguments */ - for ( i = 1; i < ( argc - 1 ); i++ ) - { - /* -format map|ase|... */ - if ( !strcmp( argv[ i ], "-format" ) ) { - i++; - if ( !Q_stricmp( argv[ i ], "ase" ) ) { - convertFunc = ConvertBSPToASE; - map_allowed = qfalse; - } - else if ( !Q_stricmp( argv[ i ], "obj" ) ) { - convertFunc = ConvertBSPToOBJ; - map_allowed = qfalse; - } - else if ( !Q_stricmp( argv[ i ], "map_bp" ) ) { - convertFunc = ConvertBSPToMap_BP; - map_allowed = qtrue; - } - else if ( !Q_stricmp( argv[ i ], "map" ) ) { - convertFunc = ConvertBSPToMap; - map_allowed = qtrue; - } - else - { - convertGame = GetGame( argv[ i ] ); - map_allowed = qfalse; - if ( convertGame == NULL ) { - Sys_Printf( "Unknown conversion format \"%s\". Defaulting to ASE.\n", argv[ i ] ); - } - } - } - else if ( !strcmp( argv[ i ], "-ne" ) ) { - normalEpsilon = atof( argv[ i + 1 ] ); - i++; - Sys_Printf( "Normal epsilon set to %f\n", normalEpsilon ); - } - else if ( !strcmp( argv[ i ], "-de" ) ) { - distanceEpsilon = atof( argv[ i + 1 ] ); - i++; - Sys_Printf( "Distance epsilon set to %f\n", distanceEpsilon ); - } - else if ( !strcmp( argv[ i ], "-shaderasbitmap" ) || !strcmp( argv[ i ], "-shadersasbitmap" ) ) { - shadersAsBitmap = qtrue; - } - else if ( !strcmp( argv[ i ], "-lightmapastexcoord" ) || !strcmp( argv[ i ], "-lightmapsastexcoord" ) ) { - lightmapsAsTexcoord = qtrue; - } - else if ( !strcmp( argv[ i ], "-deluxemapastexcoord" ) || !strcmp( argv[ i ], "-deluxemapsastexcoord" ) ) { - lightmapsAsTexcoord = qtrue; - deluxemap = qtrue; - } - else if ( !strcmp( argv[ i ], "-readbsp" ) ) { - force_bsp = qtrue; - } - else if ( !strcmp( argv[ i ], "-readmap" ) ) { - force_map = qtrue; - } - else if ( !strcmp( argv[ i ], "-meta" ) ) { - meta = qtrue; - } - else if ( !strcmp( argv[ i ], "-patchmeta" ) ) { - meta = qtrue; - patchMeta = qtrue; - } - } - - LoadShaderInfo(); - - /* clean up map name */ - strcpy( source, ExpandArg( argv[i] ) ); - ExtractFileExtension( source, ext ); - - if ( !map_allowed && !force_map ) { - force_bsp = qtrue; - } - - if ( force_map || ( !force_bsp && !Q_stricmp( ext, "map" ) && map_allowed ) ) { - if ( !map_allowed ) { - Sys_Printf( "WARNING: the requested conversion should not be done from .map files. Compile a .bsp first.\n" ); - } - StripExtension( source ); - DefaultExtension( source, ".map" ); - Sys_Printf( "Loading %s\n", source ); - LoadMapFile( source, qfalse, convertGame == NULL ); - PseudoCompileBSP( convertGame != NULL ); - } - else - { - StripExtension( source ); - DefaultExtension( source, ".bsp" ); - Sys_Printf( "Loading %s\n", source ); - LoadBSPFile( source ); - ParseEntities(); - } - - /* bsp format convert? */ - if ( convertGame != NULL ) { - /* set global game */ - game = convertGame; - - /* write bsp */ - StripExtension( source ); - DefaultExtension( source, "_c.bsp" ); - Sys_Printf( "Writing %s\n", source ); - WriteBSPFile( source ); - - /* return to sender */ - return 0; - } - - /* normal convert */ - return convertFunc( source ); -} - - - /* main() q3map mojo...