mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-27 22:52:41 +00:00
Merge branch 'improve-slope-physics-on-solid-middle-textures' into 'next'
Improve slope physics on solid middle textures See merge request STJr/SRB2!2455
This commit is contained in:
commit
c8bffdea66
4 changed files with 137 additions and 8 deletions
|
@ -544,16 +544,18 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||||
if (delta1 > delta2) { // Below
|
if (delta1 > delta2) { // Below
|
||||||
if (opentop > texbottom) {
|
if (opentop > texbottom) {
|
||||||
opentop = texbottom;
|
opentop = texbottom;
|
||||||
if ((linedef->flags & ML_MIDPEG) != 0) {
|
if (linedef->flags & ML_NOSKEW)
|
||||||
opentopslope = openbottomslope;
|
opentopslope = NULL;
|
||||||
}
|
else
|
||||||
|
opentopslope = linedef->midtexslope;
|
||||||
}
|
}
|
||||||
} else { // Above
|
} else { // Above
|
||||||
if (openbottom < textop) {
|
if (openbottom < textop) {
|
||||||
openbottom = textop;
|
openbottom = textop;
|
||||||
if ((linedef->flags & ML_MIDPEG) == 0) {
|
if (linedef->flags & ML_NOSKEW)
|
||||||
openbottomslope = opentopslope;
|
openbottomslope = NULL;
|
||||||
}
|
else
|
||||||
|
openbottomslope = linedef->midtexslope;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1113,6 +1113,8 @@ static void P_InitializeLinedef(line_t *ld)
|
||||||
ld->callcount = 0;
|
ld->callcount = 0;
|
||||||
ld->secportal = UINT32_MAX;
|
ld->secportal = UINT32_MAX;
|
||||||
|
|
||||||
|
ld->midtexslope = NULL;
|
||||||
|
|
||||||
// cph 2006/09/30 - fix sidedef errors right away.
|
// cph 2006/09/30 - fix sidedef errors right away.
|
||||||
// cph 2002/07/20 - these errors are fatal if not fixed, so apply them
|
// cph 2002/07/20 - these errors are fatal if not fixed, so apply them
|
||||||
for (j = 0; j < 2; j++)
|
for (j = 0; j < 2; j++)
|
||||||
|
|
127
src/p_slopes.c
127
src/p_slopes.c
|
@ -28,6 +28,8 @@
|
||||||
pslope_t *slopelist = NULL;
|
pslope_t *slopelist = NULL;
|
||||||
UINT16 slopecount = 0;
|
UINT16 slopecount = 0;
|
||||||
|
|
||||||
|
static void P_UpdateMidtextureSlopesForSector(sector_t *sector);
|
||||||
|
|
||||||
// Calculate line normal
|
// Calculate line normal
|
||||||
void P_CalculateSlopeNormal(pslope_t *slope)
|
void P_CalculateSlopeNormal(pslope_t *slope)
|
||||||
{
|
{
|
||||||
|
@ -212,6 +214,9 @@ void T_DynamicSlopeLine (dynlineplanethink_t* th)
|
||||||
slope->zangle = R_PointToAngle2(0, 0, th->extent, -zdelta);
|
slope->zangle = R_PointToAngle2(0, 0, th->extent, -zdelta);
|
||||||
slope->moved = true;
|
slope->moved = true;
|
||||||
P_CalculateSlopeNormal(slope);
|
P_CalculateSlopeNormal(slope);
|
||||||
|
P_UpdateMidtextureSlopesForSector(srcline->frontsector);
|
||||||
|
if (srcline->backsector)
|
||||||
|
P_UpdateMidtextureSlopesForSector(srcline->backsector);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,6 +237,12 @@ void T_DynamicSlopeVert (dynvertexplanethink_t* th)
|
||||||
}
|
}
|
||||||
|
|
||||||
ReconfigureViaVertexes(th->slope, th->vex[0], th->vex[1], th->vex[2]);
|
ReconfigureViaVertexes(th->slope, th->vex[0], th->vex[1], th->vex[2]);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
if (th->secs[i])
|
||||||
|
P_UpdateMidtextureSlopesForSector(th->secs[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void P_AddDynLineSlopeThinker (pslope_t* slope, dynplanetype_t type, line_t* sourceline, fixed_t extent)
|
static inline void P_AddDynLineSlopeThinker (pslope_t* slope, dynplanetype_t type, line_t* sourceline, fixed_t extent)
|
||||||
|
@ -758,6 +769,111 @@ pslope_t *P_MakeSlopeViaEquationConstants(const double a, const double b, const
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pslope_t *P_GetReferenceSlopeForMidtexture(line_t *line)
|
||||||
|
{
|
||||||
|
if (line->flags & ML_MIDPEG)
|
||||||
|
{
|
||||||
|
// Line has ML_MIDPEG, so use the floor slope
|
||||||
|
fixed_t frontheight = P_GetSectorFloorZAt(line->frontsector, line->v1->x, line->v1->y);
|
||||||
|
fixed_t backheight = P_GetSectorFloorZAt(line->backsector, line->v1->x, line->v1->y);
|
||||||
|
|
||||||
|
if (frontheight > backheight)
|
||||||
|
{
|
||||||
|
return line->frontsector->f_slope;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return line->backsector->f_slope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Line does not have ML_MIDPEG, so use the ceiling slope
|
||||||
|
fixed_t frontheight = P_GetSectorCeilingZAt(line->frontsector, line->v1->x, line->v1->y);
|
||||||
|
fixed_t backheight = P_GetSectorCeilingZAt(line->backsector, line->v1->x, line->v1->y);
|
||||||
|
|
||||||
|
if (frontheight < backheight)
|
||||||
|
{
|
||||||
|
return line->frontsector->c_slope;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return line->backsector->c_slope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates a slope for a solid midtexture based on the slope of the sector it's in.
|
||||||
|
static void P_UpdateSolidMidtextureSlope(line_t *line, pslope_t *ref)
|
||||||
|
{
|
||||||
|
pslope_t *slope = line->midtexslope;
|
||||||
|
|
||||||
|
if (ref == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Set origin
|
||||||
|
vector3_t origin;
|
||||||
|
origin.x = line->v1->x;
|
||||||
|
origin.y = line->v1->y;
|
||||||
|
origin.z = P_GetSlopeZAt(ref, origin.x, origin.y);
|
||||||
|
FV3_Copy(&slope->o, &origin);
|
||||||
|
|
||||||
|
// Get where the line ends
|
||||||
|
vector3_t point;
|
||||||
|
point.x = line->v2->x;
|
||||||
|
point.y = line->v2->y;
|
||||||
|
point.z = P_GetSlopeZAt(ref, point.x, point.y);
|
||||||
|
|
||||||
|
// Get length of the line
|
||||||
|
fixed_t extent = R_PointToDist2(0, 0, line->dx, line->dy);
|
||||||
|
|
||||||
|
// Precalculate variables
|
||||||
|
slope->zdelta = FixedDiv(origin.z - point.z, extent);
|
||||||
|
slope->zangle = R_PointToAngle2(0, origin.z, extent, point.z);
|
||||||
|
slope->xydirection = line->angle;
|
||||||
|
|
||||||
|
// Precalculate the direction
|
||||||
|
vector2_t dir;
|
||||||
|
dir.x = FixedMul(FINECOSINE(slope->zangle >> ANGLETOFINESHIFT), FINECOSINE((slope->xydirection+ANGLE_180) >> ANGLETOFINESHIFT));
|
||||||
|
dir.y = FixedMul(FINECOSINE(slope->zangle >> ANGLETOFINESHIFT), FINESINE((slope->xydirection+ANGLE_180) >> ANGLETOFINESHIFT));
|
||||||
|
FV2_Copy(&slope->d, &dir);
|
||||||
|
|
||||||
|
P_CalculateSlopeNormal(slope);
|
||||||
|
|
||||||
|
// Calling P_CalculateSlopeVectors is not necessary.
|
||||||
|
slope->moved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Goes through every line in the sector and updates the midtexture slope if it is present
|
||||||
|
static void P_UpdateMidtextureSlopesForSector(sector_t *sector)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < sector->linecount; i++)
|
||||||
|
{
|
||||||
|
if (sector->lines[i]->midtexslope != NULL)
|
||||||
|
P_UpdateSolidMidtextureSlope(sector->lines[i], P_GetReferenceSlopeForMidtexture(sector->lines[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates a solid midtexture slope for the line if possible
|
||||||
|
static void P_CreateSolidMidtextureSlope(line_t *line)
|
||||||
|
{
|
||||||
|
if (line->backsector == NULL) // Ignore single-sided lines (of course)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((line->flags & ML_MIDSOLID) == 0) // Ignore if the midtexture is not solid
|
||||||
|
return;
|
||||||
|
|
||||||
|
pslope_t *ref = P_GetReferenceSlopeForMidtexture(line);
|
||||||
|
if (ref)
|
||||||
|
{
|
||||||
|
line->midtexslope = Slope_Add(ref->flags & SL_NOPHYSICS);
|
||||||
|
|
||||||
|
P_UpdateSolidMidtextureSlope(line, ref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Initializes and reads the slopes from the map data.
|
/// Initializes and reads the slopes from the map data.
|
||||||
void P_SpawnSlopes(const boolean fromsave) {
|
void P_SpawnSlopes(const boolean fromsave) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -785,14 +901,21 @@ void P_SpawnSlopes(const boolean fromsave) {
|
||||||
|
|
||||||
/// Copies slopes from tagged sectors via line specials.
|
/// Copies slopes from tagged sectors via line specials.
|
||||||
/// \note Doesn't actually copy, but instead they share the same pointers.
|
/// \note Doesn't actually copy, but instead they share the same pointers.
|
||||||
|
// Also, creates midtexture slopes.
|
||||||
for (i = 0; i < numlines; i++)
|
for (i = 0; i < numlines; i++)
|
||||||
switch (lines[i].special)
|
{
|
||||||
|
line_t *line = &lines[i];
|
||||||
|
|
||||||
|
switch (line->special)
|
||||||
{
|
{
|
||||||
case 720:
|
case 720:
|
||||||
P_CopySectorSlope(&lines[i]);
|
P_CopySectorSlope(line);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
P_CreateSolidMidtextureSlope(line);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initializes slopes.
|
/// Initializes slopes.
|
||||||
|
|
|
@ -612,6 +612,8 @@ typedef struct line_s
|
||||||
INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0
|
INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0
|
||||||
|
|
||||||
UINT32 secportal; // transferred sector portal
|
UINT32 secportal; // transferred sector portal
|
||||||
|
|
||||||
|
struct pslope_s *midtexslope;
|
||||||
} line_t;
|
} line_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
Loading…
Reference in a new issue