mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-01-06 01:30:54 +00:00
a4d61e6fb1
As a bonus this already fixes several bugs caused by the botched texture scaling implementation the original texture manager came with. System cursors are currently disabled because they rely on functionality that needs to be moved to different classes.
160 lines
4.3 KiB
C++
160 lines
4.3 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Copyright 1993-1996 id Software
|
|
// Copyright 1999-2016 Randy Heit
|
|
// Copyright 2016 Magnus Norddahl
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see http://www.gnu.org/licenses/
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "vectors.h"
|
|
#include "r_wallsetup.h"
|
|
#include "swrenderer/segments/r_clipsegment.h"
|
|
#include "swrenderer/scene/r_3dfloors.h"
|
|
|
|
struct seg_t;
|
|
struct subsector_t;
|
|
struct sector_t;
|
|
struct side_t;
|
|
struct line_t;
|
|
struct FDynamicColormap;
|
|
|
|
namespace swrenderer
|
|
{
|
|
class RenderThread;
|
|
struct VisiblePlane;
|
|
|
|
struct FWallCoords
|
|
{
|
|
FVector2 tleft; // coords at left of wall in view space rx1,ry1
|
|
FVector2 tright; // coords at right of wall in view space rx2,ry2
|
|
|
|
float sz1, sz2; // depth at left, right of wall in screen space yb1,yb2
|
|
short sx1, sx2; // x coords at left, right of wall in screen space xb1,xb2
|
|
|
|
bool Init(RenderThread *thread, const DVector2 &pt1, const DVector2 &pt2, double too_close);
|
|
};
|
|
|
|
struct FWallTmapVals
|
|
{
|
|
float UoverZorg, UoverZstep;
|
|
float InvZorg, InvZstep;
|
|
|
|
void InitFromWallCoords(RenderThread *thread, const FWallCoords *wallc);
|
|
void InitFromLine(RenderThread *thread, const DVector2 &left, const DVector2 &right);
|
|
};
|
|
|
|
struct WallPartTexture
|
|
{
|
|
fixed_t TextureOffsetU;
|
|
double TextureMid;
|
|
double TextureScaleU;
|
|
double TextureScaleV;
|
|
FSoftwareTexture *Texture;
|
|
};
|
|
|
|
class SWRenderLine : VisibleSegmentRenderer
|
|
{
|
|
public:
|
|
SWRenderLine(RenderThread *thread);
|
|
void Render(seg_t *line, subsector_t *subsector, sector_t *sector, sector_t *fakebacksector, VisiblePlane *floorplane, VisiblePlane *ceilingplane, bool foggy, FDynamicColormap *basecolormap, Fake3DOpaque fake3DOpaque);
|
|
|
|
RenderThread *Thread = nullptr;
|
|
|
|
private:
|
|
bool RenderWallSegment(int x1, int x2) override;
|
|
void SetWallVariables(bool needlights);
|
|
void SetTopTexture();
|
|
void SetMiddleTexture();
|
|
void SetBottomTexture();
|
|
void ClipSegmentTopBottom(int x1, int x2);
|
|
void MarkCeilingPlane(int x1, int x2);
|
|
void MarkFloorPlane(int x1, int x2);
|
|
void Mark3DFloors(int x1, int x2);
|
|
void MarkOpaquePassClip(int x1, int x2);
|
|
void RenderTopTexture(int x1, int x2);
|
|
void RenderMiddleTexture(int x1, int x2);
|
|
void RenderBottomTexture(int x1, int x2);
|
|
|
|
bool IsFogBoundary(sector_t *front, sector_t *back) const;
|
|
bool SkyboxCompare(sector_t *frontsector, sector_t *backsector) const;
|
|
|
|
bool IsInvisibleLine() const;
|
|
bool IsDoorClosed() const;
|
|
bool IsSolid() const;
|
|
|
|
bool ShouldMarkFloor() const;
|
|
bool ShouldMarkCeiling() const;
|
|
bool ShouldMarkPortal() const;
|
|
|
|
// Line variables:
|
|
|
|
subsector_t *mSubsector;
|
|
sector_t *mFrontSector;
|
|
sector_t *mBackSector;
|
|
VisiblePlane *mFloorPlane;
|
|
VisiblePlane *mCeilingPlane;
|
|
seg_t *mLineSegment;
|
|
Fake3DOpaque m3DFloor;
|
|
|
|
double mBackCeilingZ1;
|
|
double mBackCeilingZ2;
|
|
double mBackFloorZ1;
|
|
double mBackFloorZ2;
|
|
double mFrontCeilingZ1;
|
|
double mFrontCeilingZ2;
|
|
double mFrontFloorZ1;
|
|
double mFrontFloorZ2;
|
|
|
|
bool mDoorClosed;
|
|
|
|
FWallCoords WallC;
|
|
FWallTmapVals WallT;
|
|
|
|
bool foggy;
|
|
FDynamicColormap *basecolormap;
|
|
|
|
// Wall segment variables:
|
|
|
|
bool rw_prepped;
|
|
|
|
int wallshade;
|
|
float rw_lightstep;
|
|
float rw_lightleft;
|
|
|
|
double lwallscale;
|
|
|
|
bool markfloor; // False if the back side is the same plane.
|
|
bool markceiling;
|
|
|
|
WallPartTexture mTopPart;
|
|
WallPartTexture mMiddlePart;
|
|
WallPartTexture mBottomPart;
|
|
|
|
ProjectedWallCull mCeilingClipped;
|
|
ProjectedWallCull mFloorClipped;
|
|
|
|
ProjectedWallLine walltop;
|
|
ProjectedWallLine wallbottom;
|
|
ProjectedWallLine wallupper;
|
|
ProjectedWallLine walllower;
|
|
ProjectedWallTexcoords walltexcoords;
|
|
|
|
sector_t tempsec; // killough 3/8/98: ceiling/water hack
|
|
};
|
|
}
|