mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 23:02:03 +00:00
Fixes light culling.
git-svn-id: https://svn.eduke32.com/eduke32@1413 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
aca5dc80e3
commit
a8cd07d692
2 changed files with 57 additions and 71 deletions
|
@ -155,6 +155,11 @@ typedef struct s_prprogrambit {
|
|||
#define SHADOW_DEPTH_OFFSET 30
|
||||
#define PR_MAXLIGHTPRIORITY 6
|
||||
|
||||
typedef struct s_prplanelist {
|
||||
struct s_prplane* plane;
|
||||
struct s_prplanelist* n;
|
||||
} _prplanelist;
|
||||
|
||||
typedef struct s_prlight {
|
||||
int32_t x, y, z, horiz, range;
|
||||
int16_t angle, faderadius, radius, sector;
|
||||
|
@ -172,8 +177,8 @@ typedef struct s_prlight {
|
|||
int32_t isinview : 1;
|
||||
} flags;
|
||||
GLuint lightmap;
|
||||
void* myplanes[PR_MAXLIGHTS<<1];
|
||||
int32_t planecnt;
|
||||
_prplanelist* planelist;
|
||||
int32_t planecount;
|
||||
} _prlight;
|
||||
|
||||
extern _prlight prlights[PR_MAXLIGHTS];
|
||||
|
|
|
@ -134,7 +134,6 @@ GLfloat artskydata[16];
|
|||
_prlight prlights[PR_MAXLIGHTS];
|
||||
int32_t lightcount;
|
||||
int32_t curlight;
|
||||
int32_t curlightcount;
|
||||
|
||||
_prlight gamelights[PR_MAXLIGHTS];
|
||||
int32_t gamelightcount;
|
||||
|
@ -1143,6 +1142,9 @@ int16_t polymer_addlight(_prlight* light)
|
|||
prlights[lighti].flags.isinview = 0;
|
||||
prlights[lighti].flags.active = 1;
|
||||
|
||||
prlights[lighti].planecount = 0;
|
||||
prlights[lighti].planelist = NULL;
|
||||
|
||||
polymer_culllight(lighti);
|
||||
|
||||
lightcount++;
|
||||
|
@ -1227,14 +1229,12 @@ static void polymer_displayrooms(int16_t dacursectnum)
|
|||
{
|
||||
// this is a couple of fps faster for me... does it mess anything up?
|
||||
if (wallvisible(globalposx, globalposy, sec->wallptr + i))
|
||||
{
|
||||
polymer_drawwall(sectorqueue[front], sec->wallptr + i);
|
||||
|
||||
// if we have a level boundary somewhere in the sector,
|
||||
// consider these walls as visportals
|
||||
if (wall[sec->wallptr + i].nextsector == -1)
|
||||
doquery = 1;
|
||||
}
|
||||
// if we have a level boundary somewhere in the sector,
|
||||
// consider these walls as visportals
|
||||
if (wall[sec->wallptr + i].nextsector == -1)
|
||||
doquery = 1;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
@ -1552,14 +1552,8 @@ static void polymer_drawplane(_prplane* plane)
|
|||
bglTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), &plane->buffer[3]);
|
||||
}
|
||||
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < plane->lightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
/*
|
||||
while (plane->lightcount && plane->lights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
*/
|
||||
curlight = 0;
|
||||
do {
|
||||
materialbits = polymer_bindmaterial(plane->material, plane->lights, plane->lightcount);
|
||||
|
||||
if (materialbits & prprogrambits[PR_BIT_NORMAL_MAP].bit)
|
||||
|
@ -1584,8 +1578,7 @@ static void polymer_drawplane(_prplane* plane)
|
|||
prlights[plane->lights[curlight]].flags.isinview = 1;
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
} while ((curlight < plane->lightcount) && (curlight < pr_maxlightpasses));
|
||||
|
||||
if (plane->vbo && (pr_vbos > 0))
|
||||
{
|
||||
|
@ -3421,20 +3414,14 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
|
||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m->indices[surfi]);
|
||||
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < modellightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
while (modellights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
|
||||
curlight = 0;
|
||||
do {
|
||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, 0);
|
||||
polymer_unbindmaterial(materialbits);
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
} while ((curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
||||
|
||||
bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
||||
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
|
@ -3451,20 +3438,14 @@ static void polymer_drawmdsprite(spritetype *tspr)
|
|||
mdspritematerial.nextframedatastride = sizeof(float) * 6;
|
||||
}
|
||||
|
||||
curlight = curlightcount = 0;
|
||||
while ((curlight == 0) || ((curlightcount < modellightcount) && (curlightcount < pr_maxlightpasses)))
|
||||
{
|
||||
while (modellights[curlight] == -1) {
|
||||
curlight++;
|
||||
}
|
||||
|
||||
curlight = 0;
|
||||
do {
|
||||
materialbits = polymer_bindmaterial(mdspritematerial, modellights, modellightcount);
|
||||
bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris);
|
||||
polymer_unbindmaterial(materialbits);
|
||||
|
||||
curlight++;
|
||||
curlightcount++;
|
||||
}
|
||||
} while ((curlight < modellightcount) && (curlight < pr_maxlightpasses));
|
||||
}
|
||||
|
||||
bglDisableClientState(GL_NORMAL_ARRAY);
|
||||
|
@ -3668,7 +3649,7 @@ static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights,
|
|||
programbits |= prprogrambits[PR_BIT_ANIM_INTERPOLATION].bit;
|
||||
|
||||
// PR_BIT_LIGHTING_PASS
|
||||
if (curlightcount && matlightcount)
|
||||
if (curlight && matlightcount)
|
||||
programbits |= prprogrambits[PR_BIT_LIGHTING_PASS].bit;
|
||||
|
||||
// PR_BIT_NORMAL_MAP
|
||||
|
@ -3680,7 +3661,7 @@ static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights,
|
|||
programbits |= prprogrambits[PR_BIT_DIFFUSE_MAP].bit;
|
||||
|
||||
// PR_BIT_DIFFUSE_DETAIL_MAP
|
||||
if (!curlightcount && r_detailmapping && material.detailmap)
|
||||
if (!curlight && r_detailmapping && material.detailmap)
|
||||
programbits |= prprogrambits[PR_BIT_DIFFUSE_DETAIL_MAP].bit;
|
||||
|
||||
// PR_BIT_DIFFUSE_MODULATION
|
||||
|
@ -3695,14 +3676,14 @@ static int32_t polymer_bindmaterial(_prmaterial material, int16_t* lights,
|
|||
programbits |= prprogrambits[PR_BIT_SPECULAR_MATERIAL].bit;
|
||||
|
||||
// PR_BIT_MIRROR_MAP
|
||||
if (!curlightcount && material.mirrormap)
|
||||
if (!curlight && material.mirrormap)
|
||||
programbits |= prprogrambits[PR_BIT_MIRROR_MAP].bit;
|
||||
|
||||
// PR_BIT_FOG
|
||||
programbits |= prprogrambits[PR_BIT_FOG].bit;
|
||||
|
||||
// PR_BIT_GLOW_MAP
|
||||
if (!curlightcount && r_glowmapping && material.glowmap)
|
||||
if (!curlight && r_glowmapping && material.glowmap)
|
||||
programbits |= prprogrambits[PR_BIT_GLOW_MAP].bit;
|
||||
|
||||
// PR_BIT_POINT_LIGHT
|
||||
|
@ -4153,17 +4134,19 @@ static void polymer_compileprogram(int32_t programbits)
|
|||
|
||||
// LIGHTS
|
||||
|
||||
static void polymer_removelight(int16_t lighti)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
i = prlights[lighti].planecnt-1;
|
||||
while (i >= 0)
|
||||
{
|
||||
polymer_deleteplanelight(prlights[lighti].myplanes[i], lighti);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
static void polymer_removelight(int16_t lighti)
|
||||
{
|
||||
_prplanelist* oldhead;
|
||||
|
||||
while (prlights[lighti].planelist)
|
||||
{
|
||||
polymer_deleteplanelight(prlights[lighti].planelist->plane, lighti);
|
||||
oldhead = prlights[lighti].planelist;
|
||||
prlights[lighti].planelist = prlights[lighti].planelist->n;
|
||||
Bfree(oldhead);
|
||||
}
|
||||
prlights[lighti].planecount = 0;
|
||||
}
|
||||
|
||||
static void polymer_updatelights(void)
|
||||
{
|
||||
|
@ -4244,23 +4227,32 @@ static void polymer_resetplanelights(_prplane* plane)
|
|||
static void polymer_addplanelight(_prplane* plane, int16_t lighti)
|
||||
{
|
||||
int16_t i;
|
||||
_prplanelist* oldhead;
|
||||
|
||||
if (plane->lightcount == PR_MAXLIGHTS-1 || prlights[lighti].planecnt == (PR_MAXLIGHTS<<1)-1)
|
||||
if (plane->lightcount == PR_MAXLIGHTS - 1)
|
||||
return;
|
||||
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
if ((plane->lights[i] != -1) && (prlights[plane->lights[i]].priority < prlights[lighti].priority))
|
||||
{ i++; continue; }
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (plane->lights[i] != -1)
|
||||
memmove(&plane->lights[i+1], &plane->lights[i], sizeof(int16_t) * (PR_MAXLIGHTS - (i+1)));
|
||||
memmove(&plane->lights[i+1], &plane->lights[i], sizeof(int16_t) * (PR_MAXLIGHTS - (i + 1)));
|
||||
|
||||
plane->lights[i] = lighti;
|
||||
plane->lightcount++;
|
||||
prlights[lighti].myplanes[prlights[lighti].planecnt] = plane;
|
||||
prlights[lighti].planecnt++;
|
||||
|
||||
oldhead = prlights[lighti].planelist;
|
||||
prlights[lighti].planelist = Bcalloc(sizeof(_prplanelist), 1);
|
||||
prlights[lighti].planelist->n = oldhead;
|
||||
|
||||
prlights[lighti].planelist->plane = plane;
|
||||
prlights[lighti].planecount++;
|
||||
return;
|
||||
}
|
||||
while (i < PR_MAXLIGHTS);
|
||||
|
@ -4275,9 +4267,9 @@ static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
|
|||
{
|
||||
if (plane->lights[i] == lighti)
|
||||
{
|
||||
memmove(&plane->lights[i], &plane->lights[i+1], sizeof(int16_t) * (PR_MAXLIGHTS - (i)));
|
||||
memmove(&plane->lights[i], &plane->lights[i+1], sizeof(int16_t) * (PR_MAXLIGHTS - (i + 1)));
|
||||
plane->lights[PR_MAXLIGHTS-1] = -1;
|
||||
|
||||
|
||||
plane->lightcount--;
|
||||
return;
|
||||
}
|
||||
|
@ -4447,9 +4439,6 @@ static inline void polymer_culllight(int16_t lighti)
|
|||
Bmemset(drawingstate, 0, sizeof(int16_t) * numsectors);
|
||||
drawingstate[light->sector] = 1;
|
||||
|
||||
prlights[lighti].planecnt = 0;
|
||||
// Bmemset(prlights[lighti].myplanes, 0, sizeof(intptr_t) * (PR_MAXLIGHTS<<1));
|
||||
|
||||
sectorqueue[0] = light->sector;
|
||||
|
||||
while (front != back)
|
||||
|
@ -4459,19 +4448,11 @@ static inline void polymer_culllight(int16_t lighti)
|
|||
|
||||
polymer_pokesector(sectorqueue[front]);
|
||||
|
||||
j = 0;
|
||||
|
||||
if (polymer_planeinlight(&s->floor, light)) {
|
||||
// this lets us skip the polymer_planeinlight check for the ceiling when we know the result already
|
||||
// I doubt this saves us much but it might be faster on complex sectors than the planeinlight loop
|
||||
if (!light->radius && ((light->z - getceilzofslope(light->sector, light->x, light->y)) >> 4) < light->range)
|
||||
j = 1;
|
||||
else j = 2;
|
||||
|
||||
polymer_addplanelight(&s->floor, lighti);
|
||||
}
|
||||
|
||||
if (j == 1 || (j == 0 && polymer_planeinlight(&s->ceil, light))) {
|
||||
if (polymer_planeinlight(&s->ceil, light)) {
|
||||
polymer_addplanelight(&s->ceil, lighti);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue