mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 19:20:38 +00:00
Polymost-like shading.
git-svn-id: https://svn.eduke32.com/eduke32@1298 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
09c883e700
commit
652262626a
4 changed files with 64 additions and 15 deletions
|
@ -61,6 +61,7 @@ typedef enum {
|
||||||
PR_BIT_SPECULAR_MAP,
|
PR_BIT_SPECULAR_MAP,
|
||||||
PR_BIT_SPECULAR_MATERIAL,
|
PR_BIT_SPECULAR_MATERIAL,
|
||||||
PR_BIT_MIRROR_MAP,
|
PR_BIT_MIRROR_MAP,
|
||||||
|
PR_BIT_FOG,
|
||||||
PR_BIT_GLOW_MAP,
|
PR_BIT_GLOW_MAP,
|
||||||
PR_BIT_SHADOW_MAP,
|
PR_BIT_SHADOW_MAP,
|
||||||
PR_BIT_SPOT_LIGHT,
|
PR_BIT_SPOT_LIGHT,
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#define CULL_DELAY 2
|
#define CULL_DELAY 2
|
||||||
#define MAXCULLCHECKS 1024
|
#define MAXCULLCHECKS 1024
|
||||||
|
|
||||||
|
#define FOGSCALE 0.0000640
|
||||||
|
|
||||||
extern int32_t lastcullcheck;
|
extern int32_t lastcullcheck;
|
||||||
extern char cullmodel[MAXSPRITES];
|
extern char cullmodel[MAXSPRITES];
|
||||||
extern int32_t cullcheckcnt;
|
extern int32_t cullcheckcnt;
|
||||||
|
@ -20,7 +22,7 @@ extern float gtang;
|
||||||
extern float glox1, gloy1;
|
extern float glox1, gloy1;
|
||||||
extern double gxyaspect, grhalfxdown10x;
|
extern double gxyaspect, grhalfxdown10x;
|
||||||
extern double gcosang, gsinang, gcosang2, gsinang2;
|
extern double gcosang, gsinang, gcosang2, gsinang2;
|
||||||
extern double gchang, gshang, gctang, gstang;
|
extern double gchang, gshang, gctang, gstang, gvisibility;
|
||||||
|
|
||||||
struct glfiltermodes {
|
struct glfiltermodes {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -119,6 +121,10 @@ extern float shadescale;
|
||||||
extern int32_t globalnoeffect;
|
extern int32_t globalnoeffect;
|
||||||
extern int32_t drawingskybox;
|
extern int32_t drawingskybox;
|
||||||
|
|
||||||
|
extern float fogresult, fogcol[4], fogtable[4*MAXPALOOKUPS];
|
||||||
|
|
||||||
|
void fogcalc(const int32_t shade, const int32_t vis, const int32_t pal);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#define POLYMER_C
|
#define POLYMER_C
|
||||||
#include "polymer.h"
|
#include "polymer.h"
|
||||||
|
#include "engine_priv.h"
|
||||||
|
|
||||||
// CVARS
|
// CVARS
|
||||||
int32_t pr_maxlightpasses = 5;
|
int32_t pr_maxlightpasses = 5;
|
||||||
|
@ -333,6 +334,24 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = {
|
||||||
" result = vec4((result.rgb * (1.0 - specTexel.a)) + (mirrorTexel.rgb * specTexel.rgb * specTexel.a), result.a);\n"
|
" result = vec4((result.rgb * (1.0 - specTexel.a)) + (mirrorTexel.rgb * specTexel.rgb * specTexel.a), result.a);\n"
|
||||||
"\n",
|
"\n",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
1 << PR_BIT_FOG,
|
||||||
|
// vert_def
|
||||||
|
"",
|
||||||
|
// vert_prog
|
||||||
|
"",
|
||||||
|
// frag_def
|
||||||
|
"",
|
||||||
|
// frag_prog
|
||||||
|
" float fragDepth;\n"
|
||||||
|
" float fogFactor;\n"
|
||||||
|
"\n"
|
||||||
|
" fragDepth = gl_FragCoord.z / gl_FragCoord.w / 35;\n"
|
||||||
|
" fragDepth *= fragDepth;\n"
|
||||||
|
" fogFactor = exp2(-gl_Fog.density * gl_Fog.density * fragDepth * 1.442695);\n"
|
||||||
|
" result.rgb = mix(gl_Fog.color.rgb, result.rgb, fogFactor);\n"
|
||||||
|
"\n",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
1 << PR_BIT_GLOW_MAP,
|
1 << PR_BIT_GLOW_MAP,
|
||||||
// vert_def
|
// vert_def
|
||||||
|
@ -572,8 +591,6 @@ int32_t polymer_init(void)
|
||||||
|
|
||||||
void polymer_glinit(void)
|
void polymer_glinit(void)
|
||||||
{
|
{
|
||||||
float a;
|
|
||||||
|
|
||||||
bglClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
bglClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
bglClearStencil(0);
|
bglClearStencil(0);
|
||||||
bglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
bglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
@ -610,15 +627,6 @@ void polymer_glinit(void)
|
||||||
|
|
||||||
bglDisable(GL_FOG);
|
bglDisable(GL_FOG);
|
||||||
|
|
||||||
bglFogi(GL_FOG_MODE, GL_EXP2);
|
|
||||||
//glFogfv(GL_FOG_COLOR, fogColor);
|
|
||||||
bglEnable(GL_FOG);
|
|
||||||
|
|
||||||
a = (1 - ((float)(visibility) / 512.0f)) / 10.0f;
|
|
||||||
bglFogf(GL_FOG_DENSITY, 0.1f - a);
|
|
||||||
bglFogf(GL_FOG_START, 0.0f);
|
|
||||||
bglFogf(GL_FOG_END, 1000000.0f);
|
|
||||||
|
|
||||||
bglEnable(GL_CULL_FACE);
|
bglEnable(GL_CULL_FACE);
|
||||||
bglCullFace(GL_BACK);
|
bglCullFace(GL_BACK);
|
||||||
}
|
}
|
||||||
|
@ -657,6 +665,9 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Drawing rooms...\n");
|
if (pr_verbosity >= 3) OSD_Printf("PR : Drawing rooms...\n");
|
||||||
|
|
||||||
|
// fogcalc needs this
|
||||||
|
gvisibility = ((float)globalvisibility)*FOGSCALE;
|
||||||
|
|
||||||
ang = (float)(daang) / (2048.0f / 360.0f);
|
ang = (float)(daang) / (2048.0f / 360.0f);
|
||||||
horizang = (float)(-getangle(128, dahoriz-100)) / (2048.0f / 360.0f);
|
horizang = (float)(-getangle(128, dahoriz-100)) / (2048.0f / 360.0f);
|
||||||
tiltang = (gtang * 90.0f);
|
tiltang = (gtang * 90.0f);
|
||||||
|
@ -806,12 +817,20 @@ void polymer_rotatesprite(int32_t sx, int32_t sy, int32_t z, int1
|
||||||
|
|
||||||
void polymer_drawmaskwall(int32_t damaskwallcnt)
|
void polymer_drawmaskwall(int32_t damaskwallcnt)
|
||||||
{
|
{
|
||||||
|
sectortype *sec;
|
||||||
|
walltype *wal;
|
||||||
_prwall *w;
|
_prwall *w;
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Masked wall %i...\n", damaskwallcnt);
|
if (pr_verbosity >= 3) OSD_Printf("PR : Masked wall %i...\n", damaskwallcnt);
|
||||||
|
|
||||||
|
sec = §or[sectorofwall(maskwall[damaskwallcnt])];
|
||||||
|
wal = &wall[maskwall[damaskwallcnt]];
|
||||||
w = prwalls[maskwall[damaskwallcnt]];
|
w = prwalls[maskwall[damaskwallcnt]];
|
||||||
|
|
||||||
|
fogcalc(wal->shade,sec->visibility,sec->floorpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
bglEnable(GL_CULL_FACE);
|
bglEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
polymer_drawplane(&w->mask);
|
polymer_drawplane(&w->mask);
|
||||||
|
@ -831,6 +850,10 @@ void polymer_drawsprite(int32_t snum)
|
||||||
|
|
||||||
tspr = tspriteptr[snum];
|
tspr = tspriteptr[snum];
|
||||||
|
|
||||||
|
fogcalc(tspr->shade,sector[tspr->sectnum].visibility,sector[tspr->sectnum].floorpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
||||||
{
|
{
|
||||||
polymer_drawmdsprite(tspr);
|
polymer_drawmdsprite(tspr);
|
||||||
|
@ -1897,8 +1920,17 @@ static void polymer_drawsector(int16_t sectnum)
|
||||||
sec = §or[sectnum];
|
sec = §or[sectnum];
|
||||||
s = prsectors[sectnum];
|
s = prsectors[sectnum];
|
||||||
|
|
||||||
|
fogcalc(sec->floorshade,sec->visibility,sec->floorpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
if (!(sec->floorstat & 1))
|
if (!(sec->floorstat & 1))
|
||||||
polymer_drawplane(&s->floor);
|
polymer_drawplane(&s->floor);
|
||||||
|
|
||||||
|
fogcalc(sec->ceilingshade,sec->visibility,sec->ceilingpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
if (!(sec->ceilingstat & 1))
|
if (!(sec->ceilingstat & 1))
|
||||||
polymer_drawplane(&s->ceil);
|
polymer_drawplane(&s->ceil);
|
||||||
|
|
||||||
|
@ -2364,12 +2396,20 @@ static void polymer_updatewall(int16_t wallnum)
|
||||||
|
|
||||||
static void polymer_drawwall(int16_t sectnum, int16_t wallnum)
|
static void polymer_drawwall(int16_t sectnum, int16_t wallnum)
|
||||||
{
|
{
|
||||||
|
sectortype *sec;
|
||||||
|
walltype *wal;
|
||||||
_prwall *w;
|
_prwall *w;
|
||||||
|
|
||||||
if (pr_verbosity >= 3) OSD_Printf("PR : Drawing wall %i...\n", wallnum);
|
if (pr_verbosity >= 3) OSD_Printf("PR : Drawing wall %i...\n", wallnum);
|
||||||
|
|
||||||
|
sec = §or[sectnum];
|
||||||
|
wal = &wall[wallnum];
|
||||||
w = prwalls[wallnum];
|
w = prwalls[wallnum];
|
||||||
|
|
||||||
|
fogcalc(wal->shade,sec->visibility,sec->floorpal);
|
||||||
|
bglFogf(GL_FOG_DENSITY,fogresult);
|
||||||
|
bglFogfv(GL_FOG_COLOR,fogcol);
|
||||||
|
|
||||||
if ((w->underover & 1) && !(w->underover & 4))
|
if ((w->underover & 1) && !(w->underover & 4))
|
||||||
{
|
{
|
||||||
polymer_drawplane(&w->wall);
|
polymer_drawplane(&w->wall);
|
||||||
|
@ -3282,6 +3322,9 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int
|
||||||
if (!curlight && material.mirrormap)
|
if (!curlight && material.mirrormap)
|
||||||
programbits |= prprogrambits[PR_BIT_MIRROR_MAP].bit;
|
programbits |= prprogrambits[PR_BIT_MIRROR_MAP].bit;
|
||||||
|
|
||||||
|
// PR_BIT_FOG
|
||||||
|
programbits |= prprogrambits[PR_BIT_FOG].bit;
|
||||||
|
|
||||||
// PR_BIT_GLOW_MAP
|
// PR_BIT_GLOW_MAP
|
||||||
if (!curlight && material.glowmap)
|
if (!curlight && material.glowmap)
|
||||||
programbits |= prprogrambits[PR_BIT_GLOW_MAP].bit;
|
programbits |= prprogrambits[PR_BIT_GLOW_MAP].bit;
|
||||||
|
|
|
@ -99,7 +99,6 @@ static double dxb1[MAXWALLSB], dxb2[MAXWALLSB];
|
||||||
#define USEZBUFFER 1 //1:use zbuffer (slow, nice sprite rendering), 0:no zbuffer (fast, bad sprite rendering)
|
#define USEZBUFFER 1 //1:use zbuffer (slow, nice sprite rendering), 0:no zbuffer (fast, bad sprite rendering)
|
||||||
#define LINTERPSIZ 4 //log2 of interpolation size. 4:pretty fast&acceptable quality, 0:best quality/slow!
|
#define LINTERPSIZ 4 //log2 of interpolation size. 4:pretty fast&acceptable quality, 0:best quality/slow!
|
||||||
#define DEPTHDEBUG 0 //1:render distance instead of texture, for debugging only!, 0:default
|
#define DEPTHDEBUG 0 //1:render distance instead of texture, for debugging only!, 0:default
|
||||||
#define FOGSCALE 0.0000640
|
|
||||||
|
|
||||||
float shadescale = 1.050;
|
float shadescale = 1.050;
|
||||||
|
|
||||||
|
@ -196,9 +195,9 @@ int32_t r_fullbrights = 1;
|
||||||
// is medium quality a good default?
|
// is medium quality a good default?
|
||||||
int32_t r_downsize = 1;
|
int32_t r_downsize = 1;
|
||||||
|
|
||||||
static float fogresult, fogcol[4], fogtable[4*MAXPALOOKUPS];
|
float fogresult, fogcol[4], fogtable[4*MAXPALOOKUPS];
|
||||||
|
|
||||||
static inline void fogcalc(const int32_t shade, const int32_t vis, const int32_t pal)
|
void fogcalc(const int32_t shade, const int32_t vis, const int32_t pal)
|
||||||
{
|
{
|
||||||
float f;
|
float f;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue