Add r_usenewshading 4.

Uses a constant determined from the shade tables.

Patch from Fox.

git-svn-id: https://svn.eduke32.com/eduke32@6515 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2017-11-29 07:29:33 +00:00
parent 5adb8364b6
commit 66162032a0
3 changed files with 74 additions and 4 deletions

View file

@ -80,6 +80,11 @@ static inline float getshadefactor(int32_t const shade)
eligible_for_tileshades(globalpicnum, globalpal)) eligible_for_tileshades(globalpicnum, globalpal))
return 1.f; return 1.f;
if (r_usenewshading == 4)
{
return 1.f - (shade * shadescale / frealmaxshade);
}
float const shadebound = (float)((shadescale_unbounded || shade>=numshades) ? numshades : numshades-1); float const shadebound = (float)((shadescale_unbounded || shade>=numshades) ? numshades : numshades-1);
float const scaled_shade = (float)shade*shadescale; float const scaled_shade = (float)shade*shadescale;
float const clamped_shade = min(max(scaled_shade, 0.f), shadebound); float const clamped_shade = min(max(scaled_shade, 0.f), shadebound);

View file

@ -7940,7 +7940,9 @@ int32_t drawrooms(int32_t daposx, int32_t daposy, int32_t daposz,
#ifdef USE_OPENGL #ifdef USE_OPENGL
case REND_POLYMOST: case REND_POLYMOST:
// NOTE: In Polymost, the fragment depth depends on the x screen size! // NOTE: In Polymost, the fragment depth depends on the x screen size!
if (r_usenewshading >= 2) if (r_usenewshading == 4)
globalvisibility = g_visibility;
else if (r_usenewshading >= 2)
globalvisibility = scale(g_visibility<<2, xdimen, 1680); globalvisibility = scale(g_visibility<<2, xdimen, 1680);
else else
globalvisibility = scale(g_visibility<<2, xdimen, 1100); globalvisibility = scale(g_visibility<<2, xdimen, 1100);

View file

@ -45,7 +45,7 @@ static float dxb1[MAXWALLSB], dxb2[MAXWALLSB];
float shadescale = 1.0f; float shadescale = 1.0f;
int32_t shadescale_unbounded = 0; int32_t shadescale_unbounded = 0;
int32_t r_usenewshading = 3; int32_t r_usenewshading = 4;
int32_t r_usetileshades = 2; int32_t r_usetileshades = 2;
int32_t r_npotwallmode = 0; int32_t r_npotwallmode = 0;
@ -482,10 +482,44 @@ static inline void fogcalc(int32_t tile, int32_t shade, int32_t vis, int32_t pal
} }
} }
#define GL_FOG_MAX 1.0e37f
void calc_and_apply_fog(int32_t tile, int32_t shade, int32_t vis, int32_t pal) void calc_and_apply_fog(int32_t tile, int32_t shade, int32_t vis, int32_t pal)
{ {
if (nofog) return; if (nofog) return;
if (r_usenewshading == 4)
{
fogresult = 0.f;
fogresult2 = -GL_FOG_MAX; // hide fog behind the camera
fogcol = fogtable[pal];
if (((uint8_t)(vis + 16)) > 0 && g_visibility > 0)
{
GLfloat glfogconstant = 262144.f / xdimen;
GLfloat fogrange = (frealmaxshade * glfogconstant) / (((uint8_t)(vis + 16)) * globalvisibility);
GLfloat normalizedshade = shade / frealmaxshade;
GLfloat fogshade = normalizedshade * fogrange;
fogresult = -fogshade;
fogresult2 = fogrange - fogshade;
// substract shade from fog
if (shade > 0 && shade < realmaxshade)
{
fogresult = 1.f - (fogresult2 / (fogresult2 - fogresult));
fogresult = (fogresult - normalizedshade) / (1.f - normalizedshade);
fogresult = -((fogresult2 / (1.f - fogresult)) - fogresult2) ;
}
}
bglFogf(GL_FOG_START, fogresult);
bglFogf(GL_FOG_END, fogresult2);
bglFogfv(GL_FOG_COLOR, (GLfloat *)&fogcol);
return;
}
fogcalc(tile, shade, vis, pal); fogcalc(tile, shade, vis, pal);
bglFogfv(GL_FOG_COLOR, (GLfloat *)&fogcol); bglFogfv(GL_FOG_COLOR, (GLfloat *)&fogcol);
@ -502,6 +536,32 @@ void calc_and_apply_fog_factor(int32_t tile, int32_t shade, int32_t vis, int32_t
{ {
if (nofog) return; if (nofog) return;
if (r_usenewshading == 4)
{
fogresult = 0.f;
fogresult2 = -GL_FOG_MAX; // hide fog behind the camera
fogcol = fogtable[pal];
if (((uint8_t)(vis + 16)) > 0 && ((((uint8_t)(vis + 16)) / 8.f) + shade) > 0)
{
GLfloat normalizedshade = shade / frealmaxshade;
GLfloat fogrange = (((uint8_t)(vis + 16)) / (8.f * frealmaxshade)) + normalizedshade;
// substract shade from fog
if (shade > 0 && shade < realmaxshade)
fogrange = (fogrange - normalizedshade) / (1.f - normalizedshade);
fogresult = -(GL_FOG_MAX * fogrange);
fogresult2 = GL_FOG_MAX - (GL_FOG_MAX * fogrange);
}
bglFogf(GL_FOG_START, fogresult);
bglFogf(GL_FOG_END, fogresult2);
bglFogfv(GL_FOG_COLOR, (GLfloat *)&fogcol);
return;
}
// NOTE: for r_usenewshading >= 2, the fog beginning/ending distance results are // NOTE: for r_usenewshading >= 2, the fog beginning/ending distance results are
// unused. // unused.
fogcalc(tile, shade, vis, pal); fogcalc(tile, shade, vis, pal);
@ -1620,6 +1680,9 @@ static uint8_t drawpoly_blend = 0;
static inline pthtyp *our_texcache_fetch(int32_t dameth) static inline pthtyp *our_texcache_fetch(int32_t dameth)
{ {
if (r_usenewshading == 4)
return texcache_fetch(globalpicnum, globalpal, getpalookup((r_usetileshades == 1 && !(globalflags & GLOBAL_NO_GL_TILESHADES)), globalshade), dameth);
// r_usetileshades 1 is TX's method. // r_usetileshades 1 is TX's method.
return texcache_fetch(globalpicnum, globalpal, getpalookup((r_usetileshades == 1 && !(globalflags & GLOBAL_NO_GL_TILESHADES)) ? globvis>>3 : 0, globalshade), dameth); return texcache_fetch(globalpicnum, globalpal, getpalookup((r_usetileshades == 1 && !(globalflags & GLOBAL_NO_GL_TILESHADES)) ? globvis>>3 : 0, globalshade), dameth);
} }
@ -6003,8 +6066,8 @@ void polymost_initosdfuncs(void)
{ "r_texfilter", "changes the texture filtering settings", (void *) &gltexfiltermode, CVAR_INT|CVAR_FUNCPTR, 0, 5 }, { "r_texfilter", "changes the texture filtering settings", (void *) &gltexfiltermode, CVAR_INT|CVAR_FUNCPTR, 0, 5 },
{ "r_usenewshading", { "r_usenewshading",
"visibility/fog code: 0: orig. Polymost 1: 07/2011 2: linear 12/2012 3: no neg. start 03/2014", "visibility/fog code: 0: orig. Polymost 1: 07/2011 2: linear 12/2012 3: no neg. start 03/2014 4: base constant on shade table 11/2017",
(void *) &r_usenewshading, CVAR_INT|CVAR_FUNCPTR, 0, 3 (void *) &r_usenewshading, CVAR_INT|CVAR_FUNCPTR, 0, 4
}, },
{ "r_usetileshades", "enable/disable Polymost tile shade textures", (void *) &r_usetileshades, CVAR_INT | CVAR_INVALIDATEART, 0, 2 }, { "r_usetileshades", "enable/disable Polymost tile shade textures", (void *) &r_usetileshades, CVAR_INT | CVAR_INVALIDATEART, 0, 2 },