mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-12-01 16:41:09 +00:00
Rename vissprite_t to VisibleSprite, convert it into a base class and lower all variables if possible. Remove unused fields and unions.
This commit is contained in:
parent
57d8b0e34c
commit
55131a7a6d
16 changed files with 150 additions and 148 deletions
|
@ -19,8 +19,6 @@ EXTERN_CVAR(Bool, r_dynlights);
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
struct vissprite_t;
|
|
||||||
|
|
||||||
struct ShadeConstants
|
struct ShadeConstants
|
||||||
{
|
{
|
||||||
uint16_t light_alpha;
|
uint16_t light_alpha;
|
||||||
|
|
|
@ -90,7 +90,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderTranslucentPass::ClipSpriteColumnWithPortals(int x, vissprite_t* spr)
|
bool RenderTranslucentPass::ClipSpriteColumnWithPortals(int x, VisibleSprite *spr)
|
||||||
{
|
{
|
||||||
RenderPortal *renderportal = RenderPortal::Instance();
|
RenderPortal *renderportal = RenderPortal::Instance();
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ namespace swrenderer
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderTranslucentPass::DrawSprite(vissprite_t *spr)
|
void RenderTranslucentPass::DrawSprite(VisibleSprite *spr)
|
||||||
{
|
{
|
||||||
static short clipbot[MAXWIDTH];
|
static short clipbot[MAXWIDTH];
|
||||||
static short cliptop[MAXWIDTH];
|
static short cliptop[MAXWIDTH];
|
||||||
|
@ -136,12 +136,13 @@ namespace swrenderer
|
||||||
Clip3DFloors *clip3d = Clip3DFloors::Instance();
|
Clip3DFloors *clip3d = Clip3DFloors::Instance();
|
||||||
|
|
||||||
// [RH] Check for particles
|
// [RH] Check for particles
|
||||||
if (!spr->bIsVoxel && spr->pic == nullptr)
|
if (spr->IsParticle())
|
||||||
{
|
{
|
||||||
// kg3D - reject invisible parts
|
// kg3D - reject invisible parts
|
||||||
if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && spr->gpos.Z <= clip3d->sclipBottom) return;
|
if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && spr->gpos.Z <= clip3d->sclipBottom) return;
|
||||||
if ((clip3d->fake3D & FAKE3D_CLIPTOP) && spr->gpos.Z >= clip3d->sclipTop) return;
|
if ((clip3d->fake3D & FAKE3D_CLIPTOP) && spr->gpos.Z >= clip3d->sclipTop) return;
|
||||||
RenderParticle::Render(spr);
|
|
||||||
|
spr->Render(nullptr, nullptr, 0, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +259,7 @@ namespace swrenderer
|
||||||
double scale = InvZtoScale * spr->idepth;
|
double scale = InvZtoScale * spr->idepth;
|
||||||
double hzb = DBL_MIN, hzt = DBL_MAX;
|
double hzb = DBL_MIN, hzt = DBL_MAX;
|
||||||
|
|
||||||
if (spr->bIsVoxel && spr->floorclip != 0)
|
if (spr->IsVoxel() && spr->floorclip != 0)
|
||||||
{
|
{
|
||||||
hzb = spr->gzb;
|
hzb = spr->gzb;
|
||||||
}
|
}
|
||||||
|
@ -272,7 +273,7 @@ namespace swrenderer
|
||||||
|
|
||||||
if (spr->FakeFlatStat == WaterFakeSide::BelowFloor)
|
if (spr->FakeFlatStat == WaterFakeSide::BelowFloor)
|
||||||
{ // seen below floor: clip top
|
{ // seen below floor: clip top
|
||||||
if (!spr->bIsVoxel && h > topclip)
|
if (!spr->IsVoxel() && h > topclip)
|
||||||
{
|
{
|
||||||
topclip = short(MIN(h, viewheight));
|
topclip = short(MIN(h, viewheight));
|
||||||
}
|
}
|
||||||
|
@ -280,7 +281,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // seen in the middle: clip bottom
|
{ // seen in the middle: clip bottom
|
||||||
if (!spr->bIsVoxel && h < botclip)
|
if (!spr->IsVoxel() && h < botclip)
|
||||||
{
|
{
|
||||||
botclip = MAX<short>(0, h);
|
botclip = MAX<short>(0, h);
|
||||||
}
|
}
|
||||||
|
@ -294,7 +295,7 @@ namespace swrenderer
|
||||||
|
|
||||||
if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling)
|
if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling)
|
||||||
{ // seen above ceiling: clip bottom
|
{ // seen above ceiling: clip bottom
|
||||||
if (!spr->bIsVoxel && h < botclip)
|
if (!spr->IsVoxel() && h < botclip)
|
||||||
{
|
{
|
||||||
botclip = MAX<short>(0, h);
|
botclip = MAX<short>(0, h);
|
||||||
}
|
}
|
||||||
|
@ -302,7 +303,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // seen in the middle: clip top
|
{ // seen in the middle: clip top
|
||||||
if (!spr->bIsVoxel && h > topclip)
|
if (!spr->IsVoxel() && h > topclip)
|
||||||
{
|
{
|
||||||
topclip = MIN(h, viewheight);
|
topclip = MIN(h, viewheight);
|
||||||
}
|
}
|
||||||
|
@ -311,7 +312,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// killough 3/27/98: end special clipping for deep water / fake ceilings
|
// killough 3/27/98: end special clipping for deep water / fake ceilings
|
||||||
else if (!spr->bIsVoxel && spr->floorclip)
|
else if (!spr->IsVoxel() && spr->floorclip)
|
||||||
{ // [RH] Move floorclip stuff from R_DrawVisSprite to here
|
{ // [RH] Move floorclip stuff from R_DrawVisSprite to here
|
||||||
//int clip = ((FLOAT2FIXED(CenterY) - FixedMul (spr->texturemid - (spr->pic->GetHeight() << FRACBITS) + spr->floorclip, spr->yscale)) >> FRACBITS);
|
//int clip = ((FLOAT2FIXED(CenterY) - FixedMul (spr->texturemid - (spr->pic->GetHeight() << FRACBITS) + spr->floorclip, spr->yscale)) >> FRACBITS);
|
||||||
int clip = xs_RoundToInt(CenterY - (spr->texturemid - spr->pic->GetHeight() + spr->floorclip) * spr->yscale);
|
int clip = xs_RoundToInt(CenterY - (spr->texturemid - spr->pic->GetHeight() + spr->floorclip) * spr->yscale);
|
||||||
|
@ -323,7 +324,7 @@ namespace swrenderer
|
||||||
|
|
||||||
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
|
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
|
||||||
{
|
{
|
||||||
if (!spr->bIsVoxel)
|
if (!spr->IsVoxel())
|
||||||
{
|
{
|
||||||
double hz = clip3d->sclipBottom;
|
double hz = clip3d->sclipBottom;
|
||||||
if (spr->fakefloor)
|
if (spr->fakefloor)
|
||||||
|
@ -344,7 +345,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
if (clip3d->fake3D & FAKE3D_CLIPTOP)
|
if (clip3d->fake3D & FAKE3D_CLIPTOP)
|
||||||
{
|
{
|
||||||
if (!spr->bIsVoxel)
|
if (!spr->IsVoxel())
|
||||||
{
|
{
|
||||||
double hz = clip3d->sclipTop;
|
double hz = clip3d->sclipTop;
|
||||||
if (spr->fakeceiling != nullptr)
|
if (spr->fakeceiling != nullptr)
|
||||||
|
@ -411,7 +412,7 @@ namespace swrenderer
|
||||||
r2 = MIN<int>(ds->x2, x2);
|
r2 = MIN<int>(ds->x2, x2);
|
||||||
|
|
||||||
float neardepth, fardepth;
|
float neardepth, fardepth;
|
||||||
if (!spr->bWallSprite)
|
if (!spr->IsWallSprite())
|
||||||
{
|
{
|
||||||
if (ds->sz1 < ds->sz2)
|
if (ds->sz1 < ds->sz2)
|
||||||
{
|
{
|
||||||
|
@ -425,7 +426,7 @@ namespace swrenderer
|
||||||
|
|
||||||
|
|
||||||
// Check if sprite is in front of draw seg:
|
// Check if sprite is in front of draw seg:
|
||||||
if ((!spr->bWallSprite && neardepth > spr->depth) || ((spr->bWallSprite || fardepth > spr->depth) &&
|
if ((!spr->IsWallSprite() && neardepth > spr->depth) || ((spr->IsWallSprite() || fardepth > spr->depth) &&
|
||||||
(spr->gpos.Y - ds->curline->v1->fY()) * (ds->curline->v2->fX() - ds->curline->v1->fX()) -
|
(spr->gpos.Y - ds->curline->v1->fY()) * (ds->curline->v2->fX() - ds->curline->v1->fX()) -
|
||||||
(spr->gpos.X - ds->curline->v1->fX()) * (ds->curline->v2->fY() - ds->curline->v1->fY()) <= 0))
|
(spr->gpos.X - ds->curline->v1->fX()) * (ds->curline->v2->fY() - ds->curline->v1->fY()) <= 0))
|
||||||
{
|
{
|
||||||
|
@ -475,16 +476,9 @@ namespace swrenderer
|
||||||
|
|
||||||
// all clipping has been performed, so draw the sprite
|
// all clipping has been performed, so draw the sprite
|
||||||
|
|
||||||
if (!spr->bIsVoxel)
|
if (!spr->IsVoxel())
|
||||||
{
|
{
|
||||||
if (!spr->bWallSprite)
|
spr->Render(clipbot, cliptop, 0, 0);
|
||||||
{
|
|
||||||
RenderSprite::Render(spr, clipbot, cliptop);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RenderWallSprite::Render(spr, clipbot, cliptop);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -517,7 +511,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
int minvoxely = spr->gzt <= hzt ? 0 : xs_RoundToInt((spr->gzt - hzt) / spr->yscale);
|
int minvoxely = spr->gzt <= hzt ? 0 : xs_RoundToInt((spr->gzt - hzt) / spr->yscale);
|
||||||
int maxvoxely = spr->gzb > hzb ? INT_MAX : xs_RoundToInt((spr->gzt - hzb) / spr->yscale);
|
int maxvoxely = spr->gzb > hzb ? INT_MAX : xs_RoundToInt((spr->gzt - hzb) / spr->yscale);
|
||||||
RenderVoxel::Render(spr, minvoxely, maxvoxely, cliptop, clipbot);
|
spr->Render(cliptop, clipbot, minvoxely, maxvoxely);
|
||||||
}
|
}
|
||||||
spr->Style.BaseColormap = colormap;
|
spr->Style.BaseColormap = colormap;
|
||||||
spr->Style.ColormapNum = colormapnum;
|
spr->Style.ColormapNum = colormapnum;
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct FVoxel;
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
struct vissprite_t;
|
class VisibleSprite;
|
||||||
struct drawseg_t;
|
struct drawseg_t;
|
||||||
|
|
||||||
class RenderTranslucentPass
|
class RenderTranslucentPass
|
||||||
|
@ -34,11 +34,11 @@ namespace swrenderer
|
||||||
|
|
||||||
static bool DrewAVoxel;
|
static bool DrewAVoxel;
|
||||||
|
|
||||||
static bool ClipSpriteColumnWithPortals(int x, vissprite_t* spr);
|
static bool ClipSpriteColumnWithPortals(int x, VisibleSprite *spr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void CollectPortals();
|
static void CollectPortals();
|
||||||
static void DrawSprite(vissprite_t *spr);
|
static void DrawSprite(VisibleSprite *spr);
|
||||||
static void DrawMaskedSingle(bool renew);
|
static void DrawMaskedSingle(bool renew);
|
||||||
|
|
||||||
static TArray<drawseg_t *> portaldrawsegs;
|
static TArray<drawseg_t *> portaldrawsegs;
|
||||||
|
|
|
@ -178,7 +178,7 @@ namespace swrenderer
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// store information in a vissprite
|
// store information in a vissprite
|
||||||
vissprite_t *vis = RenderMemory::NewObject<vissprite_t>();
|
RenderParticle *vis = RenderMemory::NewObject<RenderParticle>();
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->heightsec = heightsec;
|
vis->heightsec = heightsec;
|
||||||
vis->xscale = FLOAT2FIXED(xscale);
|
vis->xscale = FLOAT2FIXED(xscale);
|
||||||
|
@ -194,7 +194,6 @@ namespace swrenderer
|
||||||
vis->Translation = 0;
|
vis->Translation = 0;
|
||||||
vis->startfrac = 255 & (particle->color >> 24);
|
vis->startfrac = 255 & (particle->color >> 24);
|
||||||
vis->pic = NULL;
|
vis->pic = NULL;
|
||||||
vis->bIsVoxel = false;
|
|
||||||
vis->renderflags = (short)(particle->alpha * 255.0f + 0.5f);
|
vis->renderflags = (short)(particle->alpha * 255.0f + 0.5f);
|
||||||
vis->FakeFlatStat = fakeside;
|
vis->FakeFlatStat = fakeside;
|
||||||
vis->floorclip = 0;
|
vis->floorclip = 0;
|
||||||
|
@ -226,10 +225,12 @@ namespace swrenderer
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderParticle::Render(vissprite_t *vis)
|
void RenderParticle::Render(short *cliptop, short *clipbottom, int minZ, int maxZ)
|
||||||
{
|
{
|
||||||
using namespace drawerargs;
|
using namespace drawerargs;
|
||||||
|
|
||||||
|
auto vis = this;
|
||||||
|
|
||||||
int spacing;
|
int spacing;
|
||||||
BYTE color = vis->Style.BaseColormap->Maps[vis->startfrac];
|
BYTE color = vis->Style.BaseColormap->Maps[vis->startfrac];
|
||||||
int yl = vis->y1;
|
int yl = vis->y1;
|
||||||
|
@ -240,7 +241,7 @@ namespace swrenderer
|
||||||
if (ycount <= 0 || countbase <= 0)
|
if (ycount <= 0 || countbase <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DrawMaskedSegsBehindParticle(vis);
|
DrawMaskedSegsBehindParticle();
|
||||||
|
|
||||||
uint32_t fg = LightBgra::shade_pal_index_simple(color, LightBgra::calc_light_multiplier(LIGHTSCALE(0, vis->Style.ColormapNum << FRACBITS)));
|
uint32_t fg = LightBgra::shade_pal_index_simple(color, LightBgra::calc_light_multiplier(LIGHTSCALE(0, vis->Style.ColormapNum << FRACBITS)));
|
||||||
|
|
||||||
|
@ -275,11 +276,8 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderParticle::DrawMaskedSegsBehindParticle(const vissprite_t *vis)
|
void RenderParticle::DrawMaskedSegsBehindParticle()
|
||||||
{
|
{
|
||||||
const int x1 = vis->x1;
|
|
||||||
const int x2 = vis->x2;
|
|
||||||
|
|
||||||
// Draw any masked textures behind this particle so that when the
|
// Draw any masked textures behind this particle so that when the
|
||||||
// particle is drawn, it will be in front of them.
|
// particle is drawn, it will be in front of them.
|
||||||
for (unsigned int p = InterestingDrawsegs.Size(); p-- > FirstInterestingDrawseg; )
|
for (unsigned int p = InterestingDrawsegs.Size(); p-- > FirstInterestingDrawseg; )
|
||||||
|
@ -291,10 +289,10 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((ds->siz2 - ds->siz1) * ((x2 + x1) / 2 - ds->sx1) / (ds->sx2 - ds->sx1) + ds->siz1 < vis->idepth)
|
if ((ds->siz2 - ds->siz1) * ((x2 + x1) / 2 - ds->sx1) / (ds->sx2 - ds->sx1) + ds->siz1 < idepth)
|
||||||
{
|
{
|
||||||
// [ZZ] only draw stuff that's inside the same portal as the particle, other portals will care for themselves
|
// [ZZ] only draw stuff that's inside the same portal as the particle, other portals will care for themselves
|
||||||
if (ds->CurrentPortalUniq == vis->CurrentPortalUniq)
|
if (ds->CurrentPortalUniq == CurrentPortalUniq)
|
||||||
R_RenderMaskedSegRange(ds, MAX<int>(ds->x1, x1), MIN<int>(ds->x2, x2));
|
R_RenderMaskedSegRange(ds, MAX<int>(ds->x1, x1), MIN<int>(ds->x2, x2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,13 +18,22 @@
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
class RenderParticle
|
class RenderParticle : public VisibleSprite
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Project(particle_t *, const sector_t *sector, int shade, WaterFakeSide fakeside, bool foggy);
|
static void Project(particle_t *, const sector_t *sector, int shade, WaterFakeSide fakeside, bool foggy);
|
||||||
static void Render(vissprite_t *);
|
|
||||||
|
bool IsParticle() const override { return true; }
|
||||||
|
void Render(short *cliptop, short *clipbottom, int minZ, int maxZ) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void DrawMaskedSegsBehindParticle(const vissprite_t *vis);
|
void DrawMaskedSegsBehindParticle();
|
||||||
|
|
||||||
|
fixed_t xscale;
|
||||||
|
fixed_t startfrac; // horizontal position of x1
|
||||||
|
int y1, y2;
|
||||||
|
|
||||||
|
uint32_t Translation;
|
||||||
|
uint32_t FillColor;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace swrenderer
|
||||||
double RenderPlayerSprite::pspritexiscale;
|
double RenderPlayerSprite::pspritexiscale;
|
||||||
double RenderPlayerSprite::pspriteyscale;
|
double RenderPlayerSprite::pspriteyscale;
|
||||||
|
|
||||||
TArray<vissprite_t> RenderPlayerSprite::avis;
|
TArray<RenderSprite> RenderPlayerSprite::avis;
|
||||||
|
|
||||||
void RenderPlayerSprite::SetupSpriteScale()
|
void RenderPlayerSprite::SetupSpriteScale()
|
||||||
{
|
{
|
||||||
|
@ -205,7 +205,6 @@ namespace swrenderer
|
||||||
FTextureID picnum;
|
FTextureID picnum;
|
||||||
WORD flip;
|
WORD flip;
|
||||||
FTexture* tex;
|
FTexture* tex;
|
||||||
vissprite_t* vis;
|
|
||||||
bool noaccel;
|
bool noaccel;
|
||||||
double alpha = owner->Alpha;
|
double alpha = owner->Alpha;
|
||||||
|
|
||||||
|
@ -273,7 +272,7 @@ namespace swrenderer
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// store information in a vissprite
|
// store information in a vissprite
|
||||||
vis = &avis[vispspindex];
|
RenderSprite *vis = &avis[vispspindex];
|
||||||
vis->renderflags = owner->renderflags;
|
vis->renderflags = owner->renderflags;
|
||||||
vis->floorclip = 0;
|
vis->floorclip = 0;
|
||||||
|
|
||||||
|
@ -571,16 +570,14 @@ namespace swrenderer
|
||||||
short *mfloorclip = screenheightarray;
|
short *mfloorclip = screenheightarray;
|
||||||
short *mceilingclip = zeroarray;
|
short *mceilingclip = zeroarray;
|
||||||
|
|
||||||
RenderSprite::Render(vis, mfloorclip, mceilingclip);
|
vis->Render(mfloorclip, mceilingclip, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderPlayerSprite::RenderRemainingPlayerSprites()
|
void RenderPlayerSprite::RenderRemainingPlayerSprites()
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < vispspindex; i++)
|
for (unsigned int i = 0; i < vispspindex; i++)
|
||||||
{
|
{
|
||||||
vissprite_t *vis;
|
RenderSprite *vis = vispsprites[i].vis;
|
||||||
|
|
||||||
vis = vispsprites[i].vis;
|
|
||||||
FDynamicColormap *colormap = vispsprites[i].basecolormap;
|
FDynamicColormap *colormap = vispsprites[i].basecolormap;
|
||||||
bool flip = vis->xiscale < 0;
|
bool flip = vis->xiscale < 0;
|
||||||
FSpecialColormap *special = NULL;
|
FSpecialColormap *special = NULL;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "r_visiblesprite.h"
|
#include "r_visiblesprite.h"
|
||||||
|
#include "r_sprite.h"
|
||||||
|
|
||||||
class DPSprite;
|
class DPSprite;
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ namespace swrenderer
|
||||||
// Used to store a psprite's drawing information if it needs to be drawn later.
|
// Used to store a psprite's drawing information if it needs to be drawn later.
|
||||||
struct vispsp_t
|
struct vispsp_t
|
||||||
{
|
{
|
||||||
vissprite_t *vis;
|
RenderSprite *vis;
|
||||||
FDynamicColormap *basecolormap;
|
FDynamicColormap *basecolormap;
|
||||||
int x1;
|
int x1;
|
||||||
};
|
};
|
||||||
|
@ -48,6 +49,6 @@ namespace swrenderer
|
||||||
static double pspritexiscale;
|
static double pspritexiscale;
|
||||||
static double pspriteyscale;
|
static double pspriteyscale;
|
||||||
|
|
||||||
static TArray<vissprite_t> avis;
|
static TArray<RenderSprite> avis;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,7 +156,7 @@ namespace swrenderer
|
||||||
double yscale = spriteScale.Y / tex->Scale.Y;
|
double yscale = spriteScale.Y / tex->Scale.Y;
|
||||||
|
|
||||||
// store information in a vissprite
|
// store information in a vissprite
|
||||||
vissprite_t *vis = RenderMemory::NewObject<vissprite_t>();
|
RenderSprite *vis = RenderMemory::NewObject<RenderSprite>();
|
||||||
|
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->xscale = FLOAT2FIXED(xscale);
|
vis->xscale = FLOAT2FIXED(xscale);
|
||||||
|
@ -166,7 +166,7 @@ namespace swrenderer
|
||||||
vis->texturemid = tex->TopOffset - (ViewPos.Z - pos.Z + thing->Floorclip) / yscale;
|
vis->texturemid = tex->TopOffset - (ViewPos.Z - pos.Z + thing->Floorclip) / yscale;
|
||||||
vis->x1 = x1 < renderportal->WindowLeft ? renderportal->WindowLeft : x1;
|
vis->x1 = x1 < renderportal->WindowLeft ? renderportal->WindowLeft : x1;
|
||||||
vis->x2 = x2 > renderportal->WindowRight ? renderportal->WindowRight : x2;
|
vis->x2 = x2 > renderportal->WindowRight ? renderportal->WindowRight : x2;
|
||||||
vis->Angle = thing->Angles.Yaw;
|
//vis->Angle = thing->Angles.Yaw;
|
||||||
|
|
||||||
if (renderflags & RF_XFLIP)
|
if (renderflags & RF_XFLIP)
|
||||||
{
|
{
|
||||||
|
@ -202,12 +202,10 @@ namespace swrenderer
|
||||||
vis->fakefloor = fakefloor;
|
vis->fakefloor = fakefloor;
|
||||||
vis->fakeceiling = fakeceiling;
|
vis->fakeceiling = fakeceiling;
|
||||||
vis->Style.ColormapNum = 0;
|
vis->Style.ColormapNum = 0;
|
||||||
vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
//vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
||||||
vis->bSplitSprite = false;
|
//vis->bSplitSprite = false;
|
||||||
|
|
||||||
vis->pic = tex;
|
vis->pic = tex;
|
||||||
vis->bIsVoxel = false;
|
|
||||||
vis->bWallSprite = false;
|
|
||||||
|
|
||||||
vis->foggy = foggy;
|
vis->foggy = foggy;
|
||||||
|
|
||||||
|
@ -278,8 +276,10 @@ namespace swrenderer
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderSprite::Render(vissprite_t *vis, const short *mfloorclip, const short *mceilingclip)
|
void RenderSprite::Render(short *mfloorclip, short *mceilingclip, int, int)
|
||||||
{
|
{
|
||||||
|
auto vis = this;
|
||||||
|
|
||||||
fixed_t frac;
|
fixed_t frac;
|
||||||
FTexture *tex;
|
FTexture *tex;
|
||||||
int x2;
|
int x2;
|
||||||
|
|
|
@ -17,10 +17,21 @@
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
class RenderSprite
|
class RenderSprite : public VisibleSprite
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Project(AActor *thing, const DVector3 &pos, FTexture *tex, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
static void Project(AActor *thing, const DVector3 &pos, FTexture *tex, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
||||||
static void Render(vissprite_t *vis, const short *mfloorclip, const short *mceilingclip);
|
|
||||||
|
void Render(short *cliptop, short *clipbottom, int minZ, int maxZ) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
fixed_t xscale;
|
||||||
|
fixed_t startfrac; // horizontal position of x1
|
||||||
|
fixed_t xiscale; // negative if flipped
|
||||||
|
|
||||||
|
uint32_t Translation;
|
||||||
|
uint32_t FillColor;
|
||||||
|
|
||||||
|
friend class RenderPlayerSprite; // To do: detach sprite from playersprite!
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,70 +24,44 @@ struct FVoxel;
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
struct vissprite_t
|
class VisibleSprite
|
||||||
{
|
{
|
||||||
struct posang
|
public:
|
||||||
{
|
virtual bool IsParticle() const { return false; }
|
||||||
FVector3 vpos; // view origin
|
virtual bool IsVoxel() const { return false; }
|
||||||
FAngle vang; // view angle
|
virtual bool IsWallSprite() const { return false; }
|
||||||
};
|
|
||||||
|
virtual void Render(short *cliptop, short *clipbottom, int minZ, int maxZ) = 0;
|
||||||
|
|
||||||
|
FTexture *pic;
|
||||||
|
|
||||||
short x1, x2;
|
short x1, x2;
|
||||||
FVector3 gpos; // origin in world coordinates
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
float gzb, gzt; // global bottom / top for silhouette clipping
|
float gzb, gzt; // global bottom / top for silhouette clipping
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int y1, y2; // top / bottom of particle on screen
|
|
||||||
};
|
|
||||||
};
|
|
||||||
DAngle Angle;
|
|
||||||
fixed_t xscale;
|
|
||||||
float yscale;
|
|
||||||
float depth;
|
|
||||||
float idepth; // 1/z
|
|
||||||
float deltax, deltay;
|
|
||||||
uint32_t FillColor;
|
|
||||||
double floorclip;
|
double floorclip;
|
||||||
union
|
|
||||||
{
|
double texturemid; // floorclip
|
||||||
FTexture *pic;
|
float yscale; // voxel and floorclip
|
||||||
struct FVoxel *voxel;
|
|
||||||
};
|
sector_t *heightsec; // height sector for underwater/fake ceiling
|
||||||
union
|
WaterFakeSide FakeFlatStat; // which side of fake/floor ceiling sprite is on
|
||||||
{
|
|
||||||
// Used by face sprites
|
F3DFloor *fakefloor; // 3d floor clipping
|
||||||
struct
|
|
||||||
{
|
|
||||||
double texturemid;
|
|
||||||
fixed_t startfrac; // horizontal position of x1
|
|
||||||
fixed_t xiscale; // negative if flipped
|
|
||||||
};
|
|
||||||
// Used by wall sprites
|
|
||||||
FWallCoords wallc;
|
|
||||||
// Used by voxels
|
|
||||||
posang pa;
|
|
||||||
};
|
|
||||||
sector_t *heightsec; // killough 3/27/98: height sector for underwater/fake ceiling
|
|
||||||
sector_t *sector; // [RH] sector this sprite is in
|
|
||||||
F3DFloor *fakefloor;
|
|
||||||
F3DFloor *fakeceiling;
|
F3DFloor *fakeceiling;
|
||||||
uint8_t bIsVoxel : 1; // [RH] Use voxel instead of pic
|
|
||||||
uint8_t bWallSprite : 1; // [RH] This is a wall sprite
|
FVector3 gpos; // origin in world coordinates
|
||||||
uint8_t bSplitSprite : 1; // [RH] Sprite was split by a drawseg
|
sector_t *sector; // sector this sprite is in
|
||||||
uint8_t bInMirror : 1; // [RH] Sprite is "inside" a mirror
|
|
||||||
WaterFakeSide FakeFlatStat; // [RH] which side of fake/floor ceiling sprite is on
|
// Light shared calculation?
|
||||||
short renderflags;
|
|
||||||
uint32_t Translation; // [RH] for color translation
|
|
||||||
visstyle_t Style;
|
visstyle_t Style;
|
||||||
int CurrentPortalUniq; // [ZZ] to identify the portal that this thing is in. used for clipping.
|
|
||||||
|
|
||||||
bool foggy;
|
bool foggy;
|
||||||
|
short renderflags;
|
||||||
|
|
||||||
vissprite_t() {}
|
float depth; // Sort (draw segments), also light
|
||||||
|
|
||||||
|
float deltax, deltay; // Sort (2d/voxel version)
|
||||||
|
float idepth; // Sort (non-voxel version)
|
||||||
|
|
||||||
|
int CurrentPortalUniq; // to identify the portal that this thing is in. used for clipping.
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,15 +52,15 @@ namespace swrenderer
|
||||||
StartIndices.Pop();
|
StartIndices.Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibleSpriteList::Push(vissprite_t *sprite)
|
void VisibleSpriteList::Push(VisibleSprite *sprite)
|
||||||
{
|
{
|
||||||
Sprites.Push(sprite);
|
Sprites.Push(sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibleSpriteList::Sort(bool compare2d)
|
void VisibleSpriteList::Sort(bool compare2d)
|
||||||
{
|
{
|
||||||
size_t first = StartIndices.Size() == 0 ? 0 : StartIndices.Last();
|
unsigned int first = StartIndices.Size() == 0 ? 0 : StartIndices.Last();
|
||||||
size_t count = Sprites.Size() - first;
|
unsigned int count = Sprites.Size() - first;
|
||||||
|
|
||||||
SortedSprites.Resize(count);
|
SortedSprites.Resize(count);
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ namespace swrenderer
|
||||||
|
|
||||||
if (!(i_compatflags & COMPATF_SPRITESORT))
|
if (!(i_compatflags & COMPATF_SPRITESORT))
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
SortedSprites[i] = Sprites[first + i];
|
SortedSprites[i] = Sprites[first + i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -77,7 +77,7 @@ namespace swrenderer
|
||||||
// If the compatibility option is on sprites of equal distance need to
|
// If the compatibility option is on sprites of equal distance need to
|
||||||
// be sorted in inverse order. This is most easily achieved by
|
// be sorted in inverse order. This is most easily achieved by
|
||||||
// filling the sort array backwards before the sort.
|
// filling the sort array backwards before the sort.
|
||||||
for (size_t i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
SortedSprites[i] = Sprites[first + count - i - 1];
|
SortedSprites[i] = Sprites[first + count - i - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ namespace swrenderer
|
||||||
// It does a 2D distance test based on whichever one is furthest from
|
// It does a 2D distance test based on whichever one is furthest from
|
||||||
// the viewpoint.
|
// the viewpoint.
|
||||||
|
|
||||||
std::stable_sort(&SortedSprites[0], &SortedSprites[count], [](vissprite_t *a, vissprite_t *b) -> bool
|
std::stable_sort(&SortedSprites[0], &SortedSprites[count], [](VisibleSprite *a, VisibleSprite *b) -> bool
|
||||||
{
|
{
|
||||||
return DVector2(a->deltax, a->deltay).LengthSquared() < DVector2(b->deltax, b->deltay).LengthSquared();
|
return DVector2(a->deltax, a->deltay).LengthSquared() < DVector2(b->deltax, b->deltay).LengthSquared();
|
||||||
});
|
});
|
||||||
|
@ -96,7 +96,7 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
// This is the standard version, which does a simple test based on depth.
|
// This is the standard version, which does a simple test based on depth.
|
||||||
|
|
||||||
std::stable_sort(&SortedSprites[0], &SortedSprites[count], [](vissprite_t *a, vissprite_t *b) -> bool
|
std::stable_sort(&SortedSprites[0], &SortedSprites[count], [](VisibleSprite *a, VisibleSprite *b) -> bool
|
||||||
{
|
{
|
||||||
return a->idepth > b->idepth;
|
return a->idepth > b->idepth;
|
||||||
});
|
});
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
struct drawseg_t;
|
struct drawseg_t;
|
||||||
struct vissprite_t;
|
class VisibleSprite;
|
||||||
|
|
||||||
class VisibleSpriteList
|
class VisibleSpriteList
|
||||||
{
|
{
|
||||||
|
@ -26,13 +26,13 @@ namespace swrenderer
|
||||||
void Clear();
|
void Clear();
|
||||||
void PushPortal();
|
void PushPortal();
|
||||||
void PopPortal();
|
void PopPortal();
|
||||||
void Push(vissprite_t *sprite);
|
void Push(VisibleSprite *sprite);
|
||||||
void Sort(bool compare2d);
|
void Sort(bool compare2d);
|
||||||
|
|
||||||
TArray<vissprite_t *> SortedSprites;
|
TArray<VisibleSprite *> SortedSprites;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TArray<vissprite_t *> Sprites;
|
TArray<VisibleSprite *> Sprites;
|
||||||
TArray<size_t> StartIndices;
|
TArray<unsigned int> StartIndices;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vissprite_t *vis = RenderMemory::NewObject<vissprite_t>();
|
RenderVoxel *vis = RenderMemory::NewObject<RenderVoxel>();
|
||||||
|
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->xscale = FLOAT2FIXED(xscale);
|
vis->xscale = FLOAT2FIXED(xscale);
|
||||||
|
@ -150,12 +150,10 @@ namespace swrenderer
|
||||||
vis->fakefloor = fakefloor;
|
vis->fakefloor = fakefloor;
|
||||||
vis->fakeceiling = fakeceiling;
|
vis->fakeceiling = fakeceiling;
|
||||||
vis->Style.ColormapNum = 0;
|
vis->Style.ColormapNum = 0;
|
||||||
vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
//vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
||||||
vis->bSplitSprite = false;
|
//vis->bSplitSprite = false;
|
||||||
|
|
||||||
vis->voxel = voxel->Voxel;
|
vis->voxel = voxel->Voxel;
|
||||||
vis->bIsVoxel = true;
|
|
||||||
vis->bWallSprite = false;
|
|
||||||
vis->foggy = foggy;
|
vis->foggy = foggy;
|
||||||
|
|
||||||
// The software renderer cannot invert the source without inverting the overlay
|
// The software renderer cannot invert the source without inverting the overlay
|
||||||
|
@ -227,8 +225,10 @@ namespace swrenderer
|
||||||
RenderTranslucentPass::DrewAVoxel = true;
|
RenderTranslucentPass::DrewAVoxel = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderVoxel::Render(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom)
|
void RenderVoxel::Render(short *cliptop, short *clipbottom, int minZ, int maxZ)
|
||||||
{
|
{
|
||||||
|
auto sprite = this;
|
||||||
|
|
||||||
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(sprite->Style.BaseColormap);
|
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(sprite->Style.BaseColormap);
|
||||||
|
|
||||||
R_SetColorMapLight(sprite->Style.BaseColormap, 0, sprite->Style.ColormapNum << FRACBITS);
|
R_SetColorMapLight(sprite->Style.BaseColormap, 0, sprite->Style.ColormapNum << FRACBITS);
|
||||||
|
|
|
@ -25,11 +25,10 @@
|
||||||
|
|
||||||
struct kvxslab_t;
|
struct kvxslab_t;
|
||||||
struct FVoxelMipLevel;
|
struct FVoxelMipLevel;
|
||||||
|
struct FVoxel;
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
struct vissprite_t;
|
|
||||||
|
|
||||||
// [RH] A c-buffer. Used for keeping track of offscreen voxel spans.
|
// [RH] A c-buffer. Used for keeping track of offscreen voxel spans.
|
||||||
struct FCoverageBuffer
|
struct FCoverageBuffer
|
||||||
{
|
{
|
||||||
|
@ -52,15 +51,31 @@ namespace swrenderer
|
||||||
unsigned int NumLists;
|
unsigned int NumLists;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenderVoxel
|
class RenderVoxel : public VisibleSprite
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Project(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
static void Project(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
||||||
static void Render(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom);
|
|
||||||
|
|
||||||
static void Deinit();
|
static void Deinit();
|
||||||
|
|
||||||
|
bool IsVoxel() const override { return true; }
|
||||||
|
void Render(short *cliptop, short *clipbottom, int minZ, int maxZ) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct posang
|
||||||
|
{
|
||||||
|
FVector3 vpos; // view origin
|
||||||
|
FAngle vang; // view angle
|
||||||
|
};
|
||||||
|
|
||||||
|
posang pa;
|
||||||
|
DAngle Angle;
|
||||||
|
fixed_t xscale;
|
||||||
|
FVoxel *voxel;
|
||||||
|
|
||||||
|
uint32_t Translation;
|
||||||
|
uint32_t FillColor;
|
||||||
|
|
||||||
enum { DVF_OFFSCREEN = 1, DVF_SPANSONLY = 2, DVF_MIRRORED = 4 };
|
enum { DVF_OFFSCREEN = 1, DVF_SPANSONLY = 2, DVF_MIRRORED = 4 };
|
||||||
|
|
||||||
static void FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch);
|
static void FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch);
|
||||||
|
|
|
@ -104,7 +104,7 @@ namespace swrenderer
|
||||||
gzt = pos.Z + scale.Y * scaled_to;
|
gzt = pos.Z + scale.Y * scaled_to;
|
||||||
gzb = pos.Z + scale.Y * scaled_bo;
|
gzb = pos.Z + scale.Y * scaled_bo;
|
||||||
|
|
||||||
vissprite_t *vis = RenderMemory::NewObject<vissprite_t>();
|
RenderWallSprite *vis = RenderMemory::NewObject<RenderWallSprite>();
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->x1 = wallc.sx1 < renderportal->WindowLeft ? renderportal->WindowLeft : wallc.sx1;
|
vis->x1 = wallc.sx1 < renderportal->WindowLeft ? renderportal->WindowLeft : wallc.sx1;
|
||||||
vis->x2 = wallc.sx2 >= renderportal->WindowRight ? renderportal->WindowRight : wallc.sx2;
|
vis->x2 = wallc.sx2 >= renderportal->WindowRight ? renderportal->WindowRight : wallc.sx2;
|
||||||
|
@ -127,12 +127,9 @@ namespace swrenderer
|
||||||
vis->Style.Alpha = float(thing->Alpha);
|
vis->Style.Alpha = float(thing->Alpha);
|
||||||
vis->fakefloor = NULL;
|
vis->fakefloor = NULL;
|
||||||
vis->fakeceiling = NULL;
|
vis->fakeceiling = NULL;
|
||||||
vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
//vis->bInMirror = renderportal->MirrorFlags & RF_XFLIP;
|
||||||
vis->pic = pic;
|
vis->pic = pic;
|
||||||
vis->bIsVoxel = false;
|
vis->Style.ColormapNum = GETPALOOKUP(r_SpriteVisibility / MAX(tz, MINZ), spriteshade);
|
||||||
vis->bWallSprite = true;
|
|
||||||
vis->Style.ColormapNum = GETPALOOKUP(
|
|
||||||
r_SpriteVisibility / MAX(tz, MINZ), spriteshade);
|
|
||||||
vis->Style.BaseColormap = basecolormap;
|
vis->Style.BaseColormap = basecolormap;
|
||||||
vis->wallc = wallc;
|
vis->wallc = wallc;
|
||||||
vis->foggy = foggy;
|
vis->foggy = foggy;
|
||||||
|
@ -140,8 +137,10 @@ namespace swrenderer
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderWallSprite::Render(vissprite_t *spr, const short *mfloorclip, const short *mceilingclip)
|
void RenderWallSprite::Render(short *mfloorclip, short *mceilingclip, int, int)
|
||||||
{
|
{
|
||||||
|
auto spr = this;
|
||||||
|
|
||||||
int x1, x2;
|
int x1, x2;
|
||||||
double iyscale;
|
double iyscale;
|
||||||
bool sprflipvert;
|
bool sprflipvert;
|
||||||
|
|
|
@ -17,13 +17,19 @@
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
class RenderWallSprite
|
class RenderWallSprite : public VisibleSprite
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Project(AActor *thing, const DVector3 &pos, FTextureID picnum, const DVector2 &scale, int renderflags, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
static void Project(AActor *thing, const DVector3 &pos, FTextureID picnum, const DVector2 &scale, int renderflags, int spriteshade, bool foggy, FDynamicColormap *basecolormap);
|
||||||
static void Render(vissprite_t *spr, const short *mfloorclip, const short *mceilingclip);
|
|
||||||
|
bool IsWallSprite() const override { return true; }
|
||||||
|
void Render(short *cliptop, short *clipbottom, int minZ, int maxZ) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void DrawColumn(int x, FTexture *WallSpriteTile, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip);
|
static void DrawColumn(int x, FTexture *WallSpriteTile, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip);
|
||||||
|
|
||||||
|
FWallCoords wallc;
|
||||||
|
uint32_t Translation;
|
||||||
|
uint32_t FillColor;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue