- GLWall is mostly clean, except some smaller things in gl_sky.cpp
This commit is contained in:
parent
937a2cf69f
commit
dd524b046e
32 changed files with 673 additions and 853 deletions
|
|
@ -28,7 +28,6 @@
|
|||
#include "gl/system/gl_system.h"
|
||||
#include "gl/system/gl_interface.h"
|
||||
#include "hwrenderer/utility/hw_cvars.h"
|
||||
#include "gl/renderer/gl_colormap.h"
|
||||
#include "gl/renderer/gl_lightdata.h"
|
||||
#include "gl/renderer/gl_renderstate.h"
|
||||
#include "gl/shaders/gl_shader.h"
|
||||
|
|
@ -36,62 +35,6 @@
|
|||
#include "p_local.h"
|
||||
#include "r_sky.h"
|
||||
|
||||
// externally settable lighting properties
|
||||
static float distfogtable[2][256]; // light to fog conversion table for black fog
|
||||
|
||||
CVAR(Int, gl_weaponlight, 8, CVAR_ARCHIVE);
|
||||
CUSTOM_CVAR(Bool, gl_enhanced_nightvision, true, CVAR_ARCHIVE|CVAR_NOINITCALL)
|
||||
{
|
||||
// The fixed colormap state needs to be reset because if this happens when
|
||||
// a shader is set to CM_LITE or CM_TORCH it won't register the change in behavior caused by this CVAR.
|
||||
if (GLRenderer != nullptr && GLRenderer->mShaderManager != nullptr)
|
||||
{
|
||||
GLRenderer->mShaderManager->ResetFixedColormap();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Sets up the fog tables
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
CUSTOM_CVAR (Int, gl_distfog, 70, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
|
||||
{
|
||||
for (int i=0;i<256;i++)
|
||||
{
|
||||
|
||||
if (i<164)
|
||||
{
|
||||
distfogtable[0][i]= (gl_distfog>>1) + (gl_distfog)*(164-i)/164;
|
||||
}
|
||||
else if (i<230)
|
||||
{
|
||||
distfogtable[0][i]= (gl_distfog>>1) - (gl_distfog>>1)*(i-164)/(230-164);
|
||||
}
|
||||
else distfogtable[0][i]=0;
|
||||
|
||||
if (i<128)
|
||||
{
|
||||
distfogtable[1][i]= 6.f + (gl_distfog>>1) + (gl_distfog)*(128-i)/48;
|
||||
}
|
||||
else if (i<216)
|
||||
{
|
||||
distfogtable[1][i]= (216.f-i) / ((216.f-128.f)) * gl_distfog / 10;
|
||||
}
|
||||
else distfogtable[1][i]=0;
|
||||
}
|
||||
}
|
||||
|
||||
CUSTOM_CVAR(Int,gl_fogmode,1,CVAR_ARCHIVE|CVAR_NOINITCALL)
|
||||
{
|
||||
if (self>2) self=2;
|
||||
if (self<0) self=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -146,79 +89,6 @@ void gl_GetRenderStyle(FRenderStyle style, bool drawopaque, bool allowcolorblend
|
|||
}
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Get current light level
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
int gl_CalcLightLevel(int lightlevel, int rellight, bool weapon)
|
||||
{
|
||||
int light;
|
||||
|
||||
if (lightlevel == 0) return 0;
|
||||
|
||||
if ((level.lightmode & 2) && lightlevel < 192 && !weapon)
|
||||
{
|
||||
if (lightlevel > 100)
|
||||
{
|
||||
light = xs_CRoundToInt(192.f - (192 - lightlevel)* 1.87f);
|
||||
if (light + rellight < 20)
|
||||
{
|
||||
light = 20 + (light + rellight - 20) / 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
light += rellight;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
light = (lightlevel + rellight) / 5;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
light=lightlevel+rellight;
|
||||
}
|
||||
|
||||
return clamp(light, 0, 255);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Get current light color
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
static PalEntry gl_CalcLightColor(int light, PalEntry pe, int blendfactor)
|
||||
{
|
||||
int r,g,b;
|
||||
|
||||
if (level.lightmode == 8)
|
||||
{
|
||||
return pe;
|
||||
}
|
||||
else if (blendfactor == 0)
|
||||
{
|
||||
r = pe.r * light / 255;
|
||||
g = pe.g * light / 255;
|
||||
b = pe.b * light / 255;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is what Legacy does with colored light in 3D volumes. No, it doesn't really make sense...
|
||||
// It also doesn't translate well to software style lighting.
|
||||
int mixlight = light * (255 - blendfactor);
|
||||
|
||||
r = (mixlight + pe.r * blendfactor) / 255;
|
||||
g = (mixlight + pe.g * blendfactor) / 255;
|
||||
b = (mixlight + pe.b * blendfactor) / 255;
|
||||
}
|
||||
return PalEntry(255, uint8_t(r), uint8_t(g), uint8_t(b));
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// set current light color
|
||||
|
|
@ -233,144 +103,13 @@ void gl_SetColor(int sectorlightlevel, int rellight, bool fullbright, const FCol
|
|||
}
|
||||
else
|
||||
{
|
||||
int hwlightlevel = gl_CalcLightLevel(sectorlightlevel, rellight, weapon);
|
||||
PalEntry pe = gl_CalcLightColor(hwlightlevel, cm.LightColor, cm.BlendFactor);
|
||||
int hwlightlevel = hw_CalcLightLevel(sectorlightlevel, rellight, weapon);
|
||||
PalEntry pe = hw_CalcLightColor(hwlightlevel, cm.LightColor, cm.BlendFactor);
|
||||
gl_RenderState.SetColorAlpha(pe, alpha, cm.Desaturation);
|
||||
gl_RenderState.SetSoftLightLevel(gl_ClampLight(sectorlightlevel + rellight));
|
||||
gl_RenderState.SetSoftLightLevel(hw_ClampLight(sectorlightlevel + rellight));
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// calculates the current fog density
|
||||
//
|
||||
// Rules for fog:
|
||||
//
|
||||
// 1. If bit 4 of gl_lightmode is set always use the level's fog density.
|
||||
// This is what Legacy's GL render does.
|
||||
// 2. black fog means no fog and always uses the distfogtable based on the level's fog density setting
|
||||
// 3. If outside fog is defined and the current fog color is the same as the outside fog
|
||||
// the engine always uses the outside fog density to make the fog uniform across the level.
|
||||
// If the outside fog's density is undefined it uses the level's fog density and if that is
|
||||
// not defined it uses a default of 70.
|
||||
// 4. If a global fog density is specified it is being used for all fog on the level
|
||||
// 5. If none of the above apply fog density is based on the light level as for the software renderer.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity)
|
||||
{
|
||||
float density;
|
||||
|
||||
if (level.lightmode & 4)
|
||||
{
|
||||
// uses approximations of Legacy's default settings.
|
||||
density = level.fogdensity ? level.fogdensity : 18;
|
||||
}
|
||||
else if (sectorfogdensity != 0)
|
||||
{
|
||||
// case 1: Sector has an explicit fog density set.
|
||||
density = sectorfogdensity;
|
||||
}
|
||||
else if ((fogcolor.d & 0xffffff) == 0)
|
||||
{
|
||||
// case 2: black fog
|
||||
if (level.lightmode != 8 && !(level.flags3 & LEVEL3_NOLIGHTFADE))
|
||||
{
|
||||
density = distfogtable[level.lightmode != 0][gl_ClampLight(lightlevel)];
|
||||
}
|
||||
else
|
||||
{
|
||||
density = 0;
|
||||
}
|
||||
}
|
||||
else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
|
||||
{
|
||||
// case 3. outsidefogdensity has already been set as needed
|
||||
density = level.outsidefogdensity;
|
||||
}
|
||||
else if (level.fogdensity != 0)
|
||||
{
|
||||
// case 4: level has fog density set
|
||||
density = level.fogdensity;
|
||||
}
|
||||
else if (lightlevel < 248)
|
||||
{
|
||||
// case 5: use light level
|
||||
density = clamp<int>(255 - lightlevel, 30, 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
density = 0.f;
|
||||
}
|
||||
return density;
|
||||
}
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Check if the current linedef is a candidate for a fog boundary
|
||||
//
|
||||
// Requirements for a fog boundary:
|
||||
// - front sector has no fog
|
||||
// - back sector has fog
|
||||
// - at least one of both does not have a sky ceiling.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
bool gl_CheckFog(sector_t *frontsector, sector_t *backsector)
|
||||
{
|
||||
if (frontsector == backsector) return false; // there can't be a boundary if both sides are in the same sector.
|
||||
|
||||
// Check for fog boundaries. This needs a few more checks for the sectors
|
||||
|
||||
PalEntry fogcolor = frontsector->Colormap.FadeColor;
|
||||
|
||||
if ((fogcolor.d & 0xffffff) == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (fogcolor.a != 0)
|
||||
{
|
||||
}
|
||||
else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
|
||||
{
|
||||
}
|
||||
else if (level.fogdensity!=0 || (level.lightmode & 4))
|
||||
{
|
||||
// case 3: level has fog density set
|
||||
}
|
||||
else
|
||||
{
|
||||
// case 4: use light level
|
||||
if (frontsector->lightlevel >= 248) return false;
|
||||
}
|
||||
|
||||
fogcolor = backsector->Colormap.FadeColor;
|
||||
|
||||
if ((fogcolor.d & 0xffffff) == 0)
|
||||
{
|
||||
}
|
||||
else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (level.fogdensity!=0 || (level.lightmode & 4))
|
||||
{
|
||||
// case 3: level has fog density set
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// case 4: use light level
|
||||
if (backsector->lightlevel < 248) return false;
|
||||
}
|
||||
|
||||
// in all other cases this might create more problems than it solves.
|
||||
return ((frontsector->GetTexture(sector_t::ceiling)!=skyflatnum ||
|
||||
backsector->GetTexture(sector_t::ceiling)!=skyflatnum));
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Lighting stuff
|
||||
|
|
@ -424,7 +163,7 @@ void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *c
|
|||
else if (cmap != NULL && !fullbright)
|
||||
{
|
||||
fogcolor = cmap->FadeColor;
|
||||
fogdensity = gl_GetFogDensity(lightlevel, fogcolor, cmap->FogDensity);
|
||||
fogdensity = hw_GetFogDensity(lightlevel, fogcolor, cmap->FogDensity);
|
||||
fogcolor.a=0;
|
||||
}
|
||||
else
|
||||
|
|
@ -447,7 +186,7 @@ void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *c
|
|||
{
|
||||
if (level.lightmode == 2 && fogcolor == 0)
|
||||
{
|
||||
float light = gl_CalcLightLevel(lightlevel, rellight, false);
|
||||
float light = hw_CalcLightLevel(lightlevel, rellight, false);
|
||||
gl_SetShaderLight(light, lightlevel);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue