-/*\r
-Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
-For a list of contributors, see the accompanying CONTRIBUTORS file.\r
-\r
-This file is part of GtkRadiant.\r
-\r
-GtkRadiant is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-GtkRadiant is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with GtkRadiant; if not, write to the Free Software\r
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
-*/\r
-\r
-\r
-/* marker */\r
-#define MAIN_C\r
-\r
-\r
-\r
-/* dependencies */\r
-#include "q2map.h"\r
-\r
-#define qtrue true\r
-#define qfalse false\r
-\r
-char *mapname;\r
-char game[64];\r
-extern qboolean verbose;\r
-\r
-/// BSP \r
-extern qboolean drawflag;\r
-extern qboolean noprune;\r
-extern qboolean glview;\r
-extern qboolean nodetail;\r
-extern qboolean fulldetail;\r
-extern qboolean onlyents;\r
-extern qboolean nomerge;\r
-extern qboolean nowater;\r
-extern qboolean nofill;\r
-extern qboolean nocsg;\r
-extern qboolean noweld;\r
-extern qboolean noshare;\r
-extern qboolean nosubdiv;\r
-extern qboolean notjunc;\r
-extern qboolean noopt;\r
-extern qboolean leaktest;\r
-extern qboolean verboseentities;\r
-extern char outbase[32];\r
-extern int block_xl, block_xh, block_yl, block_yh;\r
-extern vec_t microvolume;\r
-extern float subdivide_size;\r
-\r
-// VIS\r
-extern char inbase[32];\r
-extern qboolean fastvis;\r
-extern qboolean nosort;\r
-extern int testlevel;\r
-\r
-// RAD\r
-extern qboolean dumppatches;\r
-extern int numbounce;\r
-extern qboolean extrasamples;\r
-extern float subdiv;\r
-extern float lightscale;\r
-extern float direct_scale;\r
-extern float entity_scale;\r
-extern qboolean nopvs;\r
-extern float ambient;\r
-extern float maxlight;\r
-\r
-\r
-void InitPaths( int *argc, char **argv );\r
-\r
-/*\r
-Random()\r
-returns a pseudorandom number between 0 and 1\r
-*/\r
-/*\r
-vec_t Random( void )\r
-{\r
- return (vec_t) rand() / RAND_MAX;\r
-}\r
-*/\r
-\r
-\r
-/*\r
-ExitQ2Map()\r
-cleanup routine\r
-*/\r
-/*\r
-static void ExitQ2Map( void )\r
-{\r
- BSPFilesCleanup();\r
- if( mapDrawSurfs != NULL )\r
- free( mapDrawSurfs );\r
-}\r
-*/\r
-\r
-\r
-/*\r
-BSPInfo()\r
-emits statistics about the bsp file\r
-*/\r
-\r
-int BSPInfo()\r
-{\r
- char source[ 1024 ], ext[ 64 ];\r
- int size;\r
- FILE *f;\r
- \r
- Sys_Printf ("\n----- INFO ----\n\n");\r
- \r
- /* dummy check */\r
- if( mapname == NULL )\r
- {\r
- Sys_Printf( "No files to dump info for.\n");\r
- return -1;\r
- }\r
- \r
- /* enable info mode */\r
- //infoMode = qtrue;\r
- \r
- \r
- /* mangle filename and get size */\r
- strcpy( source, mapname );\r
- ExtractFileExtension( source, ext );\r
- if( !Q_stricmp( ext, "map" ) )\r
- StripExtension( source );\r
- DefaultExtension( source, ".bsp" );\r
- f = fopen( source, "rb" );\r
- if( f )\r
- {\r
- size = Q_filelength (f);\r
- fclose( f );\r
- }\r
- else\r
- size = 0;\r
- \r
- /* load the bsp file and print lump sizes */\r
- Sys_Printf( "Map: %s\n\n", source );\r
- \r
- Sys_Printf( "-----------------------------------------------------\n" );\r
- \r
- LoadBSPFile( source ); \r
- PrintBSPFileSizes();\r
- \r
- Sys_Printf( "-----------------------------------------------------\n" );\r
- \r
- /* print sizes */\r
- Sys_Printf( "Total: %d B = %.3f kB = %.3f MB\n", size, size / 1024.0, size / (1024.0 * 1024.0) );\r
- \r
- Sys_Printf( "-----------------------------------------------------\n" );\r
- \r
- /* return count */\r
- return 0;\r
-}\r
-\r
-\r
-\r
-/*\r
-ScaleBSPMain()\r
-amaze and confuse your enemies with wierd scaled maps!\r
-*/\r
-/*\r
-int ScaleBSPMain( int argc, char **argv )\r
-{\r
- int i;\r
- float f, scale;\r
- vec3_t vec;\r
- char str[ 1024 ];\r
- \r
- \r
- // arg checking \r
- if( argc < 2 )\r
- {\r
- Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\n" );\r
- return 0;\r
- }\r
- \r
- // get scale \r
- scale = atof( argv[ argc - 2 ] );\r
- if( scale == 0.0f )\r
- {\r
- Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\n" );\r
- Sys_Printf( "Non-zero scale value required.\n" );\r
- return 0;\r
- }\r
- \r
- // do some path mangling \r
- strcpy( source, ExpandArg( argv[ argc - 1 ] ) );\r
- StripExtension( source );\r
- DefaultExtension( source, ".bsp" );\r
- \r
- // load the bsp \r
- Sys_Printf( "Loading %s\n", source );\r
- LoadBSPFile( source );\r
- ParseEntities();\r
- \r
- // note it \r
- Sys_Printf( "--- ScaleBSP ---\n" );\r
- Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities );\r
- \r
- // scale entity keys \r
- for( i = 0; i < numBSPEntities && i < numEntities; i++ )\r
- {\r
- // scale origin \r
- GetVectorForKey( &entities[ i ], "origin", vec );\r
- if( (vec[ 0 ] + vec[ 1 ] + vec[ 2 ]) )\r
- {\r
- VectorScale( vec, scale, vec );\r
- sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] );\r
- SetKeyValue( &entities[ i ], "origin", str );\r
- }\r
- \r
- // scale door lip \r
- f = FloatForKey( &entities[ i ], "lip" );\r
- if( f )\r
- {\r
- f *= scale;\r
- sprintf( str, "%f", f );\r
- SetKeyValue( &entities[ i ], "lip", str );\r
- }\r
- }\r
- \r
- // scale models \r
- for( i = 0; i < numBSPModels; i++ )\r
- {\r
- VectorScale( bspModels[ i ].mins, scale, bspModels[ i ].mins );\r
- VectorScale( bspModels[ i ].maxs, scale, bspModels[ i ].maxs );\r
- }\r
- \r
- // scale nodes \r
- for( i = 0; i < numBSPNodes; i++ )\r
- {\r
- VectorScale( bspNodes[ i ].mins, scale, bspNodes[ i ].mins );\r
- VectorScale( bspNodes[ i ].maxs, scale, bspNodes[ i ].maxs );\r
- }\r
- \r
- // scale leafs \r
- for( i = 0; i < numBSPLeafs; i++ )\r
- {\r
- VectorScale( bspLeafs[ i ].mins, scale, bspLeafs[ i ].mins );\r
- VectorScale( bspLeafs[ i ].maxs, scale, bspLeafs[ i ].maxs );\r
- }\r
- \r
- // scale drawverts \r
- for( i = 0; i < numBSPDrawVerts; i++ )\r
- VectorScale( bspDrawVerts[ i ].xyz, scale, bspDrawVerts[ i ].xyz );\r
- \r
- // scale planes \r
- for( i = 0; i < numBSPPlanes; i++ )\r
- bspPlanes[ i ].dist *= scale;\r
- \r
- // scale gridsize \r
- GetVectorForKey( &entities[ 0 ], "gridsize", vec );\r
- if( (vec[ 0 ] + vec[ 1 ] + vec[ 2 ]) == 0.0f )\r
- VectorCopy( gridSize, vec );\r
- VectorScale( vec, scale, vec );\r
- sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] );\r
- SetKeyValue( &entities[ 0 ], "gridsize", str );\r
- \r
- // write the bsp \r
- UnparseEntities();\r
- StripExtension( source );\r
- DefaultExtension( source, "_s.bsp" );\r
- Sys_Printf( "Writing %s\n", source );\r
- WriteBSPFile( source );\r
- \r
- // return to sender \r
- return 0;\r
-}\r
-*/\r
-\r
-\r
-/*\r
-ConvertBSPMain()\r
-main argument processing function for bsp conversion\r
-*/\r
-/*\r
-int ConvertBSPMain( int argc, char **argv )\r
-{\r
- int i;\r
- int (*convertFunc)( char * );\r
- \r
- \r
- // set default \r
- convertFunc = ConvertBSPToASE;\r
- \r
- // arg checking \r
- if( argc < 1 )\r
- {\r
- Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\n" );\r
- return 0;\r
- }\r
- \r
- // process arguments \r
- for( i = 1; i < (argc - 1); i++ )\r
- {\r
- // -format map|ase|... \r
- if( !strcmp( argv[ i ], "-format" ) )\r
- {\r
- i++;\r
- if( !Q_stricmp( argv[ i ], "ase" ) )\r
- convertFunc = ConvertBSPToASE;\r
- else if( !Q_stricmp( argv[ i ], "map" ) )\r
- convertFunc = ConvertBSPToMap;\r
- else\r
- Sys_Printf( "Unknown conversion format \"%s\". Defaulting to ASE.\n", argv[ i ] );\r
- }\r
- }\r
- \r
- // clean up map name \r
- strcpy( source, ExpandArg( argv[ i ] ) );\r
- StripExtension( source );\r
- DefaultExtension( source, ".bsp" );\r
- \r
- LoadShaderInfo();\r
- \r
- Sys_Printf( "Loading %s\n", source );\r
- \r
- // ydnar: load surface file \r
- //% LoadSurfaceExtraFile( source );\r
- \r
- LoadBSPFile( source );\r
- \r
- // parse bsp entities \r
- ParseEntities();\r
- \r
- // convert \r
- return convertFunc( source );\r
-}\r
-*/\r
-\r
-int Check_BSP_Options( int argc, char **argv )\r
-{\r
- int i;\r
- \r
- for (i=1 ; i<argc ; i++)\r
- {\r
- if (!strcmp(argv[i],"-glview"))\r
- {\r
- glview = true;\r
- }\r
- else if (!strcmp(argv[i], "-draw"))\r
- {\r
- Sys_Printf ("drawflag = true\n");\r
- drawflag = true;\r
- }\r
- else if (!strcmp(argv[i], "-noweld"))\r
- {\r
- Sys_Printf ("noweld = true\n");\r
- noweld = true;\r
- }\r
- else if (!strcmp(argv[i], "-nocsg"))\r
- {\r
- Sys_Printf ("nocsg = true\n");\r
- nocsg = true;\r
- }\r
- else if (!strcmp(argv[i], "-noshare"))\r
- {\r
- Sys_Printf ("noshare = true\n");\r
- noshare = true;\r
- }\r
- else if (!strcmp(argv[i], "-notjunc"))\r
- {\r
- Sys_Printf ("notjunc = true\n");\r
- notjunc = true;\r
- }\r
- else if (!strcmp(argv[i], "-nowater"))\r
- {\r
- Sys_Printf ("nowater = true\n");\r
- nowater = true;\r
- }\r
- else if (!strcmp(argv[i], "-noopt"))\r
- {\r
- Sys_Printf ("noopt = true\n");\r
- noopt = true;\r
- }\r
- else if (!strcmp(argv[i], "-noprune"))\r
- {\r
- Sys_Printf ("noprune = true\n");\r
- noprune = true;\r
- }\r
- else if (!strcmp(argv[i], "-nofill"))\r
- {\r
- Sys_Printf ("nofill = true\n");\r
- nofill = true;\r
- }\r
- else if (!strcmp(argv[i], "-nomerge"))\r
- {\r
- Sys_Printf ("nomerge = true\n");\r
- nomerge = true;\r
- }\r
- else if (!strcmp(argv[i], "-nosubdiv"))\r
- {\r
- Sys_Printf ("nosubdiv = true\n");\r
- nosubdiv = true;\r
- }\r
- else if (!strcmp(argv[i], "-nodetail"))\r
- {\r
- Sys_Printf ("nodetail = true\n");\r
- nodetail = true;\r
- }\r
- else if (!strcmp(argv[i], "-fulldetail"))\r
- {\r
- Sys_Printf ("fulldetail = true\n");\r
- fulldetail = true;\r
- }\r
- else if (!strcmp(argv[i], "-onlyents"))\r
- {\r
- Sys_Printf ("onlyents = true\n");\r
- onlyents = true;\r
- }\r
- else if (!strcmp(argv[i], "-micro"))\r
- {\r
- microvolume = atof(argv[i+1]);\r
- Sys_Printf ("microvolume = %f\n", microvolume);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i], "-leaktest"))\r
- {\r
- Sys_Printf ("leaktest = true\n");\r
- leaktest = true;\r
- }\r
- else if (!strcmp(argv[i], "-verboseentities"))\r
- {\r
- Sys_Printf ("verboseentities = true\n");\r
- verboseentities = true;\r
- }\r
- else if (!strcmp(argv[i], "-chop"))\r
- {\r
- subdivide_size = atof(argv[i+1]);\r
- Sys_Printf ("subdivide_size = %f\n", subdivide_size);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i], "-block"))\r
- {\r
- block_xl = block_xh = atoi(argv[i+1]);\r
- block_yl = block_yh = atoi(argv[i+2]);\r
- Sys_Printf ("block: %i,%i\n", block_xl, block_yl);\r
- i+=2;\r
- }\r
- else if (!strcmp(argv[i], "-blocks"))\r
- {\r
- block_xl = atoi(argv[i+1]);\r
- block_yl = atoi(argv[i+2]);\r
- block_xh = atoi(argv[i+3]);\r
- block_yh = atoi(argv[i+4]);\r
- Sys_Printf ("blocks: %i,%i to %i,%i\n", \r
- block_xl, block_yl, block_xh, block_yh);\r
- i+=4;\r
- }\r
- else if (!strcmp (argv[i],"-tmpout"))\r
- {\r
- strcpy (outbase, "/tmp");\r
- }\r
- else\r
- break;\r
- }\r
-\r
-\r
- return 0;\r
-}\r
-\r
-int Check_VIS_Options( int argc, char **argv )\r
-{\r
- int i;\r
- \r
- for (i=1 ; i<argc ; i++)\r
- {\r
- if (!strcmp(argv[i], "-fast"))\r
- {\r
- Sys_Printf ("fastvis = true\n");\r
- fastvis = true;\r
- }\r
- else if (!strcmp(argv[i], "-level"))\r
- {\r
- testlevel = atoi(argv[i+1]);\r
- Sys_Printf ("testlevel = %i\n", testlevel);\r
- i++;\r
- }\r
- else if (!strcmp (argv[i],"-nosort"))\r
- {\r
- Sys_Printf ("nosort = true\n");\r
- nosort = true;\r
- }\r
- else if (!strcmp (argv[i],"-tmpin"))\r
- strcpy (inbase, "/tmp");\r
- else if (!strcmp (argv[i],"-tmpout"))\r
- strcpy (outbase, "/tmp");\r
- else\r
- break;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-int Check_RAD_Options( int argc, char **argv )\r
-{\r
- int i;\r
- \r
- for (i=1 ; i<argc ; i++)\r
- {\r
- if (!strcmp(argv[i],"-dump"))\r
- dumppatches = true;\r
- else if (!strcmp(argv[i],"-bounce"))\r
- {\r
- numbounce = atoi (argv[i+1]);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-extra"))\r
- {\r
- extrasamples = true;\r
- Sys_Printf ("extrasamples = true\n");\r
- }\r
- else if (!strcmp(argv[i],"-chop"))\r
- {\r
- subdiv = atoi (argv[i+1]);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-scale"))\r
- {\r
- lightscale = atof (argv[i+1]);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-direct"))\r
- {\r
- direct_scale *= atof(argv[i+1]);\r
- Sys_Printf ("direct light scaling at %f\n", direct_scale);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-entity"))\r
- {\r
- entity_scale *= atof(argv[i+1]);\r
- Sys_Printf ("entity light scaling at %f\n", entity_scale);\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-glview"))\r
- {\r
- glview = true;\r
- Sys_Printf ("glview = true\n");\r
- }\r
- else if (!strcmp(argv[i],"-nopvs"))\r
- {\r
- nopvs = true;\r
- Sys_Printf ("nopvs = true\n");\r
- }\r
- else if (!strcmp(argv[i],"-ambient"))\r
- {\r
- ambient = atof (argv[i+1]) * 128;\r
- i++;\r
- }\r
- else if (!strcmp(argv[i],"-maxlight"))\r
- {\r
- maxlight = atof (argv[i+1]) * 128;\r
- i++;\r
- }\r
- else if (!strcmp (argv[i],"-tmpin"))\r
- strcpy (inbase, "/tmp");\r
- else if (!strcmp (argv[i],"-tmpout"))\r
- strcpy (outbase, "/tmp");\r
- else\r
- break;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/*\r
-main()\r
-*/\r
-\r
-int main( int argc, char **argv )\r
-{\r
- int i;\r
- int r=0;\r
- int total_time;\r
- double start, end;\r
- int alt_argc;\r
- char** alt_argv;\r
- qboolean do_info=qfalse;\r
- qboolean do_bsp=qfalse;\r
- qboolean do_vis=qfalse;\r
- qboolean do_rad=qfalse;\r
- \r
- \r
- /* we want consistent 'randomness' */\r
- srand( 0 );\r
- \r
- /* start timer */\r
- start = I_FloatTime();\r
-\r
- Sys_Printf( "\nQ2Map - Ver. 1.0\n" );\r
-\r
- /* set exit call */\r
- //atexit( ExitQ3Map );\r
- \r
- game[0] = 0;\r
- \r
- if ( argc < 2 )\r
- {\r
- Sys_Printf(" %s: -game [quake2,heretic2] -fs_basepath basepath -info -bsp -vis -rad mapname\n",argv[0]);\r
- return -1;\r
- }\r
- /* read general options first */\r
- for( i = 1; i < argc; i++ )\r
- {\r
- /* -connect */\r
- if( !strcmp( argv[ i ], "-connect" ) )\r
- {\r
- i++;\r
- Broadcast_Setup( argv[ i ] );\r
- }\r
- \r
- /* verbose */\r
- else if( !strcmp( argv[ i ], "-v" ) )\r
- {\r
- verbose = qtrue;\r
- }\r
- \r
- /* threads */\r
- else if( !strcmp( argv[ i ], "-threads" ) )\r
- {\r
- i++;\r
- numthreads = atoi( argv[ i ] );\r
- }\r
- else if( !strcmp( argv[ i ], "-game" ) )\r
- {\r
- i++;\r
- strncpy (game, argv[ i ] , 64);\r
- strlower(game);\r
- } \r
- }\r
- \r
- /* set number of threads */\r
- ThreadSetDefault();\r
- \r
- /* ydnar: new path initialization */\r
- InitPaths( &argc, argv );\r
- \r
- /* read compiling options */\r
- for( i = 1; i < argc; i++ )\r
- {\r
- /* info */\r
- if( !strcmp( argv[ i ], "-info" ) )\r
- {\r
- do_info=qtrue;\r
- }\r
-\r
- /* bsp */\r
- if( !strcmp( argv[ i ], "-bsp" ) )\r
- {\r
- do_bsp=qtrue;\r
- alt_argc=argc - i;\r
- alt_argv= (char **) ( argv + i );\r
- Check_BSP_Options( alt_argc, alt_argv );\r
- }\r
-\r
- /* vis */\r
- if( !strcmp( argv[ i ], "-vis" ) )\r
- {\r
- do_vis=qtrue;\r
- alt_argc=argc - i;\r
- alt_argv= (char **) ( argv + i );\r
- Check_VIS_Options( alt_argc, alt_argv );\r
- }\r
-\r
- /* rad */\r
- if( !strcmp( argv[ i ], "-rad" ) )\r
- {\r
- do_rad=qtrue;\r
- alt_argc=argc - i;\r
- alt_argv= (char **) ( argv + i );\r
- Check_RAD_Options( alt_argc, alt_argv );\r
- }\r
- }\r
- \r
- if (game[0] == 0)\r
- strncpy( game, "quake2", 7);\r
- \r
- Sys_Printf("Game: %s\n", game);\r
- \r
- if ( !do_info && !do_bsp && !do_vis && !do_rad)\r
- Sys_Printf("ERROR: -bsp, -vis, -light, nor -info specified.\nWhat to you want me to do?\n\n");\r
- else\r
- {\r
- mapname=argv[argc-1];\r
- \r
- if (do_bsp)\r
- BSP_Main();\r
- if (do_vis)\r
- VIS_Main();\r
- if (do_rad)\r
- RAD_Main();\r
- if (do_info)\r
- BSPInfo();\r
- \r
- }\r
- \r
- /* emit time */\r
- end = I_FloatTime();\r
- total_time = (int) (end-start);\r
- Sys_Printf("\nTotal Time: ");\r
- if ( total_time > 59 )\r
- Sys_Printf("%d Minutes ", total_time/60 );\r
- Sys_Printf( "%d Seconds\n", total_time%60 );\r
- \r
- /* shut down connection */\r
- Broadcast_Shutdown();\r
- \r
- /* return any error code */\r
- return r;\r
-}\r
+/*
+ Copyright (C) 1999-2007 id Software, Inc. and contributors.
+ For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+ This file is part of GtkRadiant.
+
+ GtkRadiant is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GtkRadiant is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GtkRadiant; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+/* marker */
+#define MAIN_C
+
+
+
+/* dependencies */
+#include "q2map.h"
+
+#define qtrue true
+#define qfalse false
+
+char *mapname;
+char game[64];
+extern qboolean verbose;
+
+/// BSP
+extern qboolean drawflag;
+extern qboolean noprune;
+extern qboolean glview;
+extern qboolean nodetail;
+extern qboolean fulldetail;
+extern qboolean onlyents;
+extern qboolean nomerge;
+extern qboolean nowater;
+extern qboolean nofill;
+extern qboolean nocsg;
+extern qboolean noweld;
+extern qboolean noshare;
+extern qboolean nosubdiv;
+extern qboolean notjunc;
+extern qboolean noopt;
+extern qboolean leaktest;
+extern qboolean verboseentities;
+extern char outbase[32];
+extern int block_xl, block_xh, block_yl, block_yh;
+extern vec_t microvolume;
+extern float subdivide_size;
+
+// VIS
+extern char inbase[32];
+extern qboolean fastvis;
+extern qboolean nosort;
+extern int testlevel;
+
+// RAD
+extern qboolean dumppatches;
+extern int numbounce;
+extern qboolean extrasamples;
+extern float subdiv;
+extern float lightscale;
+extern float direct_scale;
+extern float entity_scale;
+extern qboolean nopvs;
+extern float ambient;
+extern float maxlight;
+
+
+void InitPaths( int *argc, char **argv );
+
+/*
+ Random()
+ returns a pseudorandom number between 0 and 1
+ */
+/*
+ vec_t Random( void )
+ {
+ return (vec_t) rand() / RAND_MAX;
+ }
+ */
+
+
+/*
+ ExitQ2Map()
+ cleanup routine
+ */
+/*
+ static void ExitQ2Map( void )
+ {
+ BSPFilesCleanup();
+ if( mapDrawSurfs != NULL )
+ free( mapDrawSurfs );
+ }
+ */
+
+
+/*
+ BSPInfo()
+ emits statistics about the bsp file
+ */
+
+int BSPInfo(){
+ char source[ 1024 ], ext[ 64 ];
+ int size;
+ FILE *f;
+
+ Sys_Printf( "\n----- INFO ----\n\n" );
+
+ /* dummy check */
+ if ( mapname == NULL ) {
+ Sys_Printf( "No files to dump info for.\n" );
+ return -1;
+ }
+
+ /* enable info mode */
+ //infoMode = qtrue;
+
+
+ /* mangle filename and get size */
+ strcpy( source, mapname );
+ ExtractFileExtension( source, ext );
+ if ( !Q_stricmp( ext, "map" ) ) {
+ StripExtension( source );
+ }
+ DefaultExtension( source, ".bsp" );
+ f = fopen( source, "rb" );
+ if ( f ) {
+ size = Q_filelength( f );
+ fclose( f );
+ }
+ else{
+ size = 0;
+ }
+
+ /* load the bsp file and print lump sizes */
+ Sys_Printf( "Map: %s\n\n", source );
+
+ Sys_Printf( "-----------------------------------------------------\n" );
+
+ LoadBSPFile( source );
+ PrintBSPFileSizes();
+
+ Sys_Printf( "-----------------------------------------------------\n" );
+
+ /* print sizes */
+ Sys_Printf( "Total: %d B = %.3f kB = %.3f MB\n", size, size / 1024.0, size / ( 1024.0 * 1024.0 ) );
+
+ Sys_Printf( "-----------------------------------------------------\n" );
+
+ /* return count */
+ return 0;
+}
+
+
+
+/*
+ ScaleBSPMain()
+ amaze and confuse your enemies with wierd scaled maps!
+ */
+/*
+ int ScaleBSPMain( int argc, char **argv )
+ {
+ int i;
+ float f, scale;
+ vec3_t vec;
+ char str[ 1024 ];
+
+
+ // arg checking
+ if( argc < 2 )
+ {
+ Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\n" );
+ return 0;
+ }
+
+ // get scale
+ scale = atof( argv[ argc - 2 ] );
+ if( scale == 0.0f )
+ {
+ Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\n" );
+ Sys_Printf( "Non-zero scale value required.\n" );
+ return 0;
+ }
+
+ // 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();
+
+ // note it
+ Sys_Printf( "--- ScaleBSP ---\n" );
+ Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities );
+
+ // scale entity keys
+ 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 );
+ }
+
+ // scale door lip
+ f = FloatForKey( &entities[ i ], "lip" );
+ if( f )
+ {
+ f *= scale;
+ sprintf( str, "%f", f );
+ SetKeyValue( &entities[ i ], "lip", str );
+ }
+ }
+
+ // scale models
+ for( i = 0; i < numBSPModels; i++ )
+ {
+ VectorScale( bspModels[ i ].mins, scale, bspModels[ i ].mins );
+ VectorScale( bspModels[ i ].maxs, scale, bspModels[ i ].maxs );
+ }
+
+ // scale nodes
+ for( i = 0; i < numBSPNodes; i++ )
+ {
+ VectorScale( bspNodes[ i ].mins, scale, bspNodes[ i ].mins );
+ VectorScale( bspNodes[ i ].maxs, scale, bspNodes[ i ].maxs );
+ }
+
+ // scale leafs
+ for( i = 0; i < numBSPLeafs; i++ )
+ {
+ VectorScale( bspLeafs[ i ].mins, scale, bspLeafs[ i ].mins );
+ VectorScale( bspLeafs[ i ].maxs, scale, bspLeafs[ i ].maxs );
+ }
+
+ // scale drawverts
+ for( i = 0; i < numBSPDrawVerts; i++ )
+ VectorScale( bspDrawVerts[ i ].xyz, scale, bspDrawVerts[ i ].xyz );
+
+ // scale planes
+ for( i = 0; i < numBSPPlanes; i++ )
+ bspPlanes[ i ].dist *= scale;
+
+ // 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 );
+
+ // write the bsp
+ UnparseEntities();
+ StripExtension( source );
+ DefaultExtension( source, "_s.bsp" );
+ Sys_Printf( "Writing %s\n", source );
+ WriteBSPFile( source );
+
+ // return to sender
+ return 0;
+ }
+ */
+
+
+/*
+ ConvertBSPMain()
+ main argument processing function for bsp conversion
+ */
+/*
+ int ConvertBSPMain( int argc, char **argv )
+ {
+ int i;
+ int (*convertFunc)( char * );
+
+
+ // set default
+ convertFunc = ConvertBSPToASE;
+
+ // arg checking
+ if( argc < 1 )
+ {
+ Sys_Printf( "Usage: q3map -scale <value> [-v] <mapname>\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;
+ else if( !Q_stricmp( argv[ i ], "map" ) )
+ convertFunc = ConvertBSPToMap;
+ else
+ Sys_Printf( "Unknown conversion format \"%s\". Defaulting to ASE.\n", argv[ i ] );
+ }
+ }
+
+ // clean up map name
+ strcpy( source, ExpandArg( argv[ i ] ) );
+ StripExtension( source );
+ DefaultExtension( source, ".bsp" );
+
+ LoadShaderInfo();
+
+ Sys_Printf( "Loading %s\n", source );
+
+ // ydnar: load surface file
+ //% LoadSurfaceExtraFile( source );
+
+ LoadBSPFile( source );
+
+ // parse bsp entities
+ ParseEntities();
+
+ // convert
+ return convertFunc( source );
+ }
+ */
+
+int Check_BSP_Options( int argc, char **argv ){
+ int i;
+
+ for ( i = 1 ; i < argc ; i++ )
+ {
+ if ( !strcmp( argv[i],"-glview" ) ) {
+ glview = true;
+ }
+ else if ( !strcmp( argv[i], "-draw" ) ) {
+ Sys_Printf( "drawflag = true\n" );
+ drawflag = true;
+ }
+ else if ( !strcmp( argv[i], "-noweld" ) ) {
+ Sys_Printf( "noweld = true\n" );
+ noweld = true;
+ }
+ else if ( !strcmp( argv[i], "-nocsg" ) ) {
+ Sys_Printf( "nocsg = true\n" );
+ nocsg = true;
+ }
+ else if ( !strcmp( argv[i], "-noshare" ) ) {
+ Sys_Printf( "noshare = true\n" );
+ noshare = true;
+ }
+ else if ( !strcmp( argv[i], "-notjunc" ) ) {
+ Sys_Printf( "notjunc = true\n" );
+ notjunc = true;
+ }
+ else if ( !strcmp( argv[i], "-nowater" ) ) {
+ Sys_Printf( "nowater = true\n" );
+ nowater = true;
+ }
+ else if ( !strcmp( argv[i], "-noopt" ) ) {
+ Sys_Printf( "noopt = true\n" );
+ noopt = true;
+ }
+ else if ( !strcmp( argv[i], "-noprune" ) ) {
+ Sys_Printf( "noprune = true\n" );
+ noprune = true;
+ }
+ else if ( !strcmp( argv[i], "-nofill" ) ) {
+ Sys_Printf( "nofill = true\n" );
+ nofill = true;
+ }
+ else if ( !strcmp( argv[i], "-nomerge" ) ) {
+ Sys_Printf( "nomerge = true\n" );
+ nomerge = true;
+ }
+ else if ( !strcmp( argv[i], "-nosubdiv" ) ) {
+ Sys_Printf( "nosubdiv = true\n" );
+ nosubdiv = true;
+ }
+ else if ( !strcmp( argv[i], "-nodetail" ) ) {
+ Sys_Printf( "nodetail = true\n" );
+ nodetail = true;
+ }
+ else if ( !strcmp( argv[i], "-fulldetail" ) ) {
+ Sys_Printf( "fulldetail = true\n" );
+ fulldetail = true;
+ }
+ else if ( !strcmp( argv[i], "-onlyents" ) ) {
+ Sys_Printf( "onlyents = true\n" );
+ onlyents = true;
+ }
+ else if ( !strcmp( argv[i], "-micro" ) ) {
+ microvolume = atof( argv[i + 1] );
+ Sys_Printf( "microvolume = %f\n", microvolume );
+ i++;
+ }
+ else if ( !strcmp( argv[i], "-leaktest" ) ) {
+ Sys_Printf( "leaktest = true\n" );
+ leaktest = true;
+ }
+ else if ( !strcmp( argv[i], "-verboseentities" ) ) {
+ Sys_Printf( "verboseentities = true\n" );
+ verboseentities = true;
+ }
+ else if ( !strcmp( argv[i], "-chop" ) ) {
+ subdivide_size = atof( argv[i + 1] );
+ Sys_Printf( "subdivide_size = %f\n", subdivide_size );
+ i++;
+ }
+ else if ( !strcmp( argv[i], "-block" ) ) {
+ block_xl = block_xh = atoi( argv[i + 1] );
+ block_yl = block_yh = atoi( argv[i + 2] );
+ Sys_Printf( "block: %i,%i\n", block_xl, block_yl );
+ i += 2;
+ }
+ else if ( !strcmp( argv[i], "-blocks" ) ) {
+ block_xl = atoi( argv[i + 1] );
+ block_yl = atoi( argv[i + 2] );
+ block_xh = atoi( argv[i + 3] );
+ block_yh = atoi( argv[i + 4] );
+ Sys_Printf( "blocks: %i,%i to %i,%i\n",
+ block_xl, block_yl, block_xh, block_yh );
+ i += 4;
+ }
+ else if ( !strcmp( argv[i],"-tmpout" ) ) {
+ strcpy( outbase, "/tmp" );
+ }
+ else{
+ break;
+ }
+ }
+
+
+ return 0;
+}
+
+int Check_VIS_Options( int argc, char **argv ){
+ int i;
+
+ for ( i = 1 ; i < argc ; i++ )
+ {
+ if ( !strcmp( argv[i], "-fast" ) ) {
+ Sys_Printf( "fastvis = true\n" );
+ fastvis = true;
+ }
+ else if ( !strcmp( argv[i], "-level" ) ) {
+ testlevel = atoi( argv[i + 1] );
+ Sys_Printf( "testlevel = %i\n", testlevel );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-nosort" ) ) {
+ Sys_Printf( "nosort = true\n" );
+ nosort = true;
+ }
+ else if ( !strcmp( argv[i],"-tmpin" ) ) {
+ strcpy( inbase, "/tmp" );
+ }
+ else if ( !strcmp( argv[i],"-tmpout" ) ) {
+ strcpy( outbase, "/tmp" );
+ }
+ else{
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int Check_RAD_Options( int argc, char **argv ){
+ int i;
+
+ for ( i = 1 ; i < argc ; i++ )
+ {
+ if ( !strcmp( argv[i],"-dump" ) ) {
+ dumppatches = true;
+ }
+ else if ( !strcmp( argv[i],"-bounce" ) ) {
+ numbounce = atoi( argv[i + 1] );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-extra" ) ) {
+ extrasamples = true;
+ Sys_Printf( "extrasamples = true\n" );
+ }
+ else if ( !strcmp( argv[i],"-chop" ) ) {
+ subdiv = atoi( argv[i + 1] );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-scale" ) ) {
+ lightscale = atof( argv[i + 1] );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-direct" ) ) {
+ direct_scale *= atof( argv[i + 1] );
+ Sys_Printf( "direct light scaling at %f\n", direct_scale );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-entity" ) ) {
+ entity_scale *= atof( argv[i + 1] );
+ Sys_Printf( "entity light scaling at %f\n", entity_scale );
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-glview" ) ) {
+ glview = true;
+ Sys_Printf( "glview = true\n" );
+ }
+ else if ( !strcmp( argv[i],"-nopvs" ) ) {
+ nopvs = true;
+ Sys_Printf( "nopvs = true\n" );
+ }
+ else if ( !strcmp( argv[i],"-ambient" ) ) {
+ ambient = atof( argv[i + 1] ) * 128;
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-maxlight" ) ) {
+ maxlight = atof( argv[i + 1] ) * 128;
+ i++;
+ }
+ else if ( !strcmp( argv[i],"-tmpin" ) ) {
+ strcpy( inbase, "/tmp" );
+ }
+ else if ( !strcmp( argv[i],"-tmpout" ) ) {
+ strcpy( outbase, "/tmp" );
+ }
+ else{
+ break;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ main()
+ */
+
+int main( int argc, char **argv ){
+ int i;
+ int r = 0;
+ int total_time;
+ double start, end;
+ int alt_argc;
+ char** alt_argv;
+ qboolean do_info = qfalse;
+ qboolean do_bsp = qfalse;
+ qboolean do_vis = qfalse;
+ qboolean do_rad = qfalse;
+
+
+ /* we want consistent 'randomness' */
+ srand( 0 );
+
+ /* start timer */
+ start = I_FloatTime();
+
+ Sys_Printf( "\nQ2Map - Ver. 1.0\n" );
+
+ /* set exit call */
+ //atexit( ExitQ3Map );
+
+ game[0] = 0;
+
+ if ( argc < 2 ) {
+ Sys_Printf( " %s: -game [quake2,heretic2] -fs_basepath basepath -info -bsp -vis -rad mapname\n",argv[0] );
+ return -1;
+ }
+ /* read general options first */
+ for ( i = 1; i < argc; i++ )
+ {
+ /* -connect */
+ if ( !strcmp( argv[ i ], "-connect" ) ) {
+ i++;
+ Broadcast_Setup( argv[ i ] );
+ }
+
+ /* verbose */
+ else if ( !strcmp( argv[ i ], "-v" ) ) {
+ verbose = qtrue;
+ }
+
+ /* threads */
+ else if ( !strcmp( argv[ i ], "-threads" ) ) {
+ i++;
+ numthreads = atoi( argv[ i ] );
+ }
+ else if ( !strcmp( argv[ i ], "-game" ) ) {
+ i++;
+ strncpy( game, argv[ i ], 64 );
+ strlower( game );
+ }
+ }
+
+ /* set number of threads */
+ ThreadSetDefault();
+
+ /* ydnar: new path initialization */
+ InitPaths( &argc, argv );
+
+ /* read compiling options */
+ for ( i = 1; i < argc; i++ )
+ {
+ /* info */
+ if ( !strcmp( argv[ i ], "-info" ) ) {
+ do_info = qtrue;
+ }
+
+ /* bsp */
+ if ( !strcmp( argv[ i ], "-bsp" ) ) {
+ do_bsp = qtrue;
+ alt_argc = argc - i;
+ alt_argv = (char **) ( argv + i );
+ Check_BSP_Options( alt_argc, alt_argv );
+ }
+
+ /* vis */
+ if ( !strcmp( argv[ i ], "-vis" ) ) {
+ do_vis = qtrue;
+ alt_argc = argc - i;
+ alt_argv = (char **) ( argv + i );
+ Check_VIS_Options( alt_argc, alt_argv );
+ }
+
+ /* rad */
+ if ( !strcmp( argv[ i ], "-rad" ) ) {
+ do_rad = qtrue;
+ alt_argc = argc - i;
+ alt_argv = (char **) ( argv + i );
+ Check_RAD_Options( alt_argc, alt_argv );
+ }
+ }
+
+ if ( game[0] == 0 ) {
+ strncpy( game, "quake2", 7 );
+ }
+
+ Sys_Printf( "Game: %s\n", game );
+
+ if ( !do_info && !do_bsp && !do_vis && !do_rad ) {
+ Sys_FPrintf( SYS_ERR, "ERROR: -bsp, -vis, -light, nor -info specified.\nWhat to you want me to do?\n\n" );
+ }
+ else
+ {
+ mapname = argv[argc - 1];
+
+ if ( do_bsp ) {
+ BSP_Main();
+ }
+ if ( do_vis ) {
+ VIS_Main();
+ }
+ if ( do_rad ) {
+ RAD_Main();
+ }
+ if ( do_info ) {
+ BSPInfo();
+ }
+
+ }
+
+ /* emit time */
+ end = I_FloatTime();
+ total_time = (int) ( end - start );
+ Sys_Printf( "\nTotal Time: " );
+ if ( total_time > 59 ) {
+ Sys_Printf( "%d Minutes ", total_time / 60 );
+ }
+ Sys_Printf( "%d Seconds\n", total_time % 60 );
+
+ /* shut down connection */
+ Broadcast_Shutdown();
+
+ /* return any error code */
+ return r;
+}