mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Merge branch 'portal-fix' into 'next'
Fix portal and plane/sky interaction More portal-related fixes: * Fixes rendering issue 4 from issue #21 (Slope planes render with wrong height values when visportals are visible on-screen) * Fixes sky rendering through portals, so that the sky you see through each portal is what you'd expect to see if you were actually there. Easiest way to see what I mean is through sky 22's planet, in a map with portals at 90 degrees to the other sides respectively (the example map on the wiki for ld40, for instance). See merge request !65
This commit is contained in:
commit
bb9098b532
2 changed files with 30 additions and 17 deletions
|
@ -299,7 +299,7 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
|
||||||
}
|
}
|
||||||
|
|
||||||
length = FixedMul (distance,distscale[x1]);
|
length = FixedMul (distance,distscale[x1]);
|
||||||
angle = (currentplane->viewangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
|
angle = (currentplane->viewangle + currentplane->plangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
|
||||||
/// \note Wouldn't it be faster just to add viewx and viewy
|
/// \note Wouldn't it be faster just to add viewx and viewy
|
||||||
// to the plane's x/yoffs anyway??
|
// to the plane's x/yoffs anyway??
|
||||||
|
|
||||||
|
@ -475,7 +475,8 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel,
|
||||||
&& lightlevel == check->lightlevel
|
&& lightlevel == check->lightlevel
|
||||||
&& xoff == check->xoffs && yoff == check->yoffs
|
&& xoff == check->xoffs && yoff == check->yoffs
|
||||||
&& planecolormap == check->extra_colormap
|
&& planecolormap == check->extra_colormap
|
||||||
&& !pfloor && !check->ffloor && check->viewz == viewz
|
&& !pfloor && !check->ffloor
|
||||||
|
&& check->viewx == viewx && check->viewy == viewy && check->viewz == viewz
|
||||||
&& check->viewangle == viewangle
|
&& check->viewangle == viewangle
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
&& check->slope == slope
|
&& check->slope == slope
|
||||||
|
@ -497,8 +498,10 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel,
|
||||||
check->yoffs = yoff;
|
check->yoffs = yoff;
|
||||||
check->extra_colormap = planecolormap;
|
check->extra_colormap = planecolormap;
|
||||||
check->ffloor = pfloor;
|
check->ffloor = pfloor;
|
||||||
|
check->viewx = viewx;
|
||||||
|
check->viewy = viewy;
|
||||||
check->viewz = viewz;
|
check->viewz = viewz;
|
||||||
check->viewangle = viewangle + plangle;
|
check->viewangle = viewangle;
|
||||||
check->plangle = plangle;
|
check->plangle = plangle;
|
||||||
#ifdef POLYOBJECTS_PLANES
|
#ifdef POLYOBJECTS_PLANES
|
||||||
check->polyobj = NULL;
|
check->polyobj = NULL;
|
||||||
|
@ -567,6 +570,8 @@ visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop)
|
||||||
new_pl->yoffs = pl->yoffs;
|
new_pl->yoffs = pl->yoffs;
|
||||||
new_pl->extra_colormap = pl->extra_colormap;
|
new_pl->extra_colormap = pl->extra_colormap;
|
||||||
new_pl->ffloor = pl->ffloor;
|
new_pl->ffloor = pl->ffloor;
|
||||||
|
new_pl->viewx = pl->viewx;
|
||||||
|
new_pl->viewy = pl->viewy;
|
||||||
new_pl->viewz = pl->viewz;
|
new_pl->viewz = pl->viewz;
|
||||||
new_pl->viewangle = pl->viewangle;
|
new_pl->viewangle = pl->viewangle;
|
||||||
new_pl->plangle = pl->plangle;
|
new_pl->plangle = pl->plangle;
|
||||||
|
@ -665,7 +670,6 @@ void R_MakeSpans(INT32 x, INT32 t1, INT32 b1, INT32 t2, INT32 b2)
|
||||||
void R_DrawPlanes(void)
|
void R_DrawPlanes(void)
|
||||||
{
|
{
|
||||||
visplane_t *pl;
|
visplane_t *pl;
|
||||||
angle_t skyviewangle = viewangle; // the flat angle itself can mess with viewangle, so do your own angle instead!
|
|
||||||
INT32 x;
|
INT32 x;
|
||||||
INT32 angle;
|
INT32 angle;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
@ -704,7 +708,7 @@ void R_DrawPlanes(void)
|
||||||
|
|
||||||
if (dc_yl <= dc_yh)
|
if (dc_yl <= dc_yh)
|
||||||
{
|
{
|
||||||
angle = (skyviewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT;
|
angle = (pl->viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT;
|
||||||
dc_x = x;
|
dc_x = x;
|
||||||
dc_source =
|
dc_source =
|
||||||
R_GetColumn(skytexture,
|
R_GetColumn(skytexture,
|
||||||
|
@ -857,13 +861,13 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (!pl->slope) // Don't mess with angle on slopes! We'll handle this ourselves later
|
if (!pl->slope) // Don't mess with angle on slopes! We'll handle this ourselves later
|
||||||
#endif
|
#endif
|
||||||
if (viewangle != pl->viewangle)
|
if (viewangle != pl->viewangle+pl->plangle)
|
||||||
{
|
{
|
||||||
memset(cachedheight, 0, sizeof (cachedheight));
|
memset(cachedheight, 0, sizeof (cachedheight));
|
||||||
angle = (pl->viewangle-ANGLE_90)>>ANGLETOFINESHIFT;
|
angle = (pl->viewangle+pl->plangle-ANGLE_90)>>ANGLETOFINESHIFT;
|
||||||
basexscale = FixedDiv(FINECOSINE(angle),centerxfrac);
|
basexscale = FixedDiv(FINECOSINE(angle),centerxfrac);
|
||||||
baseyscale = -FixedDiv(FINESINE(angle),centerxfrac);
|
baseyscale = -FixedDiv(FINESINE(angle),centerxfrac);
|
||||||
viewangle = pl->viewangle;
|
viewangle = pl->viewangle+pl->plangle;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentplane = pl;
|
currentplane = pl;
|
||||||
|
@ -954,11 +958,11 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
xoffs *= fudge;
|
xoffs *= fudge;
|
||||||
yoffs /= fudge;
|
yoffs /= fudge;
|
||||||
|
|
||||||
vx = FIXED_TO_FLOAT(viewx+xoffs);
|
vx = FIXED_TO_FLOAT(pl->viewx+xoffs);
|
||||||
vy = FIXED_TO_FLOAT(viewy-yoffs);
|
vy = FIXED_TO_FLOAT(pl->viewy-yoffs);
|
||||||
vz = FIXED_TO_FLOAT(viewz);
|
vz = FIXED_TO_FLOAT(pl->viewz);
|
||||||
|
|
||||||
temp = P_GetZAt(pl->slope, viewx, viewy);
|
temp = P_GetZAt(pl->slope, pl->viewx, pl->viewy);
|
||||||
zeroheight = FIXED_TO_FLOAT(temp);
|
zeroheight = FIXED_TO_FLOAT(temp);
|
||||||
|
|
||||||
#define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
|
#define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
|
||||||
|
@ -966,14 +970,14 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
// p is the texture origin in view space
|
// p is the texture origin in view space
|
||||||
// Don't add in the offsets at this stage, because doing so can result in
|
// Don't add in the offsets at this stage, because doing so can result in
|
||||||
// errors if the flat is rotated.
|
// errors if the flat is rotated.
|
||||||
ang = ANG2RAD(ANGLE_270 - viewangle);
|
ang = ANG2RAD(ANGLE_270 - pl->viewangle);
|
||||||
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);
|
||||||
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
|
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
|
||||||
p.y = FIXED_TO_FLOAT(temp) - vz;
|
p.y = FIXED_TO_FLOAT(temp) - vz;
|
||||||
|
|
||||||
// m is the v direction vector in view space
|
// m is the v direction vector in view space
|
||||||
ang = ANG2RAD(ANGLE_180 - viewangle - pl->plangle);
|
ang = ANG2RAD(ANGLE_180 - (pl->viewangle + pl->plangle));
|
||||||
m.x = cos(ang);
|
m.x = cos(ang);
|
||||||
m.z = sin(ang);
|
m.z = sin(ang);
|
||||||
|
|
||||||
|
@ -982,9 +986,9 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
n.z = -cos(ang);
|
n.z = -cos(ang);
|
||||||
|
|
||||||
ang = ANG2RAD(pl->plangle);
|
ang = ANG2RAD(pl->plangle);
|
||||||
temp = P_GetZAt(pl->slope, viewx + FLOAT_TO_FIXED(sin(ang)), viewy + FLOAT_TO_FIXED(cos(ang)));
|
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(sin(ang)), pl->viewy + FLOAT_TO_FIXED(cos(ang)));
|
||||||
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
||||||
temp = P_GetZAt(pl->slope, viewx + FLOAT_TO_FIXED(cos(ang)), viewy - FLOAT_TO_FIXED(sin(ang)));
|
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(cos(ang)), pl->viewy - FLOAT_TO_FIXED(sin(ang)));
|
||||||
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
||||||
|
|
||||||
m.x /= fudge;
|
m.x /= fudge;
|
||||||
|
@ -1040,6 +1044,14 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
stop = pl->maxx + 1;
|
stop = pl->maxx + 1;
|
||||||
|
|
||||||
|
if (viewx != pl->viewx || viewy != pl->viewy)
|
||||||
|
{
|
||||||
|
viewx = pl->viewx;
|
||||||
|
viewy = pl->viewy;
|
||||||
|
}
|
||||||
|
if (viewz != pl->viewz)
|
||||||
|
viewz = pl->viewz;
|
||||||
|
|
||||||
for (x = pl->minx; x <= stop; x++)
|
for (x = pl->minx; x <= stop; x++)
|
||||||
{
|
{
|
||||||
R_MakeSpans(x, pl->top[x-1], pl->bottom[x-1],
|
R_MakeSpans(x, pl->top[x-1], pl->bottom[x-1],
|
||||||
|
|
|
@ -27,7 +27,8 @@ typedef struct visplane_s
|
||||||
{
|
{
|
||||||
struct visplane_s *next;
|
struct visplane_s *next;
|
||||||
|
|
||||||
fixed_t height, viewz;
|
fixed_t height;
|
||||||
|
fixed_t viewx, viewy, viewz;
|
||||||
angle_t viewangle;
|
angle_t viewangle;
|
||||||
angle_t plangle;
|
angle_t plangle;
|
||||||
INT32 picnum;
|
INT32 picnum;
|
||||||
|
|
Loading…
Reference in a new issue