mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- moved the initial 3D floor check from Trace to TraceTraverse, because that's where it will be needed for handling portals.
This commit is contained in:
parent
9f805daa73
commit
0c37a90e32
2 changed files with 88 additions and 74 deletions
159
src/p_trace.cpp
159
src/p_trace.cpp
|
@ -56,6 +56,7 @@ struct FTraceInfo
|
||||||
void *TraceCallbackData;
|
void *TraceCallbackData;
|
||||||
DWORD TraceFlags;
|
DWORD TraceFlags;
|
||||||
int inshootthrough;
|
int inshootthrough;
|
||||||
|
fixed_t startfrac;
|
||||||
|
|
||||||
// These are required for 3D-floor checking
|
// These are required for 3D-floor checking
|
||||||
// to create a fake sector with a floor
|
// to create a fake sector with a floor
|
||||||
|
@ -108,78 +109,8 @@ bool Trace (fixed_t x, fixed_t y, fixed_t z, sector_t *sector,
|
||||||
res.Crossed3DWater = NULL;
|
res.Crossed3DWater = NULL;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Do a 3D floor check in the starting sector
|
|
||||||
TDeletingArray<F3DFloor*> &ff = sector->e->XFloor.ffloors;
|
|
||||||
|
|
||||||
if (ff.Size())
|
|
||||||
{
|
|
||||||
memcpy(&inf.DummySector[0],sector,sizeof(sector_t));
|
|
||||||
inf.CurSector=sector=&inf.DummySector[0];
|
|
||||||
inf.sectorsel=1;
|
|
||||||
fixed_t bf = sector->floorplane.ZatPoint (x, y);
|
|
||||||
fixed_t bc = sector->ceilingplane.ZatPoint (x, y);
|
|
||||||
|
|
||||||
for(unsigned int i=0;i<ff.Size();i++)
|
|
||||||
{
|
|
||||||
F3DFloor * rover=ff[i];
|
|
||||||
if (!(rover->flags&FF_EXISTS))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (rover->flags&FF_SWIMMABLE && res.Crossed3DWater == NULL)
|
|
||||||
{
|
|
||||||
if (inf.Check3DFloorPlane(rover, false))
|
|
||||||
res.Crossed3DWater = rover;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(rover->flags&FF_SHOOTTHROUGH))
|
|
||||||
{
|
|
||||||
fixed_t ff_bottom=rover->bottom.plane->ZatPoint(x, y);
|
|
||||||
fixed_t ff_top=rover->top.plane->ZatPoint(x, y);
|
|
||||||
// clip to the part of the sector we are in
|
|
||||||
if (z>ff_top)
|
|
||||||
{
|
|
||||||
// above
|
|
||||||
if (bf<ff_top)
|
|
||||||
{
|
|
||||||
sector->floorplane=*rover->top.plane;
|
|
||||||
sector->SetTexture(sector_t::floor, *rover->top.texture, false);
|
|
||||||
bf=ff_top;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (z<ff_bottom)
|
|
||||||
{
|
|
||||||
//below
|
|
||||||
if (bc>ff_bottom)
|
|
||||||
{
|
|
||||||
sector->ceilingplane=*rover->bottom.plane;
|
|
||||||
sector->SetTexture(sector_t::ceiling, *rover->bottom.texture, false);
|
|
||||||
bc=ff_bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// inside
|
|
||||||
if (bf<ff_bottom)
|
|
||||||
{
|
|
||||||
sector->floorplane=*rover->bottom.plane;
|
|
||||||
sector->SetTexture(sector_t::floor, *rover->bottom.texture, false);
|
|
||||||
bf=ff_bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bc>ff_top)
|
|
||||||
{
|
|
||||||
sector->ceilingplane=*rover->top.plane;
|
|
||||||
sector->SetTexture(sector_t::ceiling, *rover->top.texture, false);
|
|
||||||
bc=ff_top;
|
|
||||||
}
|
|
||||||
inf.inshootthrough = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for overflows and clip if necessary
|
// check for overflows and clip if necessary
|
||||||
SQWORD xd = (SQWORD)x + ( ( SQWORD(vx) * SQWORD(maxDist) )>>16);
|
SQWORD xd = (SQWORD)x + ((SQWORD(vx) * SQWORD(maxDist)) >> 16);
|
||||||
|
|
||||||
if (xd>SQWORD(32767)*FRACUNIT)
|
if (xd>SQWORD(32767)*FRACUNIT)
|
||||||
{
|
{
|
||||||
|
@ -191,15 +122,15 @@ bool Trace (fixed_t x, fixed_t y, fixed_t z, sector_t *sector,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SQWORD yd = (SQWORD)y + ( ( SQWORD(vy) * SQWORD(maxDist) )>>16);
|
SQWORD yd = (SQWORD)y + ((SQWORD(vy) * SQWORD(maxDist)) >> 16);
|
||||||
|
|
||||||
if (yd>SQWORD(32767)*FRACUNIT)
|
if (yd>SQWORD(32767)*FRACUNIT)
|
||||||
{
|
{
|
||||||
maxDist = inf.MaxDist=FixedDiv(FIXED_MAX-y,vy);
|
maxDist = inf.MaxDist = FixedDiv(FIXED_MAX - y, vy);
|
||||||
}
|
}
|
||||||
else if (yd<-SQWORD(32767)*FRACUNIT)
|
else if (yd<-SQWORD(32767)*FRACUNIT)
|
||||||
{
|
{
|
||||||
maxDist = inf.MaxDist=FixedDiv(FIXED_MIN-y,vy);
|
maxDist = inf.MaxDist = FixedDiv(FIXED_MIN - y, vy);
|
||||||
}
|
}
|
||||||
|
|
||||||
// recalculate the trace's end points for robustness
|
// recalculate the trace's end points for robustness
|
||||||
|
@ -250,6 +181,86 @@ bool Trace (fixed_t x, fixed_t y, fixed_t z, sector_t *sector,
|
||||||
|
|
||||||
bool FTraceInfo::TraceTraverse (int ptflags)
|
bool FTraceInfo::TraceTraverse (int ptflags)
|
||||||
{
|
{
|
||||||
|
// Do a 3D floor check in the starting sector
|
||||||
|
TDeletingArray<F3DFloor*> &ff = CurSector->e->XFloor.ffloors;
|
||||||
|
|
||||||
|
if (ff.Size())
|
||||||
|
{
|
||||||
|
memcpy(&DummySector[0], CurSector, sizeof(sector_t));
|
||||||
|
CurSector = &DummySector[0];
|
||||||
|
sectorsel = 1;
|
||||||
|
|
||||||
|
fixed_t sdist = FixedMul(MaxDist, startfrac);
|
||||||
|
fixed_t x = StartX + FixedMul(Vx, sdist);
|
||||||
|
fixed_t y = StartY + FixedMul(Vy, sdist);
|
||||||
|
fixed_t z = StartZ + FixedMul(Vz, sdist);
|
||||||
|
|
||||||
|
fixed_t bf = CurSector->floorplane.ZatPoint(x, y);
|
||||||
|
fixed_t bc = CurSector->ceilingplane.ZatPoint(x, y);
|
||||||
|
|
||||||
|
for (auto rover : ff)
|
||||||
|
{
|
||||||
|
if (!(rover->flags&FF_EXISTS))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (rover->flags&FF_SWIMMABLE && Results->Crossed3DWater == NULL)
|
||||||
|
{
|
||||||
|
if (Check3DFloorPlane(rover, false))
|
||||||
|
Results->Crossed3DWater = rover;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(rover->flags&FF_SHOOTTHROUGH))
|
||||||
|
{
|
||||||
|
fixed_t ff_bottom = rover->bottom.plane->ZatPoint(x, y);
|
||||||
|
fixed_t ff_top = rover->top.plane->ZatPoint(x, y);
|
||||||
|
// clip to the part of the sector we are in
|
||||||
|
if (z>ff_top)
|
||||||
|
{
|
||||||
|
// above
|
||||||
|
if (bf<ff_top)
|
||||||
|
{
|
||||||
|
CurSector->floorplane = *rover->top.plane;
|
||||||
|
CurSector->SetTexture(sector_t::floor, *rover->top.texture, false);
|
||||||
|
CurSector->SkyBoxes[sector_t::floor] == NULL;
|
||||||
|
bf = ff_top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (z<ff_bottom)
|
||||||
|
{
|
||||||
|
//below
|
||||||
|
if (bc>ff_bottom)
|
||||||
|
{
|
||||||
|
CurSector->ceilingplane = *rover->bottom.plane;
|
||||||
|
CurSector->SetTexture(sector_t::ceiling, *rover->bottom.texture, false);
|
||||||
|
bc = ff_bottom;
|
||||||
|
CurSector->SkyBoxes[sector_t::ceiling] == NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// inside
|
||||||
|
if (bf<ff_bottom)
|
||||||
|
{
|
||||||
|
CurSector->floorplane = *rover->bottom.plane;
|
||||||
|
CurSector->SetTexture(sector_t::floor, *rover->bottom.texture, false);
|
||||||
|
CurSector->SkyBoxes[sector_t::floor] == NULL;
|
||||||
|
bf = ff_bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bc>ff_top)
|
||||||
|
{
|
||||||
|
CurSector->ceilingplane = *rover->top.plane;
|
||||||
|
CurSector->SetTexture(sector_t::ceiling, *rover->top.texture, false);
|
||||||
|
CurSector->SkyBoxes[sector_t::ceiling] == NULL;
|
||||||
|
bc = ff_top;
|
||||||
|
}
|
||||||
|
inshootthrough = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
FPathTraverse it(StartX, StartY, FixedMul (Vx, MaxDist), FixedMul (Vy, MaxDist), ptflags | PT_DELTA);
|
FPathTraverse it(StartX, StartY, FixedMul (Vx, MaxDist), FixedMul (Vy, MaxDist), ptflags | PT_DELTA);
|
||||||
intercept_t *in;
|
intercept_t *in;
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,9 @@ struct FTraceResults
|
||||||
sector_t *Sector;
|
sector_t *Sector;
|
||||||
FTextureID HitTexture;
|
FTextureID HitTexture;
|
||||||
fixed_t X, Y, Z;
|
fixed_t X, Y, Z;
|
||||||
|
fixedvec3 SrcFromTarget;
|
||||||
|
angle_t SrcAngleToTarget;
|
||||||
|
|
||||||
fixed_t Distance;
|
fixed_t Distance;
|
||||||
fixed_t Fraction;
|
fixed_t Fraction;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue