Skip to content

Commit c393524

Browse files
committed
Implement partial overbright clamping like q3
1 parent 9478934 commit c393524

File tree

4 files changed

+27
-45
lines changed

4 files changed

+27
-45
lines changed

src/engine/renderer/tr_bsp.cpp

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ static void R_ColorShiftLightingBytes( byte bytes[ 4 ] )
7474
backward compatible with this bug for diagnostic purpose and fair comparison with
7575
other buggy engines. */
7676

77-
if ( tr.mapOverBrightBits == 0 )
78-
{
79-
return;
80-
}
77+
ASSERT_LT( tr.overbrightBits, tr.mapOverBrightBits );
8178

8279
/* Shift the color data based on overbright range.
8380
@@ -94,7 +91,7 @@ static void R_ColorShiftLightingBytes( byte bytes[ 4 ] )
9491
what hardware overbright bit feature was not doing, but
9592
this implementation is entirely software. */
9693

97-
int shift = tr.mapOverBrightBits;
94+
int shift = tr.mapOverBrightBits - tr.overbrightBits;
9895

9996
// shift the data based on overbright range
10097
int r = bytes[ 0 ] << shift;
@@ -120,10 +117,7 @@ static void R_ColorShiftLightingBytes( byte bytes[ 4 ] )
120117

121118
static void R_ColorShiftLightingBytesCompressed( byte bytes[ 8 ] )
122119
{
123-
if ( tr.mapOverBrightBits == 0 )
124-
{
125-
return;
126-
}
120+
ASSERT_LT( tr.overbrightBits, tr.mapOverBrightBits );
127121

128122
// color shift the endpoint colors in the dxt block
129123
unsigned short rgb565 = bytes[1] << 8 | bytes[0];
@@ -164,7 +158,7 @@ R_ProcessLightmap
164158
*/
165159
void R_ProcessLightmap( byte *bytes, int width, int height, int bits )
166160
{
167-
if ( tr.mapOverBrightBits == 0 )
161+
if ( tr.overbrightBits >= tr.mapOverBrightBits )
168162
{
169163
return;
170164
}
@@ -668,7 +662,7 @@ static void R_LoadLightmaps( lump_t *l, const char *bspName )
668662
lightMapBuffer[( index * 4 ) + 2 ] = buf_p[( ( x + ( y * internalLightMapSize ) ) * 3 ) + 2 ];
669663
lightMapBuffer[( index * 4 ) + 3 ] = 255;
670664

671-
if ( tr.legacyOverBrightClamping )
665+
if ( tr.overbrightBits < tr.mapOverBrightBits )
672666
{
673667
R_ColorShiftLightingBytes( &lightMapBuffer[( index * 4 ) + 0 ] );
674668
}
@@ -1029,7 +1023,7 @@ static void ParseFace( dsurface_t *ds, drawVert_t *verts, bspSurface_t *surf, in
10291023
cv->verts[ i ].lightColor = Color::Adapt( verts[ i ].color );
10301024

10311025

1032-
if ( tr.legacyOverBrightClamping )
1026+
if ( tr.overbrightBits < tr.mapOverBrightBits )
10331027
{
10341028
R_ColorShiftLightingBytes( cv->verts[ i ].lightColor.ToArray() );
10351029
}
@@ -1239,7 +1233,7 @@ static void ParseMesh( dsurface_t *ds, drawVert_t *verts, bspSurface_t *surf )
12391233

12401234
points[ i ].lightColor = Color::Adapt( verts[ i ].color );
12411235

1242-
if ( tr.legacyOverBrightClamping )
1236+
if ( tr.overbrightBits < tr.mapOverBrightBits )
12431237
{
12441238
R_ColorShiftLightingBytes( points[ i ].lightColor.ToArray() );
12451239
}
@@ -1366,7 +1360,7 @@ static void ParseTriSurf( dsurface_t *ds, drawVert_t *verts, bspSurface_t *surf,
13661360

13671361
cv->verts[ i ].lightColor = Color::Adapt( verts[ i ].color );
13681362

1369-
if ( tr.legacyOverBrightClamping )
1363+
if ( tr.overbrightBits < tr.mapOverBrightBits )
13701364
{
13711365
R_ColorShiftLightingBytes( cv->verts[ i ].lightColor.ToArray() );
13721366
}
@@ -4112,7 +4106,7 @@ void R_LoadLightGrid( lump_t *l )
41124106
VectorSet( tmpAmbient, r_forceAmbient.Get(), r_forceAmbient.Get(), r_forceAmbient.Get() );
41134107
}
41144108

4115-
if ( tr.legacyOverBrightClamping )
4109+
if ( tr.overbrightBits < tr.mapOverBrightBits )
41164110
{
41174111
R_ColorShiftLightingBytes( tmpAmbient );
41184112
R_ColorShiftLightingBytes( tmpDirected );
@@ -4360,24 +4354,6 @@ void R_LoadEntities( lump_t *l, std::string &externalEntities )
43604354
tr.mapOverBrightBits = Math::Clamp( atof( value ), 0.0, 3.0 );
43614355
continue;
43624356
}
4363-
4364-
if ( !Q_stricmp( keyname, "overbrightClamping" ) )
4365-
{
4366-
if ( !Q_stricmp( value, "0" ) )
4367-
{
4368-
tr.legacyOverBrightClamping = false;
4369-
}
4370-
else if ( !Q_stricmp( value, "1" ) )
4371-
{
4372-
tr.legacyOverBrightClamping = true;
4373-
}
4374-
else
4375-
{
4376-
Log::Warn( "invalid value for worldspawn key overbrightClamping" );
4377-
}
4378-
4379-
continue;
4380-
}
43814357
}
43824358

43834359
// check for deluxe mapping provided by NetRadiant's q3map2
@@ -5110,6 +5086,9 @@ void RE_LoadWorldMap( const char *name )
51105086
}
51115087
R_LoadEntities( &header->lumps[ LUMP_ENTITIES ], externalEntities );
51125088

5089+
// Now we can set this after checking a possible worldspawn value for mapOverbrightBits
5090+
tr.overbrightBits = std::min( tr.mapOverBrightBits, r_overbrightBits.Get() );
5091+
51135092
R_LoadShaders( &header->lumps[ LUMP_SHADERS ] );
51145093

51155094
R_LoadLightmaps( &header->lumps[ LUMP_LIGHTMAPS ], name );
@@ -5147,7 +5126,6 @@ void RE_LoadWorldMap( const char *name )
51475126
tr.worldLight = tr.lightMode;
51485127
tr.modelLight = lightMode_t::FULLBRIGHT;
51495128
tr.modelDeluxe = deluxeMode_t::NONE;
5150-
tr.mapLightFactor = 1.0f;
51515129

51525130
// Use fullbright lighting for everything if the world is fullbright.
51535131
if ( tr.worldLight != lightMode_t::FULLBRIGHT )
@@ -5221,9 +5199,9 @@ void RE_LoadWorldMap( const char *name )
52215199

52225200
/* Set GLSL overbright parameters if the legacy clamped overbright isn't used
52235201
and the lighting mode is not fullbright. */
5224-
if ( !tr.legacyOverBrightClamping && tr.lightMode != lightMode_t::FULLBRIGHT )
5202+
if ( tr.lightMode != lightMode_t::FULLBRIGHT )
52255203
{
5226-
tr.mapLightFactor = pow( 2, tr.mapOverBrightBits );
5204+
tr.mapLightFactor = float( 1 << tr.overbrightBits );
52275205
}
52285206

52295207
tr.worldLoaded = true;

src/engine/renderer/tr_image.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1853,7 +1853,7 @@ image_t *R_FindImageFile( const char *imageName, imageParams_t &imageParams )
18531853
return nullptr;
18541854
}
18551855

1856-
if ( imageParams.bits & IF_LIGHTMAP && tr.legacyOverBrightClamping )
1856+
if ( imageParams.bits & IF_LIGHTMAP )
18571857
{
18581858
R_ProcessLightmap( *pic, width, height, imageParams.bits );
18591859
}
@@ -3054,6 +3054,7 @@ void R_InitImages()
30543054
tr.lightmaps.reserve( 128 );
30553055
tr.deluxemaps.reserve( 128 );
30563056

3057+
//TODO rewrite WoT with new info :)
30573058
/* These are the values expected by the rest of the renderer
30583059
(esp. tr_bsp), used for "gamma correction of the map".
30593060
Both were set to 0 if we had neither COMPAT_ET nor COMPAT_Q3,
@@ -3113,8 +3114,9 @@ void R_InitImages()
31133114
Because tr.overbrightBits is always 0, tr.identityLight is
31143115
always 1.0f. We can entirely remove it. */
31153116

3117+
// TODO is there any reason to set these before a map is loaded?
31163118
tr.mapOverBrightBits = r_overbrightDefaultExponent.Get();
3117-
tr.legacyOverBrightClamping = r_overbrightDefaultClamp.Get();
3119+
tr.overbrightBits = std::min(tr.mapOverBrightBits, r_overbrightBits.Get());
31183120

31193121
// create default texture and white texture
31203122
R_CreateBuiltinImages();

src/engine/renderer/tr_init.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9292
cvar_t *r_realtimeLightingCastShadows;
9393
cvar_t *r_precomputedLighting;
9494
Cvar::Cvar<int> r_overbrightDefaultExponent("r_overbrightDefaultExponent", "default map light color shift (multiply by 2^x)", Cvar::NONE, 2);
95-
Cvar::Cvar<bool> r_overbrightDefaultClamp("r_overbrightDefaultClamp", "clamp lightmap colors to 1 (in absence of map worldspawn value)", Cvar::NONE, false);
95+
Cvar::Range<Cvar::Cvar<int>> r_overbrightBits("r_overbrightBits", "clamp lightmap colors to 2^x", Cvar::NONE, 1, 0, 3);
9696
Cvar::Cvar<bool> r_overbrightIgnoreMapSettings("r_overbrightIgnoreMapSettings", "force usage of r_overbrightDefaultClamp / r_overbrightDefaultExponent, ignoring worldspawn", Cvar::NONE, false);
9797
Cvar::Range<Cvar::Cvar<int>> r_lightMode("r_lightMode", "lighting mode: 0: fullbright (cheat), 1: vertex light, 2: grid light (cheat), 3: light map", Cvar::NONE, Util::ordinal(lightMode_t::MAP), Util::ordinal(lightMode_t::FULLBRIGHT), Util::ordinal(lightMode_t::MAP));
9898
Cvar::Cvar<bool> r_colorGrading( "r_colorGrading", "Use color grading", Cvar::NONE, true );
@@ -1185,7 +1185,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p
11851185
r_realtimeLightingCastShadows = Cvar_Get( "r_realtimeLightingCastShadows", "1", 0 );
11861186
r_precomputedLighting = Cvar_Get( "r_precomputedLighting", "1", CVAR_CHEAT | CVAR_LATCH );
11871187
Cvar::Latch( r_overbrightDefaultExponent );
1188-
Cvar::Latch( r_overbrightDefaultClamp );
1188+
Cvar::Latch( r_overbrightBits );
11891189
Cvar::Latch( r_overbrightIgnoreMapSettings );
11901190
Cvar::Latch( r_lightMode );
11911191
Cvar::Latch( r_colorGrading );

src/engine/renderer/tr_local.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2811,12 +2811,14 @@ enum class shaderProfilerRenderSubGroupsMode {
28112811

28122812
viewParms_t viewParms;
28132813

2814-
// r_overbrightDefaultExponent, but can be overridden by mapper using the worldspawn
2814+
// Brightness scaling: roughly speaking, a lightmap value of x will be interpreted as
2815+
// min(x * pow(2, mapOverBrightBits), pow(2, overbrightBits))
2816+
// (but when a component hits the max allowed value, others are scaled down to keep the "same color")
28152817
int mapOverBrightBits;
2816-
// pow(2, mapOverbrightBits)
2818+
// min(r_overbrightBits.Get(), mapOverBrightBits)
2819+
int overbrightBits;
2820+
// pow(2, overbrightBits)
28172821
float mapLightFactor;
2818-
// May have to be true on some legacy maps: clamp and normalize multiplied colors.
2819-
bool legacyOverBrightClamping;
28202822

28212823
orientationr_t orientation; // for current entity
28222824

@@ -2940,7 +2942,7 @@ enum class shaderProfilerRenderSubGroupsMode {
29402942
extern cvar_t *r_realtimeLightingCastShadows;
29412943
extern cvar_t *r_precomputedLighting;
29422944
extern Cvar::Cvar<int> r_overbrightDefaultExponent;
2943-
extern Cvar::Cvar<bool> r_overbrightDefaultClamp;
2945+
extern Cvar::Range<Cvar::Cvar<int>> r_overbrightBits;
29442946
extern Cvar::Cvar<bool> r_overbrightIgnoreMapSettings;
29452947
extern Cvar::Range<Cvar::Cvar<int>> r_lightMode;
29462948
extern Cvar::Cvar<bool> r_colorGrading;

0 commit comments

Comments
 (0)