Prevent texture wobbling on planes with no flat alignment

This commit is contained in:
Jaime Ita Passos 2021-04-27 22:59:06 -03:00
parent 0fba870a35
commit 8f47a7e9cc

View file

@ -690,16 +690,16 @@ static void R_DrawSkyPlane(visplane_t *pl)
} }
} }
// Returns the height of the sloped plane at (px, py) as a floating point number // Returns the height of the sloped plane at (x, y) as a 32.16 fixed_t
static float R_GetSlopeZAt(const pslope_t *slope, fixed_t px, fixed_t py) static INT64 R_GetSlopeZAt(const pslope_t *slope, fixed_t x, fixed_t y)
{ {
float x = FixedToFloat(px - slope->o.x); x = ((INT64)x - (INT64)slope->o.x);
float y = FixedToFloat(py - slope->o.y); y = ((INT64)y - (INT64)slope->o.y);
x = (x * FixedToFloat(slope->d.x)); x = (x * (INT64)slope->d.x) / FRACUNIT;
y = (y * FixedToFloat(slope->d.y)); y = (y * (INT64)slope->d.y) / FRACUNIT;
return FixedToFloat(slope->o.z) + ((x + y) * FixedToFloat(slope->zdelta)); return (INT64)slope->o.z + ((x + y) * (INT64)slope->zdelta) / FRACUNIT;
} }
// Sets the texture origin vector of the sloped plane. // Sets the texture origin vector of the sloped plane.
@ -709,7 +709,6 @@ static void R_SetSlopePlaneOrigin(pslope_t *slope, fixed_t xpos, fixed_t ypos, f
float vx = FixedToFloat(xpos + xoff); float vx = FixedToFloat(xpos + xoff);
float vy = FixedToFloat(ypos - yoff); float vy = FixedToFloat(ypos - yoff);
float vz = FixedToFloat(zpos);
float ang = ANG2RAD(ANGLE_270 - angle); float ang = ANG2RAD(ANGLE_270 - angle);
// p is the texture origin in view space // p is the texture origin in view space
@ -717,7 +716,7 @@ static void R_SetSlopePlaneOrigin(pslope_t *slope, fixed_t xpos, fixed_t ypos, f
// errors if the flat is rotated. // errors if the flat is rotated.
p->x = vx * cos(ang) - vy * sin(ang); p->x = vx * cos(ang) - vy * sin(ang);
p->z = vx * sin(ang) + vy * cos(ang); p->z = vx * sin(ang) + vy * cos(ang);
p->y = R_GetSlopeZAt(slope, -xoff, yoff) - vz; p->y = (R_GetSlopeZAt(slope, -xoff, yoff) - zpos) / (float)FRACUNIT;
} }
// This function calculates all of the vectors necessary for drawing a sloped plane. // This function calculates all of the vectors necessary for drawing a sloped plane.
@ -844,14 +843,37 @@ static inline void R_AdjustSlopeCoordinates(visplane_t *pl)
const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT); const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT);
const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT); const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT);
fixed_t temp = xoffs; fixed_t ox, oy, temp;
xoffs = (FixedMul(temp,cosinecomponent) & modmask) + (FixedMul(yoffs,sinecomponent) & modmask);
yoffs = (-FixedMul(temp,sinecomponent) & modmask) + (FixedMul(yoffs,cosinecomponent) & modmask);
temp = xoffs & modmask; if (!pl->plangle)
yoffs &= modmask; {
xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // negative sine for opposite direction ox = (FixedMul(pl->slope->o.x,cosinecomponent) & modmask) - (FixedMul(pl->slope->o.y,sinecomponent) & modmask);
yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent); oy = (-FixedMul(pl->slope->o.x,sinecomponent) & modmask) - (FixedMul(pl->slope->o.y,cosinecomponent) & modmask);
temp = ox & modmask;
oy &= modmask;
ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction
oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent);
}
if (xoffs || yoffs)
{
temp = xoffs;
xoffs = (FixedMul(temp,cosinecomponent) & modmask) + (FixedMul(yoffs,sinecomponent) & modmask);
yoffs = (-FixedMul(temp,sinecomponent) & modmask) + (FixedMul(yoffs,cosinecomponent) & modmask);
temp = xoffs & modmask;
yoffs &= modmask;
xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto
yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent);
}
if (!pl->plangle)
{
xoffs -= (pl->slope->o.x - ox);
yoffs += (pl->slope->o.y + oy);
}
} }
static inline void R_AdjustSlopeCoordinatesNPO2(visplane_t *pl) static inline void R_AdjustSlopeCoordinatesNPO2(visplane_t *pl)
@ -862,14 +884,37 @@ static inline void R_AdjustSlopeCoordinatesNPO2(visplane_t *pl)
const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT); const fixed_t cosinecomponent = FINECOSINE(pl->plangle>>ANGLETOFINESHIFT);
const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT); const fixed_t sinecomponent = FINESINE(pl->plangle>>ANGLETOFINESHIFT);
fixed_t temp = xoffs; fixed_t ox, oy, temp;
xoffs = (FixedMul(temp,cosinecomponent) % modmaskw) + (FixedMul(yoffs,sinecomponent) % modmaskh);
yoffs = (-FixedMul(temp,sinecomponent) % modmaskw) + (FixedMul(yoffs,cosinecomponent) % modmaskh);
temp = xoffs % modmaskw; if (!pl->plangle)
yoffs %= modmaskh; {
xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto ox = (FixedMul(pl->slope->o.x,cosinecomponent) % modmaskw) - (FixedMul(pl->slope->o.y,sinecomponent) % modmaskh);
yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent); oy = (-FixedMul(pl->slope->o.x,sinecomponent) % modmaskw) - (FixedMul(pl->slope->o.y,cosinecomponent) % modmaskh);
temp = ox % modmaskw;
oy %= modmaskh;
ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction
oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent);
}
if (xoffs || yoffs)
{
temp = xoffs;
xoffs = (FixedMul(temp,cosinecomponent) % modmaskw) + (FixedMul(yoffs,sinecomponent) % modmaskh);
yoffs = (-FixedMul(temp,sinecomponent) % modmaskw) + (FixedMul(yoffs,cosinecomponent) % modmaskh);
temp = xoffs % modmaskw;
yoffs %= modmaskh;
xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto
yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent);
}
if (!pl->plangle)
{
xoffs -= (pl->slope->o.x - ox);
yoffs += (pl->slope->o.y + oy);
}
} }
void R_DrawSinglePlane(visplane_t *pl) void R_DrawSinglePlane(visplane_t *pl)
@ -1049,13 +1094,10 @@ void R_DrawSinglePlane(visplane_t *pl)
if (pl->slope) if (pl->slope)
{ {
if (xoffs || yoffs) if (ds_powersoftwo)
{ R_AdjustSlopeCoordinates(pl);
if (ds_powersoftwo) else
R_AdjustSlopeCoordinates(pl); R_AdjustSlopeCoordinatesNPO2(pl);
else
R_AdjustSlopeCoordinatesNPO2(pl);
}
if (planeripple.active) if (planeripple.active)
{ {