mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-13 22:33:32 +00:00
Prevent texture wobbling on planes with no flat alignment
This commit is contained in:
parent
0fba870a35
commit
8f47a7e9cc
1 changed files with 72 additions and 30 deletions
102
src/r_plane.c
102
src/r_plane.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue