08 Mar 2017
This commit is contained in:
parent
14b954bb63
commit
ffeb67d99a
|
@ -3177,14 +3177,15 @@ NOTE: dlights are ignored
|
||||||
*/
|
*/
|
||||||
void TriLightAtPoint( float *pos, float *value )
|
void TriLightAtPoint( float *pos, float *value )
|
||||||
{
|
{
|
||||||
color24 ambient;
|
colorVec vLightColor;
|
||||||
|
|
||||||
if( !pos || !value ) return;
|
if( !pos || !value ) return;
|
||||||
R_LightForPoint( pos, &ambient, false, false, 0.0f );
|
|
||||||
|
|
||||||
value[0] = ambient.r;
|
vLightColor = R_LightPoint( pos );
|
||||||
value[1] = ambient.g;
|
|
||||||
value[2] = ambient.b;
|
value[0] = vLightColor.r;
|
||||||
|
value[1] = vLightColor.g;
|
||||||
|
value[2] = vLightColor.b;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2654,7 +2654,7 @@ void CL_UpdateFlashlight( cl_entity_t *ent )
|
||||||
trace = CL_VisTraceLine( vecSrc, vecEnd, PM_STUDIO_BOX );
|
trace = CL_VisTraceLine( vecSrc, vecEnd, PM_STUDIO_BOX );
|
||||||
|
|
||||||
// update flashlight endpos
|
// update flashlight endpos
|
||||||
dl = CL_AllocDlight( ent->index );
|
dl = CL_AllocElight( ent->index );
|
||||||
#if 0
|
#if 0
|
||||||
// g-cont. disabled until studio lighting will be finished
|
// g-cont. disabled until studio lighting will be finished
|
||||||
if( trace.ent > 0 && clgame.pmove->visents[trace.ent].studiomodel )
|
if( trace.ent > 0 && clgame.pmove->visents[trace.ent].studiomodel )
|
||||||
|
@ -2796,11 +2796,14 @@ void CL_TestLights( void )
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
float f, r;
|
float f, r;
|
||||||
|
int numLights;
|
||||||
dlight_t *dl;
|
dlight_t *dl;
|
||||||
|
|
||||||
if( !cl_testlights->value ) return;
|
if( !cl_testlights->value ) return;
|
||||||
|
|
||||||
|
numLights = bound( 1, cl_testlights->value, MAX_DLIGHTS );
|
||||||
|
|
||||||
for( i = 0; i < bound( 1, cl_testlights->value, MAX_DLIGHTS ); i++ )
|
for( i = 0; i < numLights; i++ )
|
||||||
{
|
{
|
||||||
dl = &cl_dlights[i];
|
dl = &cl_dlights[i];
|
||||||
|
|
||||||
|
@ -2813,8 +2816,8 @@ void CL_TestLights( void )
|
||||||
dl->color.r = ((((i % 6) + 1) & 1)>>0) * 255;
|
dl->color.r = ((((i % 6) + 1) & 1)>>0) * 255;
|
||||||
dl->color.g = ((((i % 6) + 1) & 2)>>1) * 255;
|
dl->color.g = ((((i % 6) + 1) & 2)>>1) * 255;
|
||||||
dl->color.b = ((((i % 6) + 1) & 4)>>2) * 255;
|
dl->color.b = ((((i % 6) + 1) & 4)>>2) * 255;
|
||||||
|
dl->radius = Q_max( 64, 200 - 5 * numLights );
|
||||||
dl->die = cl.time + host.frametime;
|
dl->die = cl.time + host.frametime;
|
||||||
dl->radius = 200;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -559,7 +559,7 @@ qboolean VID_ScreenShot( const char *filename, int shot_type )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Image_Process( &r_shot, width, height, 0.0f, flags, NULL );
|
Image_Process( &r_shot, width, height, flags, NULL );
|
||||||
|
|
||||||
// write image
|
// write image
|
||||||
result = FS_SaveImage( filename, r_shot );
|
result = FS_SaveImage( filename, r_shot );
|
||||||
|
@ -628,7 +628,7 @@ qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qbo
|
||||||
r_side->size = r_side->width * r_side->height * 3;
|
r_side->size = r_side->width * r_side->height * 3;
|
||||||
r_side->buffer = temp;
|
r_side->buffer = temp;
|
||||||
|
|
||||||
if( flags ) Image_Process( &r_side, 0, 0, 0.0f, flags, NULL );
|
if( flags ) Image_Process( &r_side, 0, 0, flags, NULL );
|
||||||
memcpy( buffer + (size * size * 3 * i), r_side->buffer, size * size * 3 );
|
memcpy( buffer + (size * size * 3 * i), r_side->buffer, size * size * 3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1213,7 +1213,7 @@ static void GL_ProcessImage( gltexture_t *tex, rgbdata_t *pic, imgfilter_t *filt
|
||||||
img_flags |= IMAGE_FORCE_RGBA;
|
img_flags |= IMAGE_FORCE_RGBA;
|
||||||
|
|
||||||
// processing image before uploading (force to rgba, make luma etc)
|
// processing image before uploading (force to rgba, make luma etc)
|
||||||
if( pic->buffer ) Image_Process( &pic, 0, 0, 0.0f, img_flags, filter );
|
if( pic->buffer ) Image_Process( &pic, 0, 0, img_flags, filter );
|
||||||
|
|
||||||
if( tex->flags & TF_LUMINANCE )
|
if( tex->flags & TF_LUMINANCE )
|
||||||
{
|
{
|
||||||
|
@ -1407,7 +1407,7 @@ int GL_LoadTextureArray( const char **names, int flags, imgfilter_t *filter )
|
||||||
|
|
||||||
// but allow to rescale raw images
|
// but allow to rescale raw images
|
||||||
if( ImageRAW( pic->type ) && ImageRAW( src->type ) && ( pic->width != src->width || pic->height != src->height ))
|
if( ImageRAW( pic->type ) && ImageRAW( src->type ) && ( pic->width != src->width || pic->height != src->height ))
|
||||||
Image_Process( &src, pic->width, pic->height, 0.0f, IMAGE_RESAMPLE, NULL );
|
Image_Process( &src, pic->width, pic->height, IMAGE_RESAMPLE, NULL );
|
||||||
|
|
||||||
if( pic->size != src->size )
|
if( pic->size != src->size )
|
||||||
{
|
{
|
||||||
|
@ -1710,7 +1710,7 @@ void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor )
|
||||||
|
|
||||||
// all the operations makes over the image copy not an original
|
// all the operations makes over the image copy not an original
|
||||||
pic = FS_CopyImage( image->original );
|
pic = FS_CopyImage( image->original );
|
||||||
Image_Process( &pic, topColor, bottomColor, gamma, flags, NULL );
|
Image_Process( &pic, topColor, bottomColor, flags, NULL );
|
||||||
|
|
||||||
GL_UploadTexture( image, pic );
|
GL_UploadTexture( image, pic );
|
||||||
GL_ApplyTextureParams( image ); // update texture filter, wrap etc
|
GL_ApplyTextureParams( image ); // update texture filter, wrap etc
|
||||||
|
|
|
@ -344,6 +344,7 @@ void R_MarkLights( dlight_t *light, int bit, mnode_t *node );
|
||||||
void R_LightForPoint( const vec3_t point, color24 *ambientLight, qboolean invLight, qboolean useAmbient, float radius );
|
void R_LightForPoint( const vec3_t point, color24 *ambientLight, qboolean invLight, qboolean useAmbient, float radius );
|
||||||
colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lightspot );
|
colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lightspot );
|
||||||
int R_CountSurfaceDlights( msurface_t *surf );
|
int R_CountSurfaceDlights( msurface_t *surf );
|
||||||
|
colorVec R_LightPoint( const vec3_t p0 );
|
||||||
int R_CountDlights( void );
|
int R_CountDlights( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -678,6 +679,7 @@ extern convar_t *r_fastsky;
|
||||||
|
|
||||||
extern convar_t *vid_displayfrequency;
|
extern convar_t *vid_displayfrequency;
|
||||||
extern convar_t *vid_fullscreen;
|
extern convar_t *vid_fullscreen;
|
||||||
|
extern convar_t *vid_brightness;
|
||||||
extern convar_t *vid_gamma;
|
extern convar_t *vid_gamma;
|
||||||
extern convar_t *vid_mode;
|
extern convar_t *vid_mode;
|
||||||
|
|
||||||
|
|
|
@ -308,9 +308,9 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||||
{
|
{
|
||||||
uint scale = tr.lightstylevalue[surf->styles[map]];
|
uint scale = tr.lightstylevalue[surf->styles[map]];
|
||||||
|
|
||||||
cv->r += TextureToTexGamma( lm->r ) * scale;
|
cv->r += LightToTexGamma( lm->r ) * scale;
|
||||||
cv->g += TextureToTexGamma( lm->g ) * scale;
|
cv->g += LightToTexGamma( lm->g ) * scale;
|
||||||
cv->b += TextureToTexGamma( lm->b ) * scale;
|
cv->b += LightToTexGamma( lm->b ) * scale;
|
||||||
|
|
||||||
lm += size; // skip to next lightmap
|
lm += size; // skip to next lightmap
|
||||||
}
|
}
|
||||||
|
@ -350,9 +350,9 @@ void R_LightForPoint( const vec3_t point, color24 *ambientLight, qboolean invLig
|
||||||
// set to full bright if no light data
|
// set to full bright if no light data
|
||||||
if( !cl.worldmodel || !cl.worldmodel->lightdata )
|
if( !cl.worldmodel || !cl.worldmodel->lightdata )
|
||||||
{
|
{
|
||||||
ambientLight->r = TextureToTexGamma( clgame.movevars.skycolor_r );
|
ambientLight->r = LightToTexGamma( clgame.movevars.skycolor_r );
|
||||||
ambientLight->g = TextureToTexGamma( clgame.movevars.skycolor_g );
|
ambientLight->g = LightToTexGamma( clgame.movevars.skycolor_g );
|
||||||
ambientLight->b = TextureToTexGamma( clgame.movevars.skycolor_b );
|
ambientLight->b = LightToTexGamma( clgame.movevars.skycolor_b );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,9 +460,9 @@ get_light:
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
add = 1.0f - (dist / ( dl->radius + radius ));
|
add = 1.0f - (dist / ( dl->radius + radius ));
|
||||||
light.r += TextureToTexGamma( dl->color.r ) * add;
|
light.r += LightToTexGamma( dl->color.r ) * add;
|
||||||
light.g += TextureToTexGamma( dl->color.g ) * add;
|
light.g += LightToTexGamma( dl->color.g ) * add;
|
||||||
light.b += TextureToTexGamma( dl->color.b ) * add;
|
light.b += LightToTexGamma( dl->color.b ) * add;
|
||||||
total++;
|
total++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,4 +557,20 @@ colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot )
|
||||||
}
|
}
|
||||||
|
|
||||||
return light;
|
return light;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
R_LightPoint
|
||||||
|
|
||||||
|
light from floor
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
colorVec R_LightPoint( const vec3_t p0 )
|
||||||
|
{
|
||||||
|
vec3_t p1;
|
||||||
|
|
||||||
|
VectorSet( p1, p0[0], p0[1], p0[2] - 2048.0f );
|
||||||
|
|
||||||
|
return R_LightVec( p0, p1, NULL );
|
||||||
}
|
}
|
|
@ -1068,7 +1068,7 @@ void R_BeginFrame( qboolean clearScene )
|
||||||
}
|
}
|
||||||
|
|
||||||
// update gamma
|
// update gamma
|
||||||
if( FBitSet( vid_gamma->flags, FCVAR_CHANGED ))
|
if( FBitSet( vid_gamma->flags, FCVAR_CHANGED ) || FBitSet( vid_brightness->flags, FCVAR_CHANGED ))
|
||||||
{
|
{
|
||||||
if( glConfig.deviceSupportsGamma )
|
if( glConfig.deviceSupportsGamma )
|
||||||
{
|
{
|
||||||
|
@ -1078,8 +1078,8 @@ void R_BeginFrame( qboolean clearScene )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
BuildGammaTable( vid_gamma->value, vid_brightness->value );
|
||||||
glConfig.softwareGammaUpdate = true;
|
glConfig.softwareGammaUpdate = true;
|
||||||
BuildGammaTable( vid_gamma->value, GAMMA );
|
|
||||||
GL_RebuildLightmaps();
|
GL_RebuildLightmaps();
|
||||||
glConfig.softwareGammaUpdate = false;
|
glConfig.softwareGammaUpdate = false;
|
||||||
}
|
}
|
||||||
|
@ -1502,7 +1502,7 @@ static render_api_t gRenderAPI =
|
||||||
CL_GetLightStyle,
|
CL_GetLightStyle,
|
||||||
CL_GetDynamicLight,
|
CL_GetDynamicLight,
|
||||||
CL_GetEntityLight,
|
CL_GetEntityLight,
|
||||||
TextureToTexGamma,
|
LightToTexGamma,
|
||||||
CL_GetBeamChains,
|
CL_GetBeamChains,
|
||||||
R_SetCurrentEntity,
|
R_SetCurrentEntity,
|
||||||
R_SetCurrentModel,
|
R_SetCurrentModel,
|
||||||
|
|
|
@ -495,7 +495,7 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
||||||
{
|
{
|
||||||
if(!( surf->dlightbits & BIT( lnum )))
|
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
||||||
continue; // not lit by this light
|
continue; // not lit by this light
|
||||||
|
|
||||||
dl = &cl_dlights[lnum];
|
dl = &cl_dlights[lnum];
|
||||||
|
@ -542,9 +542,9 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||||
|
|
||||||
if( dist < minlight )
|
if( dist < minlight )
|
||||||
{
|
{
|
||||||
bl[0] += ( rad - dist ) * TextureToTexGamma( dl->color.r );
|
bl[0] += ((int)((rad - dist) * 256) * dl->color.r) / 256;
|
||||||
bl[1] += ( rad - dist ) * TextureToTexGamma( dl->color.g );
|
bl[1] += ((int)((rad - dist) * 256) * dl->color.g) / 256;
|
||||||
bl[2] += ( rad - dist ) * TextureToTexGamma( dl->color.b );
|
bl[2] += ((int)((rad - dist) * 256) * dl->color.b) / 256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -690,9 +690,9 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
|
||||||
|
|
||||||
for( i = 0, bl = r_blocklights; i < size; i++, bl += 3, lm++ )
|
for( i = 0, bl = r_blocklights; i < size; i++, bl += 3, lm++ )
|
||||||
{
|
{
|
||||||
bl[0] += TextureToTexGamma( lm->r ) * scale;
|
bl[0] += LightToTexGamma( lm->r ) * scale;
|
||||||
bl[1] += TextureToTexGamma( lm->g ) * scale;
|
bl[1] += LightToTexGamma( lm->g ) * scale;
|
||||||
bl[2] += TextureToTexGamma( lm->b ) * scale;
|
bl[2] += LightToTexGamma( lm->b ) * scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2067,6 +2067,8 @@ void GL_RebuildLightmaps( void )
|
||||||
model_t *m;
|
model_t *m;
|
||||||
|
|
||||||
if( !cl.world ) return; // wait for worldmodel
|
if( !cl.world ) return; // wait for worldmodel
|
||||||
|
|
||||||
|
ClearBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||||
ClearBits( vid_gamma->flags, FCVAR_CHANGED );
|
ClearBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||||
|
|
||||||
// release old lightmaps
|
// release old lightmaps
|
||||||
|
|
|
@ -316,7 +316,7 @@ void Mod_LoadMapSprite( model_t *mod, const void *buffer, size_t size, qboolean
|
||||||
if( h < MAPSPRITE_SIZE ) h = MAPSPRITE_SIZE;
|
if( h < MAPSPRITE_SIZE ) h = MAPSPRITE_SIZE;
|
||||||
|
|
||||||
// resample image if needed
|
// resample image if needed
|
||||||
Image_Process( &pix, w, h, 0.0f, IMAGE_FORCE_RGBA|IMAGE_RESAMPLE, NULL );
|
Image_Process( &pix, w, h, IMAGE_FORCE_RGBA|IMAGE_RESAMPLE, NULL );
|
||||||
|
|
||||||
w = h = MAPSPRITE_SIZE;
|
w = h = MAPSPRITE_SIZE;
|
||||||
|
|
||||||
|
|
|
@ -1608,9 +1608,9 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||||
{
|
{
|
||||||
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z );
|
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z );
|
||||||
|
|
||||||
light.r = mv->skycolor_r;
|
light.r = LightToTexGamma( mv->skycolor_r );
|
||||||
light.g = mv->skycolor_g;
|
light.g = LightToTexGamma( mv->skycolor_g );
|
||||||
light.b = mv->skycolor_b;
|
light.b = LightToTexGamma( mv->skycolor_b );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1690,9 +1690,9 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||||
|
|
||||||
VectorAdd( lightDir, dist, lightDir );
|
VectorAdd( lightDir, dist, lightDir );
|
||||||
|
|
||||||
finalLight[0] += dl->color.r * ( add / 256.0f );
|
finalLight[0] += LightToTexGamma( dl->color.r ) * ( add / 256.0f );
|
||||||
finalLight[1] += dl->color.g * ( add / 256.0f );
|
finalLight[1] += LightToTexGamma( dl->color.g ) * ( add / 256.0f );
|
||||||
finalLight[2] += dl->color.b * ( add / 256.0f );
|
finalLight[2] += LightToTexGamma( dl->color.b ) * ( add / 256.0f );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1841,6 +1841,7 @@ R_StudioLighting
|
||||||
void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
||||||
{
|
{
|
||||||
float illum;
|
float illum;
|
||||||
|
int light;
|
||||||
|
|
||||||
if( FBitSet( flags, STUDIO_NF_FULLBRIGHT ))
|
if( FBitSet( flags, STUDIO_NF_FULLBRIGHT ))
|
||||||
{
|
{
|
||||||
|
@ -1885,7 +1886,8 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
||||||
}
|
}
|
||||||
|
|
||||||
illum = Q_min( illum, 255.0f );
|
illum = Q_min( illum, 255.0f );
|
||||||
*lv = illum * (1.0f / 255.0f);
|
light = LightToTexGamma( illum );
|
||||||
|
*lv = light * (1.0f / 255.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -77,6 +77,7 @@ convar_t *r_fastsky;
|
||||||
|
|
||||||
convar_t *vid_displayfrequency;
|
convar_t *vid_displayfrequency;
|
||||||
convar_t *vid_fullscreen;
|
convar_t *vid_fullscreen;
|
||||||
|
convar_t *vid_brightness;
|
||||||
convar_t *vid_gamma;
|
convar_t *vid_gamma;
|
||||||
convar_t *vid_mode;
|
convar_t *vid_mode;
|
||||||
|
|
||||||
|
@ -973,7 +974,7 @@ void VID_StartupGamma( void )
|
||||||
if( gl_ignorehwgamma->value )
|
if( gl_ignorehwgamma->value )
|
||||||
{
|
{
|
||||||
glConfig.deviceSupportsGamma = false; // even if supported!
|
glConfig.deviceSupportsGamma = false; // even if supported!
|
||||||
BuildGammaTable( vid_gamma->value, GAMMA );
|
BuildGammaTable( vid_gamma->value, vid_brightness->value );
|
||||||
MsgDev( D_NOTE, "VID_StartupGamma: software gamma initialized\n" );
|
MsgDev( D_NOTE, "VID_StartupGamma: software gamma initialized\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1041,6 +1042,7 @@ void VID_StartupGamma( void )
|
||||||
Mem_Free( savedGamma );
|
Mem_Free( savedGamma );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||||
SetBits( vid_gamma->flags, FCVAR_CHANGED );
|
SetBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1791,6 +1793,7 @@ void GL_InitCommands( void )
|
||||||
SetBits( gl_vsync->flags, FCVAR_CHANGED );
|
SetBits( gl_vsync->flags, FCVAR_CHANGED );
|
||||||
|
|
||||||
vid_gamma = Cvar_Get( "gamma", "1.0", FCVAR_ARCHIVE, "gamma amount" );
|
vid_gamma = Cvar_Get( "gamma", "1.0", FCVAR_ARCHIVE, "gamma amount" );
|
||||||
|
vid_brightness = Cvar_Get( "brightness", "1.0", FCVAR_ARCHIVE, "brighntess factor" );
|
||||||
vid_mode = Cvar_Get( "vid_mode", VID_AUTOMODE, FCVAR_RENDERINFO, "display resolution mode" );
|
vid_mode = Cvar_Get( "vid_mode", VID_AUTOMODE, FCVAR_RENDERINFO, "display resolution mode" );
|
||||||
vid_fullscreen = Cvar_Get( "fullscreen", "0", FCVAR_RENDERINFO, "set in 1 to enable fullscreen mode" );
|
vid_fullscreen = Cvar_Get( "fullscreen", "0", FCVAR_RENDERINFO, "set in 1 to enable fullscreen mode" );
|
||||||
vid_displayfrequency = Cvar_Get ( "vid_displayfrequency", "0", FCVAR_RENDERINFO, "fullscreen refresh rate" );
|
vid_displayfrequency = Cvar_Get ( "vid_displayfrequency", "0", FCVAR_RENDERINFO, "fullscreen refresh rate" );
|
||||||
|
|
|
@ -551,7 +551,7 @@ qboolean FS_SaveImage( const char *filename, rgbdata_t *pix );
|
||||||
rgbdata_t *FS_CopyImage( rgbdata_t *in );
|
rgbdata_t *FS_CopyImage( rgbdata_t *in );
|
||||||
void FS_FreeImage( rgbdata_t *pack );
|
void FS_FreeImage( rgbdata_t *pack );
|
||||||
extern const bpc_desc_t PFDesc[]; // image get pixelformat
|
extern const bpc_desc_t PFDesc[]; // image get pixelformat
|
||||||
qboolean Image_Process( rgbdata_t **pix, int width, int height, float gamma, uint flags, imgfilter_t *filter );
|
qboolean Image_Process( rgbdata_t **pix, int width, int height, uint flags, imgfilter_t *filter );
|
||||||
void Image_PaletteHueReplace( byte *palSrc, int newHue, int start, int end );
|
void Image_PaletteHueReplace( byte *palSrc, int newHue, int start, int end );
|
||||||
void Image_SetForceFlags( uint flags ); // set image force flags on loading
|
void Image_SetForceFlags( uint flags ); // set image force flags on loading
|
||||||
size_t Image_DXTGetLinearSize( int type, int width, int height, int depth );
|
size_t Image_DXTGetLinearSize( int type, int width, int height, int depth );
|
||||||
|
@ -906,8 +906,8 @@ void S_StopBackgroundTrack( void );
|
||||||
void S_StopAllSounds( void );
|
void S_StopAllSounds( void );
|
||||||
|
|
||||||
// gamma routines
|
// gamma routines
|
||||||
void BuildGammaTable( float gamma, float texGamma );
|
void BuildGammaTable( float gamma, float brightness );
|
||||||
byte TextureToTexGamma( byte b );
|
byte LightToTexGamma( byte b );
|
||||||
byte TextureToGamma( byte b );
|
byte TextureToGamma( byte b );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -469,7 +469,7 @@ void Con_CheckResize( void )
|
||||||
charWidth = con.curFont->charWidths['M'] - 1;
|
charWidth = con.curFont->charWidths['M'] - 1;
|
||||||
|
|
||||||
width = ( glState.width / charWidth ) - 2;
|
width = ( glState.width / charWidth ) - 2;
|
||||||
if( !glw_state.initialized ) width = 78;
|
if( !glw_state.initialized ) width = (640 / 5);
|
||||||
|
|
||||||
if( width == con.linewidth )
|
if( width == con.linewidth )
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -20,42 +20,70 @@ GNU General Public License for more details.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Gamma conversion support
|
// Gamma conversion support
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static byte gammatable[256];
|
|
||||||
static byte texgammatable[256]; // palette is sent through this to convert to screen gamma
|
static byte texgammatable[256]; // palette is sent through this to convert to screen gamma
|
||||||
|
static byte lightgammatable[256];
|
||||||
|
static int lineargammatable[1024];
|
||||||
|
static int screengammatable[1024];
|
||||||
|
|
||||||
void BuildGammaTable( float gamma, float texGamma )
|
void BuildGammaTable( float lightgamma, float brightness )
|
||||||
{
|
{
|
||||||
int i, inf;
|
int i, inf;
|
||||||
float g1, g = gamma;
|
float f, g, g1, g3;
|
||||||
double f;
|
|
||||||
|
|
||||||
g = bound( 1.8f, g, 3.0f );
|
lightgamma = bound( 1.8f, lightgamma, 3.0f );
|
||||||
texGamma = bound( 1.8f, texGamma, 3.0f );
|
brightness = bound( 0.0f, brightness, 3.0f );
|
||||||
|
|
||||||
g = 1.0f / g;
|
if( brightness <= 0.0f )
|
||||||
g1 = texGamma * g;
|
g3 = 0.125f;
|
||||||
|
else if( brightness > 1.0f )
|
||||||
|
g3 = 0.05f;
|
||||||
|
else g3 = 0.125f - (brightness * brightness) * 0.075f;
|
||||||
|
|
||||||
|
g = 1.0f / lightgamma;
|
||||||
|
g1 = GAMMA * g;
|
||||||
|
|
||||||
for( i = 0; i < 256; i++ )
|
for( i = 0; i < 256; i++ )
|
||||||
{
|
{
|
||||||
inf = 255 * pow( i / 255.f, g1 );
|
f = pow( i / 255.f, GAMMA );
|
||||||
|
|
||||||
|
// scale up
|
||||||
|
if( brightness > 1.0f )
|
||||||
|
f = f * brightness;
|
||||||
|
|
||||||
|
// shift up
|
||||||
|
if( f <= g3 ) f = (f / g3) * 0.125f;
|
||||||
|
else f = 0.125f + ((f - g3) / (1.0f - g3)) * 0.875f;
|
||||||
|
|
||||||
|
// convert linear space to desired gamma space
|
||||||
|
inf = (int)( 255.0 * pow( f, g ));
|
||||||
|
|
||||||
|
lightgammatable[i] = bound( 0, inf, 255 );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i = 0; i < 256; i++ )
|
||||||
|
{
|
||||||
|
f = 255.0 * pow(( float )i / 255.0f, g1 );
|
||||||
|
inf = (int)(f + 0.5f);
|
||||||
texgammatable[i] = bound( 0, inf, 255 );
|
texgammatable[i] = bound( 0, inf, 255 );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( i = 0; i < 256; i++ )
|
for( i = 0; i < 1024; i++ )
|
||||||
{
|
{
|
||||||
f = 255.0 * pow(( float )i / 255.0f, 2.2f / texGamma );
|
// convert from screen gamma space to linear space
|
||||||
inf = (int)(f + 0.5f);
|
lineargammatable[i] = 1023 * pow( i / 1023.0, g1 );
|
||||||
gammatable[i] = bound( 0, inf, 255 );
|
|
||||||
|
// convert from linear gamma space to screen space
|
||||||
|
screengammatable[i] = 1023 * pow( i / 1023.0, 1.0 / g1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte TextureToTexGamma( byte b )
|
byte LightToTexGamma( byte b )
|
||||||
{
|
{
|
||||||
if( glConfig.deviceSupportsGamma )
|
if( glConfig.deviceSupportsGamma )
|
||||||
return b; // passthrough
|
return b; // passthrough
|
||||||
|
|
||||||
b = bound( 0, b, 255 );
|
b = bound( 0, b, 255 );
|
||||||
return texgammatable[b];
|
return lightgammatable[b];
|
||||||
}
|
}
|
||||||
|
|
||||||
byte TextureToGamma( byte b )
|
byte TextureToGamma( byte b )
|
||||||
|
@ -64,5 +92,5 @@ byte TextureToGamma( byte b )
|
||||||
return b; // passthrough
|
return b; // passthrough
|
||||||
|
|
||||||
b = bound( 0, b, 255 );
|
b = bound( 0, b, 255 );
|
||||||
return gammatable[b];
|
return texgammatable[b];
|
||||||
}
|
}
|
|
@ -1372,31 +1372,19 @@ rgbdata_t *Image_DecompressInternal( rgbdata_t *pic )
|
||||||
return pic;
|
return pic;
|
||||||
}
|
}
|
||||||
|
|
||||||
rgbdata_t *Image_LightGamma( rgbdata_t *pic, float texGamma )
|
rgbdata_t *Image_LightGamma( rgbdata_t *pic )
|
||||||
{
|
{
|
||||||
byte *in = (byte *)pic->buffer;
|
byte *in = (byte *)pic->buffer;
|
||||||
byte gammatable[256];
|
int i;
|
||||||
int i, inf;
|
|
||||||
double f;
|
|
||||||
|
|
||||||
if( pic->type != PF_RGBA_32 )
|
if( pic->type != PF_RGBA_32 )
|
||||||
return pic;
|
return pic;
|
||||||
|
|
||||||
texGamma = bound( 1.8f, texGamma, 3.0f );
|
|
||||||
|
|
||||||
// build the gamma table
|
|
||||||
for( i = 0; i < 256; i++ )
|
|
||||||
{
|
|
||||||
f = 255.0 * pow(( float )i / 255.0f, 2.2f / texGamma );
|
|
||||||
inf = (int)(f + 0.5f);
|
|
||||||
gammatable[i] = bound( 0, inf, 255 );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = 0; i < pic->width * pic->height; i++, in += 4 )
|
for( i = 0; i < pic->width * pic->height; i++, in += 4 )
|
||||||
{
|
{
|
||||||
in[0] = gammatable[in[0]];
|
in[0] = LightToTexGamma( in[0] );
|
||||||
in[1] = gammatable[in[1]];
|
in[1] = LightToTexGamma( in[1] );
|
||||||
in[2] = gammatable[in[2]];
|
in[2] = LightToTexGamma( in[2] );
|
||||||
}
|
}
|
||||||
|
|
||||||
return pic;
|
return pic;
|
||||||
|
@ -1550,7 +1538,7 @@ qboolean Image_ApplyFilter( rgbdata_t *pic, int filter, float factor, float bias
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean Image_Process( rgbdata_t **pix, int width, int height, float gamma, uint flags, imgfilter_t *filter )
|
qboolean Image_Process( rgbdata_t **pix, int width, int height, uint flags, imgfilter_t *filter )
|
||||||
{
|
{
|
||||||
rgbdata_t *pic = *pix;
|
rgbdata_t *pic = *pix;
|
||||||
qboolean result = true;
|
qboolean result = true;
|
||||||
|
@ -1587,7 +1575,7 @@ qboolean Image_Process( rgbdata_t **pix, int width, int height, float gamma, uin
|
||||||
|
|
||||||
// update format to RGBA if any
|
// update format to RGBA if any
|
||||||
if( flags & IMAGE_FORCE_RGBA ) pic = Image_DecompressInternal( pic );
|
if( flags & IMAGE_FORCE_RGBA ) pic = Image_DecompressInternal( pic );
|
||||||
if( flags & IMAGE_LIGHTGAMMA ) pic = Image_LightGamma( pic, gamma );
|
if( flags & IMAGE_LIGHTGAMMA ) pic = Image_LightGamma( pic );
|
||||||
|
|
||||||
if( filter ) Image_ApplyFilter( pic, filter->filter, filter->factor, filter->bias, filter->flags, filter->blendFunc );
|
if( filter ) Image_ApplyFilter( pic, filter->filter, filter->factor, filter->bias, filter->flags, filter->blendFunc );
|
||||||
|
|
||||||
|
|
|
@ -66,12 +66,12 @@ UI_VidOptions_GetConfig
|
||||||
static void UI_VidOptions_GetConfig( void )
|
static void UI_VidOptions_GetConfig( void )
|
||||||
{
|
{
|
||||||
uiVidOptions.screenSize.curValue = RemapVal( CVAR_GET_FLOAT( "viewsize" ), 30.0f, 120.0f, 0.0f, 1.0f );
|
uiVidOptions.screenSize.curValue = RemapVal( CVAR_GET_FLOAT( "viewsize" ), 30.0f, 120.0f, 0.0f, 1.0f );
|
||||||
uiVidOptions.glareReduction.curValue = (CVAR_GET_FLOAT( "r_flaresize" ) - 100.0f ) / 200.0f;
|
uiVidOptions.glareReduction.curValue = CVAR_GET_FLOAT( "brightness" );
|
||||||
|
|
||||||
if( CVAR_GET_FLOAT( "gl_ignorehwgamma" ))
|
if( CVAR_GET_FLOAT( "gl_ignorehwgamma" ))
|
||||||
{
|
{
|
||||||
uiVidOptions.gammaIntensity.curValue = RemapVal( CVAR_GET_FLOAT( "gamma" ), 1.8f, 3.0f, 0.0f, 1.0f );
|
uiVidOptions.gammaIntensity.curValue = RemapVal( CVAR_GET_FLOAT( "gamma" ), 1.8f, 3.0f, 0.0f, 1.0f );
|
||||||
PIC_SetGamma( uiVidOptions.hTestImage, CVAR_GET_FLOAT( "gamma" ));
|
PIC_SetGamma( uiVidOptions.hTestImage, 1.0f );
|
||||||
}
|
}
|
||||||
else uiVidOptions.gammaIntensity.curValue = RemapVal( CVAR_GET_FLOAT( "gamma" ), 0.5f, 2.3f, 0.0f, 1.0f );
|
else uiVidOptions.gammaIntensity.curValue = RemapVal( CVAR_GET_FLOAT( "gamma" ), 0.5f, 2.3f, 0.0f, 1.0f );
|
||||||
|
|
||||||
|
@ -93,19 +93,22 @@ UI_VidOptions_UpdateConfig
|
||||||
static void UI_VidOptions_UpdateConfig( void )
|
static void UI_VidOptions_UpdateConfig( void )
|
||||||
{
|
{
|
||||||
CVAR_SET_FLOAT( "viewsize", RemapVal( uiVidOptions.screenSize.curValue, 0.0f, 1.0f, 30.0f, 120.0f ));
|
CVAR_SET_FLOAT( "viewsize", RemapVal( uiVidOptions.screenSize.curValue, 0.0f, 1.0f, 30.0f, 120.0f ));
|
||||||
CVAR_SET_FLOAT( "r_flaresize", (uiVidOptions.glareReduction.curValue * 200.0f ) + 100.0f );
|
CVAR_SET_FLOAT( "brightness", uiVidOptions.glareReduction.curValue );
|
||||||
CVAR_SET_FLOAT( "r_fastsky", uiVidOptions.fastSky.enabled );
|
CVAR_SET_FLOAT( "r_fastsky", uiVidOptions.fastSky.enabled );
|
||||||
CVAR_SET_FLOAT( "host_allow_materials", uiVidOptions.hiTextures.enabled );
|
CVAR_SET_FLOAT( "host_allow_materials", uiVidOptions.hiTextures.enabled );
|
||||||
|
|
||||||
if( CVAR_GET_FLOAT( "gl_ignorehwgamma" ))
|
if( CVAR_GET_FLOAT( "gl_ignorehwgamma" ))
|
||||||
PIC_SetGamma( uiVidOptions.hTestImage, RemapVal( uiVidOptions.gammaIntensity.curValue, 0.0f, 1.0f, 1.8f, 3.0f ));
|
{
|
||||||
|
CVAR_SET_FLOAT( "gamma", RemapVal( uiVidOptions.gammaIntensity.curValue, 0.0f, 1.0f, 1.8f, 3.0f ));
|
||||||
|
PIC_SetGamma( uiVidOptions.hTestImage, 1.0f );
|
||||||
|
}
|
||||||
else CVAR_SET_FLOAT( "gamma", RemapVal( uiVidOptions.gammaIntensity.curValue, 0.0f, 1.0f, 0.5f, 2.3f ));
|
else CVAR_SET_FLOAT( "gamma", RemapVal( uiVidOptions.gammaIntensity.curValue, 0.0f, 1.0f, 0.5f, 2.3f ));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UI_VidOptions_SetConfig( void )
|
static void UI_VidOptions_SetConfig( void )
|
||||||
{
|
{
|
||||||
CVAR_SET_FLOAT( "viewsize", RemapVal( uiVidOptions.screenSize.curValue, 0.0f, 1.0f, 30.0f, 120.0f ));
|
CVAR_SET_FLOAT( "viewsize", RemapVal( uiVidOptions.screenSize.curValue, 0.0f, 1.0f, 30.0f, 120.0f ));
|
||||||
CVAR_SET_FLOAT( "r_flaresize", (uiVidOptions.glareReduction.curValue * 200.0f ) + 100.0f );
|
CVAR_SET_FLOAT( "brightness", uiVidOptions.glareReduction.curValue );
|
||||||
CVAR_SET_FLOAT( "r_fastsky", uiVidOptions.fastSky.enabled );
|
CVAR_SET_FLOAT( "r_fastsky", uiVidOptions.fastSky.enabled );
|
||||||
CVAR_SET_FLOAT( "host_allow_materials", uiVidOptions.hiTextures.enabled );
|
CVAR_SET_FLOAT( "host_allow_materials", uiVidOptions.hiTextures.enabled );
|
||||||
|
|
||||||
|
|
Reference in New Issue