@@ -2405,26 +2405,28 @@ static void R_CreateFogImage()
24052405{
24062406 // Fog image is always created because disabling fog is cheat.
24072407
2408- int x, y;
2409- byte *data, *ptr;
2410- float d;
2411- float borderColor[ 4 ];
2412-
2413- constexpr int FOG_S = 256 ;
2414- constexpr int FOG_T = 32 ;
2408+ constexpr size_t FOG_S = 256 ;
2409+ constexpr size_t FOG_T = 32 ;
2410+ constexpr channels = 4 ;
24152411
2416- ptr = data = (byte*) ri.Hunk_AllocateTempMemory ( FOG_S * FOG_T * 4 );
2412+ byte *dataNaive, *ptrNaive;
2413+ byte *dataLinear, *ptrLinear;
2414+ ptrNaive = dataNaive = (byte*) ri.Hunk_AllocateTempMemory ( FOG_S * FOG_T * channels );
2415+ ptrLinear = dataLinear = (byte*) ri.Hunk_AllocateTempMemory ( FOG_S * FOG_T * channels );
24172416
24182417 // S is distance, T is depth
2419- for ( y = 0 ; y < FOG_T; y++ )
2418+ for ( int y = 0 ; y < FOG_T; y++ )
24202419 {
2421- for ( x = 0 ; x < FOG_S; x++ )
2420+ for ( int x = 0 ; x < FOG_S; x++ )
24222421 {
2423- d = R_FogFactor ( ( x + 0 .5f ) / FOG_S, ( y + 0 .5f ) / FOG_T );
2422+ float d = R_FogFactor ( ( x + 0 .5f ) / FOG_S, ( y + 0 .5f ) / FOG_T );
24242423
2425- ptr[ 0 ] = ptr[ 1 ] = ptr[ 2 ] = 255 ;
2426- ptr[ 3 ] = 255 * d;
2427- ptr += 4 ;
2424+ ptrNaive[ 0 ] = ptrNaive[ 1 ] = ptrNaive[ 2 ] = 255 ;
2425+ ptrLinear[ 0 ] = ptrLinear[ 1 ] = ptrLinear[ 2 ] = 255 ;
2426+ ptrNaive[ 3 ] = 255 * d;
2427+ ptrLinear[ 3 ] = 255 * convertFromSRGB ( d );
2428+ ptrNaive += channels;
2429+ ptrLinear += channels;
24282430 }
24292431 }
24302432
@@ -2436,13 +2438,18 @@ static void R_CreateFogImage()
24362438 imageParams.filterType = filterType_t::FT_DEFAULT;
24372439 imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP;
24382440
2439- tr.fogImage = R_CreateImage ( " _fog" , ( const byte ** ) &data, FOG_S, FOG_T, 1 , imageParams );
2440- ri.Hunk_FreeTempMemory ( data );
2441+ tr.fogImageNaive = R_CreateImage ( " _fogNaive" , ( const byte ** ) &dataNaive, FOG_S, FOG_T, 1 , imageParams );
2442+ tr.fogImageLinear = R_CreateImage ( " _fogLinear" , ( const byte ** ) &dataLinear, FOG_S, FOG_T, 1 , imageParams );
2443+
2444+ ri.Hunk_FreeTempMemory ( dataNaive );
2445+ ri.Hunk_FreeTempMemory ( dataLinear );
2446+
2447+ /* Just to be safe and not leave a null pointer in the wild.
2448+ This is modified when a map is loaded. */
2449+ tr.fogImage = tr.fogImageNaive ;
24412450
2442- borderColor[ 0 ] = 1.0 ;
2443- borderColor[ 1 ] = 1.0 ;
2444- borderColor[ 2 ] = 1.0 ;
2445- borderColor[ 3 ] = 1 ;
2451+ vec4_t borderColor;
2452+ Vector4Set ( borderColor, 1 .0f , 1 .0f , 1 .0f , 1 .0f );
24462453
24472454 glTexParameterfv ( GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor );
24482455}
0 commit comments