- fixed: The 3D floor light list should use the last light starting above the ceiling, not the first one.

- fixed: ExtraFloor_LightOnly type 2 was behaving like type 0. Instead anything interrupting it should reset to the sector's own light level.
This commit is contained in:
Christoph Oelckers 2016-01-29 10:54:44 +01:00
parent 058bfdea26
commit 674b81a6b1
2 changed files with 24 additions and 17 deletions

View file

@ -290,6 +290,7 @@ static int P_Set3DFloor(line_t * line, int param, int param2, int alpha)
// if flooding is used the floor must be non-solid and is automatically made shootthrough and seethrough
if ((param2&128) && !(flags & FF_SOLID)) flags |= FF_FLOOD|FF_SEETHROUGH|FF_SHOOTTHROUGH;
if (param2&512) flags |= FF_FADEWALLS;
if (param2&1024) flags |= FF_RESET;
FTextureID tex = line->sidedef[0]->GetTexture(side_t::top);
if (!tex.Exists() && alpha<255)
{
@ -434,6 +435,7 @@ void P_Recalculate3DFloors(sector_t * sector)
fixed_t maxheight, minheight;
unsigned i, j;
lightlist_t newlight;
lightlist_t resetlight; // what it goes back to after FF_DOUBLESHADOW
TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors;
TArray<lightlist_t> & lightlist = sector->e->XFloor.lightlist;
@ -588,7 +590,9 @@ void P_Recalculate3DFloors(sector_t * sector)
lightlist[0].extra_colormap = sector->ColorMap;
lightlist[0].blend = 0;
lightlist[0].flags = 0;
resetlight = lightlist[0];
maxheight = sector->CenterCeiling();
minheight = sector->CenterFloor();
for(i = 0; i < ffloors.Size(); i++)
@ -611,7 +615,7 @@ void P_Recalculate3DFloors(sector_t * sector)
newlight.flags = rover->flags;
lightlist.Push(newlight);
}
else if (i==0)
else //if (i==0)
{
fixed_t ff_bottom=rover->bottom.plane->ZatPoint(CenterSpot(sector));
if (ff_bottom<maxheight)
@ -625,6 +629,18 @@ void P_Recalculate3DFloors(sector_t * sector)
lightlist[0].flags = rover->flags;
}
}
if (!(rover->flags & (FF_DOUBLESHADOW | FF_RESET)))
{
resetlight = lightlist.Last();
}
else if (rover->flags & FF_RESET)
{
resetlight.p_lightlevel = &sector->lightlevel;
resetlight.lightsource = NULL;
resetlight.extra_colormap = sector->ColorMap;
resetlight.blend = 0;
}
if (rover->flags&FF_DOUBLESHADOW)
{
fixed_t ff_bottom=rover->bottom.plane->ZatPoint(CenterSpot(sector));
@ -632,20 +648,10 @@ void P_Recalculate3DFloors(sector_t * sector)
{
newlight.caster = rover;
newlight.plane = *rover->bottom.plane;
if (lightlist.Size()>1)
{
newlight.lightsource = lightlist[lightlist.Size()-2].lightsource;
newlight.p_lightlevel = lightlist[lightlist.Size()-2].p_lightlevel;
newlight.extra_colormap = lightlist[lightlist.Size()-2].extra_colormap;
newlight.blend = lightlist[lightlist.Size()-2].blend;
}
else
{
newlight.lightsource = NULL;
newlight.p_lightlevel = &sector->lightlevel;
newlight.extra_colormap = sector->ColorMap;
newlight.blend = 0;
}
newlight.lightsource = resetlight.lightsource;
newlight.p_lightlevel = resetlight.p_lightlevel;
newlight.extra_colormap = resetlight.extra_colormap;
newlight.blend = resetlight.blend;
newlight.flags = rover->flags;
lightlist.Push(newlight);
}
@ -825,7 +831,7 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li
//==========================================================================
void P_Spawn3DFloors (void)
{
static int flagvals[] = {128+512, 2+512, 512};
static int flagvals[] = {512, 2+512, 512+1024};
int i;
line_t * line;

View file

@ -35,6 +35,7 @@ typedef enum
FF_ADDITIVETRANS = 0x10000000, // Render this floor with additive translucency
FF_FLOOD = 0x20000000, // extends towards the next lowest flooding or solid 3D floor or the bottom of the sector
FF_THISINSIDE = 0x40000000, // hack for software 3D with FF_BOTHPLANES
FF_RESET = 0x80000000, // light effect is completely reset, once interrupted
} ffloortype_e;
// This is for the purpose of Sector_SetContents: