-autolevel for minimap

This commit is contained in:
Rudolf Polzer 2011-12-09 16:18:17 +01:00 committed by Thomas Debesse
parent 2eb4247587
commit 4d47b8ed5b

View file

@ -103,7 +103,7 @@ typedef struct minimap_s
float *sample_offsets; float *sample_offsets;
float sharpen_boxmult; float sharpen_boxmult;
float sharpen_centermult; float sharpen_centermult;
float boost; float boost, brightness, contrast;
float *data1f; float *data1f;
float *sharpendata1f; float *sharpendata1f;
vec3_t mins, size; vec3_t mins, size;
@ -331,6 +331,17 @@ static void MiniMapContrastBoost(int y)
} }
} }
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) void MiniMapMakeMinsMaxs(vec3_t mins_in, vec3_t maxs_in, float border, qboolean keepaspect)
{ {
vec3_t mins, maxs, extend; vec3_t mins, maxs, extend;
@ -568,6 +579,7 @@ int MiniMapBSPMain( int argc, char **argv )
char basename[1024]; char basename[1024];
char path[1024]; char path[1024];
char relativeMinimapFilename[1024]; char relativeMinimapFilename[1024];
qboolean autolevel;
float minimapSharpen; float minimapSharpen;
float border; float border;
byte *data4b, *p; byte *data4b, *p;
@ -605,9 +617,12 @@ int MiniMapBSPMain( int argc, char **argv )
keepaspect = game->miniMapKeepAspect; keepaspect = game->miniMapKeepAspect;
mode = game->miniMapMode; mode = game->miniMapMode;
autolevel = qfalse;
minimap.samples = 1; minimap.samples = 1;
minimap.sample_offsets = NULL; minimap.sample_offsets = NULL;
minimap.boost = 1.0; minimap.boost = 1.0;
minimap.brightness = 0.0;
minimap.contrast = 1.0;
/* process arguments */ /* process arguments */
for( i = 1; i < (argc - 1); i++ ) for( i = 1; i < (argc - 1); i++ )
@ -691,12 +706,34 @@ int MiniMapBSPMain( int argc, char **argv )
mode = MINIMAP_MODE_WHITE; mode = MINIMAP_MODE_WHITE;
Sys_Printf( "Writing as white alpha image\n" ); 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]); minimap.boost = atof(argv[i + 1]);
i++; i++;
Sys_Printf( "Contrast boost set to %f\n", minimap.boost ); 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); MiniMapMakeMinsMaxs(mins, maxs, border, keepaspect);
@ -750,6 +787,44 @@ int MiniMapBSPMain( int argc, char **argv )
RunThreadsOnIndividual(minimap.height, qtrue, MiniMapContrastBoost); 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!
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;
}
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.boost );
Sys_Printf( "Auto level: Contrast changed to %f\n", minimap.contrast );
}
if(minimap.brightness != 0 || minimap.contrast != 1)
{
Sys_Printf( "\n--- MiniMapBrightnessContrast (%d) ---\n", minimap.height );
RunThreadsOnIndividual(minimap.height, qtrue, MiniMapBrightnessContrast);
}
if(minimap.sharpendata1f) if(minimap.sharpendata1f)
{ {
Sys_Printf( "\n--- MiniMapSharpen (%d) ---\n", minimap.height ); Sys_Printf( "\n--- MiniMapSharpen (%d) ---\n", minimap.height );