From dbb84c7ee8ac7d25d7f7adc6ffd7a55288c655ed Mon Sep 17 00:00:00 2001 From: plagman Date: Sat, 6 Jun 2009 13:12:29 +0000 Subject: [PATCH] Reverts the priority change and removes applylights. git-svn-id: https://svn.eduke32.com/eduke32@1404 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/polymer.h | 78 +++--- polymer/eduke32/build/src/polymer.c | 320 +++++++++--------------- 2 files changed, 154 insertions(+), 244 deletions(-) diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index 43d7b0df1..e2b2cccf5 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -148,6 +148,41 @@ typedef struct s_prprogrambit { char* frag_prog; } _prprogrambit; +// LIGHTS +#define PR_MAXLIGHTS 128 +#define SHADOW_DEPTH_OFFSET 30 +#define PR_MAXLIGHTPRIORITY 6 + +typedef struct s_prlight { + int32_t x, y, z, horiz, range; + int16_t angle, faderadius, radius, sector; + uint8_t color[3], priority; + int8_t minshade, maxshade; + int16_t tilenum; + // internal members + GLfloat proj[16]; + GLfloat transform[16]; + float frustum[5 * 4]; + int32_t rtindex; + struct { + int32_t active : 1; + int32_t invalidate : 1; + int32_t isinview : 1; + } flags; + GLuint lightmap; +} _prlight; + +extern _prlight prlights[PR_MAXLIGHTS]; + +extern _prlight staticlights[PR_MAXLIGHTS]; +extern int32_t staticlightcount; + +extern _prlight gamelights[PR_MAXLIGHTS]; +extern int32_t gamelightcount; + +extern _prlight framelights[PR_MAXLIGHTS]; +extern int32_t framelightcount; + // RENDER TARGETS typedef struct s_prrt { GLenum target; @@ -157,12 +192,6 @@ typedef struct s_prrt { int32_t xdim, ydim; } _prrt; -// LIGHTS -#define PR_MAXLIGHTS 128 -#define SHADOW_DEPTH_OFFSET 30 -#define PR_MAXLIGHTPRIORITY 6 - - // BUILD DATA typedef struct s_prplane { // geometry @@ -184,40 +213,6 @@ typedef struct s_prplane { int16_t lightcount; } _prplane; - -typedef struct s_prlight { - int32_t x, y, z, horiz, range; - int16_t angle, faderadius, radius, sector; - uint8_t color[3], priority; - int8_t minshade, maxshade; - int16_t tilenum; - // internal members - GLfloat proj[16]; - GLfloat transform[16]; - float frustum[5 * 4]; - int32_t rtindex; - struct { - int32_t active : 1; - int32_t invalidate : 1; - int32_t isinview : 1; - int32_t display : 1; - } flags; - GLuint lightmap; - _prplane* myplanes[PR_MAXLIGHTS]; - int32_t planecnt; -} _prlight; - -extern _prlight staticlights[PR_MAXLIGHTS]; -extern int32_t staticlightcount; - -extern _prlight gamelights[PR_MAXLIGHTS]; -extern int32_t gamelightcount; - -extern _prlight framelights[PR_MAXLIGHTS]; -extern int32_t framelightcount; - -extern _prlight prlights[PR_MAXLIGHTS]; - typedef struct s_prsector { // polymer data GLdouble* verts; @@ -341,14 +336,13 @@ static void polymer_updatelights(void); static void polymer_resetlights(void); static void polymer_resetplanelights(_prplane* plane); static void polymer_addplanelight(_prplane* plane, int16_t lighti); -static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti); +static void polymer_deleteplanelight(_prplane* plane, int16_t lighti); static int32_t polymer_planeinlight(_prplane* plane, _prlight* light); static void polymer_invalidateplanelights(_prplane* plane); static void polymer_invalidatesectorlights(int16_t sectnum); static void polymer_processspotlight(_prlight* light); static inline void polymer_culllight(int16_t lighti); static void polymer_prepareshadows(void); -static void polymer_applylights(void); // RENDER TARGETS static void polymer_initrendertargets(int32_t count); diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index 8d94676e7..e7baa2c17 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -1071,7 +1071,7 @@ void polymer_drawsprite(int32_t snum) i = j = 0; while (j < lightcount) { - while (prlights[i].flags.active == 0 || prlights[i].flags.display == 0) { + while (prlights[i].flags.active == 0) { i++; } @@ -1144,6 +1144,9 @@ int16_t polymer_addlight(_prlight* light) void polymer_deletelight(int16_t lighti) { + if (!prlights[lighti].flags.active) + return; + polymer_removelight(lighti); prlights[lighti].flags.active = 0; @@ -3279,7 +3282,7 @@ static void polymer_drawmdsprite(spritetype *tspr) i = j = 0; while (j < lightcount) { - while (prlights[i].flags.active == 0 || prlights[i].flags.display == 0) { + while (prlights[i].flags.active == 0) { i++; } @@ -3608,10 +3611,8 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile } // PR_BIT_GLOW_MAP -/* if (r_fullbrights && pth && pth->flags & 16) material->glowmap = pth->ofb->glpic; -*/ if (hicfindsubst(tilenum, GLOWPAL, 0)) { @@ -4123,14 +4124,118 @@ static void polymer_compileprogram(int32_t programbits) // LIGHTS +static void polymer_removelight(int16_t lighti) +{ + int32_t i; + _prsector *s; + _prwall *w; + + // XXX: might need to store a list of affected planes in the light record + // if this loop ends up consuming too much cycles + i = 0; + while (i < numsectors) + { + s = prsectors[i]; + + polymer_deleteplanelight(&s->floor, lighti); + polymer_deleteplanelight(&s->ceil, lighti); + + i++; + } + + i = 0; + while (i < numwalls) + { + w = prwalls[i]; + + polymer_deleteplanelight(&w->wall, lighti); + polymer_deleteplanelight(&w->over, lighti); + polymer_deleteplanelight(&w->mask, lighti); + + i++; + } +} + +static void polymer_updatelights(void) +{ + int32_t i; + + while (i < PR_MAXLIGHTS) + { + if (prlights[i].flags.active && prlights[i].flags.invalidate) { + // highly suboptimal + polymer_removelight(i); + + if (prlights[i].radius) + polymer_processspotlight(&prlights[i]); + polymer_culllight(i); + + prlights[i].flags.invalidate = 0; + } + + if (prlights[i].flags.active) + prlights[i].rtindex = -1; + i++; + } +} + +static void polymer_resetlights(void) +{ + int32_t i; + _prsector *s; + _prwall *w; + + i = 0; + while (i < numsectors) + { + s = prsectors[i]; + + polymer_resetplanelights(&s->floor); + polymer_resetplanelights(&s->ceil); + + i++; + } + + i = 0; + while (i < numwalls) + { + w = prwalls[i]; + + polymer_resetplanelights(&w->wall); + polymer_resetplanelights(&w->over); + polymer_resetplanelights(&w->mask); + + i++; + } + + i = 0; + while (i < PR_MAXLIGHTS) + { + prlights[i].flags.active = 0; + i++; + } + + lightcount = 0; +} + +static void polymer_resetplanelights(_prplane* plane) +{ + int32_t i; + + i = 0; + while (i < PR_MAXLIGHTS) + { + plane->lights[i] = -1; + i++; + } + + plane->lightcount = 0; +} static void polymer_addplanelight(_prplane* plane, int16_t lighti) { int16_t i; - if (prlights[lighti].planecnt >= PR_MAXLIGHTS-1) - return; - i = 0; while (i < PR_MAXLIGHTS) { @@ -4138,15 +4243,13 @@ static void polymer_addplanelight(_prplane* plane, int16_t lighti) { plane->lights[i] = lighti; plane->lightcount++; - prlights[lighti].myplanes[prlights[lighti].planecnt] = plane; - prlights[lighti].planecnt++; return; } i++; } } -static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti) +static void polymer_deleteplanelight(_prplane* plane, int16_t lighti) { int16_t i; @@ -4214,118 +4317,6 @@ static void polymer_invalidateplanelights(_prplane* plane) } } - -static void polymer_removelight(int16_t lighti) -{ - int32_t i; - - // XXX: might need to store a list of affected planes in the light record - // if this loop ends up consuming too much cycles - i = prlights[lighti].planecnt-1; - while (i >= 0) - { - polymer_deleteplanelight(prlights[lighti].myplanes[i], lighti); - i--; - } -} - -static void polymer_updatelights(void) -{ - int32_t i, curpriority; - - i = 0; - while (i < PR_MAXLIGHTS) - prlights[i++].flags.display = 0; - - curpriority = 0; - while (curpriority < pr_maxlightpriority) - { - i = 0; - do - { - while (prlights[i].priority != curpriority && i < PR_MAXLIGHTS) - i++; - - if (i == PR_MAXLIGHTS) - break; - - if (prlights[i].flags.active) - { - prlights[i].flags.display = 1; - - if (prlights[i].flags.invalidate) - { - // highly suboptimal - polymer_removelight(i); - - if (prlights[i].radius) - polymer_processspotlight(&prlights[i]); - polymer_culllight(i); - - prlights[i].flags.invalidate = 0; - prlights[i].rtindex = -1; - } - } - i++; - } - while (1); - curpriority++; - } -} - -static void polymer_resetlights(void) -{ - int32_t i; - _prsector *s; - _prwall *w; - - i = 0; - while (i < numsectors) - { - s = prsectors[i]; - - polymer_resetplanelights(&s->floor); - polymer_resetplanelights(&s->ceil); - - i++; - } - - i = 0; - while (i < numwalls) - { - w = prwalls[i]; - - polymer_resetplanelights(&w->wall); - polymer_resetplanelights(&w->over); - polymer_resetplanelights(&w->mask); - - i++; - } - - i = 0; - while (i < PR_MAXLIGHTS) - { - prlights[i].flags.active = 0; - i++; - } - - lightcount = 0; -} - -static void polymer_resetplanelights(_prplane* plane) -{ - int32_t i; - - i = 0; - while (i < PR_MAXLIGHTS) - { - plane->lights[i] = -1; - i++; - } - - plane->lightcount = 0; -} - static void polymer_invalidatesectorlights(int16_t sectnum) { int32_t i; @@ -4432,9 +4423,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); - sectorqueue[0] = light->sector; while (front != back) @@ -4493,7 +4481,7 @@ static void polymer_prepareshadows(void) int16_t oviewangle, oglobalang; int32_t ocosglobalang, osinglobalang; int32_t ocosviewingrangeglobalang, osinviewingrangeglobalang; - int32_t i, j; + int32_t i, j, k; int32_t gx, gy, gz; int32_t oldoverridematerial; @@ -4509,11 +4497,11 @@ static void polymer_prepareshadows(void) ocosviewingrangeglobalang = cosviewingrangeglobalang; osinviewingrangeglobalang = sinviewingrangeglobalang; - i = j = 0; + i = j = k = 0; - while ((i < lightcount) && (j < pr_shadowcount)) + while ((k < lightcount) && (j < pr_shadowcount)) { - while ((prlights[i].flags.active == 0 || prlights[i].flags.display == 0) && i < lightcount) { + while (prlights[i].flags.active == 0) { i++; } @@ -4574,6 +4562,7 @@ static void polymer_prepareshadows(void) j++; } i++; + k++; } globalposx = gx; @@ -4588,79 +4577,6 @@ static void polymer_prepareshadows(void) sinviewingrangeglobalang = osinviewingrangeglobalang; } -static void polymer_applylights(void) -{ - int32_t i, curpriority; - _prlight light; - float fade; - - curpriority = 0; - while (curpriority < PR_MAXLIGHTPRIORITY) - { - i = 0; - while (i < staticlightcount) - { - if ((staticlights[i].priority != curpriority) || - (staticlights[i].priority > pr_maxlightpriority)) - { - i++; - continue; - } - - if (staticlights[i].minshade == staticlights[i].maxshade) - polymer_addlight(&staticlights[i]); - else { - light = staticlights[i]; - - fade = sector[light.sector].floorshade; - fade -= light.minshade; - fade /= light.maxshade - light.minshade; - - if (fade < 0.0f) - fade = 0.0f; - if (fade > 1.0f) - fade = 1.0f; - - light.color[0] *= fade; - light.color[1] *= fade; - light.color[2] *= fade; - - polymer_addlight(&light); - } - i++; - } - - i = 0; - while (i < gamelightcount) - { - if ((gamelights[i].priority != curpriority) || - (gamelights[i].priority > pr_maxlightpriority)) - { - i++; - continue; - } - - polymer_addlight(&gamelights[i]); - i++; - } - - i = 0; - while (i < framelightcount) - { - if ((framelights[i].priority != curpriority) || - (framelights[i].priority > pr_maxlightpriority)) - { - i++; - continue; - } - - polymer_addlight(&framelights[i]); - i++; - } - curpriority++; - } -} - // RENDER TARGETS static void polymer_initrendertargets(int32_t count) {