More light crap

git-svn-id: https://svn.eduke32.com/eduke32@1410 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2009-06-07 03:13:55 +00:00
parent 0744452216
commit 6c3ed1ec9c
5 changed files with 86 additions and 44 deletions

View file

@ -10380,15 +10380,18 @@ int32_t sectorofwall(int16_t theline)
// //
int32_t getceilzofslope(int16_t sectnum, int32_t dax, int32_t day) int32_t getceilzofslope(int16_t sectnum, int32_t dax, int32_t day)
{ {
if (!(sector[sectnum].ceilingstat&2)) return(sector[sectnum].ceilingz);
{
int32_t dx, dy, i, j; int32_t dx, dy, i, j;
walltype *wal; walltype *wal;
if (!(sector[sectnum].ceilingstat&2)) return(sector[sectnum].ceilingz);
wal = &wall[sector[sectnum].wallptr]; wal = &wall[sector[sectnum].wallptr];
dx = wall[wal->point2].x-wal->x; dy = wall[wal->point2].y-wal->y; dx = wall[wal->point2].x-wal->x; dy = wall[wal->point2].y-wal->y;
i = (nsqrtasm(dx*dx+dy*dy)<<5); if (i == 0) return(sector[sectnum].ceilingz); i = (nsqrtasm(dx*dx+dy*dy)<<5); if (i == 0) return(sector[sectnum].ceilingz);
j = dmulscale3(dx,day-wal->y,-dy,dax-wal->x); j = dmulscale3(dx,day-wal->y,-dy,dax-wal->x);
return(sector[sectnum].ceilingz+(scale(sector[sectnum].ceilingheinum,j>>1,i)<<1)); return(sector[sectnum].ceilingz+(scale(sector[sectnum].ceilingheinum,j>>1,i)<<1));
}
} }
@ -10397,15 +10400,18 @@ int32_t getceilzofslope(int16_t sectnum, int32_t dax, int32_t day)
// //
int32_t getflorzofslope(int16_t sectnum, int32_t dax, int32_t day) int32_t getflorzofslope(int16_t sectnum, int32_t dax, int32_t day)
{ {
if (!(sector[sectnum].floorstat&2)) return(sector[sectnum].floorz);
{
int32_t dx, dy, i, j; int32_t dx, dy, i, j;
walltype *wal; walltype *wal;
if (!(sector[sectnum].floorstat&2)) return(sector[sectnum].floorz);
wal = &wall[sector[sectnum].wallptr]; wal = &wall[sector[sectnum].wallptr];
dx = wall[wal->point2].x-wal->x; dy = wall[wal->point2].y-wal->y; dx = wall[wal->point2].x-wal->x; dy = wall[wal->point2].y-wal->y;
i = (nsqrtasm(dx*dx+dy*dy)<<5); if (i == 0) return(sector[sectnum].floorz); i = (nsqrtasm(dx*dx+dy*dy)<<5); if (i == 0) return(sector[sectnum].floorz);
j = dmulscale3(dx,day-wal->y,-dy,dax-wal->x); j = dmulscale3(dx,day-wal->y,-dy,dax-wal->x);
return(sector[sectnum].floorz+(scale(sector[sectnum].floorheinum,j>>1,i)<<1)); return(sector[sectnum].floorz+(scale(sector[sectnum].floorheinum,j>>1,i)<<1));
}
} }

View file

@ -4147,8 +4147,6 @@ static void polymer_removelight(int16_t lighti)
{ {
int32_t i; 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; i = prlights[lighti].planecnt-1;
while (i >= 0) while (i >= 0)
{ {
@ -4241,13 +4239,12 @@ static void polymer_addplanelight(_prplane* plane, int16_t lighti)
return; return;
i = 0; i = 0;
while (i < PR_MAXLIGHTS) do
{ {
if ((plane->lights[i] != -1) && (prlights[plane->lights[i]].priority >= prlights[lighti].priority)) if ((plane->lights[i] != -1) && (prlights[plane->lights[i]].priority < prlights[lighti].priority))
break; { i++; continue; }
if (plane->lights[i] == -1) 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->lights[i] = lighti;
@ -4256,8 +4253,7 @@ static void polymer_addplanelight(_prplane* plane, int16_t lighti)
prlights[lighti].planecnt++; prlights[lighti].planecnt++;
return; return;
} }
i++; while (i < PR_MAXLIGHTS);
}
} }
static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti) static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
@ -4265,7 +4261,7 @@ static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
int16_t i; int16_t i;
i = 0; i = 0;
while (i < PR_MAXLIGHTS) do
{ {
if (plane->lights[i] == lighti) if (plane->lights[i] == lighti)
{ {
@ -4277,6 +4273,7 @@ static inline void polymer_deleteplanelight(_prplane* plane, int16_t lighti)
} }
i++; i++;
} }
while (i < PR_MAXLIGHTS);
} }
static int32_t polymer_planeinlight(_prplane* plane, _prlight* light) static int32_t polymer_planeinlight(_prplane* plane, _prlight* light)
@ -4296,22 +4293,24 @@ static int32_t polymer_planeinlight(_prplane* plane, _prlight* light)
i = 0; i = 0;
while (i < 3) do
{ {
j = k = l = 0; j = k = l = 0;
while (j < plane->vertcount) do
{ {
if (plane->buffer[(j * 5) + i] > (lightpos[i] + light->range)) k++; if (plane->buffer[(j * 5) + i] > (lightpos[i] + light->range)) k++;
if (plane->buffer[(j * 5) + i] < (lightpos[i] - light->range)) l++; if (plane->buffer[(j * 5) + i] < (lightpos[i] - light->range)) l++;
j++; j++;
} }
while (j < plane->vertcount);
if ((k == plane->vertcount) || (l == plane->vertcount)) if ((k == plane->vertcount) || (l == plane->vertcount))
return 0; return 0;
i++; i++;
} }
while (i < 3);
return 1; return 1;
} }
@ -4420,12 +4419,14 @@ static void polymer_processspotlight(_prlight* light)
} }
} }
static inline void polymer_culllight(int16_t lighti) static inline void polymer_culllight(int16_t lighti)
{ {
_prlight* light; _prlight* light;
int32_t front; int32_t front;
int32_t back; int32_t back;
int32_t i; int32_t i;
int32_t j;
_prsector *s; _prsector *s;
_prwall *w; _prwall *w;
sectortype *sec; sectortype *sec;
@ -4448,10 +4449,19 @@ static inline void polymer_culllight(int16_t lighti)
polymer_pokesector(sectorqueue[front]); polymer_pokesector(sectorqueue[front]);
j = 0;
if (polymer_planeinlight(&s->floor, light)) { if (polymer_planeinlight(&s->floor, light)) {
// this lets us skip the polymer_planeinlight check for the ceiling when we know it will pass
// I doubt this saves us much but it might be faster on complex sectors than the loop
if (!light->radius &&
((light->z - getceilzofslope(light->sector, light->x, light->y)) >> 4) < light->range)
j++;
polymer_addplanelight(&s->floor, lighti); polymer_addplanelight(&s->floor, lighti);
} }
if (polymer_planeinlight(&s->ceil, light)) {
if (j /*|| polymer_planeinlight(&s->ceil, light)*/) {
polymer_addplanelight(&s->ceil, lighti); polymer_addplanelight(&s->ceil, lighti);
} }
@ -4460,14 +4470,21 @@ static inline void polymer_culllight(int16_t lighti)
{ {
w = prwalls[sec->wallptr + i]; w = prwalls[sec->wallptr + i];
j = 0;
if (polymer_planeinlight(&w->wall, light)) { if (polymer_planeinlight(&w->wall, light)) {
polymer_addplanelight(&w->wall, lighti); polymer_addplanelight(&w->wall, lighti);
j++;
} }
if (polymer_planeinlight(&w->over, light)) { if (polymer_planeinlight(&w->over, light)) {
polymer_addplanelight(&w->over, lighti); polymer_addplanelight(&w->over, lighti);
j++;
} }
// assume the light hits the middle section if it hits the top and bottom
if (wallvisible(light->x, light->y, sec->wallptr + i) && if (wallvisible(light->x, light->y, sec->wallptr + i) &&
polymer_planeinlight(&w->mask, light)) { (j == 2 || polymer_planeinlight(&w->mask, light))) {
if ((w->mask.vertcount == 4) && if ((w->mask.vertcount == 4) &&
(w->mask.buffer[(0 * 5) + 1] >= w->mask.buffer[(3 * 5) + 1]) && (w->mask.buffer[(0 * 5) + 1] >= w->mask.buffer[(3 * 5) + 1]) &&
(w->mask.buffer[(1 * 5) + 1] >= w->mask.buffer[(2 * 5) + 1])) (w->mask.buffer[(1 * 5) + 1] >= w->mask.buffer[(2 * 5) + 1]))

View file

@ -601,7 +601,7 @@ inline void G_AddGameLight(int32_t radius, int32_t srcsprite, int32_t zoffset, i
mylight.color[1] = (color>>8)&255; mylight.color[1] = (color>>8)&255;
mylight.color[2] = (color>>16)&255; mylight.color[2] = (color>>16)&255;
mylight.radius = radius; mylight.radius = radius;
mylight.range = range; ActorExtra[srcsprite].maxrange = mylight.range = range;
mylight.priority = priority; mylight.priority = priority;
@ -612,8 +612,12 @@ inline void G_AddGameLight(int32_t radius, int32_t srcsprite, int32_t zoffset, i
} }
s->z -= zoffset; s->z -= zoffset;
if (Bmemcmp(&sprite[srcsprite], ActorExtra[srcsprite].lightptr, sizeof(int32_t) * 3)) if (range > ActorExtra[srcsprite].maxrange ||
Bmemcmp(&sprite[srcsprite], ActorExtra[srcsprite].lightptr, sizeof(int32_t) * 3))
{ {
if (range > ActorExtra[srcsprite].maxrange)
ActorExtra[srcsprite].maxrange = range;
Bmemcpy(ActorExtra[srcsprite].lightptr, &sprite[srcsprite], sizeof(int32_t) * 3); Bmemcpy(ActorExtra[srcsprite].lightptr, &sprite[srcsprite], sizeof(int32_t) * 3);
ActorExtra[srcsprite].lightptr->sector = s->sectnum; ActorExtra[srcsprite].lightptr->sector = s->sectnum;
ActorExtra[srcsprite].lightptr->flags.invalidate = 1; ActorExtra[srcsprite].lightptr->flags.invalidate = 1;
@ -665,7 +669,7 @@ static void G_MoveZombieActors(void)
case FLOORFLAME__STATIC: case FLOORFLAME__STATIC:
case FIREBARREL__STATIC: case FIREBARREL__STATIC:
case FIREVASE__STATIC: case FIREVASE__STATIC:
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
break; break;
case ATOMICHEALTH__STATIC: case ATOMICHEALTH__STATIC:
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), 2048, 128+(128<<8)+(255<<16),PR_LIGHT_PRIO_HIGH_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), 2048, 128+(128<<8)+(255<<16),PR_LIGHT_PRIO_HIGH_GAME);
@ -677,7 +681,7 @@ static void G_MoveZombieActors(void)
if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break; if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break;
if (s->z > ActorExtra[i].floorz+2048) break; if (s->z > ActorExtra[i].floorz+2048) break;
*/ */
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
break; break;
case BURNING__STATIC: case BURNING__STATIC:
case BURNING2__STATIC: case BURNING2__STATIC:
@ -685,7 +689,7 @@ static void G_MoveZombieActors(void)
if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break; if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break;
if (s->z > ActorExtra[i].floorz + 2048) break; if (s->z > ActorExtra[i].floorz + 2048) break;
*/ */
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
break; break;
case EXPLOSION2__STATIC: case EXPLOSION2__STATIC:
@ -2250,7 +2254,7 @@ CLEAR_THE_BOLT:
case FLOORFLAME__STATIC: case FLOORFLAME__STATIC:
case FIREBARREL__STATIC: case FIREBARREL__STATIC:
case FIREVASE__STATIC: case FIREVASE__STATIC:
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
case EXPLODINGBARREL__STATIC: case EXPLODINGBARREL__STATIC:
case WOODENHORSE__STATIC: case WOODENHORSE__STATIC:
case HORSEONSIDE__STATIC: case HORSEONSIDE__STATIC:
@ -3470,7 +3474,7 @@ static void G_MoveActors(void)
if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break; if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break;
if (s->z > ActorExtra[i].floorz+2048) break; if (s->z > ActorExtra[i].floorz+2048) break;
*/ */
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
break; break;
case DUCK__STATIC: case DUCK__STATIC:
@ -5225,7 +5229,7 @@ static void G_MoveMisc(void) // STATNUM 5
if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break; if (ActorExtra[i].floorz - ActorExtra[i].ceilingz < 128) break;
if (s->z > ActorExtra[i].floorz + 2048) break; if (s->z > ActorExtra[i].floorz + 2048) break;
*/ */
G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_MAX_GAME); G_AddGameLight(0, i, ((s->yrepeat*tilesizy[s->picnum])<<1), LIGHTRAD, 255+(95<<8),PR_LIGHT_PRIO_HIGH_GAME);
break; break;
case EXPLOSION2__STATIC: case EXPLOSION2__STATIC:

View file

@ -549,6 +549,7 @@ typedef struct {
#ifdef POLYMER #ifdef POLYMER
int16_t lightId; int16_t lightId;
int16_t lightcount; // how many tics until light is killed int16_t lightcount; // how many tics until light is killed
int16_t maxrange;
_prlight *lightptr; _prlight *lightptr;
#endif #endif
} ActorData_t; } ActorData_t;

View file

@ -587,8 +587,22 @@ int32_t G_LoadPlayer(int32_t spot)
G_ResetTimers(); G_ResetTimers();
#ifdef POLYMER #ifdef POLYMER
if (getrendermode() >= 4) if (getrendermode() == 4)
{
int32_t i = 0;
polymer_loadboard(); polymer_loadboard();
while (i < MAXSPRITES)
{
if (ActorExtra[i].lightptr)
{
polymer_deletelight(ActorExtra[i].lightId);
ActorExtra[i].lightptr = NULL;
ActorExtra[i].lightId = -1;
}
i++;
}
}
#endif #endif
return(0); return(0);