float *sample_offsets;
float sharpen_boxmult;
float sharpen_centermult;
- float boost;
+ float boost, brightness, contrast;
float *data1f;
float *sharpendata1f;
vec3_t mins, size;
}
}
+static void MiniMapBrightnessContrast(int y)
+{
+ int x;
+ float *q = &minimap.data1f[y * minimap.width];
+ for(x = 0; x < minimap.width; ++x)
+ {
+ *q = *q * minimap.contrast + minimap.brightness;
+ ++q;
+ }
+}
+
void MiniMapMakeMinsMaxs(vec3_t mins_in, vec3_t maxs_in, float border, qboolean keepaspect)
{
vec3_t mins, maxs, extend;
void MiniMapSetupBrushes( void )
{
- int i, b, compileFlags;
- bspBrush_t *brush;
- bspShader_t *shader;
- shaderInfo_t *si;
-
-
- /* note it */
- Sys_FPrintf( SYS_VRB, "--- MiniMapSetupBrushes ---\n" );
-
- /* allocate */
- if( opaqueBrushes == NULL )
- opaqueBrushes = safe_malloc( numBSPBrushes / 8 + 1 );
-
- /* clear */
- memset( opaqueBrushes, 0, numBSPBrushes / 8 + 1 );
- numOpaqueBrushes = 0;
-
- /* walk the list of worldspawn brushes */
- for( i = 0; i < minimap.model->numBSPBrushes; i++ )
- {
- /* get brush */
- b = minimap.model->firstBSPBrush + i;
- brush = &bspBrushes[ b ];
-
-#if 0
- /* check all sides */
- compileFlags = 0;
- for( j = 0; j < brush->numSides; j++ )
- {
- /* do bsp shader calculations */
- side = &bspBrushSides[ brush->firstSide + j ];
- shader = &bspShaders[ side->shaderNum ];
-
- /* get shader info */
- si = ShaderInfoForShader( shader->shader );
- if( si == NULL )
- continue;
-
- /* or together compile flags */
- compileFlags |= si->compileFlags;
- }
-#else
- shader = &bspShaders[ brush->shaderNum ];
- si = ShaderInfoForShader( shader->shader );
- if( si == NULL )
- compileFlags = 0;
- else
- compileFlags = si->compileFlags;
-#endif
-
- /* determine if this brush is solid */
- if( (compileFlags & (C_SOLID | C_SKY)) == C_SOLID )
- {
- opaqueBrushes[ b >> 3 ] |= (1 << (b & 7));
- numOpaqueBrushes++;
- maxOpaqueBrush = i;
- }
- }
-
- /* emit some statistics */
- Sys_FPrintf( SYS_VRB, "%9d solid brushes\n", numOpaqueBrushes );
+ SetupBrushesFlags(C_SOLID | C_SKY, C_SOLID, 0, 0);
+ // at least one must be solid
+ // none may be sky
+ // not all may be nodraw
}
qboolean MiniMapEvaluateSampleOffsets(int *bestj, int *bestk, float *bestval)
char basename[1024];
char path[1024];
char relativeMinimapFilename[1024];
+ qboolean autolevel;
float minimapSharpen;
float border;
byte *data4b, *p;
keepaspect = game->miniMapKeepAspect;
mode = game->miniMapMode;
+ autolevel = qfalse;
minimap.samples = 1;
minimap.sample_offsets = NULL;
minimap.boost = 1.0;
+ minimap.brightness = 0.0;
+ minimap.contrast = 1.0;
/* process arguments */
for( i = 1; i < (argc - 1); i++ )
mode = MINIMAP_MODE_WHITE;
Sys_Printf( "Writing as white alpha image\n" );
}
- else if( !strcmp( argv[ i ], "-boost" ) )
+ else if( !strcmp( argv[ i ], "-boost" ) && i < (argc - 2) )
{
minimap.boost = atof(argv[i + 1]);
i++;
Sys_Printf( "Contrast boost set to %f\n", minimap.boost );
}
+ else if( !strcmp( argv[ i ], "-brightness" ) && i < (argc - 2) )
+ {
+ minimap.brightness = atof(argv[i + 1]);
+ i++;
+ Sys_Printf( "Brightness set to %f\n", minimap.brightness );
+ }
+ else if( !strcmp( argv[ i ], "-contrast" ) && i < (argc - 2) )
+ {
+ minimap.contrast = atof(argv[i + 1]);
+ i++;
+ Sys_Printf( "Contrast set to %f\n", minimap.contrast );
+ }
+ else if( !strcmp( argv[ i ], "-autolevel" ) )
+ {
+ autolevel = qtrue;
+ Sys_Printf( "Auto level enabled\n", border );
+ }
+ else if( !strcmp( argv[ i ], "-noautolevel" ) )
+ {
+ autolevel = qfalse;
+ Sys_Printf( "Auto level disabled\n", border );
+ }
}
MiniMapMakeMinsMaxs(mins, maxs, border, keepaspect);
RunThreadsOnIndividual(minimap.height, qtrue, MiniMapContrastBoost);
}
+ if(autolevel)
+ {
+ Sys_Printf( "\n--- MiniMapAutoLevel (%d) ---\n", minimap.height );
+ float mi = 1, ma = 0;
+ float s, o;
+
+ // TODO threads!
+ q = minimap.data1f;
+ for(y = 0; y < minimap.height; ++y)
+ for(x = 0; x < minimap.width; ++x)
+ {
+ float v = *q++;
+ if(v < mi)
+ mi = v;
+ if(v > ma)
+ ma = v;
+ }
+ if(ma > mi)
+ {
+ s = 1 / (ma - mi);
+ o = mi / (ma - mi);
+
+ // equations:
+ // brightness + contrast * v
+ // after autolevel:
+ // brightness + contrast * (v * s - o)
+ // =
+ // (brightness - contrast * o) + (contrast * s) * v
+ minimap.brightness = minimap.brightness - minimap.contrast * o;
+ minimap.contrast *= s;
+
+ Sys_Printf( "Auto level: Brightness changed to %f\n", minimap.brightness );
+ Sys_Printf( "Auto level: Contrast changed to %f\n", minimap.contrast );
+ }
+ else
+ Sys_Printf( "Auto level: failed because all pixels are the same value\n" );
+ }
+
+ if(minimap.brightness != 0 || minimap.contrast != 1)
+ {
+ Sys_Printf( "\n--- MiniMapBrightnessContrast (%d) ---\n", minimap.height );
+ RunThreadsOnIndividual(minimap.height, qtrue, MiniMapBrightnessContrast);
+ }
+
if(minimap.sharpendata1f)
{
Sys_Printf( "\n--- MiniMapSharpen (%d) ---\n", minimap.height );
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';
+ memcpy( lumpString, (char*) lump, ((size_t)length < sizeof(lumpString) ? (size_t)length : sizeof(lumpString)-1) );
+ lumpString[ sizeof(lumpString)-1 ] = '\0';
/* print basic lump info */
Sys_Printf( "Lump: %d\n", i );
}
+/*
+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()
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 -scale <value> [-v] <mapname>\n" );
+ Sys_Printf( "Usage: q3map -convert -format <ase|obj|map_bp|map> [-shadesasbitmap|-lightmapsastexcoord|-deluxemapsastexcoord] [-readbsp|-readmap [-meta|-patchmeta]] <mapname>\n" );
return 0;
}
{
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 ], "-shadersasbitmap" ) )
shadersAsBitmap = qtrue;
+ else if( !strcmp( argv[ i ], "-lightmapsastexcoord" ) )
+ lightmapsAsTexcoord = qtrue;
+ else if( !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;
+ }
}
-
- /* 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();
+ /* 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 )