mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-26 22:11:43 +00:00
- Improved fuzz rendering in software renderer by scaling it relative to 320x200
This commit is contained in:
parent
279b1e27dc
commit
f34ededdef
9 changed files with 206 additions and 6 deletions
|
@ -53,6 +53,7 @@
|
||||||
#include "swrenderer/scene/r_light.h"
|
#include "swrenderer/scene/r_light.h"
|
||||||
|
|
||||||
CVAR(Bool, r_dynlights, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
|
CVAR(Bool, r_dynlights, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
|
||||||
|
CVAR(Bool, r_fuzzscale, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
|
@ -64,6 +65,20 @@ namespace swrenderer
|
||||||
int fuzzpos;
|
int fuzzpos;
|
||||||
int fuzzviewheight;
|
int fuzzviewheight;
|
||||||
|
|
||||||
|
int fuzz_random_x_offset[FUZZ_RANDOM_X_SIZE] =
|
||||||
|
{
|
||||||
|
75, 76, 21, 91, 56, 33, 62, 99, 61, 79,
|
||||||
|
95, 54, 41, 18, 69, 43, 49, 59, 10, 84,
|
||||||
|
94, 17, 57, 46, 9, 39, 55, 34,100, 81,
|
||||||
|
73, 88, 92, 3, 63, 36, 7, 28, 13, 80,
|
||||||
|
16, 96, 78, 29, 71, 58, 89, 24, 1, 35,
|
||||||
|
52, 82, 4, 14, 22, 53, 38, 66, 12, 72,
|
||||||
|
90, 44, 77, 83, 6, 27, 48, 30, 42, 32,
|
||||||
|
65, 15, 97, 20, 67, 74, 98, 85, 60, 68,
|
||||||
|
19, 26, 8, 87, 86, 64, 11, 37, 31, 47,
|
||||||
|
25, 5, 50, 51, 23, 2, 93, 70, 40, 45
|
||||||
|
};
|
||||||
|
|
||||||
uint32_t particle_texture[NUM_PARTICLE_TEXTURES][PARTICLE_TEXTURE_SIZE * PARTICLE_TEXTURE_SIZE];
|
uint32_t particle_texture[NUM_PARTICLE_TEXTURES][PARTICLE_TEXTURE_SIZE * PARTICLE_TEXTURE_SIZE];
|
||||||
|
|
||||||
short zeroarray[MAXWIDTH];
|
short zeroarray[MAXWIDTH];
|
||||||
|
@ -176,11 +191,28 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void R_UpdateFuzzPosFrameStart()
|
||||||
|
{
|
||||||
|
if (r_fuzzscale)
|
||||||
|
{
|
||||||
|
int next_random = 0;
|
||||||
|
|
||||||
|
fuzzpos = (fuzzpos + fuzz_random_x_offset[next_random] * FUZZTABLE / 100) % FUZZTABLE;
|
||||||
|
|
||||||
|
next_random++;
|
||||||
|
if (next_random == FUZZ_RANDOM_X_SIZE)
|
||||||
|
next_random = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void R_UpdateFuzzPos(const SpriteDrawerArgs &args)
|
void R_UpdateFuzzPos(const SpriteDrawerArgs &args)
|
||||||
{
|
{
|
||||||
int yl = MAX(args.FuzzY1(), 1);
|
if (!r_fuzzscale)
|
||||||
int yh = MIN(args.FuzzY2(), fuzzviewheight);
|
{
|
||||||
if (yl <= yh)
|
int yl = MAX(args.FuzzY1(), 1);
|
||||||
fuzzpos = (fuzzpos + yh - yl + 1) % FUZZTABLE;
|
int yh = MIN(args.FuzzY2(), fuzzviewheight);
|
||||||
|
if (yl <= yh)
|
||||||
|
fuzzpos = (fuzzpos + yh - yl + 1) % FUZZTABLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ EXTERN_CVAR(Int, r_drawfuzz);
|
||||||
EXTERN_CVAR(Bool, r_drawtrans);
|
EXTERN_CVAR(Bool, r_drawtrans);
|
||||||
EXTERN_CVAR(Float, transsouls);
|
EXTERN_CVAR(Float, transsouls);
|
||||||
EXTERN_CVAR(Bool, r_dynlights);
|
EXTERN_CVAR(Bool, r_dynlights);
|
||||||
|
EXTERN_CVAR(Bool, r_fuzzscale);
|
||||||
|
|
||||||
class DrawerCommandQueue;
|
class DrawerCommandQueue;
|
||||||
typedef std::shared_ptr<DrawerCommandQueue> DrawerCommandQueuePtr;
|
typedef std::shared_ptr<DrawerCommandQueue> DrawerCommandQueuePtr;
|
||||||
|
@ -41,7 +42,9 @@ namespace swrenderer
|
||||||
|
|
||||||
// Spectre/Invisibility.
|
// Spectre/Invisibility.
|
||||||
#define FUZZTABLE 50
|
#define FUZZTABLE 50
|
||||||
|
#define FUZZ_RANDOM_X_SIZE 100
|
||||||
extern int fuzzoffset[FUZZTABLE + 1];
|
extern int fuzzoffset[FUZZTABLE + 1];
|
||||||
|
extern int fuzz_random_x_offset[FUZZ_RANDOM_X_SIZE];
|
||||||
extern int fuzzpos;
|
extern int fuzzpos;
|
||||||
extern int fuzzviewheight;
|
extern int fuzzviewheight;
|
||||||
|
|
||||||
|
@ -99,5 +102,6 @@ namespace swrenderer
|
||||||
void R_InitFuzzTable(int fuzzoff);
|
void R_InitFuzzTable(int fuzzoff);
|
||||||
void R_InitParticleTexture();
|
void R_InitParticleTexture();
|
||||||
|
|
||||||
|
void R_UpdateFuzzPosFrameStart();
|
||||||
void R_UpdateFuzzPos(const SpriteDrawerArgs &args);
|
void R_UpdateFuzzPos(const SpriteDrawerArgs &args);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1834,6 +1834,60 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DrawScaledFuzzColumnPalCommand::DrawScaledFuzzColumnPalCommand(const SpriteDrawerArgs &drawerargs)
|
||||||
|
{
|
||||||
|
_x = drawerargs.FuzzX();
|
||||||
|
_yl = drawerargs.FuzzY1();
|
||||||
|
_yh = drawerargs.FuzzY2();
|
||||||
|
_destorg = drawerargs.Viewport()->GetDest(0, 0);
|
||||||
|
_pitch = drawerargs.Viewport()->RenderTarget->GetPitch();
|
||||||
|
_fuzzpos = fuzzpos;
|
||||||
|
_fuzzviewheight = fuzzviewheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawScaledFuzzColumnPalCommand::Execute(DrawerThread *thread)
|
||||||
|
{
|
||||||
|
int x = _x;
|
||||||
|
int yl = MAX(_yl, 1);
|
||||||
|
int yh = MIN(_yh, _fuzzviewheight);
|
||||||
|
|
||||||
|
int count = thread->count_for_thread(yl, yh - yl + 1);
|
||||||
|
if (count <= 0) return;
|
||||||
|
|
||||||
|
int pitch = _pitch;
|
||||||
|
uint8_t *dest = _pitch * yl + x + (uint8_t*)_destorg;
|
||||||
|
|
||||||
|
int scaled_x = x * 200 / _fuzzviewheight;
|
||||||
|
int fuzz_x = fuzz_random_x_offset[scaled_x % FUZZ_RANDOM_X_SIZE] + _fuzzpos;
|
||||||
|
|
||||||
|
fixed_t fuzzstep = (200 << FRACBITS) / _fuzzviewheight;
|
||||||
|
fixed_t fuzzcount = FUZZTABLE << FRACBITS;
|
||||||
|
fixed_t fuzz = (fuzz_x << FRACBITS) + yl * fuzzstep;
|
||||||
|
|
||||||
|
dest = thread->dest_for_thread(yl, pitch, dest);
|
||||||
|
pitch *= thread->num_cores;
|
||||||
|
|
||||||
|
fuzz += fuzzstep * thread->skipped_by_thread(yl);
|
||||||
|
fuzz %= fuzzcount;
|
||||||
|
fuzzstep *= thread->num_cores;
|
||||||
|
|
||||||
|
uint8_t *map = NormalLight.Maps;
|
||||||
|
|
||||||
|
while (count > 0)
|
||||||
|
{
|
||||||
|
int offset = fuzzoffset[fuzz >> FRACBITS] << 8;
|
||||||
|
*dest = map[offset + *dest];
|
||||||
|
dest += pitch;
|
||||||
|
|
||||||
|
fuzz += fuzzstep;
|
||||||
|
if (fuzz >= fuzzcount) fuzz -= fuzzcount;
|
||||||
|
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
DrawFuzzColumnPalCommand::DrawFuzzColumnPalCommand(const SpriteDrawerArgs &args)
|
DrawFuzzColumnPalCommand::DrawFuzzColumnPalCommand(const SpriteDrawerArgs &args)
|
||||||
|
|
|
@ -90,6 +90,23 @@ namespace swrenderer
|
||||||
int _fuzzviewheight;
|
int _fuzzviewheight;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DrawScaledFuzzColumnPalCommand : public DrawerCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawScaledFuzzColumnPalCommand(const SpriteDrawerArgs &drawerargs);
|
||||||
|
void Execute(DrawerThread *thread) override;
|
||||||
|
FString DebugInfo() override { return "DrawScaledFuzzColumnPalCommand"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _x;
|
||||||
|
int _yl;
|
||||||
|
int _yh;
|
||||||
|
uint8_t *_destorg;
|
||||||
|
int _pitch;
|
||||||
|
int _fuzzpos;
|
||||||
|
int _fuzzviewheight;
|
||||||
|
};
|
||||||
|
|
||||||
class PalSpanCommand : public DrawerCommand
|
class PalSpanCommand : public DrawerCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -245,7 +262,14 @@ namespace swrenderer
|
||||||
void FillAddClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddClampPalCommand>(args); }
|
void FillAddClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnAddClampPalCommand>(args); }
|
||||||
void FillSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnSubClampPalCommand>(args); }
|
void FillSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnSubClampPalCommand>(args); }
|
||||||
void FillRevSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnRevSubClampPalCommand>(args); }
|
void FillRevSubClampColumn(const SpriteDrawerArgs &args) override { Queue->Push<FillColumnRevSubClampPalCommand>(args); }
|
||||||
void DrawFuzzColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawFuzzColumnPalCommand>(args); R_UpdateFuzzPos(args); }
|
void DrawFuzzColumn(const SpriteDrawerArgs &args) override
|
||||||
|
{
|
||||||
|
if (r_fuzzscale)
|
||||||
|
Queue->Push<DrawScaledFuzzColumnPalCommand>(args);
|
||||||
|
else
|
||||||
|
Queue->Push<DrawFuzzColumnPalCommand>(args);
|
||||||
|
R_UpdateFuzzPos(args);
|
||||||
|
}
|
||||||
void DrawAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddPalCommand>(args); }
|
void DrawAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnAddPalCommand>(args); }
|
||||||
void DrawTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTranslatedPalCommand>(args); }
|
void DrawTranslatedColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTranslatedPalCommand>(args); }
|
||||||
void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTlatedAddPalCommand>(args); }
|
void DrawTranslatedAddColumn(const SpriteDrawerArgs &args) override { Queue->Push<DrawColumnTlatedAddPalCommand>(args); }
|
||||||
|
|
|
@ -142,7 +142,10 @@ namespace swrenderer
|
||||||
|
|
||||||
void SWTruecolorDrawers::DrawFuzzColumn(const SpriteDrawerArgs &args)
|
void SWTruecolorDrawers::DrawFuzzColumn(const SpriteDrawerArgs &args)
|
||||||
{
|
{
|
||||||
Queue->Push<DrawFuzzColumnRGBACommand>(args);
|
if (r_fuzzscale)
|
||||||
|
Queue->Push<DrawScaledFuzzColumnRGBACommand>(args);
|
||||||
|
else
|
||||||
|
Queue->Push<DrawFuzzColumnRGBACommand>(args);
|
||||||
R_UpdateFuzzPos(args);
|
R_UpdateFuzzPos(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,6 +251,69 @@ namespace swrenderer
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DrawScaledFuzzColumnRGBACommand::DrawScaledFuzzColumnRGBACommand(const SpriteDrawerArgs &drawerargs)
|
||||||
|
{
|
||||||
|
_x = drawerargs.FuzzX();
|
||||||
|
_yl = drawerargs.FuzzY1();
|
||||||
|
_yh = drawerargs.FuzzY2();
|
||||||
|
_destorg = drawerargs.Viewport()->GetDest(0, 0);
|
||||||
|
_pitch = drawerargs.Viewport()->RenderTarget->GetPitch();
|
||||||
|
_fuzzpos = fuzzpos;
|
||||||
|
_fuzzviewheight = fuzzviewheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawScaledFuzzColumnRGBACommand::Execute(DrawerThread *thread)
|
||||||
|
{
|
||||||
|
int x = _x;
|
||||||
|
int yl = MAX(_yl, 1);
|
||||||
|
int yh = MIN(_yh, _fuzzviewheight);
|
||||||
|
|
||||||
|
int count = thread->count_for_thread(yl, yh - yl + 1);
|
||||||
|
if (count <= 0) return;
|
||||||
|
|
||||||
|
int pitch = _pitch;
|
||||||
|
uint32_t *dest = _pitch * yl + x + (uint32_t*)_destorg;
|
||||||
|
|
||||||
|
int scaled_x = x * 200 / _fuzzviewheight;
|
||||||
|
int fuzz_x = fuzz_random_x_offset[scaled_x % FUZZ_RANDOM_X_SIZE] + _fuzzpos;
|
||||||
|
|
||||||
|
fixed_t fuzzstep = (200 << FRACBITS) / _fuzzviewheight;
|
||||||
|
fixed_t fuzzcount = FUZZTABLE << FRACBITS;
|
||||||
|
fixed_t fuzz = (fuzz_x << FRACBITS) + yl * fuzzstep;
|
||||||
|
|
||||||
|
dest = thread->dest_for_thread(yl, pitch, dest);
|
||||||
|
pitch *= thread->num_cores;
|
||||||
|
|
||||||
|
fuzz += fuzzstep * thread->skipped_by_thread(yl);
|
||||||
|
fuzz %= fuzzcount;
|
||||||
|
fuzzstep *= thread->num_cores;
|
||||||
|
|
||||||
|
while (count > 0)
|
||||||
|
{
|
||||||
|
int alpha = 32 - fuzzoffset[fuzz >> FRACBITS];
|
||||||
|
|
||||||
|
uint32_t bg = *dest;
|
||||||
|
uint32_t red = (RPART(bg) * alpha) >> 5;
|
||||||
|
uint32_t green = (GPART(bg) * alpha) >> 5;
|
||||||
|
uint32_t blue = (BPART(bg) * alpha) >> 5;
|
||||||
|
|
||||||
|
*dest = 0xff000000 | (red << 16) | (green << 8) | blue;
|
||||||
|
dest += pitch;
|
||||||
|
|
||||||
|
fuzz += fuzzstep;
|
||||||
|
if (fuzz >= fuzzcount) fuzz -= fuzzcount;
|
||||||
|
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FString DrawScaledFuzzColumnRGBACommand::DebugInfo()
|
||||||
|
{
|
||||||
|
return "DrawScaledFuzzColumn";
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
DrawFuzzColumnRGBACommand::DrawFuzzColumnRGBACommand(const SpriteDrawerArgs &drawerargs)
|
DrawFuzzColumnRGBACommand::DrawFuzzColumnRGBACommand(const SpriteDrawerArgs &drawerargs)
|
||||||
{
|
{
|
||||||
_x = drawerargs.FuzzX();
|
_x = drawerargs.FuzzX();
|
||||||
|
|
|
@ -86,6 +86,22 @@ namespace swrenderer
|
||||||
FString DebugInfo() override;
|
FString DebugInfo() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DrawScaledFuzzColumnRGBACommand : public DrawerCommand
|
||||||
|
{
|
||||||
|
int _x;
|
||||||
|
int _yl;
|
||||||
|
int _yh;
|
||||||
|
uint8_t * RESTRICT _destorg;
|
||||||
|
int _pitch;
|
||||||
|
int _fuzzpos;
|
||||||
|
int _fuzzviewheight;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DrawScaledFuzzColumnRGBACommand(const SpriteDrawerArgs &drawerargs);
|
||||||
|
void Execute(DrawerThread *thread) override;
|
||||||
|
FString DebugInfo() override;
|
||||||
|
};
|
||||||
|
|
||||||
class FillSpanRGBACommand : public DrawerCommand
|
class FillSpanRGBACommand : public DrawerCommand
|
||||||
{
|
{
|
||||||
int _x1;
|
int _x1;
|
||||||
|
|
|
@ -152,6 +152,8 @@ namespace swrenderer
|
||||||
// Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function
|
// Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function
|
||||||
PO_LinkToSubsectors();
|
PO_LinkToSubsectors();
|
||||||
|
|
||||||
|
R_UpdateFuzzPosFrameStart();
|
||||||
|
|
||||||
ActorRenderFlags savedflags = MainThread()->Viewport->viewpoint.camera->renderflags;
|
ActorRenderFlags savedflags = MainThread()->Viewport->viewpoint.camera->renderflags;
|
||||||
// Never draw the player unless in chasecam mode
|
// Never draw the player unless in chasecam mode
|
||||||
if (!MainThread()->Viewport->viewpoint.showviewer)
|
if (!MainThread()->Viewport->viewpoint.showviewer)
|
||||||
|
|
|
@ -1816,6 +1816,7 @@ DSPLYMNU_ATTACHEDSURFACES = "Use attached surfaces"; // Not used
|
||||||
DSPLYMNU_SKYMODE = "Sky render mode";
|
DSPLYMNU_SKYMODE = "Sky render mode";
|
||||||
DSPLYMNU_LINEARSKY = "Linear skies";
|
DSPLYMNU_LINEARSKY = "Linear skies";
|
||||||
DSPLYMNU_GZDFULLBRIGHT = "Fullbright overrides sector color";
|
DSPLYMNU_GZDFULLBRIGHT = "Fullbright overrides sector color";
|
||||||
|
DSPLYMNU_SCALEFUZZ = "Scale fuzz effect";
|
||||||
DSPLYMNU_DRAWFUZZ = "Use fuzz effect";
|
DSPLYMNU_DRAWFUZZ = "Use fuzz effect";
|
||||||
DSPLYMNU_OLDTRANS = "Classic Transparency";
|
DSPLYMNU_OLDTRANS = "Classic Transparency";
|
||||||
DSPLYMNU_TRANSSOUL = "Lost Soul translucency";
|
DSPLYMNU_TRANSSOUL = "Lost Soul translucency";
|
||||||
|
|
|
@ -725,6 +725,7 @@ OptionMenu "SWROptions" protected
|
||||||
Option "$DSPLYMNU_SKYMODE", "r_skymode", "SkyModes"
|
Option "$DSPLYMNU_SKYMODE", "r_skymode", "SkyModes"
|
||||||
Option "$DSPLYMNU_LINEARSKY", "r_linearsky", "OnOff"
|
Option "$DSPLYMNU_LINEARSKY", "r_linearsky", "OnOff"
|
||||||
Option "$DSPLYMNU_GZDFULLBRIGHT", "r_fullbrightignoresectorcolor", "OnOff"
|
Option "$DSPLYMNU_GZDFULLBRIGHT", "r_fullbrightignoresectorcolor", "OnOff"
|
||||||
|
Option "$DSPLYMNU_SCALEFUZZ", "r_fuzzscale", "OnOff"
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionMenu "VideoOptions" protected
|
OptionMenu "VideoOptions" protected
|
||||||
|
|
Loading…
Reference in a new issue