X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=tools%2Fquake3%2Fq3map2%2Fmain.c;h=75bc4608703040218db568b49aceaa85eaf70162;hb=11c140ba5e462d14fc1708c60e099746d4c1fded;hp=e74a89cfc76141b124fc1f030a59b61d3a1cc9ef;hpb=c2be26a9bdb2ec7ae7c817fd84885fa2a85521fb;p=xonotic%2Fnetradiant.git diff --git a/tools/quake3/q3map2/main.c b/tools/quake3/q3map2/main.c index e74a89cf..75bc4608 100644 --- a/tools/quake3/q3map2/main.c +++ b/tools/quake3/q3map2/main.c @@ -35,6 +35,7 @@ /* dependencies */ #include "q3map2.h" +#include /* Random() @@ -58,7 +59,7 @@ char *Q_strncpyz( char *dst, const char *src, size_t len ) { char *Q_strcat( char *dst, size_t dlen, const char *src ) { - size_t n = strlen( dst ); + size_t n = strlen( dst ); if ( n > dlen ) { abort(); /* buffer overflow */ @@ -91,338 +92,274 @@ static void ExitQ3Map( void ){ } } -static int MD4BlockChecksum( void * buffer, int length ) { - unsigned char digest[16]; - int checksum; - - md4_get_digest( buffer, length, digest ); - /* I suppose it has to be done that way for legacy reasons? */ - checksum = digest[0] & ( digest[1] << 8 ) & ( digest[2] << 16 ) & ( digest[3] << 24 ); - checksum ^= digest[4] & ( digest[5] << 8 ) & ( digest[6] << 16 ) & ( digest[7] << 24 ); - checksum ^= digest[8] & ( digest[9] << 8 ) & ( digest[10] << 16 ) & ( digest[11] << 24 ); - checksum ^= digest[12] & ( digest[13] << 8 ) & ( digest[14] << 16 ) & ( digest[15] << 24 ); - return checksum; -} /* - FixAAS() - resets an aas checksum to match the given BSP + ShiftBSPMain() + shifts a map: for testing physics with huge coordinates */ -int FixAAS( int argc, char **argv ){ - int length, checksum; - void *buffer; - FILE *file; - char aas[ 1024 ], **ext; - char *exts[] = - { - ".aas", - "_b0.aas", - "_b1.aas", - NULL - }; +int ShiftBSPMain( int argc, char **argv ){ + int i, j; + float f, a; + vec3_t scale; + vec3_t vec; + char str[ 1024 ]; + int uniform, axis; + qboolean texscale; + float *old_xyzst = NULL; + float spawn_ref = 0; /* arg checking */ - if ( argc < 2 ) { - Sys_Printf( "Usage: q3map -fixaas [-v] \n" ); + if ( argc < 3 ) { + Sys_Printf( "Usage: q3map [-v] -shift [-tex] [-spawn_ref ] \n" ); return 0; } - /* do some path mangling */ - strcpy( source, ExpandArg( argv[ argc - 1 ] ) ); - StripExtension( source ); - DefaultExtension( source, ".bsp" ); - - /* note it */ - Sys_Printf( "--- FixAAS ---\n" ); - - /* load the bsp */ - Sys_Printf( "Loading %s\n", source ); - length = LoadFile( source, &buffer ); - - /* create bsp checksum */ - Sys_Printf( "Creating checksum...\n" ); - checksum = LittleLong( MD4BlockChecksum( buffer, length ) ); - - /* write checksum to aas */ - ext = exts; - while ( *ext ) + texscale = qfalse; + for ( i = 1; i < argc - 2; ++i ) { - /* mangle name */ - strcpy( aas, source ); - StripExtension( aas ); - strcat( aas, *ext ); - Sys_Printf( "Trying %s\n", aas ); - ext++; - - /* fix it */ - file = fopen( aas, "r+b" ); - if ( !file ) { - continue; + if ( !strcmp( argv[i], "-tex" ) ) { + texscale = qtrue; } - if ( fwrite( &checksum, 4, 1, file ) != 1 ) { - Error( "Error writing checksum to %s", aas ); + else if ( !strcmp( argv[i], "-spawn_ref" ) ) { + spawn_ref = atof( argv[i + 1] ); + ++i; + } + else{ + break; } - fclose( file ); } - /* return to sender */ - return 0; -} + /* get shift */ + // if(argc-2 >= i) // always true + scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] ); + if ( argc - 3 >= i ) { + scale[1] = scale[0] = atof( argv[ argc - 3 ] ); + } + if ( argc - 4 >= i ) { + scale[0] = atof( argv[ argc - 4 ] ); + } + uniform = ( ( scale[0] == scale[1] ) && ( scale[1] == scale[2] ) ); -/* - AnalyzeBSP() - ydnar - analyzes a Quake engine BSP file - */ + /* do some path mangling */ + strcpy( source, ExpandArg( argv[ argc - 1 ] ) ); + StripExtension( source ); + DefaultExtension( source, ".bsp" ); -typedef struct abspHeader_s -{ - char ident[ 4 ]; - int version; + /* load the bsp */ + Sys_Printf( "Loading %s\n", source ); + LoadBSPFile( source ); + ParseEntities(); - bspLump_t lumps[ 1 ]; /* unknown size */ -} -abspHeader_t; + /* note it */ + Sys_Printf( "--- ShiftBSP ---\n" ); + Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities ); -typedef struct abspLumpTest_s -{ - int radix, minCount; - char *name; -} -abspLumpTest_t; - -int AnalyzeBSP( int argc, char **argv ){ - abspHeader_t *header; - int size, i, version, offset, length, lumpInt, count; - char ident[ 5 ]; - void *lump; - float lumpFloat; - char lumpString[ 1024 ], source[ 1024 ]; - qboolean lumpSwap = qfalse; - abspLumpTest_t *lumpTest; - static abspLumpTest_t lumpTests[] = + /* shift entity keys */ + for ( i = 0; i < numBSPEntities && i < numEntities; i++ ) { - { sizeof( bspPlane_t ), 6, "IBSP LUMP_PLANES" }, - { sizeof( bspBrush_t ), 1, "IBSP LUMP_BRUSHES" }, - { 8, 6, "IBSP LUMP_BRUSHSIDES" }, - { sizeof( bspBrushSide_t ), 6, "RBSP LUMP_BRUSHSIDES" }, - { sizeof( bspModel_t ), 1, "IBSP LUMP_MODELS" }, - { sizeof( bspNode_t ), 2, "IBSP LUMP_NODES" }, - { sizeof( bspLeaf_t ), 1, "IBSP LUMP_LEAFS" }, - { 104, 3, "IBSP LUMP_DRAWSURFS" }, - { 44, 3, "IBSP LUMP_DRAWVERTS" }, - { 4, 6, "IBSP LUMP_DRAWINDEXES" }, - { 128 * 128 * 3, 1, "IBSP LUMP_LIGHTMAPS" }, - { 256 * 256 * 3, 1, "IBSP LUMP_LIGHTMAPS (256 x 256)" }, - { 512 * 512 * 3, 1, "IBSP LUMP_LIGHTMAPS (512 x 512)" }, - { 0, 0, NULL } - }; + /* shift origin */ + GetVectorForKey( &entities[ i ], "origin", vec ); + if ( ( vec[ 0 ] || vec[ 1 ] || vec[ 2 ] ) ) { + if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) { + vec[2] += spawn_ref; + } + vec[0] += scale[0]; + vec[1] += scale[1]; + vec[2] += scale[2]; + if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) { + vec[2] -= spawn_ref; + } + sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] ); + SetKeyValue( &entities[ i ], "origin", str ); + } + } - /* arg checking */ - if ( argc < 1 ) { - Sys_Printf( "Usage: q3map -analyze [-lumpswap] [-v] \n" ); - return 0; + /* shift models */ + for ( i = 0; i < numBSPModels; i++ ) + { + bspModels[ i ].mins[0] += scale[0]; + bspModels[ i ].mins[1] += scale[1]; + bspModels[ i ].mins[2] += scale[2]; + bspModels[ i ].maxs[0] += scale[0]; + bspModels[ i ].maxs[1] += scale[1]; + bspModels[ i ].maxs[2] += scale[2]; } - /* process arguments */ - for ( i = 1; i < ( argc - 1 ); i++ ) + /* shift nodes */ + for ( i = 0; i < numBSPNodes; i++ ) { - /* -format map|ase|... */ - if ( !strcmp( argv[ i ], "-lumpswap" ) ) { - Sys_Printf( "Swapped lump structs enabled\n" ); - lumpSwap = qtrue; - } + bspNodes[ i ].mins[0] += scale[0]; + bspNodes[ i ].mins[1] += scale[1]; + bspNodes[ i ].mins[2] += scale[2]; + bspNodes[ i ].maxs[0] += scale[0]; + bspNodes[ i ].maxs[1] += scale[1]; + bspNodes[ i ].maxs[2] += scale[2]; } - /* clean up map name */ - strcpy( source, ExpandArg( argv[ i ] ) ); - Sys_Printf( "Loading %s\n", source ); + /* shift leafs */ + for ( i = 0; i < numBSPLeafs; i++ ) + { + bspLeafs[ i ].mins[0] += scale[0]; + bspLeafs[ i ].mins[1] += scale[1]; + bspLeafs[ i ].mins[2] += scale[2]; + bspLeafs[ i ].maxs[0] += scale[0]; + bspLeafs[ i ].maxs[1] += scale[1]; + bspLeafs[ i ].maxs[2] += scale[2]; + } - /* load the file */ - size = LoadFile( source, (void**) &header ); - if ( size == 0 || header == NULL ) { - Sys_Printf( "Unable to load %s.\n", source ); - return -1; + /* shift drawverts */ + for ( i = 0; i < numBSPDrawVerts; i++ ) + { + bspDrawVerts[i].xyz[0] += scale[0]; + bspDrawVerts[i].xyz[1] += scale[1]; + bspDrawVerts[i].xyz[2] += scale[2]; } - /* analyze ident/version */ - memcpy( ident, header->ident, 4 ); - ident[ 4 ] = '\0'; - version = LittleLong( header->version ); + /* shift planes */ - Sys_Printf( "Identity: %s\n", ident ); - Sys_Printf( "Version: %d\n", version ); - Sys_Printf( "---------------------------------------\n" ); + vec3_t point; - /* analyze each lump */ - for ( i = 0; i < 100; i++ ) + for ( i = 0; i < numBSPPlanes; i++ ) { - /* call of duty swapped lump pairs */ - if ( lumpSwap ) { - offset = LittleLong( header->lumps[ i ].length ); - length = LittleLong( header->lumps[ i ].offset ); - } - - /* standard lump pairs */ - else - { - offset = LittleLong( header->lumps[ i ].offset ); - length = LittleLong( header->lumps[ i ].length ); - } - - /* extract data */ - lump = (byte*) header + offset; - lumpInt = LittleLong( (int) *( (int*) lump ) ); - lumpFloat = LittleFloat( (float) *( (float*) lump ) ); - memcpy( lumpString, (char*) lump, ( length < 1024 ? length : 1024 ) ); - lumpString[ 1024 ] = '\0'; - - /* print basic lump info */ - Sys_Printf( "Lump: %d\n", i ); - Sys_Printf( "Offset: %d bytes\n", offset ); - Sys_Printf( "Length: %d bytes\n", length ); - - /* only operate on valid lumps */ - if ( length > 0 ) { - /* print data in 4 formats */ - Sys_Printf( "As hex: %08X\n", lumpInt ); - Sys_Printf( "As int: %d\n", lumpInt ); - Sys_Printf( "As float: %f\n", lumpFloat ); - Sys_Printf( "As string: %s\n", lumpString ); - - /* guess lump type */ - if ( lumpString[ 0 ] == '{' && lumpString[ 2 ] == '"' ) { - Sys_Printf( "Type guess: IBSP LUMP_ENTITIES\n" ); - } - else if ( strstr( lumpString, "textures/" ) ) { - Sys_Printf( "Type guess: IBSP LUMP_SHADERS\n" ); - } - else - { - /* guess based on size/count */ - for ( lumpTest = lumpTests; lumpTest->radix > 0; lumpTest++ ) - { - if ( ( length % lumpTest->radix ) != 0 ) { - continue; - } - count = length / lumpTest->radix; - if ( count < lumpTest->minCount ) { - continue; - } - Sys_Printf( "Type guess: %s (%d x %d)\n", lumpTest->name, count, lumpTest->radix ); - } + //find point on plane + for ( j=0; j<3; j++ ){ + if ( fabs( bspPlanes[ i ].normal[j] ) > 0.5 ){ + point[j] = bspPlanes[ i ].dist / bspPlanes[ i ].normal[j]; + point[(j+1)%3] = point[(j+2)%3] = 0; + break; } } - - Sys_Printf( "---------------------------------------\n" ); - - /* end of file */ - if ( offset + length >= size ) { - break; + //shift point + for ( j=0; j<3; j++ ){ + point[j] += scale[j]; } + //calc new plane dist + bspPlanes[ i ].dist = DotProduct( point, bspPlanes[ i ].normal ); } - /* last stats */ - Sys_Printf( "Lump count: %d\n", i + 1 ); - Sys_Printf( "File size: %d bytes\n", size ); + /* scale gridsize */ + /* + GetVectorForKey( &entities[ 0 ], "gridsize", vec ); + if ( ( vec[ 0 ] + vec[ 1 ] + vec[ 2 ] ) == 0.0f ) { + VectorCopy( gridSize, vec ); + } + vec[0] *= scale[0]; + vec[1] *= scale[1]; + vec[2] *= scale[2]; + sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] ); + SetKeyValue( &entities[ 0 ], "gridsize", str ); +*/ + /* inject command line parameters */ + InjectCommandLine( argv, 0, argc - 1 ); + + /* write the bsp */ + UnparseEntities(); + StripExtension( source ); + DefaultExtension( source, "_sh.bsp" ); + Sys_Printf( "Writing %s\n", source ); + WriteBSPFile( source ); - /* return to caller */ + /* return to sender */ return 0; } +void FixDOSName( char *src ){ + if ( src == NULL ) { + return; + } -/* - BSPInfo() - emits statistics about the bsp file - */ + while ( *src ) + { + if ( *src == '\\' ) { + *src = '/'; + } + src++; + } +} -int BSPInfo( int count, char **fileNames ){ +/* + 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; - char source[ 1024 ], ext[ 64 ]; - int size; - FILE *f; + 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; +} - /* dummy check */ - if ( count < 1 ) { - Sys_Printf( "No files to dump info for.\n" ); - return -1; +/* + 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; +} - /* enable info mode */ - infoMode = qtrue; - - /* walk file list */ - for ( i = 0; i < count; i++ ) +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 ) { - Sys_Printf( "---------------------------------\n" ); - - /* mangle filename and get size */ - strcpy( source, fileNames[ i ] ); - ExtractFileExtension( source, ext ); - if ( !Q_stricmp( ext, "map" ) ) { - StripExtension( source ); + if ( !GetToken( qtrue ) ) { + break; } - DefaultExtension( source, ".bsp" ); - f = fopen( source, "rb" ); - if ( f ) { - size = Q_filelength( f ); - fclose( f ); + if ( !strcmp( token, "}" ) ) { + break; } - else{ - size = 0; + if ( token[0] == '{' ) { + Error( "ReadExclusionsFile: %s, line %d: brace, opening twice in a row.", exName, scriptline ); } - /* load the bsp file and print lump sizes */ - Sys_Printf( "%s\n", source ); - LoadBSPFile( source ); - PrintBSPFileSizes(); - - /* print sizes */ - Sys_Printf( "\n" ); - Sys_Printf( " total %9d\n", size ); - Sys_Printf( " %9d KB\n", size / 1024 ); - Sys_Printf( " %9d MB\n", size / ( 1024 * 1024 ) ); - - Sys_Printf( "---------------------------------\n" ); + /* add to list */ + strcpy( data[*num], token ); + (*num)++; } - - /* return count */ - return i; + return; } - - +char q3map2path[1024]; /* - ScaleBSPMain() - amaze and confuse your enemies with wierd scaled maps! + pk3BSPMain() + map autopackager, works for Q3 type of shaders and ents */ -int ScaleBSPMain( int argc, char **argv ){ - int i; - float f, scale; - vec3_t vec; - char str[ 1024 ]; - +int pk3BSPMain( int argc, char **argv ){ + int i, j; + qboolean dbg = qfalse, png = qfalse; - /* arg checking */ - if ( argc < 2 ) { - Sys_Printf( "Usage: q3map -scale [-v] \n" ); - return 0; + /* process arguments */ + for ( i = 1; i < ( argc - 1 ); i++ ){ + if ( !strcmp( argv[ i ], "-dbg" ) ) { + dbg = qtrue; + } + else if ( !strcmp( argv[ i ], "-png" ) ) { + png = qtrue; + } } - /* get scale */ - scale = atof( argv[ argc - 2 ] ); - if ( scale == 0.0f ) { - Sys_Printf( "Usage: q3map -scale [-v] \n" ); - Sys_Printf( "Non-zero scale value required.\n" ); - return 0; - } + /* do some path mangling */ strcpy( source, ExpandArg( argv[ argc - 1 ] ) ); @@ -434,160 +371,574 @@ int ScaleBSPMain( int argc, char **argv ){ LoadBSPFile( source ); ParseEntities(); - /* note it */ - Sys_Printf( "--- ScaleBSP ---\n" ); - Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities ); - /* scale entity keys */ + 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++ ) { - /* scale origin */ - GetVectorForKey( &entities[ i ], "origin", vec ); - if ( ( vec[ 0 ] + vec[ 1 ] + vec[ 2 ] ) ) { - VectorScale( vec, scale, vec ); - sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] ); - SetKeyValue( &entities[ i ], "origin", str ); + 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 ); + } - /* scale door lip */ - f = FloatForKey( &entities[ i ], "lip" ); - if ( f ) { - f *= scale; - sprintf( str, "%f", f ); - SetKeyValue( &entities[ i ], "lip", str ); + //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] ); } } - /* scale models */ - for ( i = 0; i < numBSPModels; i++ ) - { - VectorScale( bspModels[ i ].mins, scale, bspModels[ i ].mins ); - VectorScale( bspModels[ i ].maxs, scale, bspModels[ i ].maxs ); + vfsListShaderFiles( pk3Shaderfiles, &pk3ShaderfilesN ); + + if( dbg ){ + Sys_Printf( "\tSchroider fileses.....%i\n", pk3ShaderfilesN ); + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + Sys_Printf( "%s\n", pk3Shaderfiles[i] ); + } } - /* scale nodes */ - for ( i = 0; i < numBSPNodes; i++ ) - { - VectorScale( bspNodes[ i ].mins, scale, bspNodes[ i ].mins ); - VectorScale( bspNodes[ i ].maxs, scale, bspNodes[ i ].maxs ); + + /* 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; } - /* scale leafs */ - for ( i = 0; i < numBSPLeafs; i++ ) + /* parse the file */ + ParseFromMemory( (char *) buffer, size ); + + /* blocks pointers */ + //int *exptrN; + //char *exptr[512][64]; + + + /* tokenize it */ + while ( 1 ) { - VectorScale( bspLeafs[ i ].mins, scale, bspLeafs[ i ].mins ); - VectorScale( bspLeafs[ i ].maxs, scale, bspLeafs[ i ].maxs ); + /* 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 ); + } } - /* scale drawverts */ - for ( i = 0; i < numBSPDrawVerts; i++ ) - VectorScale( bspDrawVerts[ i ].xyz, scale, bspDrawVerts[ i ].xyz ); + /* 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] ); + } - /* scale planes */ - for ( i = 0; i < numBSPPlanes; i++ ) - bspPlanes[ i ].dist *= scale; + char temp[ 1024 ]; - /* scale gridsize */ - GetVectorForKey( &entities[ 0 ], "gridsize", vec ); - if ( ( vec[ 0 ] + vec[ 1 ] + vec[ 2 ] ) == 0.0f ) { - VectorCopy( gridSize, vec ); - } - VectorScale( vec, scale, vec ); - sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] ); - SetKeyValue( &entities[ 0 ], "gridsize", str ); + //Parse Shader Files + for ( i = 0; i < pk3ShaderfilesN; i++ ){ + qboolean wantShader = qfalse; + qboolean wantShaderFile = qfalse; + char shadername[ 1024 ]; + char lastwantedShader[ 1024 ]; - /* write the bsp */ - UnparseEntities(); - StripExtension( source ); - DefaultExtension( source, "_s.bsp" ); - Sys_Printf( "Writing %s\n", source ); - WriteBSPFile( source ); - /* return to sender */ - return 0; -} + /* 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 ); + } -/* - ConvertBSPMain() - main argument processing function for bsp conversion - */ + while ( 1 ) + { + /* get the next token */ + if ( !GetToken( qtrue ) ) { + break; + } + if ( !strcmp( token, "}" ) ) { + break; + } -int ConvertBSPMain( int argc, char **argv ){ - int i; - int ( *convertFunc )( char * ); - game_t *convertGame; + /* ----------------------------------------------------------------- + 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; + } + } - /* set default */ - convertFunc = ConvertBSPToASE; - convertGame = NULL; + /* 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'; + } - /* arg checking */ - if ( argc < 1 ) { - Sys_Printf( "Usage: q3map -convert [-format ] [-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; + + +/* 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; + } } - else if ( !Q_stricmp( argv[ i ], "map" ) ) { - convertFunc = ConvertBSPToMap; + if ( pk3Shaders[i][0] == '\0' ) continue; + for ( j = 0; j < EXpk3TexturesN; j++ ){ + if ( !stricmp( pk3Shaders[i], EXpk3Textures[j] ) ){ + pk3Shaders[i][0] = '\0'; + break; + } } - else - { - convertGame = GetGame( argv[ i ] ); - if ( convertGame == NULL ) { - Sys_Printf( "Unknown conversion format \"%s\". Defaulting to ASE.\n", argv[ i ] ); + } + } + +//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] ); } } - /* clean up map name */ - strcpy( source, ExpandArg( argv[ i ] ) ); - StripExtension( source ); - DefaultExtension( source, ".bsp" ); + Sys_Printf( "\n\tShaizers....\n" ); - LoadShaderInfo(); + 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( "Loading %s\n", source ); + Sys_Printf( "\n\tSounds....\n" ); - /* ydnar: load surface file */ - //% LoadSurfaceExtraFile( source ); + 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] ); + } + } - LoadBSPFile( source ); + Sys_Printf( "\n\tVideos....\n" ); - /* parse bsp entities */ - ParseEntities(); + 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] ); + } - /* bsp format convert? */ - if ( convertGame != NULL ) { - /* set global game */ - game = convertGame; + Sys_Printf( "\n\t.\n" ); - /* write bsp */ - StripExtension( source ); - DefaultExtension( source, "_c.bsp" ); - Sys_Printf( "Writing %s\n", source ); - WriteBSPFile( source ); + sprintf( temp, "maps/%s.bsp", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); + } - /* return to sender */ - return 0; + sprintf( temp, "maps/%s.aas", nameOFmap ); + if ( vfsPackFile( temp, packname ) ){ + Sys_Printf( "++%s\n", temp ); + } + else{ + Sys_Printf( " !FAIL! %s\n", temp ); } - /* normal convert */ - return convertFunc( source ); -} + 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; +} /* @@ -598,6 +949,7 @@ int ConvertBSPMain( int argc, char **argv ){ int main( int argc, char **argv ){ int i, r; double start, end; + extern qboolean werror; /* we want consistent 'randomness' */ @@ -615,6 +967,13 @@ int main( int argc, char **argv ){ /* read general options first */ for ( i = 1; i < argc; i++ ) { + /* -help */ + if ( !strcmp( argv[ i ], "-h" ) || !strcmp( argv[ i ], "--help" ) + || !strcmp( argv[ i ], "-help" ) ) { + HelpMain(argv[i+1]); + return 0; + } + /* -connect */ if ( !strcmp( argv[ i ], "-connect" ) ) { argv[ i ] = NULL; @@ -625,8 +984,10 @@ int main( int argc, char **argv ){ /* verbose */ else if ( !strcmp( argv[ i ], "-v" ) ) { - verbose = qtrue; - argv[ i ] = NULL; + if ( !verbose ) { + verbose = qtrue; + argv[ i ] = NULL; + } } /* force */ @@ -635,6 +996,12 @@ int main( int argc, char **argv ){ argv[ i ] = NULL; } + /* make all warnings into errors */ + else if ( !strcmp( argv[ i ], "-werror" ) ) { + werror = qtrue; + argv[ i ] = NULL; + } + /* patch subdivisions */ else if ( !strcmp( argv[ i ], "-subdivisions" ) ) { argv[ i ] = NULL; @@ -653,6 +1020,14 @@ int main( int argc, char **argv ){ numthreads = atoi( argv[ i ] ); argv[ i ] = NULL; } + + else if( !strcmp( argv[ i ], "-nocmdline" ) ) + { + Sys_Printf( "noCmdLine\n" ); + nocmdline = qtrue; + argv[ i ] = NULL; + } + } /* init model library */ @@ -678,12 +1053,20 @@ int main( int argc, char **argv ){ Sys_Printf( "Q3Map - v1.0r (c) 1999 Id Software Inc.\n" ); Sys_Printf( "Q3Map (ydnar) - v" Q3MAP_VERSION "\n" ); - Sys_Printf( "GtkRadiant - v" RADIANT_VERSION " " __DATE__ " " __TIME__ "\n" ); + Sys_Printf( "NetRadiant - v" RADIANT_VERSION " " __DATE__ " " __TIME__ "\n" ); Sys_Printf( "%s\n", Q3MAP_MOTD ); + Sys_Printf( "%s\n", argv[0] ); + + strcpy( q3map2path, argv[0] );//fuer autoPack func /* ydnar: new path initialization */ InitPaths( &argc, argv ); + /* set game options */ + if ( !patchSubdivisions ) { + patchSubdivisions = game->patchSubdivisions; + } + /* check if we have enough options left to attempt something */ if ( argc < 2 ) { Error( "Usage: %s [general options] [options] mapfile", argv[ 0 ] ); @@ -691,17 +1074,17 @@ int main( int argc, char **argv ){ /* fixaas */ if ( !strcmp( argv[ 1 ], "-fixaas" ) ) { - r = FixAAS( argc - 1, argv + 1 ); + r = FixAASMain( argc - 1, argv + 1 ); } /* analyze */ else if ( !strcmp( argv[ 1 ], "-analyze" ) ) { - r = AnalyzeBSP( argc - 1, argv + 1 ); + r = AnalyzeBSPMain( argc - 1, argv + 1 ); } /* info */ else if ( !strcmp( argv[ 1 ], "-info" ) ) { - r = BSPInfo( argc - 2, argv + 2 ); + r = BSPInfoMain( argc - 2, argv + 2 ); } /* vis */ @@ -716,11 +1099,16 @@ int main( int argc, char **argv ){ /* vlight */ else if ( !strcmp( argv[ 1 ], "-vlight" ) ) { - Sys_Printf( "WARNING: VLight is no longer supported, defaulting to -light -fast instead\n\n" ); + Sys_FPrintf( SYS_WRN, "WARNING: VLight is no longer supported, defaulting to -light -fast instead\n\n" ); argv[ 1 ] = "-fast"; /* eek a hack */ r = LightMain( argc, argv ); } + /* QBall: export entities */ + else if ( !strcmp( argv[ 1 ], "-exportents" ) ) { + r = ExportEntitiesMain( argc - 1, argv + 1 ); + } + /* ydnar: lightmap export */ else if ( !strcmp( argv[ 1 ], "-export" ) ) { r = ExportLightmapsMain( argc - 1, argv + 1 ); @@ -736,11 +1124,26 @@ int main( int argc, char **argv ){ r = ScaleBSPMain( argc - 1, argv + 1 ); } + /* bsp shifting */ + else if ( !strcmp( argv[ 1 ], "-shift" ) ) { + r = ShiftBSPMain( argc - 1, argv + 1 ); + } + + /* autopacking */ + else if ( !strcmp( argv[ 1 ], "-pk3" ) ) { + r = pk3BSPMain( argc - 1, argv + 1 ); + } + /* ydnar: bsp conversion */ else if ( !strcmp( argv[ 1 ], "-convert" ) ) { r = ConvertBSPMain( argc - 1, argv + 1 ); } + /* div0: minimap */ + else if ( !strcmp( argv[ 1 ], "-minimap" ) ) { + r = MiniMapBSPMain( argc - 1, argv + 1 ); + } + /* ydnar: otherwise create a bsp */ else{ r = BSPMain( argc, argv );