mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-18 01:21:32 +00:00
- backported some 3D floor changes from GZDoom.
SVN r2517 (trunk)
This commit is contained in:
parent
e9c43fe908
commit
185bd2f15d
4 changed files with 47 additions and 24 deletions
|
@ -680,5 +680,32 @@ void P_Spawn3DFloors (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// Returns a 3D floorplane appropriate for the given coordinates
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
secplane_t P_FindFloorPlane(sector_t * sector, fixed_t x, fixed_t y, fixed_t z)
|
||||||
|
{
|
||||||
|
secplane_t retplane = sector->floorplane;
|
||||||
|
if (sector->e) // apparently this can be called when the data is already gone
|
||||||
|
{
|
||||||
|
for(unsigned int i=0;i<sector->e->XFloor.ffloors.Size();i++)
|
||||||
|
{
|
||||||
|
F3DFloor * rover= sector->e->XFloor.ffloors[i];
|
||||||
|
if(!(rover->flags & FF_SOLID) || !(rover->flags & FF_EXISTS)) continue;
|
||||||
|
|
||||||
|
if (rover->top.plane->ZatPoint(x, y) == z)
|
||||||
|
{
|
||||||
|
retplane = *rover->top.plane;
|
||||||
|
if (retplane.c<0) retplane.FlipVert();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retplane;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -125,6 +125,8 @@ struct FLineOpening;
|
||||||
|
|
||||||
void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *linedef,
|
void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *linedef,
|
||||||
fixed_t x, fixed_t y, fixed_t refx, fixed_t refy);
|
fixed_t x, fixed_t y, fixed_t refx, fixed_t refy);
|
||||||
|
|
||||||
|
secplane_t P_FindFloorPlane(sector_t * sector, fixed_t x, fixed_t y, fixed_t z);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -156,6 +158,8 @@ struct FLineOpening;
|
||||||
inline void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *linedef,
|
inline void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *linedef,
|
||||||
fixed_t x, fixed_t y, fixed_t refx, fixed_t refy) {}
|
fixed_t x, fixed_t y, fixed_t refx, fixed_t refy) {}
|
||||||
|
|
||||||
|
//secplane_t P_FindFloorPlane(sector_t * sector, fixed_t x, fixed_t y, fixed_t z){return sector->floorplane;}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -655,8 +655,14 @@ bool PIT_CheckLine (line_t *ld, const FBoundingBox &box, FCheckPosition &tm)
|
||||||
if (!(tm.thing->flags & MF_DROPOFF) &&
|
if (!(tm.thing->flags & MF_DROPOFF) &&
|
||||||
!(tm.thing->flags & (MF_NOGRAVITY|MF_NOCLIP)))
|
!(tm.thing->flags & (MF_NOGRAVITY|MF_NOCLIP)))
|
||||||
{
|
{
|
||||||
if (ld->frontsector->floorplane.c < STEEPSLOPE ||
|
secplane_t frontplane = ld->frontsector->floorplane;
|
||||||
ld->backsector->floorplane.c < STEEPSLOPE)
|
secplane_t backplane = ld->backsector->floorplane;
|
||||||
|
#ifdef _3DFLOORS
|
||||||
|
// Check 3D floors as well
|
||||||
|
frontplane = P_FindFloorPlane(ld->frontsector, tm.thing->x, tm.thing->y, tm.thing->floorz);
|
||||||
|
backplane = P_FindFloorPlane(ld->backsector, tm.thing->x, tm.thing->y, tm.thing->floorz);
|
||||||
|
#endif
|
||||||
|
if (frontplane.c < STEEPSLOPE || backplane.c < STEEPSLOPE)
|
||||||
{
|
{
|
||||||
const msecnode_t *node = tm.thing->touching_sectorlist;
|
const msecnode_t *node = tm.thing->touching_sectorlist;
|
||||||
bool allow = false;
|
bool allow = false;
|
||||||
|
|
|
@ -3178,41 +3178,27 @@ void AActor::Tick ()
|
||||||
velz <= 0 &&
|
velz <= 0 &&
|
||||||
floorz == z)
|
floorz == z)
|
||||||
{
|
{
|
||||||
const secplane_t * floorplane = &floorsector->floorplane;
|
secplane_t floorplane = floorsector->floorplane;
|
||||||
static secplane_t copyplane;
|
|
||||||
|
|
||||||
#ifdef _3DFLOORS
|
#ifdef _3DFLOORS
|
||||||
// Check 3D floors as well
|
// Check 3D floors as well
|
||||||
if (floorsector->e) // apparently this can be called when the data is already gone-
|
floorplane = P_FindFloorPlane(floorsector, x, y, floorz);
|
||||||
for(unsigned int i=0;i<floorsector->e->XFloor.ffloors.Size();i++)
|
|
||||||
{
|
|
||||||
F3DFloor * rover= floorsector->e->XFloor.ffloors[i];
|
|
||||||
if(!(rover->flags & FF_SOLID) || !(rover->flags & FF_EXISTS)) continue;
|
|
||||||
|
|
||||||
if (rover->top.plane->ZatPoint(x, y) == floorz)
|
|
||||||
{
|
|
||||||
copyplane = *rover->top.plane;
|
|
||||||
if (copyplane.c<0) copyplane.FlipVert();
|
|
||||||
floorplane = ©plane;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (floorplane->c < STEEPSLOPE &&
|
if (floorplane.c < STEEPSLOPE &&
|
||||||
floorplane->ZatPoint (x, y) <= floorz)
|
floorplane.ZatPoint (x, y) <= floorz)
|
||||||
{
|
{
|
||||||
const msecnode_t *node;
|
const msecnode_t *node;
|
||||||
bool dopush = true;
|
bool dopush = true;
|
||||||
|
|
||||||
if (floorplane->c > STEEPSLOPE*2/3)
|
if (floorplane.c > STEEPSLOPE*2/3)
|
||||||
{
|
{
|
||||||
for (node = touching_sectorlist; node; node = node->m_tnext)
|
for (node = touching_sectorlist; node; node = node->m_tnext)
|
||||||
{
|
{
|
||||||
const sector_t *sec = node->m_sector;
|
const sector_t *sec = node->m_sector;
|
||||||
if (sec->floorplane.c >= STEEPSLOPE)
|
if (sec->floorplane.c >= STEEPSLOPE)
|
||||||
{
|
{
|
||||||
if (floorplane->ZatPoint (x, y) >= z - MaxStepHeight)
|
if (floorplane.ZatPoint (x, y) >= z - MaxStepHeight)
|
||||||
{
|
{
|
||||||
dopush = false;
|
dopush = false;
|
||||||
break;
|
break;
|
||||||
|
@ -3222,8 +3208,8 @@ void AActor::Tick ()
|
||||||
}
|
}
|
||||||
if (dopush)
|
if (dopush)
|
||||||
{
|
{
|
||||||
velx += floorplane->a;
|
velx += floorplane.a;
|
||||||
vely += floorplane->b;
|
vely += floorplane.b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue