2
0
mirror of https://github.com/FWGS/xash3d-fwgs synced 2024-11-22 09:56:22 +01:00

ref: gl: implement reading engine's world flag and extra info for lightmapped water

* Rename gl_litwater to gl_litwater_force because it doesn't affect maps that declare
  litwater support
This commit is contained in:
Alibek Omarov 2024-08-26 17:11:22 +03:00
parent b64329d1ee
commit 7364765d62
5 changed files with 53 additions and 10 deletions

View File

@ -1897,7 +1897,10 @@ static void Mod_LoadEntities( model_t *mod, dbspmodel_t *bmod )
else if( !Q_stricmp( keyname, "generator" ) || !Q_stricmp( keyname, "_generator" ))
Q_strncpy( world.generator, token, sizeof( world.generator ));
else if( !Q_stricmp( keyname, "_litwater" ))
{
if( Q_atoi( token ) != 0 )
SetBits( world.flags, FWORLD_HAS_LITWATER );
}
else if( !Q_stricmp( keyname, "_litwater_minlight" ))
world.litwater_minlight = Q_atoi( token );
else if( !Q_stricmp( keyname, "_litwater_scale" ))

View File

@ -748,7 +748,7 @@ extern convar_t gl_test; // cvar to testify new effects
extern convar_t gl_msaa;
extern convar_t gl_stencilbits;
extern convar_t gl_overbright;
extern convar_t gl_litwater;
extern convar_t gl_litwater_force;
extern convar_t gl_litwater_minlight;
extern convar_t gl_litwater_scale;

View File

@ -20,7 +20,7 @@ CVAR_DEFINE_AUTO( gl_test, "0", 0, "engine developer cvar for quick testing new
CVAR_DEFINE_AUTO( gl_msaa, "1", FCVAR_GLCONFIG, "enable or disable multisample anti-aliasing" );
CVAR_DEFINE_AUTO( gl_stencilbits, "8", FCVAR_GLCONFIG|FCVAR_READ_ONLY, "pixelformat stencil bits (0 - auto)" );
CVAR_DEFINE_AUTO( gl_overbright, "1", FCVAR_GLCONFIG, "overbrights" );
CVAR_DEFINE_AUTO( gl_litwater, "0", FCVAR_GLCONFIG, "enable lightmapped water" );
CVAR_DEFINE_AUTO( gl_litwater_force, "0", FCVAR_GLCONFIG, "force enable lightmapped water, even if support not declared in the map" );
CVAR_DEFINE_AUTO( gl_litwater_minlight, "192", FCVAR_GLCONFIG, "minimal light water receives, helps avoid too dark lightmapped water" );
CVAR_DEFINE_AUTO( gl_litwater_scale, "1.5", FCVAR_GLCONFIG, "lightmapped water scale factor" );
CVAR_DEFINE_AUTO( r_lighting_extended, "1", FCVAR_GLCONFIG, "allow to get lighting from world and bmodels" );
@ -1210,7 +1210,7 @@ static void GL_InitCommands( void )
gEngfuncs.Cvar_RegisterVariable( &gl_stencilbits );
gEngfuncs.Cvar_RegisterVariable( &gl_round_down );
gEngfuncs.Cvar_RegisterVariable( &gl_overbright );
gEngfuncs.Cvar_RegisterVariable( &gl_litwater );
gEngfuncs.Cvar_RegisterVariable( &gl_litwater_force );
gEngfuncs.Cvar_RegisterVariable( &gl_litwater_minlight );
gEngfuncs.Cvar_RegisterVariable( &gl_litwater_scale );

View File

@ -1027,7 +1027,8 @@ static void R_CheckGamma( void )
ClearBits( r_vbo_overbrightmode.flags, FCVAR_CHANGED );
}
if( FBitSet( gl_litwater_scale.flags|gl_litwater_minlight.flags, FCVAR_CHANGED ))
// we only recalculate lightmap on the fly if map hasn't declared support for lightmapped water
if( !FBitSet( tr.world->flags, FWORLD_HAS_LITWATER ) && FBitSet( gl_litwater_scale.flags|gl_litwater_minlight.flags, FCVAR_CHANGED ))
{
rebuild = true;
ClearBits( gl_litwater_scale.flags, FCVAR_CHANGED );

View File

@ -52,6 +52,42 @@ static qboolean R_AddSurfToVBO( msurface_t *surf, qboolean buildlightmaps );
static void R_DrawVBO( qboolean drawlightmaps, qboolean drawtextures );
static void R_RenderLightmap( msurface_t *fa );
static qboolean Mod_HaveLightmappedWater( void )
{
// if this flag set, it's level designer's job to ensure water has been properly lit
if( FBitSet( tr.world->flags, FWORLD_HAS_LITWATER ))
return true;
// otherwise, check user preference, as some maps have lightmapped water
return gl_litwater_force.value ? true : false;
}
static int Mod_LightmappedWaterMinlight( void )
{
if( FBitSet( tr.world->flags, FWORLD_HAS_LITWATER ))
{
if( tr.world->litwater_minlight >= 0 )
return tr.world->litwater_minlight;
return 0;
}
return Q_max( (int)gl_litwater_minlight.value, 0 );
}
static float Mod_LightmappedWaterScale( void )
{
if( FBitSet( tr.world->flags, FWORLD_HAS_LITWATER ))
{
if( tr.world->litwater_scale >= 0.0f )
return tr.world->litwater_scale;
return 1.0f;
}
return gl_litwater_scale.value;
}
byte *Mod_GetCurrentVis( void )
{
if( gEngfuncs.drawFuncs->Mod_GetCurrentVis && tr.fCustomRendering )
@ -739,6 +775,8 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
mextrasurf_t *info = surf->info;
color24 *lm;
int lightscale;
const int litwater_minlight = Mod_LightmappedWaterMinlight();
const float litwater_scale = Mod_LightmappedWaterScale();
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
smax = ( info->lightextents[0] / sample_size ) + 1;
@ -786,8 +824,9 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
// when the it wasn't properly lit by the level designer
if( FBitSet( surf->flags, SURF_DRAWTURB ))
{
t *= gl_litwater_scale.value;
t = Q_max( gl_litwater_minlight.value, t );
float ft = t * litwater_scale;
t = Q_max( litwater_minlight, Q_rint( ft ));
}
if( t > 1023 )
@ -1334,7 +1373,7 @@ static void R_RenderBrushPoly( msurface_t *fa, int cull_type )
EmitWaterPolys( fa, (cull_type == CULL_BACKSIDE), ripplescale );
// add lightmaps if requested
if( gl_litwater.value )
if( Mod_HaveLightmappedWater( ))
R_RenderLightmap( fa );
return;
@ -1629,7 +1668,7 @@ void R_DrawWaterSurfaces( void )
{
EmitWaterPolys( s, false, ripplescale );
if( gl_litwater.value )
if( Mod_HaveLightmappedWater( ))
R_RenderLightmap( s );
}
@ -1835,7 +1874,7 @@ void R_DrawBrushModel( cl_entity_t *e )
{
if( FBitSet( psurf->flags, SURF_DRAWTURB ))
{
if( gl_litwater.value )
if( Mod_HaveLightmappedWater( ))
continue; // we don't want back faces when drawing lightmaps to avoid Z fighting
}
else