Skip to content

Commit

Permalink
Use separate fuzztable, etc. for player weapon fuzz effect
Browse files Browse the repository at this point in the history
  • Loading branch information
bradharding committed Oct 11, 2024
1 parent f62d8c6 commit 864e3e3
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 35 deletions.
3 changes: 2 additions & 1 deletion src/m_random.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@

unsigned int seed;
unsigned int bigseed;
unsigned int fuzzseed;
unsigned int fuzz1seed;
unsigned int fuzz2seed;

// MBF21: [XA] Common random formulas used by codepointers

Expand Down
25 changes: 18 additions & 7 deletions src/m_random.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@
#include "m_fixed.h"

#define BIGSEED 1
#define FUZZSEED 1

#define RAND rndtable[(seed = (seed + 1) & 255)]
#define BIGRAND ((bigseed = 214013 * bigseed + 2531011) >> 16)
#define FUZZRAND ((fuzzseed = 214013 * fuzzseed + 2531011) >> 16)
#define FUZZ1RAND ((fuzz1seed = 214013 * fuzz1seed + 2531011) >> 16)
#define FUZZ2RAND ((fuzz2seed = 214013 * fuzz2seed + 2531011) >> 16)

static const unsigned char rndtable[] =
{
Expand All @@ -66,7 +66,8 @@ static const unsigned char rndtable[] =

extern unsigned int seed;
extern unsigned int bigseed;
extern unsigned int fuzzseed;
extern unsigned int fuzz1seed;
extern unsigned int fuzz2seed;

int P_RandomHitscanAngle(const fixed_t spread);
int P_RandomHitscanSlope(const fixed_t spread);
Expand Down Expand Up @@ -131,12 +132,22 @@ static inline void M_BigSeed(const unsigned int value)
bigseed = value;
}

static inline int M_FuzzRandomInt(const int lower, const int upper)
static inline int M_Fuzz1RandomInt(const int lower, const int upper)
{
return (FUZZRAND % (upper - lower + 1) + lower);
return (FUZZ1RAND % (upper - lower + 1) + lower);
}

static inline void M_FuzzSeed(const unsigned int value)
static inline void M_Fuzz1Seed(const unsigned int value)
{
fuzzseed = value;
fuzz1seed = value;
}

static inline int M_Fuzz2RandomInt(const int lower, const int upper)
{
return (FUZZ2RAND % (upper - lower + 1) + lower);
}

static inline void M_Fuzz2Seed(const unsigned int value)
{
fuzz2seed = value;
}
3 changes: 2 additions & 1 deletion src/p_setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -2027,7 +2027,8 @@ static void P_LoadThings(int map, int lump)

M_Seed((unsigned int)time(NULL));
M_BigSeed((unsigned int)time(NULL));
M_FuzzSeed((unsigned int)time(NULL));
M_Fuzz1Seed((unsigned int)time(NULL));
M_Fuzz2Seed((unsigned int)time(NULL));
W_ReleaseLumpNum(lump);
}

Expand Down
25 changes: 14 additions & 11 deletions src/r_draw.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ int viewwindowx;
int viewwindowy;

int fuzzrange[3];
int fuzzpos;
int fuzztable[MAXSCREENAREA];
int fuzz1pos;
int fuzz2pos;
int fuzz1table[MAXSCREENAREA];
int fuzz2table[MAXSCREENAREA];

static byte *ylookup0[MAXHEIGHT];
static byte *ylookup1[MAXHEIGHT];
Expand Down Expand Up @@ -1050,24 +1052,24 @@ void R_DrawFuzzColumn(void)

// top
if (dc_yl >= 2)
BIGFUZZYPIXEL(8, (fuzztable[fuzzpos++] = FUZZ(-1, 1)));
BIGFUZZYPIXEL(8, (fuzz1table[fuzz1pos++] = FUZZ1(-1, 1)));
else
BIGFUZZYPIXEL(6, (fuzztable[fuzzpos++] = FUZZ(0, 1)));
BIGFUZZYPIXEL(6, (fuzz1table[fuzz1pos++] = FUZZ1(0, 1)));

dest += SCREENWIDTH * 2;

while (--count)
{
// middle
BIGFUZZYPIXEL(6, (fuzztable[fuzzpos++] = FUZZ(-1, 1)));
BIGFUZZYPIXEL(6, (fuzz1table[fuzz1pos++] = FUZZ1(-1, 1)));
dest += SCREENWIDTH * 2;
}

// bottom
if (dc_yl & 1)
HALFBIGFUZZYPIXEL(5, (fuzztable[fuzzpos++] = FUZZ(-1, 0)));
HALFBIGFUZZYPIXEL(5, (fuzz1table[fuzz1pos++] = FUZZ1(-1, 0)));
else
BIGFUZZYPIXEL(5, (fuzztable[fuzzpos++] = FUZZ(-1, 0)));
BIGFUZZYPIXEL(5, (fuzz1table[fuzz1pos++] = FUZZ1(-1, 0)));
}

void R_DrawFuzzColumns(void)
Expand All @@ -1085,11 +1087,11 @@ void R_DrawFuzzColumns(void)
byte *dest = screens[0] + x;

if (y == height - SCREENWIDTH * 2)
BIGFUZZYPIXEL(5, (fuzztable[fuzzpos++] = FUZZ(-1, 0)));
BIGFUZZYPIXEL(5, (fuzz2table[fuzz2pos++] = FUZZ2(-1, 0)));
else if (y >= SCREENWIDTH * 2 && *(source - SCREENWIDTH * 2) == NOFUZZ)
BIGFUZZYPIXEL(8, (fuzztable[fuzzpos++] = FUZZ(-1, 1)));
BIGFUZZYPIXEL(8, (fuzz2table[fuzz2pos++] = FUZZ2(-1, 1)));
else
BIGFUZZYPIXEL(6, (fuzztable[fuzzpos++] = FUZZ(-1, 1)));
BIGFUZZYPIXEL(6, (fuzz2table[fuzz2pos++] = FUZZ2(-1, 1)));
}
}
}
Expand Down Expand Up @@ -1304,7 +1306,8 @@ void R_InitBuffer(void)
fuzzrange[1] = 0;
fuzzrange[2] = SCREENWIDTH * 2;

memset(fuzztable, 0, MAXSCREENAREA);
memset(fuzz1table, 0, MAXSCREENAREA);
memset(fuzz2table, 0, MAXSCREENAREA);
}

void R_FillBezel(void)
Expand Down
9 changes: 6 additions & 3 deletions src/r_draw.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@

#include "m_random.h"

#define FUZZ(a, b) fuzzrange[M_FuzzRandomInt(a, b) + 1]
#define FUZZ1(a, b) fuzzrange[M_Fuzz1RandomInt(a, b) + 1]
#define FUZZ2(a, b) fuzzrange[M_Fuzz2RandomInt(a, b) + 1]
#define BIGFUZZYPIXEL(a, b) *dest = *(dest + 1) = *(dest + SCREENWIDTH) = *(dest + SCREENWIDTH + 1) = \
fullcolormap[(a) * 256 + dest[b]]
#define HALFBIGFUZZYPIXEL(a, b) *dest = *(dest + 1) = fullcolormap[(a) * 256 + dest[b]]
Expand Down Expand Up @@ -67,9 +68,11 @@ extern byte *dc_black40;
// first pixel in a column
extern byte *dc_source;

extern int fuzzpos;
extern int fuzz1pos;
extern int fuzz2pos;
extern int fuzzrange[3];
extern int fuzztable[MAXSCREENAREA];
extern int fuzz1table[MAXSCREENAREA];
extern int fuzz2table[MAXSCREENAREA];

// The span blitting interface.
// Hook in assembler or system specific BLT here.
Expand Down
5 changes: 4 additions & 1 deletion src/r_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1173,7 +1173,10 @@ void R_RenderPlayerView(void)
R_DrawPlanes();

if (consoleactive || freeze)
M_FuzzSeed(0);
{
M_Fuzz1Seed(0);
M_Fuzz2Seed(0);
}

R_DrawMasked();

Expand Down
6 changes: 3 additions & 3 deletions src/r_things.c
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,7 @@ static void R_DrawVisSprite(const vissprite_t *vis)

sprtopscreen = (int64_t)centeryfrac - FixedMul(dc_texturemid, spryscale);
baseclip = (vis->footclip ? (int)(sprtopscreen + vis->footclip) >> FRACBITS : viewheight);
fuzzpos = 0;
fuzz1pos = 0;

for (dc_x = vis->x1; dc_x <= x2; dc_x++, frac += xiscale)
{
Expand Down Expand Up @@ -559,7 +559,7 @@ static void R_DrawVisSpriteWithShadow(const vissprite_t *vis)
shadowcolfunc = mobj->shadowcolfunc;
shadowtopscreen = centeryfrac - FixedMul(vis->shadowpos, spryscale);
shadowshift = (shadowtopscreen * 9 / 10) >> FRACBITS;
fuzzpos = 0;
fuzz1pos = 0;

for (dc_x = vis->x1; dc_x <= x2; dc_x++, frac += xiscale)
{
Expand Down Expand Up @@ -1206,7 +1206,7 @@ static void R_DrawPlayerSprites(void)
// add all active psprites
if (invisibility && (invisibility > STARTFLASHING || (invisibility & FLASHONTIC)))
{
fuzzpos = 0;
fuzz2pos = 0;

V_FillRect(1, viewwindowx, viewwindowy, viewwidth, viewheight, PINK, 0, false, false, NULL, NULL);
R_DrawPlayerSprite(weapon, true, (weaponstate->dehacked || altered));
Expand Down
16 changes: 8 additions & 8 deletions src/v_video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1511,7 +1511,7 @@ void V_DrawFuzzPatch(int x, int y, patch_t *patch)
x -= SHORT(patch->leftoffset);
x += WIDESCREENDELTA;

fuzzpos = 0;
fuzz1pos = 0;

desttop = &screens[0][((y * DY) >> FRACBITS) * SCREENWIDTH + ((x * DX) >> FRACBITS)];

Expand All @@ -1529,13 +1529,13 @@ void V_DrawFuzzPatch(int x, int y, patch_t *patch)
{
if (count & 1)
{
fuzzpos++;
fuzz1pos++;

if (!menuactive && !consoleactive && !paused)
fuzztable[fuzzpos] = FUZZ(-1, 1);
fuzz1table[fuzz1pos] = FUZZ1(-1, 1);
}

*dest = fullcolormap[6 * 256 + dest[fuzztable[fuzzpos]]];
*dest = fullcolormap[6 * 256 + dest[fuzz1table[fuzz1pos]]];
dest += SCREENWIDTH;
}

Expand All @@ -1553,7 +1553,7 @@ void V_DrawFlippedFuzzPatch(int x, int y, patch_t *patch)
x -= SHORT(patch->leftoffset);
x += WIDESCREENDELTA;

fuzzpos = 0;
fuzz1pos = 0;

desttop = &screens[0][((y * DY) >> FRACBITS) * SCREENWIDTH + ((x * DX) >> FRACBITS)];

Expand All @@ -1571,13 +1571,13 @@ void V_DrawFlippedFuzzPatch(int x, int y, patch_t *patch)
{
if (count & 1)
{
fuzzpos++;
fuzz1pos++;

if (!menuactive && !consoleactive && !paused)
fuzztable[fuzzpos] = FUZZ(-1, 1);
fuzz1table[fuzz1pos] = FUZZ1(-1, 1);
}

*dest = fullcolormap[6 * 256 + dest[fuzztable[fuzzpos]]];
*dest = fullcolormap[6 * 256 + dest[fuzz1table[fuzz1pos]]];
dest += SCREENWIDTH;
}

Expand Down

0 comments on commit 864e3e3

Please sign in to comment.