mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-28 12:30:46 +00:00
- handle RRRA E1L2's fog in the shader instead of hacking the shade tables.
This commit is contained in:
parent
ee11fba4e7
commit
d46ea7481f
8 changed files with 37 additions and 118 deletions
|
@ -1322,30 +1322,6 @@ static int get_screen_coords(const vec2_t &p1, const vec2_t &p2,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////// *WALLSCAN HELPERS //////////
|
|
||||||
|
|
||||||
#define WSHELPER_DECL inline //ATTRIBUTE((always_inline))
|
|
||||||
|
|
||||||
static WSHELPER_DECL void tweak_tsizes(vec2_16_t *tsiz)
|
|
||||||
{
|
|
||||||
if (pow2long[picsiz[globalpicnum]&15] == tsiz->x)
|
|
||||||
tsiz->x--;
|
|
||||||
else
|
|
||||||
tsiz->x = -tsiz->x;
|
|
||||||
|
|
||||||
if (pow2long[picsiz[globalpicnum]>>4] == tsiz->y)
|
|
||||||
tsiz->y = (picsiz[globalpicnum]>>4);
|
|
||||||
else
|
|
||||||
tsiz->y = -tsiz->y;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int32_t drawing_sprite = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// wallfront (internal)
|
// wallfront (internal)
|
||||||
//
|
//
|
||||||
|
@ -1472,31 +1448,6 @@ static inline void wallmosts_finish(int16_t *mostbuf, int32_t z1, int32_t z2,
|
||||||
mostbuf[ix2] = clamp(mostbuf[ix2], 0, ydimen);
|
mostbuf[ix2] = clamp(mostbuf[ix2], 0, ydimen);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CLASSIC_Z_DIFF_64
|
|
||||||
typedef int64_t zint_t;
|
|
||||||
|
|
||||||
// For drawvox()
|
|
||||||
static FORCE_INLINE zint_t mulscale16z(int32_t a, int32_t d)
|
|
||||||
{
|
|
||||||
return ((zint_t)a * d)>>16;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE zint_t mulscale20z(int32_t a, int32_t d)
|
|
||||||
{
|
|
||||||
return ((zint_t)a * d)>>20;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE zint_t dmulscale24z(int32_t a, int32_t d, int32_t S, int32_t D)
|
|
||||||
{
|
|
||||||
return (((zint_t)a * d) + ((zint_t)S * D)) >> 24;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
typedef int32_t zint_t;
|
|
||||||
# define mulscale16z mulscale16
|
|
||||||
# define mulscale20z mulscale20
|
|
||||||
# define dmulscale24z dmulscale24
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// globalpicnum --> globalxshift, globalyshift
|
// globalpicnum --> globalxshift, globalyshift
|
||||||
static void calc_globalshifts(void)
|
static void calc_globalshifts(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -406,6 +406,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t skyzbufferhack_pass = 0;
|
static int32_t skyzbufferhack_pass = 0;
|
||||||
|
|
||||||
if (flatskyrender && skyzbufferhack_pass == 0)
|
if (flatskyrender && skyzbufferhack_pass == 0)
|
||||||
{
|
{
|
||||||
polymost_flatskyrender(dpxy, n, method|DAMETH_SKY, tilesize);
|
polymost_flatskyrender(dpxy, n, method|DAMETH_SKY, tilesize);
|
||||||
|
@ -1876,6 +1877,8 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i
|
||||||
flatskyrender = 0;
|
flatskyrender = 0;
|
||||||
vec2f_t xys[8];
|
vec2f_t xys[8];
|
||||||
|
|
||||||
|
auto f = GLInterface.useMapFog;
|
||||||
|
GLInterface.useMapFog = false;
|
||||||
// Transform polygon to sky coordinates
|
// Transform polygon to sky coordinates
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
|
@ -2065,6 +2068,7 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i
|
||||||
GLInterface.SetClamp(0);
|
GLInterface.SetClamp(0);
|
||||||
|
|
||||||
flatskyrender = 1;
|
flatskyrender = 1;
|
||||||
|
GLInterface.useMapFog = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void polymost_drawalls(int32_t const bunch)
|
static void polymost_drawalls(int32_t const bunch)
|
||||||
|
|
|
@ -151,7 +151,6 @@ inline bool V_IsTrueColor()
|
||||||
|
|
||||||
|
|
||||||
class FTexture;
|
class FTexture;
|
||||||
struct FColormap;
|
|
||||||
class FileWriter;
|
class FileWriter;
|
||||||
enum FTextureFormat : uint32_t;
|
enum FTextureFormat : uint32_t;
|
||||||
class FModelRenderer;
|
class FModelRenderer;
|
||||||
|
|
|
@ -27,6 +27,7 @@ enum PRSFlags
|
||||||
RF_NPOTEmulation = 32,
|
RF_NPOTEmulation = 32,
|
||||||
RF_ShadeInterpolate = 64,
|
RF_ShadeInterpolate = 64,
|
||||||
RF_FogDisabled = 128,
|
RF_FogDisabled = 128,
|
||||||
|
RF_MapFog = 256, // RRRA E2L1.
|
||||||
|
|
||||||
RF_HICTINT_Grayscale = 0x10000,
|
RF_HICTINT_Grayscale = 0x10000,
|
||||||
RF_HICTINT_Invert = 0x20000,
|
RF_HICTINT_Invert = 0x20000,
|
||||||
|
|
|
@ -196,10 +196,12 @@ static GLint primtypes[] =
|
||||||
|
|
||||||
void GLInstance::Draw(EDrawType type, size_t start, size_t count)
|
void GLInstance::Draw(EDrawType type, size_t start, size_t count)
|
||||||
{
|
{
|
||||||
|
applyMapFog();
|
||||||
renderState.vindex = start;
|
renderState.vindex = start;
|
||||||
renderState.vcount = count;
|
renderState.vcount = count;
|
||||||
renderState.primtype = type;
|
renderState.primtype = type;
|
||||||
rendercommands.Push(renderState);
|
rendercommands.Push(renderState);
|
||||||
|
clearMapFog();
|
||||||
SetIdentityMatrix(Matrix_Texture);
|
SetIdentityMatrix(Matrix_Texture);
|
||||||
SetIdentityMatrix(Matrix_Detail);
|
SetIdentityMatrix(Matrix_Detail);
|
||||||
renderState.StateFlags &= ~(STF_CLEARCOLOR | STF_CLEARDEPTH | STF_VIEWPORTSET | STF_SCISSORSET);
|
renderState.StateFlags &= ~(STF_CLEARCOLOR | STF_CLEARDEPTH | STF_VIEWPORTSET | STF_SCISSORSET);
|
||||||
|
@ -209,6 +211,7 @@ void GLInstance::DrawElement(EDrawType type, size_t start, size_t count, Polymos
|
||||||
{
|
{
|
||||||
if (activeShader == polymostShader)
|
if (activeShader == polymostShader)
|
||||||
{
|
{
|
||||||
|
glVertexAttrib4fv(2, renderState.Color);
|
||||||
glVertexAttrib4fv(2, renderState.Color);
|
glVertexAttrib4fv(2, renderState.Color);
|
||||||
if (renderState.Color[3] != 1.f) renderState.Flags &= ~RF_Brightmapping; // The way the colormaps are set up means that brightmaps cannot be used on translucent content at all.
|
if (renderState.Color[3] != 1.f) renderState.Flags &= ~RF_Brightmapping; // The way the colormaps are set up means that brightmaps cannot be used on translucent content at all.
|
||||||
renderState.Apply(polymostShader, lastState);
|
renderState.Apply(polymostShader, lastState);
|
||||||
|
|
|
@ -480,7 +480,26 @@ public:
|
||||||
else renderState.Flags &= ~RF_FogDisabled;
|
else renderState.Flags &= ~RF_FogDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetBrightness(int brightness)
|
// Hack...
|
||||||
|
bool useMapFog = false;
|
||||||
|
|
||||||
|
void SetMapFog(bool yes)
|
||||||
|
{
|
||||||
|
useMapFog = yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyMapFog()
|
||||||
|
{
|
||||||
|
if (useMapFog) renderState.Flags |= RF_MapFog;
|
||||||
|
else renderState.Flags &= ~RF_MapFog;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearMapFog()
|
||||||
|
{
|
||||||
|
renderState.Flags &= ~RF_MapFog;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetBrightness(int brightness)
|
||||||
{
|
{
|
||||||
renderState.Brightness = 8.f / (brightness + 8.f);
|
renderState.Brightness = 8.f / (brightness + 8.f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "v_2ddrawer.h"
|
#include "v_2ddrawer.h"
|
||||||
#include "secrets.h"
|
#include "secrets.h"
|
||||||
|
#include "glbackend/glbackend.h"
|
||||||
|
|
||||||
BEGIN_RR_NS
|
BEGIN_RR_NS
|
||||||
|
|
||||||
|
@ -2518,72 +2519,7 @@ void G_FreeMapState(int levelNum)
|
||||||
|
|
||||||
void G_SetFog(int fogtype)
|
void G_SetFog(int fogtype)
|
||||||
{
|
{
|
||||||
static int oldFogType = 0;
|
GLInterface.SetMapFog(fogtype != 0);
|
||||||
static int makeTables = 0;
|
|
||||||
static char *lut0,*lut30,*lut33,*lut23,*lut8;
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
static palette_t flut0,flut30,flut33,flut23,flut8;
|
|
||||||
#endif
|
|
||||||
if (!makeTables)
|
|
||||||
{
|
|
||||||
makeTables = 1;
|
|
||||||
lut0 = palookup[0];
|
|
||||||
lut30 = palookup[30];
|
|
||||||
lut33 = palookup[33];
|
|
||||||
lut23 = palookup[23];
|
|
||||||
lut8 = palookup[8];
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
flut0 = palookupfog[0];
|
|
||||||
flut30 = palookupfog[30];
|
|
||||||
flut33 = palookupfog[33];
|
|
||||||
flut23 = palookupfog[23];
|
|
||||||
flut8 = palookupfog[8];
|
|
||||||
#endif
|
|
||||||
paletteMakeLookupTable(50, NULL, 12*4, 12*4, 12*4, 0);
|
|
||||||
paletteMakeLookupTable(51, NULL, 12*4, 12*4, 12*4, 0);
|
|
||||||
}
|
|
||||||
if (fogtype == 0)
|
|
||||||
{
|
|
||||||
palookup[0] = lut0;
|
|
||||||
palookup[30] = lut30;
|
|
||||||
palookup[33] = lut33;
|
|
||||||
palookup[23] = lut23;
|
|
||||||
palookup[8] = lut8;
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
palookupfog[0] = flut0;
|
|
||||||
palookupfog[30] = flut30;
|
|
||||||
palookupfog[33] = flut33;
|
|
||||||
palookupfog[23] = flut23;
|
|
||||||
palookupfog[8] = flut8;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if (fogtype == 2)
|
|
||||||
{
|
|
||||||
palookup[0] = palookup[50];
|
|
||||||
palookup[30] = palookup[51];
|
|
||||||
palookup[33] = palookup[51];
|
|
||||||
palookup[23] = palookup[51];
|
|
||||||
palookup[8] = palookup[54];
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
palookupfog[0] = palookupfog[50];
|
|
||||||
palookupfog[30] = palookupfog[51];
|
|
||||||
palookupfog[33] = palookupfog[51];
|
|
||||||
palookupfog[23] = palookupfog[51];
|
|
||||||
palookupfog[8] = palookupfog[54];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (oldFogType != fogtype)
|
|
||||||
{
|
|
||||||
oldFogType = fogtype;
|
|
||||||
#ifdef USE_OPENGL
|
|
||||||
if (videoGetRenderMode() >= REND_POLYMOST)
|
|
||||||
{
|
|
||||||
//gltexinvalidatetype(INVALIDATE_ALL_NON_INDEXED);
|
|
||||||
static int swaps[] = { 0, 30, 33, 23, 8 };
|
|
||||||
uploadpalswaps(5, swaps);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
END_RR_NS
|
END_RR_NS
|
||||||
|
|
|
@ -8,6 +8,7 @@ const int RF_Brightmapping = 16;
|
||||||
const int RF_NPOTEmulation = 32;
|
const int RF_NPOTEmulation = 32;
|
||||||
const int RF_ShadeInterpolate = 64;
|
const int RF_ShadeInterpolate = 64;
|
||||||
const int RF_FogDisabled = 128;
|
const int RF_FogDisabled = 128;
|
||||||
|
const int RF_MapFog = 256;
|
||||||
|
|
||||||
const int RF_HICTINT_Grayscale = 0x1;
|
const int RF_HICTINT_Grayscale = 0x1;
|
||||||
const int RF_HICTINT_Invert = 0x2;
|
const int RF_HICTINT_Invert = 0x2;
|
||||||
|
@ -217,9 +218,14 @@ void main()
|
||||||
lightcolor = clamp(lightcolor + texture(s_brightmap, v_texCoord.xy).rgb, 0.0, 1.0);
|
lightcolor = clamp(lightcolor + texture(s_brightmap, v_texCoord.xy).rgb, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
color.rgb *= lightcolor;
|
color.rgb *= lightcolor;
|
||||||
color.rgb += u_fogColor.rgb * shade;
|
if ((u_flags & RF_MapFog) == 0) color.rgb += u_fogColor.rgb * shade;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((u_flags & RF_MapFog) != 0) // fog hack for RRRA E2L1. Needs to be done better, this is gross, but still preferable to the broken original implementation.
|
||||||
|
{
|
||||||
|
float fogfactor = 0.55 + 0.3 * exp2 (-5.0*v_fogCoord);
|
||||||
|
color.rgb = vec3(0.6*(1.0-fogfactor)) + color.rgb * fogfactor;// mix(vec3(0.6), color.rgb, fogfactor);
|
||||||
|
}
|
||||||
if (color.a < u_alphaThreshold) discard; // it's only here that we have the alpha value available to be able to perform the alpha test.
|
if (color.a < u_alphaThreshold) discard; // it's only here that we have the alpha value available to be able to perform the alpha test.
|
||||||
|
|
||||||
color.a *= v_color.a;
|
color.a *= v_color.a;
|
||||||
|
|
Loading…
Reference in a new issue