mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-02 22:51:39 +00:00
127 lines
3.2 KiB
C++
127 lines
3.2 KiB
C++
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stddef.h>
|
||
|
#include "templates.h"
|
||
|
#include "i_system.h"
|
||
|
#include "doomdef.h"
|
||
|
#include "doomstat.h"
|
||
|
#include "doomdata.h"
|
||
|
#include "p_lnspec.h"
|
||
|
#include "r_sky.h"
|
||
|
#include "v_video.h"
|
||
|
#include "m_swap.h"
|
||
|
#include "w_wad.h"
|
||
|
#include "stats.h"
|
||
|
#include "a_sharedglobal.h"
|
||
|
#include "d_net.h"
|
||
|
#include "g_level.h"
|
||
|
#include "r_wallsetup.h"
|
||
|
#include "v_palette.h"
|
||
|
#include "r_data/colormaps.h"
|
||
|
#include "swrenderer/r_main.h"
|
||
|
#include "swrenderer/r_memory.h"
|
||
|
#include "swrenderer/scene/r_bsp.h"
|
||
|
#include "swrenderer/line/r_line.h"
|
||
|
|
||
|
namespace swrenderer
|
||
|
{
|
||
|
FWallCoords WallC;
|
||
|
FWallTmapVals WallT;
|
||
|
|
||
|
// Transform and clip coordinates. Returns true if it was clipped away
|
||
|
bool FWallCoords::Init(const DVector2 &pt1, const DVector2 &pt2, double too_close)
|
||
|
{
|
||
|
tleft.X = float(pt1.X * ViewSin - pt1.Y * ViewCos);
|
||
|
tright.X = float(pt2.X * ViewSin - pt2.Y * ViewCos);
|
||
|
|
||
|
tleft.Y = float(pt1.X * ViewTanCos + pt1.Y * ViewTanSin);
|
||
|
tright.Y = float(pt2.X * ViewTanCos + pt2.Y * ViewTanSin);
|
||
|
|
||
|
if (MirrorFlags & RF_XFLIP)
|
||
|
{
|
||
|
float t = -tleft.X;
|
||
|
tleft.X = -tright.X;
|
||
|
tright.X = t;
|
||
|
swapvalues(tleft.Y, tright.Y);
|
||
|
}
|
||
|
|
||
|
if (tleft.X >= -tleft.Y)
|
||
|
{
|
||
|
if (tleft.X > tleft.Y) return true; // left edge is off the right side
|
||
|
if (tleft.Y == 0) return true;
|
||
|
sx1 = xs_RoundToInt(CenterX + tleft.X * CenterX / tleft.Y);
|
||
|
sz1 = tleft.Y;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (tright.X < -tright.Y) return true; // wall is off the left side
|
||
|
float den = tleft.X - tright.X - tright.Y + tleft.Y;
|
||
|
if (den == 0) return true;
|
||
|
sx1 = 0;
|
||
|
sz1 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X + tleft.Y) / den;
|
||
|
}
|
||
|
|
||
|
if (sz1 < too_close)
|
||
|
return true;
|
||
|
|
||
|
if (tright.X <= tright.Y)
|
||
|
{
|
||
|
if (tright.X < -tright.Y) return true; // right edge is off the left side
|
||
|
if (tright.Y == 0) return true;
|
||
|
sx2 = xs_RoundToInt(CenterX + tright.X * CenterX / tright.Y);
|
||
|
sz2 = tright.Y;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (tleft.X > tleft.Y) return true; // wall is off the right side
|
||
|
float den = tright.Y - tleft.Y - tright.X + tleft.X;
|
||
|
if (den == 0) return true;
|
||
|
sx2 = viewwidth;
|
||
|
sz2 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X - tleft.Y) / den;
|
||
|
}
|
||
|
|
||
|
if (sz2 < too_close || sx2 <= sx1)
|
||
|
return true;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void FWallTmapVals::InitFromWallCoords(const FWallCoords *wallc)
|
||
|
{
|
||
|
const FVector2 *left = &wallc->tleft;
|
||
|
const FVector2 *right = &wallc->tright;
|
||
|
|
||
|
if (MirrorFlags & RF_XFLIP)
|
||
|
{
|
||
|
swapvalues(left, right);
|
||
|
}
|
||
|
UoverZorg = left->X * centerx;
|
||
|
UoverZstep = -left->Y;
|
||
|
InvZorg = (left->X - right->X) * centerx;
|
||
|
InvZstep = right->Y - left->Y;
|
||
|
}
|
||
|
|
||
|
void FWallTmapVals::InitFromLine(const DVector2 &left, const DVector2 &right)
|
||
|
{
|
||
|
// Coordinates should have already had viewx,viewy subtracted
|
||
|
|
||
|
double fullx1 = left.X * ViewSin - left.Y * ViewCos;
|
||
|
double fullx2 = right.X * ViewSin - right.Y * ViewCos;
|
||
|
double fully1 = left.X * ViewTanCos + left.Y * ViewTanSin;
|
||
|
double fully2 = right.X * ViewTanCos + right.Y * ViewTanSin;
|
||
|
|
||
|
if (MirrorFlags & RF_XFLIP)
|
||
|
{
|
||
|
fullx1 = -fullx1;
|
||
|
fullx2 = -fullx2;
|
||
|
}
|
||
|
|
||
|
UoverZorg = float(fullx1 * centerx);
|
||
|
UoverZstep = float(-fully1);
|
||
|
InvZorg = float((fullx1 - fullx2) * centerx);
|
||
|
InvZstep = float(fully2 - fully1);
|
||
|
}
|
||
|
}
|