From e75e03d9e0da874dd6ebf96fed6734d8043a9dd7 Mon Sep 17 00:00:00 2001 From: Fabian Greffrath Date: Fri, 10 Jun 2022 08:47:56 +0200 Subject: [PATCH] add support for SMMU swirling flats (#591) * ad support for SMMU swirling flats * formatting glitch * shorten sequence length to 256 * create distorted flat lookup table on demand * make init function static * add config key and menu switch --- Source/CMakeLists.txt | 1 + Source/m_menu.c | 27 +++++++-- Source/m_misc.c | 8 +++ Source/p_spec.c | 13 ++++- Source/r_plane.c | 13 ++++- Source/r_swirl.c | 126 ++++++++++++++++++++++++++++++++++++++++++ Source/r_swirl.h | 25 +++++++++ 7 files changed, 205 insertions(+), 8 deletions(-) create mode 100644 Source/r_swirl.c create mode 100644 Source/r_swirl.h diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index fa059e71..5db72c59 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -99,6 +99,7 @@ set(WOOF_SOURCES r_segs.c r_segs.h r_sky.c r_sky.h r_state.h + r_swirl.c r_swirl.h r_things.c r_things.h s_sound.c s_sound.h s_musinfo.c s_musinfo.h diff --git a/Source/m_menu.c b/Source/m_menu.c index c83ca2d7..3b78bba9 100644 --- a/Source/m_menu.c +++ b/Source/m_menu.c @@ -3648,12 +3648,13 @@ void M_DrawEnemy(void) extern int realtic_clock_rate, tran_filter_pct; -setup_menu_t gen_settings1[], gen_settings2[]; +setup_menu_t gen_settings1[], gen_settings2[], gen_settings3[]; setup_menu_t* gen_settings[] = { gen_settings1, gen_settings2, + gen_settings3, NULL }; @@ -3803,6 +3804,7 @@ enum { general_title4, general_sky1, general_sky2, + general_swirl, general_smoothlight, general_brightmaps, general_diskicon, @@ -3854,6 +3856,9 @@ setup_menu_t gen_settings2[] = { // General Settings screen2 {"Linear Sky Scrolling", S_YESNO, m_null, M_X, G_Y3 + general_sky2*M_SPC, {"linearsky"}, 0, R_InitPlanes}, + {"Swirling Animated Flats", S_YESNO, m_null, M_X, + G_Y3 + general_swirl*M_SPC, {"r_swirl"}}, + {"Smooth Diminishing Lighting", S_YESNO, m_null, M_X, G_Y3 + general_smoothlight*M_SPC, {"smoothlight"}, 0, M_SmoothLight}, @@ -3866,18 +3871,28 @@ setup_menu_t gen_settings2[] = { // General Settings screen2 {"Show ENDOOM screen", S_CHOICE, m_null, M_X, G_Y3 + general_endoom*M_SPC, {"show_endoom"}, 0, NULL, default_endoom_strings}, - {"Miscellaneous" ,S_SKIP|S_TITLE, m_null, M_X, G_Y4}, + {"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings1}}, + {"NEXT ->",S_SKIP|S_NEXT, m_null, M_X_NEXT, M_Y_PREVNEXT, {gen_settings3}}, + + // Final entry + + {0,S_SKIP|S_END,m_null} +}; + +setup_menu_t gen_settings3[] = { // General Settings screen3 + + {"Miscellaneous" ,S_SKIP|S_TITLE, m_null, M_X, M_Y}, {"Game speed, percentage of normal", S_NUM|S_PRGWARN, m_null, M_X, - G_Y4 + general_realtic*M_SPC, {"realtic_clock_rate"}}, + M_Y + general_realtic*M_SPC, {"realtic_clock_rate"}}, {"Default skill level", S_CHOICE|S_LEVWARN, m_null, M_X, - G_Y4 + general_skill*M_SPC, {"default_skill"}, 0, NULL, default_skill_strings}, + M_Y + general_skill*M_SPC, {"default_skill"}, 0, NULL, default_skill_strings}, {"Show demo progress bar", S_YESNO, m_null, M_X, - G_Y4 + general_demobar*M_SPC, {"demobar"}}, + M_Y + general_demobar*M_SPC, {"demobar"}}, - {"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings1}}, + {"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings2}}, // Final entry diff --git a/Source/m_misc.c b/Source/m_misc.c index 2a32bcfb..c7f43fd4 100644 --- a/Source/m_misc.c +++ b/Source/m_misc.c @@ -96,6 +96,7 @@ extern boolean mus_reverb; extern boolean demobar; extern boolean smoothlight; extern boolean brightmaps; +extern boolean r_swirl; extern char *chat_macros[], *wad_files[], *deh_files[]; // killough 10/98 @@ -226,6 +227,13 @@ default_t defaults[] = { "set percentage of foreground/background translucency mix" }, + { + "r_swirl", + (config_t *) &r_swirl, NULL, + {0}, {0,1}, number, ss_gen, wad_yes, + "1 to enable swirling animated flats" + }, + { "smoothlight", (config_t *) &smoothlight, NULL, diff --git a/Source/p_spec.c b/Source/p_spec.c index 7a90f562..a084128f 100644 --- a/Source/p_spec.c +++ b/Source/p_spec.c @@ -162,13 +162,17 @@ void P_InitPicAnims (void) lastanim->istexture = animdefs[i].istexture; lastanim->numpics = lastanim->picnum - lastanim->basepic + 1; + lastanim->speed = LONG(animdefs[i].speed); // killough 5/5/98: add LONG() + // [crispy] add support for SMMU swirling flats + if (lastanim->speed < 65536 && lastanim->numpics != 1) + { if (lastanim->numpics < 2) I_Error ("P_InitPicAnims: bad cycle from %s to %s", animdefs[i].startname, animdefs[i].endname); + } - lastanim->speed = LONG(animdefs[i].speed); // killough 5/5/98: add LONG() lastanim++; } Z_ChangeTag (animdefs,PU_CACHE); //jff 3/23/98 allow table to be freed @@ -2258,6 +2262,8 @@ int levelTimeCount; boolean levelFragLimit; // Ty 03/18/98 Added -frags support int levelFragLimitCount; // Ty 03/18/98 Added -frags support +int r_swirl; + void P_UpdateSpecials (void) { anim_t* anim; @@ -2298,7 +2304,12 @@ void P_UpdateSpecials (void) if (anim->istexture) texturetranslation[i] = pic; else + { flattranslation[i] = pic; + // [crispy] add support for SMMU swirling flats + if (anim->speed > 65535 || anim->numpics == 1 || r_swirl) + flattranslation[i] = -1; + } } // Check buttons (retriggerable switches) and change texture on timeout diff --git a/Source/r_plane.c b/Source/r_plane.c index b44c4861..b13c8986 100644 --- a/Source/r_plane.c +++ b/Source/r_plane.c @@ -50,6 +50,7 @@ #include "r_sky.h" #include "r_plane.h" #include "r_bmaps.h" // [crispy] R_BrightmapForTexName() +#include "r_swirl.h" // [crispy] R_DistortedFlat() #define MAXVISPLANES 128 /* must be a power of 2 */ @@ -440,10 +441,20 @@ static void do_draw_plane(visplane_t *pl) else // regular flat { int stop, light; + boolean swirling = (flattranslation[pl->picnum] == -1); + // [crispy] add support for SMMU swirling flats + if (swirling) + { + ds_source = R_DistortedFlat(firstflat + pl->picnum); + ds_brightmap = R_BrightmapForFlatNum(pl->picnum); + } + else + { ds_source = W_CacheLumpNum(firstflat + flattranslation[pl->picnum], PU_STATIC); ds_brightmap = R_BrightmapForFlatNum(flattranslation[pl->picnum]); + } xoffs = pl->xoffs; // killough 2/28/98: Add offsets yoffs = pl->yoffs; @@ -463,7 +474,7 @@ static void do_draw_plane(visplane_t *pl) for (x = pl->minx ; x <= stop ; x++) R_MakeSpans(x,pl->top[x-1],pl->bottom[x-1],pl->top[x],pl->bottom[x]); - Z_ChangeTag (ds_source, PU_CACHE); + if (!swirling) Z_ChangeTag (ds_source, PU_CACHE); } } } diff --git a/Source/r_swirl.c b/Source/r_swirl.c new file mode 100644 index 00000000..cdd88eae --- /dev/null +++ b/Source/r_swirl.c @@ -0,0 +1,126 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2000, 2005-2014 Simon Howard +// Copyright(C) 2019 Fabian Greffrath +// +// 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 2 +// 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. +// +// DESCRIPTION: +// [crispy] add support for SMMU swirling flats +// + +// [crispy] adapted from smmu/r_ripple.c, by Simon Howard + +#include "doomstat.h" + +#include "i_system.h" +#include "w_wad.h" + +#include "tables.h" + + +// swirl factors determine the number of waves per flat width + +// 1 cycle per 64 units +#define swirlfactor (FINEANGLES/64) + +// 1 cycle per 32 units (2 in 64) +#define swirlfactor2 (FINEANGLES/32) + +#define SEQUENCE 256 +#define FLATSIZE (64 * 64) + +static int *offsets = NULL; +static int *offset; + +#define AMP 2 +#define AMP2 2 +#define SPEED 32 + +static void R_InitDistortedFlats() +{ + int i; + + offsets = I_Realloc(offsets, SEQUENCE * FLATSIZE * sizeof(*offsets)); + offset = offsets; + + for (i = 0; i < SEQUENCE; i++) + { + int x, y; + + for (x = 0; x < 64; x++) + { + for (y = 0; y < 64; y++) + { + int x1, y1; + int sinvalue, sinvalue2; + + sinvalue = (y * swirlfactor + i * SPEED * 5 + 900) & FINEMASK; + sinvalue2 = (x * swirlfactor2 + i * SPEED * 4 + 300) & FINEMASK; + x1 = x + 128 + + ((finesine[sinvalue] * AMP) >> FRACBITS) + + ((finesine[sinvalue2] * AMP2) >> FRACBITS); + + sinvalue = (x * swirlfactor + i * SPEED * 3 + 700) & FINEMASK; + sinvalue2 = (y * swirlfactor2 + i * SPEED * 4 + 1200) & FINEMASK; + y1 = y + 128 + + ((finesine[sinvalue] * AMP) >> FRACBITS) + + ((finesine[sinvalue2] * AMP2) >> FRACBITS); + + x1 &= 63; + y1 &= 63; + + offset[(y << 6) + x] = (y1 << 6) + x1; + } + } + + offset += FLATSIZE; + } +} + +byte *R_DistortedFlat(int flatnum) +{ + static int swirltic = -1; + static int swirlflat = -1; + static byte distortedflat[FLATSIZE]; + + if (!offsets) + { + R_InitDistortedFlats(); + } + + if (swirltic != leveltime) + { + offset = offsets + ((leveltime & (SEQUENCE - 1)) * FLATSIZE); + + swirltic = leveltime; + swirlflat = -1; + } + + if (swirlflat != flatnum) + { + char *normalflat; + int i; + + normalflat = W_CacheLumpNum(flatnum, PU_STATIC); + + for (i = 0; i < FLATSIZE; i++) + { + distortedflat[i] = normalflat[offset[i]]; + } + + Z_ChangeTag(normalflat, PU_CACHE); + + swirlflat = flatnum; + } + + return distortedflat; +} diff --git a/Source/r_swirl.h b/Source/r_swirl.h new file mode 100644 index 00000000..ad311649 --- /dev/null +++ b/Source/r_swirl.h @@ -0,0 +1,25 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2000, 2005-2014 Simon Howard +// Copyright(C) 2019 Fabian Greffrath +// +// 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 2 +// 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. +// +// DESCRIPTION: +// [crispy] add support for SMMU swirling flats +// + +#ifndef __R_SWIRL__ +#define __R_SWIRL__ + +byte *R_DistortedFlat(int flatnum); + +#endif