From 1c3e0f1a755677f480b21ee1cd8c2c80343f9202 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 21 Oct 2021 15:55:57 +0800 Subject: [PATCH 01/22] Added 'NoPerPixelLighting' flag to models to force it to not use per-pixel lighting. Main use case is for voxels that have been converted to models. --- src/r_data/models.cpp | 4 ++++ src/r_data/models.h | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 43d846a4de..c626a13eb2 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -524,6 +524,10 @@ static void ParseModelDefLump(int Lump) { smf.flags |= MDL_USEACTORROLL; } + else if (sc.Compare("noperpixellighting")) + { + smf.flags |= MDL_NOPERPIXELLIGHTING; + } else if (sc.Compare("rotating")) { smf.flags |= MDL_ROTATING; diff --git a/src/r_data/models.h b/src/r_data/models.h index 715ca73be1..2ce9744cab 100644 --- a/src/r_data/models.h +++ b/src/r_data/models.h @@ -55,6 +55,7 @@ enum MDL_BADROTATION = 128, MDL_DONTCULLBACKFACES = 256, MDL_USEROTATIONCENTER = 512, + MDL_NOPERPIXELLIGHTING = 1024, // forces a model to not use per-pixel lighting. useful for voxel-converted-to-model objects. }; FSpriteModelFrame * FindModelFrame(const PClass * ti, int sprite, int frame, bool dropped); diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index d53e9ee1e4..d66074f6de 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -482,7 +482,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp) inline void HWSprite::PutSprite(HWDrawInfo *di, bool translucent) { // That's a lot of checks... - if (modelframe && !modelframe->isVoxel && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) + if (modelframe && !modelframe->isVoxel && !(modelframe->flags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) { hw_GetDynModelLight(actor, lightdata); dynlightindex = screen->mLights->UploadLights(lightdata); From 6799566dc2a27fa1de16496db10679956acd0aa1 Mon Sep 17 00:00:00 2001 From: Blue Shadow Date: Sat, 23 Oct 2021 09:09:34 +0300 Subject: [PATCH 02/22] - fixed: menu delegate class error message referenced the wrong gameinfo property --- src/menu/doommenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu/doommenu.cpp b/src/menu/doommenu.cpp index 24fb66cfbb..0851323d41 100644 --- a/src/menu/doommenu.cpp +++ b/src/menu/doommenu.cpp @@ -1312,7 +1312,7 @@ void SetDefaultMenuColors() cls = PClass::FindClass(gameinfo.MenuDelegateClass); if (!cls) - I_FatalError("%s: Undefined menu delegate class", gameinfo.HelpMenuClass.GetChars()); + I_FatalError("%s: Undefined menu delegate class", gameinfo.MenuDelegateClass.GetChars()); if (!cls->IsDescendantOf("MenuDelegateBase")) I_FatalError("'%s' does not inherit from MenuDelegateBase", gameinfo.MenuDelegateClass.GetChars()); menuDelegate = cls->CreateNew(); From 8e1dd7d2c54bbff2550bf36fc61ed3b6952aead8 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 23 Oct 2021 13:46:59 +0300 Subject: [PATCH 03/22] - removed obsolete code from Cocoa backend --- src/common/platform/posix/cocoa/i_main.mm | 24 +---------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/common/platform/posix/cocoa/i_main.mm b/src/common/platform/posix/cocoa/i_main.mm index b113aaa3ba..727edef78a 100644 --- a/src/common/platform/posix/cocoa/i_main.mm +++ b/src/common/platform/posix/cocoa/i_main.mm @@ -73,23 +73,6 @@ void Mac_I_FatalError(const char* const message) } -#if MAC_OS_X_VERSION_MAX_ALLOWED < 101000 - -// Available since 10.9 with no public declaration/definition until 10.10 - -struct NSOperatingSystemVersion -{ - NSInteger majorVersion; - NSInteger minorVersion; - NSInteger patchVersion; -}; - -@interface NSProcessInfo(OperatingSystemVersion) -- (NSOperatingSystemVersion)operatingSystemVersion; -@end - -#endif // before 10.10 - static bool ReadSystemVersionFromPlist(NSOperatingSystemVersion& version) { #if MAC_OS_X_VERSION_MAX_ALLOWED < 110000 @@ -169,9 +152,6 @@ void I_DetectOS() case 10: switch (version.minorVersion) { - case 9: name = "OS X Mavericks"; break; - case 10: name = "OS X Yosemite"; break; - case 11: name = "OS X El Capitan"; break; case 12: name = "macOS Sierra"; break; case 13: name = "macOS High Sierra"; break; case 14: name = "macOS Mojave"; break; @@ -196,9 +176,7 @@ void I_DetectOS() sysctlbyname("hw.model", model, &size, nullptr, 0); const char* const architecture = -#ifdef __i386__ - "32-bit Intel"; -#elif defined __x86_64__ +#ifdef __x86_64__ "64-bit Intel"; #elif defined __aarch64__ "64-bit ARM"; From 199558189399e9ac847bb5d7c20da47522ab8eaf Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 25 Oct 2021 08:10:41 +0200 Subject: [PATCH 04/22] - moved hacx widescreen assets to hacx.hacx1 They are not compatible and not intended for the Hacx 2 IWAD. --- .../filter/{hacx => hacx.hacx1}/graphics/credit.lmp | Bin .../filter/{hacx => hacx.hacx1}/graphics/help.lmp | Bin .../{hacx => hacx.hacx1}/graphics/interpic.lmp | Bin .../{hacx => hacx.hacx1}/graphics/titlepic.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGA0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGB0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGC0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGD0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGE0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGF0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGG0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGH0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGI0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/CRYGJ0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISFA0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISFB0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISFC0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISFD0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISGA0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/MISGB0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/PISGE0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/PLSGB0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2A0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2B0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2C0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2D0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2E0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2F0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2G0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2H0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2I0.lmp | Bin .../filter/{hacx => hacx.hacx1}/sprites/SHT2J0.lmp | Bin 32 files changed, 0 insertions(+), 0 deletions(-) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/graphics/credit.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/graphics/help.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/graphics/interpic.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/graphics/titlepic.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGA0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGB0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGC0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGD0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGE0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGF0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGG0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGH0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGI0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/CRYGJ0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISFA0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISFB0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISFC0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISFD0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISGA0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/MISGB0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/PISGE0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/PLSGB0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2A0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2B0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2C0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2D0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2E0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2F0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2G0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2H0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2I0.lmp (100%) rename wadsrc_widepix/static/filter/{hacx => hacx.hacx1}/sprites/SHT2J0.lmp (100%) diff --git a/wadsrc_widepix/static/filter/hacx/graphics/credit.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/graphics/credit.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/graphics/credit.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/graphics/credit.lmp diff --git a/wadsrc_widepix/static/filter/hacx/graphics/help.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/graphics/help.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/graphics/help.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/graphics/help.lmp diff --git a/wadsrc_widepix/static/filter/hacx/graphics/interpic.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/graphics/interpic.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/graphics/interpic.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/graphics/interpic.lmp diff --git a/wadsrc_widepix/static/filter/hacx/graphics/titlepic.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/graphics/titlepic.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/graphics/titlepic.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/graphics/titlepic.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGA0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGA0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGA0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGA0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGB0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGB0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGB0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGB0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGC0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGC0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGC0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGC0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGD0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGD0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGD0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGD0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGE0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGE0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGE0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGE0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGF0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGF0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGF0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGF0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGG0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGG0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGG0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGG0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGH0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGH0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGH0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGH0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGI0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGI0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGI0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGI0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/CRYGJ0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGJ0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/CRYGJ0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/CRYGJ0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISFA0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFA0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISFA0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFA0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISFB0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFB0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISFB0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFB0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISFC0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFC0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISFC0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFC0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISFD0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFD0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISFD0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISFD0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISGA0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISGA0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISGA0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISGA0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/MISGB0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISGB0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/MISGB0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/MISGB0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/PISGE0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/PISGE0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/PISGE0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/PISGE0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/PLSGB0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/PLSGB0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/PLSGB0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/PLSGB0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2A0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2A0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2A0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2A0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2B0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2B0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2B0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2B0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2C0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2C0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2C0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2C0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2D0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2D0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2D0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2D0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2E0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2E0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2E0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2E0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2F0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2F0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2F0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2F0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2G0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2G0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2G0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2G0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2H0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2H0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2H0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2H0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2I0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2I0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2I0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2I0.lmp diff --git a/wadsrc_widepix/static/filter/hacx/sprites/SHT2J0.lmp b/wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2J0.lmp similarity index 100% rename from wadsrc_widepix/static/filter/hacx/sprites/SHT2J0.lmp rename to wadsrc_widepix/static/filter/hacx.hacx1/sprites/SHT2J0.lmp From efdc6a50a18e0ff15a6a5f9b0ce58118e67fca83 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 25 Oct 2021 11:49:40 -0400 Subject: [PATCH 05/22] - remove another vestigial file from the time back when Widepix was submoduled --- wadsrc_widepix/static/.gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 wadsrc_widepix/static/.gitignore diff --git a/wadsrc_widepix/static/.gitignore b/wadsrc_widepix/static/.gitignore deleted file mode 100644 index 3ce1f9a1da..0000000000 --- a/wadsrc_widepix/static/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/psd -/reference From d853961a8335de8a43f170a3b9241238fc8f32cd Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 27 Oct 2021 03:38:02 +0200 Subject: [PATCH 06/22] Fix vulkan buffers not using the stream usage for the 2d drawer Add BufferUsageType enum to clarify what kind of usage is expected by the buffer allocated by SetData --- src/common/2d/v_2ddrawer.h | 4 +- src/common/rendering/gl/gl_buffers.cpp | 27 ++++--- src/common/rendering/gl/gl_buffers.h | 2 +- src/common/rendering/gl/gl_renderbuffers.cpp | 2 +- src/common/rendering/gles/gles_buffers.cpp | 5 +- src/common/rendering/gles/gles_buffers.h | 2 +- .../rendering/gles/gles_shaderprogram.h | 2 +- .../rendering/hwrenderer/data/buffers.h | 10 ++- .../hwrenderer/data/flatvertices.cpp | 4 +- .../hwrenderer/data/hw_lightbuffer.cpp | 2 +- .../hwrenderer/data/hw_shadowmap.cpp | 6 +- .../rendering/hwrenderer/data/hw_skydome.cpp | 2 +- .../hwrenderer/data/hw_viewpointbuffer.cpp | 2 +- .../hwrenderer/data/shaderuniforms.h | 2 +- .../polyrenderer/backend/poly_buffers.cpp | 2 +- .../polyrenderer/backend/poly_buffers.h | 2 +- .../polyrenderer/backend/poly_framebuffer.cpp | 4 +- .../vulkan/renderer/vk_streambuffer.cpp | 2 +- .../rendering/vulkan/system/vk_buffers.cpp | 74 +++++++++++-------- .../rendering/vulkan/system/vk_buffers.h | 2 +- .../vulkan/system/vk_framebuffer.cpp | 2 +- src/rendering/hwrenderer/hw_vertexbuilder.cpp | 2 +- 22 files changed, 96 insertions(+), 66 deletions(-) diff --git a/src/common/2d/v_2ddrawer.h b/src/common/2d/v_2ddrawer.h index 74d5935a63..f662de7acd 100644 --- a/src/common/2d/v_2ddrawer.h +++ b/src/common/2d/v_2ddrawer.h @@ -306,8 +306,8 @@ public: void UploadData(F2DDrawer::TwoDVertex *vertices, int vertcount, int *indices, int indexcount) { - mVertexBuffer->SetData(vertcount * sizeof(*vertices), vertices, false); - mIndexBuffer->SetData(indexcount * sizeof(unsigned int), indices, false); + mVertexBuffer->SetData(vertcount * sizeof(*vertices), vertices, BufferUsageType::Stream); + mIndexBuffer->SetData(indexcount * sizeof(unsigned int), indices, BufferUsageType::Stream); } std::pair GetBufferObjects() const diff --git a/src/common/rendering/gl/gl_buffers.cpp b/src/common/rendering/gl/gl_buffers.cpp index 47970b4016..9338fee982 100644 --- a/src/common/rendering/gl/gl_buffers.cpp +++ b/src/common/rendering/gl/gl_buffers.cpp @@ -76,16 +76,20 @@ void GLBuffer::Bind() } -void GLBuffer::SetData(size_t size, const void *data, bool staticdata) +void GLBuffer::SetData(size_t size, const void *data, BufferUsageType usage) { Bind(); - if (data != nullptr) + if (usage == BufferUsageType::Static) { - glBufferData(mUseType, size, data, staticdata? GL_STATIC_DRAW : GL_STREAM_DRAW); + glBufferData(mUseType, size, data, GL_STATIC_DRAW); } - else + else if (usage == BufferUsageType::Stream) { - mPersistent = screen->BuffersArePersistent() && !staticdata; + glBufferData(mUseType, size, data, GL_STREAM_DRAW); + } + else if (usage == BufferUsageType::Persistent) + { + mPersistent = screen->BuffersArePersistent(); if (mPersistent) { glBufferStorage(mUseType, size, nullptr, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); @@ -93,10 +97,15 @@ void GLBuffer::SetData(size_t size, const void *data, bool staticdata) } else { - glBufferData(mUseType, size, nullptr, staticdata ? GL_STATIC_DRAW : GL_STREAM_DRAW); + glBufferData(mUseType, size, nullptr, GL_STREAM_DRAW); map = nullptr; } - if (!staticdata) nomap = false; + nomap = false; + } + else if (usage == BufferUsageType::Mappable) + { + glBufferData(mUseType, size, nullptr, GL_STATIC_DRAW); + map = nullptr; } buffersize = size; InvalidateBufferState(); @@ -134,7 +143,7 @@ void GLBuffer::Unmap() void *GLBuffer::Lock(unsigned int size) { // This initializes this buffer as a static object with no data. - SetData(size, nullptr, true); + SetData(size, nullptr, BufferUsageType::Mappable); return glMapBufferRange(mUseType, 0, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT); } @@ -158,7 +167,7 @@ void GLBuffer::Resize(size_t newsize) glUnmapBuffer(mUseType); glGenBuffers(1, &mBufferId); - SetData(newsize, nullptr, false); + SetData(newsize, nullptr, BufferUsageType::Persistent); glBindBuffer(GL_COPY_READ_BUFFER, oldbuffer); // copy contents and delete the old buffer. diff --git a/src/common/rendering/gl/gl_buffers.h b/src/common/rendering/gl/gl_buffers.h index 0141ece5f4..d0c2b62c81 100644 --- a/src/common/rendering/gl/gl_buffers.h +++ b/src/common/rendering/gl/gl_buffers.h @@ -24,7 +24,7 @@ protected: GLBuffer(int usetype); ~GLBuffer(); - void SetData(size_t size, const void *data, bool staticdata) override; + void SetData(size_t size, const void *data, BufferUsageType usage) override; void SetSubData(size_t offset, size_t size, const void *data) override; void Map() override; void Unmap() override; diff --git a/src/common/rendering/gl/gl_renderbuffers.cpp b/src/common/rendering/gl/gl_renderbuffers.cpp index a1d8899bb1..134009fc46 100644 --- a/src/common/rendering/gl/gl_renderbuffers.cpp +++ b/src/common/rendering/gl/gl_renderbuffers.cpp @@ -952,7 +952,7 @@ void GLPPRenderState::Draw() { if (!shader->Uniforms) shader->Uniforms.reset(screen->CreateDataBuffer(POSTPROCESS_BINDINGPOINT, false, false)); - shader->Uniforms->SetData(Uniforms.Data.Size(), Uniforms.Data.Data()); + shader->Uniforms->SetData(Uniforms.Data.Size(), Uniforms.Data.Data(), BufferUsageType::Static); static_cast(shader->Uniforms.get())->BindBase(); } diff --git a/src/common/rendering/gles/gles_buffers.cpp b/src/common/rendering/gles/gles_buffers.cpp index f3ffcfcc6b..de815ea34e 100644 --- a/src/common/rendering/gles/gles_buffers.cpp +++ b/src/common/rendering/gles/gles_buffers.cpp @@ -93,8 +93,9 @@ void GLBuffer::Bind() } -void GLBuffer::SetData(size_t size, const void* data, bool staticdata) +void GLBuffer::SetData(size_t size, const void* data, BufferUsageType usage) { + bool staticdata = (usage == BufferUsageType::Static || usage == BufferUsageType::Mappable); if (isData || !gles.useMappedBuffers) { if (memory) @@ -175,7 +176,7 @@ void GLBuffer::Unmap() void *GLBuffer::Lock(unsigned int size) { // This initializes this buffer as a static object with no data. - SetData(size, nullptr, true); + SetData(size, nullptr, BufferUsageType::Mappable); if (!isData && gles.useMappedBuffers) { return glMapBufferRange(mUseType, 0, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT); diff --git a/src/common/rendering/gles/gles_buffers.h b/src/common/rendering/gles/gles_buffers.h index 0bd2053512..d9e01ece66 100644 --- a/src/common/rendering/gles/gles_buffers.h +++ b/src/common/rendering/gles/gles_buffers.h @@ -26,7 +26,7 @@ protected: GLBuffer(int usetype); ~GLBuffer(); - void SetData(size_t size, const void *data, bool staticdata) override; + void SetData(size_t size, const void *data, BufferUsageType usage) override; void SetSubData(size_t offset, size_t size, const void *data) override; void Map() override; void Unmap() override; diff --git a/src/common/rendering/gles/gles_shaderprogram.h b/src/common/rendering/gles/gles_shaderprogram.h index a8dc97428b..e464180546 100644 --- a/src/common/rendering/gles/gles_shaderprogram.h +++ b/src/common/rendering/gles/gles_shaderprogram.h @@ -88,7 +88,7 @@ public: void SetData() { if (mBuffer != nullptr) - mBuffer->SetData(sizeof(T), &Values); + mBuffer->SetData(sizeof(T), &Values, BufferUsageType::Static); } IDataBuffer* GetBuffer() const diff --git a/src/common/rendering/hwrenderer/data/buffers.h b/src/common/rendering/hwrenderer/data/buffers.h index 586e5caa02..980adde5e0 100644 --- a/src/common/rendering/hwrenderer/data/buffers.h +++ b/src/common/rendering/hwrenderer/data/buffers.h @@ -46,6 +46,14 @@ struct FVertexBufferAttribute int offset; }; +enum class BufferUsageType +{ + Static, // initial data is not null, staticdata is true + Stream, // initial data is not null, staticdata is false + Persistent, // initial data is null, staticdata is false + Mappable // initial data is null, staticdata is true +}; + class IBuffer { protected: @@ -57,7 +65,7 @@ public: IBuffer &operator=(const IBuffer &) = delete; virtual ~IBuffer() = default; - virtual void SetData(size_t size, const void *data, bool staticdata = true) = 0; + virtual void SetData(size_t size, const void *data, BufferUsageType type) = 0; virtual void SetSubData(size_t offset, size_t size, const void *data) = 0; virtual void *Lock(unsigned int size) = 0; virtual void Unlock() = 0; diff --git a/src/common/rendering/hwrenderer/data/flatvertices.cpp b/src/common/rendering/hwrenderer/data/flatvertices.cpp index 9a34b45ff9..6fe258b269 100644 --- a/src/common/rendering/hwrenderer/data/flatvertices.cpp +++ b/src/common/rendering/hwrenderer/data/flatvertices.cpp @@ -81,7 +81,7 @@ FFlatVertexBuffer::FFlatVertexBuffer(int width, int height, int pipelineNbr): mIndexBuffer = screen->CreateIndexBuffer(); int data[4] = {}; - mIndexBuffer->SetData(4, data); // On Vulkan this may not be empty, so set some dummy defaults to avoid crashes. + mIndexBuffer->SetData(4, data, BufferUsageType::Static); // On Vulkan this may not be empty, so set some dummy defaults to avoid crashes. for (int n = 0; n < mPipelineNbr; n++) @@ -89,7 +89,7 @@ FFlatVertexBuffer::FFlatVertexBuffer(int width, int height, int pipelineNbr): mVertexBufferPipeline[n] = screen->CreateVertexBuffer(); unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex); - mVertexBufferPipeline[n]->SetData(bytesize, nullptr, false); + mVertexBufferPipeline[n]->SetData(bytesize, nullptr, BufferUsageType::Persistent); static const FVertexBufferAttribute format[] = { { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FFlatVertex, x) }, diff --git a/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp b/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp index e0283d58e6..9f7bb66c21 100644 --- a/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp +++ b/src/common/rendering/hwrenderer/data/hw_lightbuffer.cpp @@ -64,7 +64,7 @@ FLightBuffer::FLightBuffer(int pipelineNbr): for (int n = 0; n < mPipelineNbr; n++) { mBufferPipeline[n] = screen->CreateDataBuffer(LIGHTBUF_BINDINGPOINT, mBufferType, false); - mBufferPipeline[n]->SetData(mByteSize, nullptr, false); + mBufferPipeline[n]->SetData(mByteSize, nullptr, BufferUsageType::Persistent); } Clear(); diff --git a/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp b/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp index c5e5fb09bb..26eaa2d2c3 100644 --- a/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp +++ b/src/common/rendering/hwrenderer/data/hw_shadowmap.cpp @@ -117,7 +117,7 @@ void IShadowMap::UploadLights() if (mLightList == nullptr) mLightList = screen->CreateDataBuffer(LIGHTLIST_BINDINGPOINT, true, false); - mLightList->SetData(sizeof(float) * mLights.Size(), &mLights[0]); + mLightList->SetData(sizeof(float) * mLights.Size(), &mLights[0], BufferUsageType::Stream); } @@ -129,11 +129,11 @@ void IShadowMap::UploadAABBTree() if (!mNodesBuffer) mNodesBuffer = screen->CreateDataBuffer(LIGHTNODES_BINDINGPOINT, true, false); - mNodesBuffer->SetData(mAABBTree->NodesSize(), mAABBTree->Nodes()); + mNodesBuffer->SetData(mAABBTree->NodesSize(), mAABBTree->Nodes(), BufferUsageType::Static); if (!mLinesBuffer) mLinesBuffer = screen->CreateDataBuffer(LIGHTLINES_BINDINGPOINT, true, false); - mLinesBuffer->SetData(mAABBTree->LinesSize(), mAABBTree->Lines()); + mLinesBuffer->SetData(mAABBTree->LinesSize(), mAABBTree->Lines(), BufferUsageType::Static); } else if (mAABBTree->Update()) { diff --git a/src/common/rendering/hwrenderer/data/hw_skydome.cpp b/src/common/rendering/hwrenderer/data/hw_skydome.cpp index 5d5ee8000d..e9e1bc364f 100644 --- a/src/common/rendering/hwrenderer/data/hw_skydome.cpp +++ b/src/common/rendering/hwrenderer/data/hw_skydome.cpp @@ -130,7 +130,7 @@ FSkyVertexBuffer::FSkyVertexBuffer() { 0, VATTR_COLOR, VFmt_Byte4, (int)myoffsetof(FSkyVertex, color) } }; mVertexBuffer->SetFormat(1, 3, sizeof(FSkyVertex), format); - mVertexBuffer->SetData(mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], true); + mVertexBuffer->SetData(mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], BufferUsageType::Static); } FSkyVertexBuffer::~FSkyVertexBuffer() diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp b/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp index c37306b8a9..89a5a8436f 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp +++ b/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp @@ -43,7 +43,7 @@ HWViewpointBuffer::HWViewpointBuffer(int pipelineNbr): for (int n = 0; n < mPipelineNbr; n++) { mBufferPipeline[n] = screen->CreateDataBuffer(VIEWPOINT_BINDINGPOINT, false, true); - mBufferPipeline[n]->SetData(mByteSize, nullptr, false); + mBufferPipeline[n]->SetData(mByteSize, nullptr, BufferUsageType::Persistent); } Clear(); diff --git a/src/common/rendering/hwrenderer/data/shaderuniforms.h b/src/common/rendering/hwrenderer/data/shaderuniforms.h index 2543b52b1f..92995fcaa7 100644 --- a/src/common/rendering/hwrenderer/data/shaderuniforms.h +++ b/src/common/rendering/hwrenderer/data/shaderuniforms.h @@ -129,7 +129,7 @@ public: void SetData() { if (mBuffer != nullptr) - mBuffer->SetData(sizeof(T), &Values); + mBuffer->SetData(sizeof(T), &Values, BufferUsageType::Static); } IDataBuffer* GetBuffer() const diff --git a/src/common/rendering/polyrenderer/backend/poly_buffers.cpp b/src/common/rendering/polyrenderer/backend/poly_buffers.cpp index 82c336e2ab..10ebef0d06 100644 --- a/src/common/rendering/polyrenderer/backend/poly_buffers.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_buffers.cpp @@ -56,7 +56,7 @@ void PolyBuffer::Reset() { } -void PolyBuffer::SetData(size_t size, const void *data, bool staticdata) +void PolyBuffer::SetData(size_t size, const void *data, BufferUsageType usage) { mData.resize(size); map = mData.data(); diff --git a/src/common/rendering/polyrenderer/backend/poly_buffers.h b/src/common/rendering/polyrenderer/backend/poly_buffers.h index 2f3d2cc747..c364586fad 100644 --- a/src/common/rendering/polyrenderer/backend/poly_buffers.h +++ b/src/common/rendering/polyrenderer/backend/poly_buffers.h @@ -20,7 +20,7 @@ public: static void ResetAll(); void Reset(); - void SetData(size_t size, const void *data, bool staticdata) override; + void SetData(size_t size, const void *data, BufferUsageType usage) override; void SetSubData(size_t offset, size_t size, const void *data) override; void Resize(size_t newsize) override; diff --git a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp index a71523a468..6f8ead0c5d 100644 --- a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp @@ -111,7 +111,7 @@ void PolyFrameBuffer::InitializeState() mScreenQuad.VertexBuffer->SetFormat(1, 3, sizeof(ScreenQuadVertex), format); mScreenQuad.IndexBuffer = screen->CreateIndexBuffer(); - mScreenQuad.IndexBuffer->SetData(6 * sizeof(uint32_t), indices, false); + mScreenQuad.IndexBuffer->SetData(6 * sizeof(uint32_t), indices, BufferUsageType::Stream); CheckCanvas(); } @@ -254,7 +254,7 @@ void PolyFrameBuffer::PostProcessScene(bool swscene, int fixedcm, float flash, c { 0.0f, (float)mScreenViewport.height, 0.0f, 1.0f }, { (float)mScreenViewport.width, (float)mScreenViewport.height, 1.0f, 1.0f } }; - mScreenQuad.VertexBuffer->SetData(4 * sizeof(ScreenQuadVertex), vertices, false); + mScreenQuad.VertexBuffer->SetData(4 * sizeof(ScreenQuadVertex), vertices, BufferUsageType::Stream); mRenderState->SetVertexBuffer(mScreenQuad.VertexBuffer, 0, 0); mRenderState->SetIndexBuffer(mScreenQuad.IndexBuffer); diff --git a/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp b/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp index b393867c39..5a40be3715 100644 --- a/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp +++ b/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp @@ -30,7 +30,7 @@ VkStreamBuffer::VkStreamBuffer(size_t structSize, size_t count) mBlockSize = static_cast((structSize + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment); UniformBuffer = (VKDataBuffer*)GetVulkanFrameBuffer()->CreateDataBuffer(-1, false, false); - UniformBuffer->SetData(mBlockSize * count, nullptr, false); + UniformBuffer->SetData(mBlockSize * count, nullptr, BufferUsageType::Persistent); } VkStreamBuffer::~VkStreamBuffer() diff --git a/src/common/rendering/vulkan/system/vk_buffers.cpp b/src/common/rendering/vulkan/system/vk_buffers.cpp index 420be91f11..96835419ff 100644 --- a/src/common/rendering/vulkan/system/vk_buffers.cpp +++ b/src/common/rendering/vulkan/system/vk_buffers.cpp @@ -64,61 +64,73 @@ void VKBuffer::Reset() mStaging.reset(); } -void VKBuffer::SetData(size_t size, const void *data, bool staticdata) +void VKBuffer::SetData(size_t size, const void *data, BufferUsageType usage) { auto fb = GetVulkanFrameBuffer(); - size = std::max(size, (size_t)16); // For supporting zero byte buffers + size_t bufsize = std::max(size, (size_t)16); // For supporting zero byte buffers - if (staticdata) + if (usage == BufferUsageType::Static || usage == BufferUsageType::Stream) { + // Note: we could recycle buffers here for the stream usage type to improve performance + mPersistent = false; - { - BufferBuilder builder; - builder.setUsage(VK_BUFFER_USAGE_TRANSFER_DST_BIT | mBufferType, VMA_MEMORY_USAGE_GPU_ONLY); - builder.setSize(size); - mBuffer = builder.create(fb->device); - } + BufferBuilder builder; + builder.setUsage(VK_BUFFER_USAGE_TRANSFER_DST_BIT | mBufferType, VMA_MEMORY_USAGE_GPU_ONLY); + builder.setSize(bufsize); + mBuffer = builder.create(fb->device); - { - BufferBuilder builder; - builder.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY); - builder.setSize(size); - mStaging = builder.create(fb->device); - } + BufferBuilder builder2; + builder2.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY); + builder2.setSize(bufsize); + mStaging = builder2.create(fb->device); - void *dst = mStaging->Map(0, size); - memcpy(dst, data, size); - mStaging->Unmap(); + if (data) + { + void* dst = mStaging->Map(0, bufsize); + memcpy(dst, data, size); + mStaging->Unmap(); + } fb->GetTransferCommands()->copyBuffer(mStaging.get(), mBuffer.get()); } - else + else if (usage == BufferUsageType::Persistent) { - mPersistent = screen->BuffersArePersistent(); + mPersistent = true; BufferBuilder builder; - builder.setUsage(mBufferType, VMA_MEMORY_USAGE_UNKNOWN, mPersistent ? VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT : 0); + builder.setUsage(mBufferType, VMA_MEMORY_USAGE_UNKNOWN, VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT); builder.setMemoryType( VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - builder.setSize(size); + builder.setSize(bufsize); mBuffer = builder.create(fb->device); - if (mPersistent) + map = mBuffer->Map(0, bufsize); + if (data) + memcpy(map, data, size); + } + else if (usage == BufferUsageType::Mappable) + { + mPersistent = false; + + BufferBuilder builder; + builder.setUsage(mBufferType, VMA_MEMORY_USAGE_UNKNOWN, 0); + builder.setMemoryType( + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + builder.setSize(bufsize); + mBuffer = builder.create(fb->device); + + if (data) { - map = mBuffer->Map(0, size); - if (data) - memcpy(map, data, size); - } - else if (data) - { - void *dst = mBuffer->Map(0, size); + void* dst = mBuffer->Map(0, bufsize); memcpy(dst, data, size); mBuffer->Unmap(); } } + buffersize = size; } @@ -214,7 +226,7 @@ void VKBuffer::Unlock() if (!mBuffer) { map = nullptr; - SetData(mStaticUpload.Size(), mStaticUpload.Data(), true); + SetData(mStaticUpload.Size(), mStaticUpload.Data(), BufferUsageType::Static); mStaticUpload.Clear(); } else if (!mPersistent) diff --git a/src/common/rendering/vulkan/system/vk_buffers.h b/src/common/rendering/vulkan/system/vk_buffers.h index d85391b3c3..78f8501480 100644 --- a/src/common/rendering/vulkan/system/vk_buffers.h +++ b/src/common/rendering/vulkan/system/vk_buffers.h @@ -19,7 +19,7 @@ public: static void ResetAll(); void Reset(); - void SetData(size_t size, const void *data, bool staticdata) override; + void SetData(size_t size, const void *data, BufferUsageType usage) override; void SetSubData(size_t offset, size_t size, const void *data) override; void Resize(size_t newsize) override; diff --git a/src/common/rendering/vulkan/system/vk_framebuffer.cpp b/src/common/rendering/vulkan/system/vk_framebuffer.cpp index 4d08212ecd..131a3e6fb1 100644 --- a/src/common/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_framebuffer.cpp @@ -721,7 +721,7 @@ void VulkanFrameBuffer::CreateFanToTrisIndexBuffer() } FanToTrisIndexBuffer.reset(CreateIndexBuffer()); - FanToTrisIndexBuffer->SetData(sizeof(uint32_t) * data.Size(), data.Data()); + FanToTrisIndexBuffer->SetData(sizeof(uint32_t) * data.Size(), data.Data(), BufferUsageType::Static); } void VulkanFrameBuffer::UpdateShadowMap() diff --git a/src/rendering/hwrenderer/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/hw_vertexbuilder.cpp index bf5dd8bd0a..c4b980d656 100644 --- a/src/rendering/hwrenderer/hw_vertexbuilder.cpp +++ b/src/rendering/hwrenderer/hw_vertexbuilder.cpp @@ -400,5 +400,5 @@ void CreateVBO(FFlatVertexBuffer* fvb, TArray& sectors) CreateVertices(fvb, sectors); fvb->mCurIndex = fvb->mIndex = fvb->vbo_shadowdata.Size(); fvb->Copy(0, fvb->mIndex); - fvb->mIndexBuffer->SetData(fvb->ibo_data.Size() * sizeof(uint32_t), &fvb->ibo_data[0]); + fvb->mIndexBuffer->SetData(fvb->ibo_data.Size() * sizeof(uint32_t), &fvb->ibo_data[0], BufferUsageType::Static); } From c2b3600981a84290f5075d174616dbc8bbad8bec Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 29 Oct 2021 21:51:02 +0800 Subject: [PATCH 07/22] Add a render style parameter to Screen.Dim --- src/common/2d/v_draw.cpp | 3 ++- wadsrc/static/zscript/engine/base.zs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/2d/v_draw.cpp b/src/common/2d/v_draw.cpp index 9c53e754b4..a0438ad13b 100644 --- a/src/common/2d/v_draw.cpp +++ b/src/common/2d/v_draw.cpp @@ -1529,8 +1529,9 @@ DEFINE_ACTION_FUNCTION(_Screen, Dim) PARAM_INT(y1); PARAM_INT(w); PARAM_INT(h); + PARAM_INT(style); if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function"); - Dim(twod, color, float(amount), x1, y1, w, h); + Dim(twod, color, float(amount), x1, y1, w, h, &LegacyRenderStyles[style]); return 0; } diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index 95b678225a..d4b8964668 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -413,7 +413,7 @@ struct Screen native native static int GetWidth(); native static int GetHeight(); native static void Clear(int left, int top, int right, int bottom, Color color, int palcolor = -1); - native static void Dim(Color col, double amount, int x, int y, int w, int h); + native static void Dim(Color col, double amount, int x, int y, int w, int h, ERenderStyle style = STYLE_Translucent); native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...); native static vararg void DrawShape(TextureID tex, bool animate, Shape2D s, ...); From 8e59ed754e8f409bec32433e43e172cafcf1b28c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 29 Oct 2021 22:22:28 +0200 Subject: [PATCH 08/22] Fix vulkan validation errors for wrong image transitions and buffers used after destroyed --- .../vulkan/renderer/vk_renderbuffers.cpp | 7 +------ .../rendering/vulkan/system/vk_buffers.cpp | 21 +++++++++++++++++-- .../rendering/vulkan/system/vk_device.cpp | 7 +++++-- .../vulkan/textures/vk_hwtexture.cpp | 11 ++++++---- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/common/rendering/vulkan/renderer/vk_renderbuffers.cpp b/src/common/rendering/vulkan/renderer/vk_renderbuffers.cpp index 75288a4f2e..34e44096d5 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderbuffers.cpp @@ -239,13 +239,8 @@ void VkRenderBuffers::CreateShadowmap() ImageBuilder builder; builder.setSize(gl_shadowmap_quality, 1024); - builder.setFormat(SceneNormalFormat); + builder.setFormat(VK_FORMAT_R32_SFLOAT); builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); - if (!builder.isFormatSupported(fb->device, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) - { - SceneNormalFormat = VK_FORMAT_R8G8B8A8_UNORM; - builder.setFormat(SceneNormalFormat); - } Shadowmap.Image = builder.create(fb->device); Shadowmap.Image->SetDebugName("VkRenderBuffers.Shadowmap"); diff --git a/src/common/rendering/vulkan/system/vk_buffers.cpp b/src/common/rendering/vulkan/system/vk_buffers.cpp index 96835419ff..ce1ac503d8 100644 --- a/src/common/rendering/vulkan/system/vk_buffers.cpp +++ b/src/common/rendering/vulkan/system/vk_buffers.cpp @@ -46,8 +46,13 @@ VKBuffer::~VKBuffer() mBuffer->Unmap(); auto fb = GetVulkanFrameBuffer(); - if (fb && mBuffer) - fb->FrameDeleteList.Buffers.push_back(std::move(mBuffer)); + if (fb) + { + if (mBuffer) + fb->FrameDeleteList.Buffers.push_back(std::move(mBuffer)); + if (mStaging) + fb->FrameDeleteList.Buffers.push_back(std::move(mStaging)); + } } void VKBuffer::ResetAll() @@ -70,6 +75,18 @@ void VKBuffer::SetData(size_t size, const void *data, BufferUsageType usage) size_t bufsize = std::max(size, (size_t)16); // For supporting zero byte buffers + // If SetData is called multiple times we have to keep the old buffers alive as there might still be draw commands referencing them + if (mBuffer) + { + fb->FrameDeleteList.Buffers.push_back(std::move(mBuffer)); + mBuffer = {}; + } + if (mStaging) + { + fb->FrameDeleteList.Buffers.push_back(std::move(mStaging)); + mStaging = {}; + } + if (usage == BufferUsageType::Static || usage == BufferUsageType::Stream) { // Note: we could recycle buffers here for the stream usage type to improve performance diff --git a/src/common/rendering/vulkan/system/vk_device.cpp b/src/common/rendering/vulkan/system/vk_device.cpp index f6ce072afa..be83d8937c 100644 --- a/src/common/rendering/vulkan/system/vk_device.cpp +++ b/src/common/rendering/vulkan/system/vk_device.cpp @@ -377,9 +377,11 @@ VkBool32 VulkanDevice::DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT mess seenMessages.insert(msg); const char *typestr; + bool showcallstack = false; if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { typestr = "vulkan error"; + showcallstack = true; } else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { @@ -398,11 +400,12 @@ VkBool32 VulkanDevice::DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT mess typestr = "vulkan"; } - Printf("\n"); + if (showcallstack) + Printf("\n"); Printf(TEXTCOLOR_RED "[%s] ", typestr); Printf(TEXTCOLOR_WHITE "%s\n", msg.GetChars()); - if (vk_debug_callstack) + if (vk_debug_callstack && showcallstack) { FString callstack = JitCaptureStackTrace(0, true); if (!callstack.IsEmpty()) diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp index 276f9fd091..dce6dcb6f6 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp @@ -400,14 +400,16 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state) WriteDescriptors update; MaterialLayerInfo *layer; auto systex = static_cast(GetLayer(0, state.mTranslation, &layer)); - update.addCombinedImageSampler(descriptor.get(), 0, systex->GetImage(layer->layerTexture, state.mTranslation, layer->scaleFlags)->View.get(), sampler, systex->mImage.Layout); + auto systeximage = systex->GetImage(layer->layerTexture, state.mTranslation, layer->scaleFlags); + update.addCombinedImageSampler(descriptor.get(), 0, systeximage->View.get(), sampler, systeximage->Layout); if (!(layer->scaleFlags & CTF_Indexed)) { for (int i = 1; i < numLayers; i++) { auto systex = static_cast(GetLayer(i, 0, &layer)); - update.addCombinedImageSampler(descriptor.get(), i, systex->GetImage(layer->layerTexture, 0, layer->scaleFlags)->View.get(), sampler, systex->mImage.Layout); + auto systeximage = systex->GetImage(layer->layerTexture, 0, layer->scaleFlags); + update.addCombinedImageSampler(descriptor.get(), i, systeximage->View.get(), sampler, systeximage->Layout); } } else @@ -415,7 +417,8 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state) for (int i = 1; i < 3; i++) { auto systex = static_cast(GetLayer(i, translation, &layer)); - update.addCombinedImageSampler(descriptor.get(), i, systex->GetImage(layer->layerTexture, 0, layer->scaleFlags)->View.get(), sampler, systex->mImage.Layout); + auto systeximage = systex->GetImage(layer->layerTexture, 0, layer->scaleFlags); + update.addCombinedImageSampler(descriptor.get(), i, systeximage->View.get(), sampler, systeximage->Layout); } numLayers = 3; } @@ -423,7 +426,7 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state) auto dummyImage = fb->GetRenderPassManager()->GetNullTextureView(); for (int i = numLayers; i < SHADER_MIN_REQUIRED_TEXTURE_LAYERS; i++) { - update.addCombinedImageSampler(descriptor.get(), i, dummyImage, sampler, systex->mImage.Layout); + update.addCombinedImageSampler(descriptor.get(), i, dummyImage, sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } update.updateSets(fb->device); From cc617d9085bed7278f2160bb9a4de1f702076e10 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 09:29:21 +0200 Subject: [PATCH 09/22] - Backend update from Raze. Mostly warning fixes reported by Clang, plus GLES update. --- src/common/filesystem/file_zip.cpp | 2 +- src/common/fonts/font.cpp | 2 +- src/common/models/models_voxel.cpp | 4 ++-- .../rendering/gles/gles_postprocess.cpp | 4 +++- .../rendering/gles/gles_renderstate.cpp | 23 ++++++++++++------- src/common/rendering/gles/gles_samplers.cpp | 18 +++++++++++++++ .../rendering/gles/gles_shaderprogram.cpp | 2 +- src/common/rendering/gles/gles_system.cpp | 4 +++- src/common/rendering/gles/gles_system.h | 2 ++ 9 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/common/filesystem/file_zip.cpp b/src/common/filesystem/file_zip.cpp index b3acb8d136..db5bdf902a 100644 --- a/src/common/filesystem/file_zip.cpp +++ b/src/common/filesystem/file_zip.cpp @@ -266,7 +266,7 @@ bool FZipFile::Open(bool quiet, LumpFilterInfo* filter) // at least one of the more common definition lumps must be present. for (auto &p : filter->requiredPrefixes) { - if (name.IndexOf(name0 + p) == 0 || name.LastIndexOf(p) == name.Len() - strlen(p)) + if (name.IndexOf(name0 + p) == 0 || name.LastIndexOf(p) == ptrdiff_t(name.Len() - strlen(p))) { foundspeciallump = true; break; diff --git a/src/common/fonts/font.cpp b/src/common/fonts/font.cpp index 6ddbe41d46..5edd09eb17 100644 --- a/src/common/fonts/font.cpp +++ b/src/common/fonts/font.cpp @@ -686,7 +686,7 @@ int FFont::GetColorTranslation (EColorRange range, PalEntry *color) const { // Single pic fonts do not set up their translation table and must always return 0. if (Translations.Size() == 0) return 0; - assert(Translations.Size() == NumTextColors); + assert(Translations.Size() == (unsigned)NumTextColors); if (noTranslate) { diff --git a/src/common/models/models_voxel.cpp b/src/common/models/models_voxel.cpp index 2be0521ad4..809d254007 100644 --- a/src/common/models/models_voxel.cpp +++ b/src/common/models/models_voxel.cpp @@ -210,8 +210,8 @@ void FVoxelModel::AddFace(int x1, int y1, int z1, int x2, int y2, int z2, int x3 unsigned int indx[4]; vert.packedNormal = 0; // currently this is not being used for voxels. - vert.u = (((col & 15) * 255 / 16) + 7) / 255.f; - vert.v = (((col / 16) * 255 / 16) + 7) / 255.f; + vert.u = (((col & 15) + 0.5f) / 16.f); + vert.v = (((col / 16) + 0.5f) / 16.f); vert.x = x1 - PivotX; vert.z = -y1 + PivotY; diff --git a/src/common/rendering/gles/gles_postprocess.cpp b/src/common/rendering/gles/gles_postprocess.cpp index a618c3b2e9..7292ef2280 100644 --- a/src/common/rendering/gles/gles_postprocess.cpp +++ b/src/common/rendering/gles/gles_postprocess.cpp @@ -159,7 +159,7 @@ void FGLRenderer::DrawPresentTexture(const IntRect &box, bool applyGamma) mPresentShader->Uniforms.SetData(); - for (int n = 0; n < mPresentShader->Uniforms.mFields.size(); n++) + for (size_t n = 0; n < mPresentShader->Uniforms.mFields.size(); n++) { int index = -1; UniformFieldDesc desc = mPresentShader->Uniforms.mFields[n]; @@ -175,6 +175,8 @@ void FGLRenderer::DrawPresentTexture(const IntRect &box, bool applyGamma) case UniformType::Vec2: glUniform2fv(loc,1 , ((GLfloat*)(((char*)(&mPresentShader->Uniforms)) + desc.Offset))); break; + default: + break; } } diff --git a/src/common/rendering/gles/gles_renderstate.cpp b/src/common/rendering/gles/gles_renderstate.cpp index 78bfc23de0..0a9e4ca138 100644 --- a/src/common/rendering/gles/gles_renderstate.cpp +++ b/src/common/rendering/gles/gles_renderstate.cpp @@ -35,6 +35,9 @@ #include "gles_renderbuffers.h" #include "gles_hwtexture.h" #include "gles_buffers.h" +#include "gles_renderer.h" +#include "gles_samplers.h" + #include "hw_clock.h" #include "printf.h" @@ -116,13 +119,13 @@ bool FGLRenderState::ApplyShader() addLights = (int(lightPtr[3]) - int(lightPtr[2])) / LIGHT_VEC4_NUM; // Here we limit the number of lights, but dont' change the light data so priority has to be mod, sub then add - if (modLights > gles.maxlights) + if (modLights > (int)gles.maxlights) modLights = gles.maxlights; - if (modLights + subLights > gles.maxlights) + if (modLights + subLights > (int)gles.maxlights) subLights = gles.maxlights - modLights; - if (modLights + subLights + addLights > gles.maxlights) + if (modLights + subLights + addLights > (int)gles.maxlights) addLights = gles.maxlights - modLights - subLights; totalLights = modLights + subLights + addLights; @@ -332,7 +335,7 @@ bool FGLRenderState::ApplyShader() // Calculate the total number of vec4s we need int totalVectors = totalLights * LIGHT_VEC4_NUM; - if (totalVectors > gles.numlightvectors) + if (totalVectors > (int)gles.numlightvectors) totalVectors = gles.numlightvectors; glUniform4fv(activeShader->cur->lights_index, totalVectors, lightPtr); @@ -479,6 +482,7 @@ void FGLRenderState::ApplyMaterial(FMaterial *mat, int clampmode, int translatio for (int i = 1; i < 3; i++) { auto systex = static_cast(mat->GetLayer(i, translation, &layer)); + GLRenderer->mSamplerManager->Bind(i, CLAMP_NONE, 255); systex->Bind(i, false); maxbound = i; } @@ -720,10 +724,13 @@ void FGLRenderState::ClearScreen() bool FGLRenderState::SetDepthClamp(bool on) { bool res = mLastDepthClamp; - /* - if (!on) glDisable(GL_DEPTH_CLAMP); - else glEnable(GL_DEPTH_CLAMP); - */ + + if (gles.depthClampAvailable) + { + if (!on) glDisable(GL_DEPTH_CLAMP); + else glEnable(GL_DEPTH_CLAMP); + } + mLastDepthClamp = on; return res; } diff --git a/src/common/rendering/gles/gles_samplers.cpp b/src/common/rendering/gles/gles_samplers.cpp index 1e3b16d2de..c088657c7a 100644 --- a/src/common/rendering/gles/gles_samplers.cpp +++ b/src/common/rendering/gles/gles_samplers.cpp @@ -119,8 +119,26 @@ uint8_t FSamplerManager::Bind(int texunit, int num, int lastval) break; case CLAMP_NOFILTER: + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + break; + case CLAMP_NOFILTER_X: + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + break; + case CLAMP_NOFILTER_Y: + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + break; + case CLAMP_NOFILTER_XY: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); diff --git a/src/common/rendering/gles/gles_shaderprogram.cpp b/src/common/rendering/gles/gles_shaderprogram.cpp index 26906f57a7..6aa9ec1721 100644 --- a/src/common/rendering/gles/gles_shaderprogram.cpp +++ b/src/common/rendering/gles/gles_shaderprogram.cpp @@ -272,7 +272,7 @@ void FPresentShaderBase::Init(const char * vtx_shader_name, const char * program Uniforms.UniformLocation.resize(Uniforms.mFields.size()); - for (int n = 0; n < Uniforms.mFields.size(); n++) + for (size_t n = 0; n < Uniforms.mFields.size(); n++) { int index = -1; UniformFieldDesc desc = Uniforms.mFields[n]; diff --git a/src/common/rendering/gles/gles_system.cpp b/src/common/rendering/gles/gles_system.cpp index a01b8b92ca..79f6e0a486 100644 --- a/src/common/rendering/gles/gles_system.cpp +++ b/src/common/rendering/gles/gles_system.cpp @@ -62,7 +62,6 @@ static PROC(WINAPI* getprocaddress)(LPCSTR name); static void* LoadGLES2Proc(const char* name) { - HINSTANCE hGetProcIDDLL = LoadLibraryA("libGLESv2.dll"); int error = GetLastError(); @@ -71,6 +70,7 @@ static void* LoadGLES2Proc(const char* name) if (!addr) { //exit(1); + return nullptr; } else { @@ -182,10 +182,12 @@ namespace OpenGLESRenderer #if USE_GLES2 gles.depthStencilAvailable = CheckExtension("GL_OES_packed_depth_stencil"); gles.npotAvailable = CheckExtension("GL_OES_texture_npot"); + gles.depthClampAvailable = CheckExtension("GL_EXT_depth_clamp"); #else gles.depthStencilAvailable = true; gles.npotAvailable = true; gles.useMappedBuffers = true; + gles.depthClampAvailable = true; #endif gles.numlightvectors = (gles.maxlights * LIGHT_VEC4_NUM); diff --git a/src/common/rendering/gles/gles_system.h b/src/common/rendering/gles/gles_system.h index 0214993624..d7f6ed139b 100644 --- a/src/common/rendering/gles/gles_system.h +++ b/src/common/rendering/gles/gles_system.h @@ -42,6 +42,7 @@ GLAPI PFNGLUNMAPBUFFEROESPROC glUnmapBuffer; #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_BGRA 0x80E1 +#define GL_DEPTH_CLAMP 0x864F #else #include "gl_load/gl_load.h" @@ -69,6 +70,7 @@ namespace OpenGLESRenderer bool depthStencilAvailable; bool npotAvailable; bool forceGLSLv100; + bool depthClampAvailable; int max_texturesize; char* vendorstring; char* modelstring; From 226666ce7faca93a1878ee00d1dfe7a12b1c51ac Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:08:11 +0200 Subject: [PATCH 10/22] - replaced MIN/MAX with min/max from the C++ standard library in the software renderer --- src/rendering/swrenderer/drawers/r_draw.cpp | 6 +- .../swrenderer/drawers/r_draw_pal.cpp | 184 +++++++++--------- .../swrenderer/drawers/r_draw_rgba.cpp | 22 +-- .../swrenderer/drawers/r_draw_sky32.h | 16 +- .../swrenderer/drawers/r_draw_sky32_sse2.h | 16 +- .../swrenderer/drawers/r_draw_span32.h | 44 ++--- .../swrenderer/drawers/r_draw_span32_sse2.h | 6 +- .../swrenderer/drawers/r_draw_sprite32.h | 42 ++-- .../swrenderer/drawers/r_draw_wall32.h | 34 ++-- .../swrenderer/drawers/r_draw_wall32_sse2.h | 2 +- .../swrenderer/line/r_farclip_line.cpp | 4 +- .../swrenderer/line/r_fogboundary.cpp | 12 +- src/rendering/swrenderer/line/r_line.cpp | 12 +- .../swrenderer/line/r_renderdrawsegment.cpp | 22 +-- src/rendering/swrenderer/line/r_wallsetup.cpp | 4 +- .../swrenderer/plane/r_flatplane.cpp | 4 +- .../swrenderer/plane/r_planerenderer.cpp | 8 +- src/rendering/swrenderer/plane/r_skyplane.cpp | 6 +- src/rendering/swrenderer/scene/r_light.cpp | 2 +- src/rendering/swrenderer/scene/r_light.h | 6 +- .../swrenderer/scene/r_opaque_pass.cpp | 4 +- .../swrenderer/segments/r_drawsegment.cpp | 18 +- .../swrenderer/textures/r_swtexture.cpp | 30 +-- .../swrenderer/textures/warpbuffer.h | 2 +- .../swrenderer/textures/warptexture.cpp | 12 +- .../swrenderer/things/r_particle.cpp | 6 +- .../swrenderer/things/r_visiblesprite.cpp | 54 ++--- src/rendering/swrenderer/things/r_voxel.cpp | 32 +-- .../swrenderer/things/r_wallsprite.cpp | 4 +- .../swrenderer/viewport/r_drawerargs.cpp | 2 +- .../swrenderer/viewport/r_spritedrawer.cpp | 34 ++-- 31 files changed, 325 insertions(+), 325 deletions(-) diff --git a/src/rendering/swrenderer/drawers/r_draw.cpp b/src/rendering/swrenderer/drawers/r_draw.cpp index 797f656262..01b79134ad 100644 --- a/src/rendering/swrenderer/drawers/r_draw.cpp +++ b/src/rendering/swrenderer/drawers/r_draw.cpp @@ -109,7 +109,7 @@ namespace swrenderer for (int k = 0; k < 256; ++k) { uint8_t v = (((k + 2) * a) + 256) >> 14; - table[k] = MIN(v, 64); + table[k] = min(v, 64); } table += 256; } @@ -212,8 +212,8 @@ namespace swrenderer { if (!r_fuzzscale) { - int yl = MAX(args.FuzzY1(), 1); - int yh = MIN(args.FuzzY2(), fuzzviewheight); + int yl = max(args.FuzzY1(), 1); + int yh = min(args.FuzzY2(), fuzzviewheight); if (yl <= yh) fuzzpos = (fuzzpos + yh - yl + 1) % FUZZTABLE; } diff --git a/src/rendering/swrenderer/drawers/r_draw_pal.cpp b/src/rendering/swrenderer/drawers/r_draw_pal.cpp index 8cc7a0fc8a..0d6b97f2f0 100644 --- a/src/rendering/swrenderer/drawers/r_draw_pal.cpp +++ b/src/rendering/swrenderer/drawers/r_draw_pal.cpp @@ -107,7 +107,7 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) float Lxy2 = lights[i].x; // L.x*L.x + L.y*L.y float Lz = lights[i].z - viewpos_z; float dist2 = Lxy2 + Lz * Lz; @@ -117,7 +117,7 @@ namespace swrenderer float rcp_dist = _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(dist2))); #endif float dist = dist2 * rcp_dist; - float distance_attenuation = (256.0f - MIN(dist * lights[i].radius, 256.0f)); + float distance_attenuation = (256.0f - min(dist * lights[i].radius, 256.0f)); // The simple light type float simple_attenuation = distance_attenuation; @@ -139,9 +139,9 @@ namespace swrenderer uint32_t material_g = GPalette.BaseColors[material].g; uint32_t material_b = GPalette.BaseColors[material].b; - lit_r = MIN(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); - lit_g = MIN(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); - lit_b = MIN(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); + lit_r = min(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); + lit_g = min(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); + lit_b = min(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); return RGB256k.All[((lit_r >> 2) << 12) | ((lit_g >> 2) << 6) | (lit_b >> 2)]; } @@ -286,9 +286,9 @@ namespace swrenderer { uint8_t lit = colormap[pix]; - uint32_t r = MIN(GPalette.BaseColors[lit].r + GPalette.BaseColors[*dest].r, 255); - uint32_t g = MIN(GPalette.BaseColors[lit].g + GPalette.BaseColors[*dest].g, 255); - uint32_t b = MIN(GPalette.BaseColors[lit].b + GPalette.BaseColors[*dest].b, 255); + uint32_t r = min(GPalette.BaseColors[lit].r + GPalette.BaseColors[*dest].r, 255); + uint32_t g = min(GPalette.BaseColors[lit].g + GPalette.BaseColors[*dest].g, 255); + uint32_t b = min(GPalette.BaseColors[lit].b + GPalette.BaseColors[*dest].b, 255); *dest = RGB256k.RGB[r>>2][g>>2][b>>2]; } frac += fracstep; @@ -352,9 +352,9 @@ namespace swrenderer { uint8_t lit = num_dynlights != 0 ? AddLightsColumn(dynlights, num_dynlights, viewpos_z, colormap[pix], pix) : colormap[pix]; - uint32_t r = MIN(GPalette.BaseColors[lit].r + GPalette.BaseColors[*dest].r, 255); - uint32_t g = MIN(GPalette.BaseColors[lit].g + GPalette.BaseColors[*dest].g, 255); - uint32_t b = MIN(GPalette.BaseColors[lit].b + GPalette.BaseColors[*dest].b, 255); + uint32_t r = min(GPalette.BaseColors[lit].r + GPalette.BaseColors[*dest].r, 255); + uint32_t g = min(GPalette.BaseColors[lit].g + GPalette.BaseColors[*dest].g, 255); + uint32_t b = min(GPalette.BaseColors[lit].b + GPalette.BaseColors[*dest].b, 255); *dest = RGB256k.RGB[r>>2][g>>2][b>>2]; } viewpos_z += step_viewpos_z; @@ -567,7 +567,7 @@ namespace swrenderer uint8_t fg = source0[sample_index]; uint32_t c = palette[fg]; - int alpha_top = MAX(MIN(frac >> (16 - start_fade), 256), 0); + int alpha_top = max(min(frac >> (16 - start_fade), 256), 0); int inv_alpha_top = 256 - alpha_top; int c_red = RPART(c); int c_green = GPART(c); @@ -600,7 +600,7 @@ namespace swrenderer uint8_t fg = source0[sample_index]; uint32_t c = palette[fg]; - int alpha_bottom = MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0); + int alpha_bottom = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); int inv_alpha_bottom = 256 - alpha_bottom; int c_red = RPART(c); int c_green = GPART(c); @@ -645,7 +645,7 @@ namespace swrenderer uint8_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } @@ -701,12 +701,12 @@ namespace swrenderer uint8_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } uint32_t c = palette[fg]; - int alpha_top = MAX(MIN(frac >> (16 - start_fade), 256), 0); + int alpha_top = max(min(frac >> (16 - start_fade), 256), 0); int inv_alpha_top = 256 - alpha_top; int c_red = RPART(c); int c_green = GPART(c); @@ -728,7 +728,7 @@ namespace swrenderer uint8_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } *dest = fg; @@ -745,12 +745,12 @@ namespace swrenderer uint8_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } uint32_t c = palette[fg]; - int alpha_bottom = MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0); + int alpha_bottom = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); int inv_alpha_bottom = 256 - alpha_bottom; int c_red = RPART(c); int c_green = GPART(c); @@ -785,9 +785,9 @@ namespace swrenderer uint32_t material_g = GPalette.BaseColors[material].g; uint32_t material_b = GPalette.BaseColors[material].b; - lit_r = MIN(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); - lit_g = MIN(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); - lit_b = MIN(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); + lit_r = min(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); + lit_g = min(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); + lit_b = min(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); return RGB256k.All[((lit_r >> 2) << 12) | ((lit_g >> 2) << 6) | (lit_b >> 2)]; } @@ -836,9 +836,9 @@ namespace swrenderer uint32_t lit_g = GPART(dynlight); uint32_t lit_b = BPART(dynlight); uint32_t light = 256 - (args.Light() >> (FRACBITS - 8)); - lit_r = MIN(light + lit_r, 256); - lit_g = MIN(light + lit_g, 256); - lit_b = MIN(light + lit_b, 256); + lit_r = min(light + lit_r, 256); + lit_g = min(light + lit_g, 256); + lit_b = min(light + lit_b, 256); lit_r = lit_r - light; lit_g = lit_g - light; lit_b = lit_b - light; @@ -1011,9 +1011,9 @@ namespace swrenderer int src_g = ((srccolor >> 0) & 0xff) * srcalpha; int src_b = ((srccolor >> 8) & 0xff) * srcalpha; int bg = *dest; - int r = MAX((-src_r + palette[bg].r * destalpha)>>18, 0); - int g = MAX((-src_g + palette[bg].g * destalpha)>>18, 0); - int b = MAX((-src_b + palette[bg].b * destalpha)>>18, 0); + int r = max((-src_r + palette[bg].r * destalpha)>>18, 0); + int g = max((-src_g + palette[bg].g * destalpha)>>18, 0); + int b = max((-src_b + palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; @@ -1061,9 +1061,9 @@ namespace swrenderer int src_g = ((srccolor >> 0) & 0xff) * srcalpha; int src_b = ((srccolor >> 8) & 0xff) * srcalpha; int bg = *dest; - int r = MAX((src_r - palette[bg].r * destalpha)>>18, 0); - int g = MAX((src_g - palette[bg].g * destalpha)>>18, 0); - int b = MAX((src_b - palette[bg].b * destalpha)>>18, 0); + int r = max((src_r - palette[bg].r * destalpha)>>18, 0); + int g = max((src_g - palette[bg].g * destalpha)>>18, 0); + int b = max((src_b - palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; @@ -1113,9 +1113,9 @@ namespace swrenderer { uint32_t fg = colormap[source[frac >> FRACBITS]]; uint32_t bg = *dest; - uint32_t r = MIN((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); - uint32_t g = MIN((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); - uint32_t b = MIN((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); + uint32_t r = min((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); + uint32_t g = min((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); + uint32_t b = min((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1192,9 +1192,9 @@ namespace swrenderer { uint32_t fg = colormap[translation[source[frac >> FRACBITS]]]; uint32_t bg = *dest; - uint32_t r = MIN((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); - uint32_t g = MIN((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); - uint32_t b = MIN((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); + uint32_t r = min((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); + uint32_t g = min((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); + uint32_t b = min((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1331,9 +1331,9 @@ namespace swrenderer { int fg = colormap[source[frac >> FRACBITS]]; int bg = *dest; - int r = MIN((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); - int g = MIN((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); - int b = MIN((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); + int r = min((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); + int g = min((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); + int b = min((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1385,9 +1385,9 @@ namespace swrenderer { int fg = colormap[translation[source[frac >> FRACBITS]]]; int bg = *dest; - int r = MIN((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); - int g = MIN((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); - int b = MIN((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); + int r = min((palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 63); + int g = min((palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 63); + int b = min((palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 63); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1437,9 +1437,9 @@ namespace swrenderer { int fg = colormap[source[frac >> FRACBITS]]; int bg = *dest; - int r = MAX((palette[fg].r * srcalpha - palette[bg].r * destalpha)>>18, 0); - int g = MAX((palette[fg].g * srcalpha - palette[bg].g * destalpha)>>18, 0); - int b = MAX((palette[fg].b * srcalpha - palette[bg].b * destalpha)>>18, 0); + int r = max((palette[fg].r * srcalpha - palette[bg].r * destalpha)>>18, 0); + int g = max((palette[fg].g * srcalpha - palette[bg].g * destalpha)>>18, 0); + int b = max((palette[fg].b * srcalpha - palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1490,9 +1490,9 @@ namespace swrenderer { int fg = colormap[translation[source[frac >> FRACBITS]]]; int bg = *dest; - int r = MAX((palette[fg].r * srcalpha - palette[bg].r * destalpha)>>18, 0); - int g = MAX((palette[fg].g * srcalpha - palette[bg].g * destalpha)>>18, 0); - int b = MAX((palette[fg].b * srcalpha - palette[bg].b * destalpha)>>18, 0); + int r = max((palette[fg].r * srcalpha - palette[bg].r * destalpha)>>18, 0); + int g = max((palette[fg].g * srcalpha - palette[bg].g * destalpha)>>18, 0); + int b = max((palette[fg].b * srcalpha - palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1542,9 +1542,9 @@ namespace swrenderer { int fg = colormap[source[frac >> FRACBITS]]; int bg = *dest; - int r = MAX((-palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 0); - int g = MAX((-palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 0); - int b = MAX((-palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 0); + int r = max((-palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 0); + int g = max((-palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 0); + int b = max((-palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1595,9 +1595,9 @@ namespace swrenderer { int fg = colormap[translation[source[frac >> FRACBITS]]]; int bg = *dest; - int r = MAX((-palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 0); - int g = MAX((-palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 0); - int b = MAX((-palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 0); + int r = max((-palette[fg].r * srcalpha + palette[bg].r * destalpha)>>18, 0); + int g = max((-palette[fg].g * srcalpha + palette[bg].g * destalpha)>>18, 0); + int b = max((-palette[fg].b * srcalpha + palette[bg].b * destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; dest += pitch; frac += fracstep; @@ -1618,8 +1618,8 @@ namespace swrenderer int _fuzzviewheight = fuzzviewheight; int x = _x; - int yl = MAX(_yl, 1); - int yh = MIN(_yh, _fuzzviewheight); + int yl = max(_yl, 1); + int yh = min(_yh, _fuzzviewheight); int count = yh - yl + 1; if (count <= 0) return; @@ -1661,8 +1661,8 @@ namespace swrenderer int _fuzzpos = fuzzpos; int _fuzzviewheight = fuzzviewheight; - int yl = MAX(_yl, 1); - int yh = MIN(_yh, _fuzzviewheight); + int yl = max(_yl, 1); + int yh = min(_yh, _fuzzviewheight); int count = yh - yl + 1; @@ -1687,7 +1687,7 @@ namespace swrenderer if (available % fuzzstep != 0) next_wrap++; - int cnt = MIN(count, next_wrap); + int cnt = min(count, next_wrap); count -= cnt; do { @@ -1733,7 +1733,7 @@ namespace swrenderer if (available % fuzzstep != 0) next_wrap++; - int cnt = MIN(count, next_wrap); + int cnt = min(count, next_wrap); count -= cnt; do { @@ -1775,7 +1775,7 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // attenuation = 1 - MIN(dist * (1/radius), 1) + // attenuation = 1 - min(dist * (1/radius), 1) float Lyz2 = lights[i].y; // L.y*L.y + L.z*L.z float Lx = lights[i].x - viewpos_x; float dist2 = Lyz2 + Lx * Lx; @@ -1785,7 +1785,7 @@ namespace swrenderer float rcp_dist = _mm_cvtss_f32(_mm_rsqrt_ss(_mm_load_ss(&dist2))); #endif float dist = dist2 * rcp_dist; - float distance_attenuation = (256.0f - MIN(dist * lights[i].radius, 256.0f)); + float distance_attenuation = (256.0f - min(dist * lights[i].radius, 256.0f)); // The simple light type float simple_attenuation = distance_attenuation; @@ -1807,9 +1807,9 @@ namespace swrenderer uint32_t material_g = GPalette.BaseColors[material].g; uint32_t material_b = GPalette.BaseColors[material].b; - lit_r = MIN(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); - lit_g = MIN(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); - lit_b = MIN(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); + lit_r = min(GPalette.BaseColors[fg].r + ((lit_r * material_r) >> 8), 255); + lit_g = min(GPalette.BaseColors[fg].g + ((lit_g * material_g) >> 8), 255); + lit_b = min(GPalette.BaseColors[fg].b + ((lit_b * material_b) >> 8), 255); return RGB256k.All[((lit_r >> 2) << 12) | ((lit_g >> 2) << 6) | (lit_b >> 2)]; } @@ -2113,9 +2113,9 @@ namespace swrenderer spot = ((xfrac >> (32 - 6 - 6))&(63 * 64)) + (yfrac >> (32 - 6)); uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[source[spot]], source[spot]) : colormap[source[spot]]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest++ = RGB256k.RGB[r][g][b]; xfrac += xstep; @@ -2133,9 +2133,9 @@ namespace swrenderer spot = (((xfrac >> 16) * srcwidth) >> 16) * srcheight + (((yfrac >> 16) * srcheight) >> 16); uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[source[spot]], source[spot]) : colormap[source[spot]]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest++ = RGB256k.RGB[r][g][b]; xfrac += xstep; @@ -2267,9 +2267,9 @@ namespace swrenderer { uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[texdata], texdata) : colormap[texdata]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; } dest++; @@ -2293,9 +2293,9 @@ namespace swrenderer { uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[texdata], texdata) : colormap[texdata]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; } dest++; @@ -2416,9 +2416,9 @@ namespace swrenderer spot = ((xfrac >> (32 - 6 - 6))&(63 * 64)) + (yfrac >> (32 - 6)); uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[source[spot]], source[spot]) : colormap[source[spot]]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest++ = RGB256k.RGB[r][g][b]; xfrac += xstep; @@ -2436,9 +2436,9 @@ namespace swrenderer spot = (((xfrac >> 16) * srcwidth) >> 16) * srcheight + (((yfrac >> 16) * srcheight) >> 16); uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[source[spot]], source[spot]) : colormap[source[spot]]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest++ = RGB256k.RGB[r][g][b]; xfrac += xstep; @@ -2577,9 +2577,9 @@ namespace swrenderer { uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[texdata], texdata) : colormap[texdata]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; } dest++; @@ -2603,9 +2603,9 @@ namespace swrenderer { uint32_t fg = num_dynlights != 0 ? AddLightsSpan(dynlights, num_dynlights, viewpos_x, colormap[texdata], texdata) : colormap[texdata]; uint32_t bg = *dest; - int r = MAX((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); - int g = MAX((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); - int b = MAX((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); + int r = max((palette[fg].r * _srcalpha + palette[bg].r * _destalpha)>>18, 0); + int g = max((palette[fg].g * _srcalpha + palette[bg].g * _destalpha)>>18, 0); + int b = max((palette[fg].b * _srcalpha + palette[bg].b * _destalpha)>>18, 0); *dest = RGB256k.RGB[r][g][b]; } dest++; @@ -2859,7 +2859,7 @@ namespace swrenderer if (count <= 0) return; - int particle_texture_index = MIN(gl_particles_style, NUM_PARTICLE_TEXTURES - 1); + int particle_texture_index = min(gl_particles_style, NUM_PARTICLE_TEXTURES - 1); const uint32_t *source = &particle_texture[particle_texture_index][(_fracposx >> FRACBITS) * PARTICLE_TEXTURE_SIZE]; uint32_t particle_alpha = _alpha; @@ -3122,7 +3122,7 @@ namespace swrenderer uint32_t next_uv_wrap = available / texelStepY; if (available % texelStepY != 0) next_uv_wrap++; - uint32_t count = MIN(left, next_uv_wrap); + uint32_t count = min(left, next_uv_wrap); drawerargs.SetDest(x, y); drawerargs.SetCount(count); diff --git a/src/rendering/swrenderer/drawers/r_draw_rgba.cpp b/src/rendering/swrenderer/drawers/r_draw_rgba.cpp index b6360981cd..c8d87ef9e8 100644 --- a/src/rendering/swrenderer/drawers/r_draw_rgba.cpp +++ b/src/rendering/swrenderer/drawers/r_draw_rgba.cpp @@ -257,8 +257,8 @@ namespace swrenderer int _fuzzviewheight = fuzzviewheight; int x = _x; - int yl = MAX(_yl, 1); - int yh = MIN(_yh, _fuzzviewheight); + int yl = max(_yl, 1); + int yh = min(_yh, _fuzzviewheight); int count = yh - yl + 1; if (count <= 0) return; @@ -304,8 +304,8 @@ namespace swrenderer int _fuzzpos = fuzzpos; int _fuzzviewheight = fuzzviewheight; - int yl = MAX(_yl, 1); - int yh = MIN(_yh, _fuzzviewheight); + int yl = max(_yl, 1); + int yh = min(_yh, _fuzzviewheight); int count = yh - yl + 1; @@ -328,7 +328,7 @@ namespace swrenderer if (available % fuzzstep != 0) next_wrap++; - int cnt = MIN(count, next_wrap); + int cnt = min(count, next_wrap); count -= cnt; do { @@ -383,7 +383,7 @@ namespace swrenderer if (available % fuzzstep != 0) next_wrap++; - int cnt = MIN(count, next_wrap); + int cnt = min(count, next_wrap); count -= cnt; do { @@ -810,7 +810,7 @@ namespace swrenderer if (count <= 0) return; - int particle_texture_index = MIN(gl_particles_style, NUM_PARTICLE_TEXTURES - 1); + int particle_texture_index = min(gl_particles_style, NUM_PARTICLE_TEXTURES - 1); const uint32_t *source = &particle_texture[particle_texture_index][(_fracposx >> FRACBITS) * PARTICLE_TEXTURE_SIZE]; uint32_t particle_alpha = _alpha; @@ -991,9 +991,9 @@ namespace swrenderer double xmagnitude = fabs(static_cast(texelStepX) * (1.0 / 0x1'0000'0000LL)); double ymagnitude = fabs(static_cast(texelStepY) * (1.0 / 0x1'0000'0000LL)); - double magnitude = MAX(ymagnitude, xmagnitude); + double magnitude = max(ymagnitude, xmagnitude); double min_lod = -1000.0; - double lod = MAX(log2(magnitude) + r_lod_bias, min_lod); + double lod = max(log2(magnitude) + r_lod_bias, min_lod); bool magnifying = lod < 0.0f; int mipmap_offset = 0; @@ -1006,8 +1006,8 @@ namespace swrenderer { mipmap_offset += mip_width * mip_height; level--; - mip_width = MAX(mip_width >> 1, 1); - mip_height = MAX(mip_height >> 1, 1); + mip_width = max(mip_width >> 1, 1); + mip_height = max(mip_height >> 1, 1); } } diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32.h b/src/rendering/swrenderer/drawers/r_draw_sky32.h index df208afabf..ea9dff4f72 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32.h @@ -91,7 +91,7 @@ namespace swrenderer uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - uint32_t alpha = MAX(MIN(frac >> (16 - start_fade), 256), 0); + uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; BgraColor c = fg; @@ -122,7 +122,7 @@ namespace swrenderer uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - uint32_t alpha = MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0); + uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; BgraColor c = fg; @@ -187,7 +187,7 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } @@ -220,11 +220,11 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } - uint32_t alpha = MAX(MIN(frac >> (16 - start_fade), 256), 0); + uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; BgraColor c = fg; @@ -243,7 +243,7 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } *dest = fg; @@ -260,11 +260,11 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } - uint32_t alpha = MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0); + uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; BgraColor c = fg; diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h index 998833416c..bc2411b835 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h @@ -91,7 +91,7 @@ namespace swrenderer uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - __m128i alpha = _mm_set1_epi16(MAX(MIN(frac >> (16 - start_fade), 256), 0)); + __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); __m128i c = _mm_unpacklo_epi8(_mm_cvtsi32_si128(fg), _mm_setzero_si128()); @@ -120,7 +120,7 @@ namespace swrenderer uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - __m128i alpha = _mm_set1_epi16(MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); + __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); __m128i c = _mm_unpacklo_epi8(_mm_cvtsi32_si128(fg), _mm_setzero_si128()); @@ -171,7 +171,7 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } @@ -216,11 +216,11 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } - __m128i alpha = _mm_set1_epi16(MAX(MIN(frac >> (16 - start_fade), 256), 0)); + __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); __m128i c = _mm_unpacklo_epi8(_mm_cvtsi32_si128(fg), _mm_setzero_si128()); @@ -239,7 +239,7 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } *dest = fg; @@ -256,11 +256,11 @@ namespace swrenderer uint32_t fg = source0[sample_index]; if (fg == 0) { - uint32_t sample_index2 = MIN(sample_index, maxtextureheight1); + uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; } - __m128i alpha = _mm_set1_epi16(MAX(MIN(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); + __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); __m128i c = _mm_unpacklo_epi8(_mm_cvtsi32_si128(fg), _mm_setzero_si128()); diff --git a/src/rendering/swrenderer/drawers/r_draw_span32.h b/src/rendering/swrenderer/drawers/r_draw_span32.h index 9534c496b0..1c1e3e55de 100644 --- a/src/rendering/swrenderer/drawers/r_draw_span32.h +++ b/src/rendering/swrenderer/drawers/r_draw_span32.h @@ -94,8 +94,8 @@ namespace swrenderer break; texdata.source += texdata.width * texdata.height; - texdata.width = MAX(texdata.width / 2, 1); - texdata.height = MAX(texdata.height / 2, 1); + texdata.width = max(texdata.width / 2, 1); + texdata.height = max(texdata.height / 2, 1); level--; } } @@ -324,13 +324,13 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) float Lyz2 = light_y; // L.y*L.y + L.z*L.z float Lx = light_x - viewpos_x; float dist2 = Lyz2 + Lx * Lx; float rcp_dist = 1.f/sqrt(dist2); float dist = dist2 * rcp_dist; - float distance_attenuation = 256.0f - MIN(dist * light_radius, 256.0f); + float distance_attenuation = 256.0f - min(dist * light_radius, 256.0f); // The simple light type float simple_attenuation = distance_attenuation; @@ -348,13 +348,13 @@ namespace swrenderer lit.b += (light_color.b * attenuation) >> 8; } - lit.r = MIN(lit.r, 256); - lit.g = MIN(lit.g, 256); - lit.b = MIN(lit.b, 256); + lit.r = min(lit.r, 256); + lit.g = min(lit.g, 256); + lit.b = min(lit.b, 256); - fgcolor.r = MIN(fgcolor.r + ((material.r * lit.r) >> 8), 255); - fgcolor.g = MIN(fgcolor.g + ((material.g * lit.g) >> 8), 255); - fgcolor.b = MIN(fgcolor.b + ((material.b * lit.b) >> 8), 255); + fgcolor.r = min(fgcolor.r + ((material.r * lit.r) >> 8), 255); + fgcolor.g = min(fgcolor.g + ((material.g * lit.g) >> 8), 255); + fgcolor.b = min(fgcolor.b + ((material.b * lit.b) >> 8), 255); return fgcolor; } @@ -381,9 +381,9 @@ namespace swrenderer bgcolor.b = bgcolor.b * destalpha; BgraColor outcolor; - outcolor.r = MIN((fgcolor.r + bgcolor.r) >> 8, 255); - outcolor.g = MIN((fgcolor.g + bgcolor.g) >> 8, 255); - outcolor.b = MIN((fgcolor.b + bgcolor.b) >> 8, 255); + outcolor.r = min((fgcolor.r + bgcolor.r) >> 8, 255); + outcolor.g = min((fgcolor.g + bgcolor.g) >> 8, 255); + outcolor.b = min((fgcolor.b + bgcolor.b) >> 8, 255); return outcolor; } else @@ -405,21 +405,21 @@ namespace swrenderer BgraColor outcolor; if (BlendT::Mode == (int)SpanBlendModes::AddClamp) { - outcolor.r = MIN((fgcolor.r + bgcolor.r) >> 8, 255); - outcolor.g = MIN((fgcolor.g + bgcolor.g) >> 8, 255); - outcolor.b = MIN((fgcolor.b + bgcolor.b) >> 8, 255); + outcolor.r = min((fgcolor.r + bgcolor.r) >> 8, 255); + outcolor.g = min((fgcolor.g + bgcolor.g) >> 8, 255); + outcolor.b = min((fgcolor.b + bgcolor.b) >> 8, 255); } else if (BlendT::Mode == (int)SpanBlendModes::SubClamp) { - outcolor.r = MAX(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); } else if (BlendT::Mode == (int)SpanBlendModes::RevSubClamp) { - outcolor.r = MAX(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); } outcolor.a = 255; return outcolor; diff --git a/src/rendering/swrenderer/drawers/r_draw_span32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_span32_sse2.h index 527545a9d6..230ba8c134 100644 --- a/src/rendering/swrenderer/drawers/r_draw_span32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_span32_sse2.h @@ -94,8 +94,8 @@ namespace swrenderer break; texdata.source += texdata.width * texdata.height; - texdata.width = MAX(texdata.width / 2, 1); - texdata.height = MAX(texdata.height / 2, 1); + texdata.width = max(texdata.width / 2, 1); + texdata.height = max(texdata.height / 2, 1); level--; } } @@ -366,7 +366,7 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) __m128 Lyz2 = light_y; // L.y*L.y + L.z*L.z __m128 Lx = _mm_sub_ps(light_x, viewpos_x); __m128 dist2 = _mm_add_ps(Lyz2, _mm_mul_ps(Lx, Lx)); diff --git a/src/rendering/swrenderer/drawers/r_draw_sprite32.h b/src/rendering/swrenderer/drawers/r_draw_sprite32.h index 7fa300f820..6ae563dc6e 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sprite32.h +++ b/src/rendering/swrenderer/drawers/r_draw_sprite32.h @@ -143,9 +143,9 @@ namespace swrenderer shade_light.g = shade_constants.light_green; shade_light.b = shade_constants.light_blue; desaturate = shade_constants.desaturate; - lightcontrib.r = MIN(light + dynlight.r, 256) - light; - lightcontrib.g = MIN(light + dynlight.g, 256) - light; - lightcontrib.b = MIN(light + dynlight.b, 256) - light; + lightcontrib.r = min(light + dynlight.r, 256) - light; + lightcontrib.g = min(light + dynlight.g, 256) - light; + lightcontrib.b = min(light + dynlight.b, 256) - light; mlight.r = light; mlight.g = light; mlight.b = light; @@ -161,9 +161,9 @@ namespace swrenderer shade_light.b = 0; desaturate = 0; lightcontrib = 0; - mlight.r = MIN(light + dynlight.r, 256); - mlight.g = MIN(light + dynlight.g, 256); - mlight.b = MIN(light + dynlight.b, 256); + mlight.r = min(light + dynlight.r, 256); + mlight.g = min(light + dynlight.g, 256); + mlight.b = min(light + dynlight.b, 256); } int count = args.Count(); @@ -300,9 +300,9 @@ namespace swrenderer fgcolor.g = (((shade_fade.g + ((fgcolor.g * inv_desaturate + intensity) >> 8) * mlight.g) >> 8) * shade_light.g) >> 8; fgcolor.b = (((shade_fade.b + ((fgcolor.b * inv_desaturate + intensity) >> 8) * mlight.b) >> 8) * shade_light.b) >> 8; - fgcolor.r = MIN(fgcolor.r + lit_dynlight.r, 255); - fgcolor.g = MIN(fgcolor.g + lit_dynlight.g, 255); - fgcolor.b = MIN(fgcolor.b + lit_dynlight.b, 255); + fgcolor.r = min(fgcolor.r + lit_dynlight.r, 255); + fgcolor.g = min(fgcolor.g + lit_dynlight.g, 255); + fgcolor.b = min(fgcolor.b + lit_dynlight.b, 255); return fgcolor; } } @@ -332,9 +332,9 @@ namespace swrenderer { uint32_t alpha = ifgshade; BgraColor outcolor; - outcolor.r = MIN(((fgcolor.r * alpha) >> 8) + bgcolor.r, 255); - outcolor.g = MIN(((fgcolor.g * alpha) >> 8) + bgcolor.g, 255); - outcolor.b = MIN(((fgcolor.b * alpha) >> 8) + bgcolor.b, 255); + outcolor.r = min(((fgcolor.r * alpha) >> 8) + bgcolor.r, 255); + outcolor.g = min(((fgcolor.g * alpha) >> 8) + bgcolor.g, 255); + outcolor.b = min(((fgcolor.b * alpha) >> 8) + bgcolor.b, 255); outcolor.a = 255; return outcolor; } @@ -357,21 +357,21 @@ namespace swrenderer BgraColor outcolor; if (BlendT::Mode == (int)SpriteBlendModes::AddClamp) { - outcolor.r = MIN((fgcolor.r + bgcolor.r) >> 8, 255); - outcolor.g = MIN((fgcolor.g + bgcolor.g) >> 8, 255); - outcolor.b = MIN((fgcolor.b + bgcolor.b) >> 8, 255); + outcolor.r = min((fgcolor.r + bgcolor.r) >> 8, 255); + outcolor.g = min((fgcolor.g + bgcolor.g) >> 8, 255); + outcolor.b = min((fgcolor.b + bgcolor.b) >> 8, 255); } else if (BlendT::Mode == (int)SpriteBlendModes::SubClamp) { - outcolor.r = MAX(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); } else if (BlendT::Mode == (int)SpriteBlendModes::RevSubClamp) { - outcolor.r = MAX(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); } outcolor.a = 255; return outcolor; diff --git a/src/rendering/swrenderer/drawers/r_draw_wall32.h b/src/rendering/swrenderer/drawers/r_draw_wall32.h index 65f7025b2d..92056a9b73 100644 --- a/src/rendering/swrenderer/drawers/r_draw_wall32.h +++ b/src/rendering/swrenderer/drawers/r_draw_wall32.h @@ -236,13 +236,13 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) float Lxy2 = light_x; // L.x*L.x + L.y*L.y float Lz = light_z - viewpos_z; float dist2 = Lxy2 + Lz * Lz; float rcp_dist = 1.f/sqrt(dist2); float dist = dist2 * rcp_dist; - float distance_attenuation = 256.0f - MIN(dist * light_radius, 256.0f); + float distance_attenuation = 256.0f - min(dist * light_radius, 256.0f); // The simple light type float simple_attenuation = distance_attenuation; @@ -260,13 +260,13 @@ namespace swrenderer lit.b += (light_color.b * attenuation) >> 8; } - lit.r = MIN(lit.r, 256); - lit.g = MIN(lit.g, 256); - lit.b = MIN(lit.b, 256); + lit.r = min(lit.r, 256); + lit.g = min(lit.g, 256); + lit.b = min(lit.b, 256); - fgcolor.r = MIN(fgcolor.r + ((material.r * lit.r) >> 8), 255); - fgcolor.g = MIN(fgcolor.g + ((material.g * lit.g) >> 8), 255); - fgcolor.b = MIN(fgcolor.b + ((material.b * lit.b) >> 8), 255); + fgcolor.r = min(fgcolor.r + ((material.r * lit.r) >> 8), 255); + fgcolor.g = min(fgcolor.g + ((material.g * lit.g) >> 8), 255); + fgcolor.b = min(fgcolor.b + ((material.b * lit.b) >> 8), 255); return fgcolor; } @@ -302,21 +302,21 @@ namespace swrenderer BgraColor outcolor; if (BlendT::Mode == (int)WallBlendModes::AddClamp) { - outcolor.r = MIN((fgcolor.r + bgcolor.r) >> 8, 255); - outcolor.g = MIN((fgcolor.g + bgcolor.g) >> 8, 255); - outcolor.b = MIN((fgcolor.b + bgcolor.b) >> 8, 255); + outcolor.r = min((fgcolor.r + bgcolor.r) >> 8, 255); + outcolor.g = min((fgcolor.g + bgcolor.g) >> 8, 255); + outcolor.b = min((fgcolor.b + bgcolor.b) >> 8, 255); } else if (BlendT::Mode == (int)WallBlendModes::SubClamp) { - outcolor.r = MAX(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(fgcolor.r - bgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(fgcolor.g - bgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(fgcolor.b - bgcolor.b) >> 8, 0); } else if (BlendT::Mode == (int)WallBlendModes::RevSubClamp) { - outcolor.r = MAX(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); - outcolor.g = MAX(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); - outcolor.b = MAX(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); + outcolor.r = max(int32_t(bgcolor.r - fgcolor.r) >> 8, 0); + outcolor.g = max(int32_t(bgcolor.g - fgcolor.g) >> 8, 0); + outcolor.b = max(int32_t(bgcolor.b - fgcolor.b) >> 8, 0); } outcolor.a = 255; return outcolor; diff --git a/src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h index 4ea8d4d759..1860ba6673 100644 --- a/src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h @@ -280,7 +280,7 @@ namespace swrenderer // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) __m128 Lxy2 = light_x; // L.x*L.x + L.y*L.y __m128 Lz = _mm_sub_ps(light_z, viewpos_z); __m128 dist2 = _mm_add_ps(Lxy2, _mm_mul_ps(Lz, Lz)); diff --git a/src/rendering/swrenderer/line/r_farclip_line.cpp b/src/rendering/swrenderer/line/r_farclip_line.cpp index e0f0275789..1583ed90aa 100644 --- a/src/rendering/swrenderer/line/r_farclip_line.cpp +++ b/src/rendering/swrenderer/line/r_farclip_line.cpp @@ -155,7 +155,7 @@ namespace swrenderer for (int x = x1; x < x2; ++x) { short top = (clip3d->fakeFloor && m3DFloor.type == Fake3DOpaque::FakeCeiling) ? clip3d->fakeFloor->ceilingclip[x] : ceilingclip[x]; - short bottom = MIN(walltop.ScreenY[x], floorclip[x]); + short bottom = min(walltop.ScreenY[x], floorclip[x]); if (top < bottom) { mCeilingPlane->top[x] = top; @@ -177,7 +177,7 @@ namespace swrenderer for (int x = x1; x < x2; ++x) { - short top = MAX(wallbottom.ScreenY[x], ceilingclip[x]); + short top = max(wallbottom.ScreenY[x], ceilingclip[x]); short bottom = (clip3d->fakeFloor && m3DFloor.type == Fake3DOpaque::FakeFloor) ? clip3d->fakeFloor->floorclip[x] : floorclip[x]; if (top < bottom) { diff --git a/src/rendering/swrenderer/line/r_fogboundary.cpp b/src/rendering/swrenderer/line/r_fogboundary.cpp index 1a6e405199..46cf673bd3 100644 --- a/src/rendering/swrenderer/line/r_fogboundary.cpp +++ b/src/rendering/swrenderer/line/r_fogboundary.cpp @@ -110,13 +110,13 @@ namespace swrenderer { if (fake_dc_colormap != basecolormapdata) { - stop = MIN(t1, b2); + stop = min(t1, b2); while (t2 < stop) { int y = t2++; drawerargs.DrawFogBoundaryLine(thread, y, xr, spanend[y]); } - stop = MAX(b1, t2); + stop = max(b1, t2); while (b2 > stop) { int y = --b2; @@ -125,16 +125,16 @@ namespace swrenderer } else { - t2 = MAX(t2, MIN(t1, b2)); - b2 = MIN(b2, MAX(b1, t2)); + t2 = max(t2, min(t1, b2)); + b2 = min(b2, max(b1, t2)); } - stop = MIN(t2, b1); + stop = min(t2, b1); while (t1 < stop) { spanend[t1++] = x; } - stop = MAX(b2, t2); + stop = max(b2, t2); while (b1 > stop) { spanend[--b1] = x; diff --git a/src/rendering/swrenderer/line/r_line.cpp b/src/rendering/swrenderer/line/r_line.cpp index e2e08b268d..de4f4f3078 100644 --- a/src/rendering/swrenderer/line/r_line.cpp +++ b/src/rendering/swrenderer/line/r_line.cpp @@ -752,7 +752,7 @@ namespace swrenderer for (int x = x1; x < x2; ++x) { short top = (clip3d->fakeFloor && m3DFloor.type == Fake3DOpaque::FakeCeiling) ? clip3d->fakeFloor->ceilingclip[x] : ceilingclip[x]; - short bottom = MIN(walltop.ScreenY[x], floorclip[x]); + short bottom = min(walltop.ScreenY[x], floorclip[x]); if (top < bottom) { mCeilingPlane->top[x] = top; @@ -774,7 +774,7 @@ namespace swrenderer for (int x = x1; x < x2; ++x) { - short top = MAX(wallbottom.ScreenY[x], ceilingclip[x]); + short top = max(wallbottom.ScreenY[x], ceilingclip[x]); short bottom = (clip3d->fakeFloor && m3DFloor.type == Fake3DOpaque::FakeFloor) ? clip3d->fakeFloor->floorclip[x] : floorclip[x]; if (top < bottom) { @@ -804,7 +804,7 @@ namespace swrenderer { for (int x = x1; x < x2; ++x) { - walllower.ScreenY[x] = MIN(MAX(walllower.ScreenY[x], ceilingclip[x]), wallbottom.ScreenY[x]); + walllower.ScreenY[x] = min(max(walllower.ScreenY[x], ceilingclip[x]), wallbottom.ScreenY[x]); } memcpy(clip3d->fakeFloor->floorclip + x1, walllower.ScreenY + x1, (x2 - x1) * sizeof(short)); } @@ -816,7 +816,7 @@ namespace swrenderer { for (int x = x1; x < x2; ++x) { - wallupper.ScreenY[x] = MAX(MIN(wallupper.ScreenY[x], floorclip[x]), walltop.ScreenY[x]); + wallupper.ScreenY[x] = max(min(wallupper.ScreenY[x], floorclip[x]), walltop.ScreenY[x]); } memcpy(clip3d->fakeFloor->ceilingclip + x1, wallupper.ScreenY + x1, (x2 - x1) * sizeof(short)); } @@ -839,7 +839,7 @@ namespace swrenderer { // top wall for (int x = x1; x < x2; ++x) { - wallupper.ScreenY[x] = MAX(MIN(wallupper.ScreenY[x], floorclip[x]), walltop.ScreenY[x]); + wallupper.ScreenY[x] = max(min(wallupper.ScreenY[x], floorclip[x]), walltop.ScreenY[x]); } memcpy(ceilingclip + x1, wallupper.ScreenY + x1, (x2 - x1) * sizeof(short)); } @@ -852,7 +852,7 @@ namespace swrenderer { // bottom wall for (int x = x1; x < x2; ++x) { - walllower.ScreenY[x] = MIN(MAX(walllower.ScreenY[x], ceilingclip[x]), wallbottom.ScreenY[x]); + walllower.ScreenY[x] = min(max(walllower.ScreenY[x], ceilingclip[x]), wallbottom.ScreenY[x]); } memcpy(floorclip + x1, walllower.ScreenY + x1, (x2 - x1) * sizeof(short)); } diff --git a/src/rendering/swrenderer/line/r_renderdrawsegment.cpp b/src/rendering/swrenderer/line/r_renderdrawsegment.cpp index b4c5fa544a..bd67b88f08 100644 --- a/src/rendering/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/rendering/swrenderer/line/r_renderdrawsegment.cpp @@ -122,20 +122,20 @@ namespace swrenderer top -= Thread->Viewport->viewpoint.Pos.Z; bot -= Thread->Viewport->viewpoint.Pos.Z; - ceilZ = MIN(ceilZ, top); - floorZ = MAX(floorZ, bot); + ceilZ = min(ceilZ, top); + floorZ = max(floorZ, bot); } // Clip wall by the current 3D floor render range. if (m3DFloor.clipTop) { double clipZ = m3DFloor.sclipTop - Thread->Viewport->viewpoint.Pos.Z; - ceilZ = MIN(ceilZ, clipZ); + ceilZ = min(ceilZ, clipZ); } if (m3DFloor.clipBottom) { double clipZ = m3DFloor.sclipBottom - Thread->Viewport->viewpoint.Pos.Z; - floorZ = MAX(floorZ, clipZ); + floorZ = max(floorZ, clipZ); } wallupper.Project(Thread->Viewport.get(), ceilZ, &ds->WallC); @@ -191,7 +191,7 @@ namespace swrenderer sector_t tempsec; const sector_t* lightsector = Thread->OpaquePass->FakeFlat(frontsector, &tempsec, nullptr, nullptr, nullptr, 0, 0, 0, 0); - fixed_t alpha = FLOAT2FIXED((float)MIN(curline->linedef->alpha, 1.)); + fixed_t alpha = FLOAT2FIXED((float)min(curline->linedef->alpha, 1.)); bool additive = (curline->linedef->flags & ML_ADDTRANS) != 0; RenderWallPart renderWallpart(Thread); @@ -614,16 +614,16 @@ namespace swrenderer double frontfz1 = ds->curline->frontsector->floorplane.ZatPoint(ds->curline->v1); double frontcz2 = ds->curline->frontsector->ceilingplane.ZatPoint(ds->curline->v2); double frontfz2 = ds->curline->frontsector->floorplane.ZatPoint(ds->curline->v2); - top = MAX(frontcz1, frontcz2); - bot = MIN(frontfz1, frontfz2); + top = max(frontcz1, frontcz2); + bot = min(frontfz1, frontfz2); if (m3DFloor.clipTop) { - top = MIN(top, m3DFloor.sclipTop); + top = min(top, m3DFloor.sclipTop); } if (m3DFloor.clipBottom) { - bot = MAX(bot, m3DFloor.sclipBottom); + bot = max(bot, m3DFloor.sclipBottom); } } @@ -632,9 +632,9 @@ namespace swrenderer double texheight = tex->GetScaledHeight() / fabs(curline->sidedef->GetTextureYScale(side_t::mid)); double texturemid; if (curline->linedef->flags & ML_DONTPEGBOTTOM) - texturemid = MAX(frontsector->GetPlaneTexZ(sector_t::floor), backsector->GetPlaneTexZ(sector_t::floor)) + texheight; + texturemid = max(frontsector->GetPlaneTexZ(sector_t::floor), backsector->GetPlaneTexZ(sector_t::floor)) + texheight; else - texturemid = MIN(frontsector->GetPlaneTexZ(sector_t::ceiling), backsector->GetPlaneTexZ(sector_t::ceiling)); + texturemid = min(frontsector->GetPlaneTexZ(sector_t::ceiling), backsector->GetPlaneTexZ(sector_t::ceiling)); double rowoffset = curline->sidedef->GetTextureYOffset(side_t::mid); if (tex->useWorldPanning(curline->GetLevel())) rowoffset /= fabs(tex->GetScale().Y * curline->sidedef->GetTextureYScale(side_t::mid)); diff --git a/src/rendering/swrenderer/line/r_wallsetup.cpp b/src/rendering/swrenderer/line/r_wallsetup.cpp index 2f864581e2..f1bf6aff26 100644 --- a/src/rendering/swrenderer/line/r_wallsetup.cpp +++ b/src/rendering/swrenderer/line/r_wallsetup.cpp @@ -441,8 +441,8 @@ namespace swrenderer float yscale = GetYScale(sidedef, pic, side_t::mid); double cameraZ = viewport->viewpoint.Pos.Z; - double texZFloor = MAX(frontsector->GetPlaneTexZ(sector_t::floor), backsector->GetPlaneTexZ(sector_t::floor)); - double texZCeiling = MIN(frontsector->GetPlaneTexZ(sector_t::ceiling), backsector->GetPlaneTexZ(sector_t::ceiling)); + double texZFloor = max(frontsector->GetPlaneTexZ(sector_t::floor), backsector->GetPlaneTexZ(sector_t::floor)); + double texZCeiling = min(frontsector->GetPlaneTexZ(sector_t::ceiling), backsector->GetPlaneTexZ(sector_t::ceiling)); double texturemid; if (yscale >= 0) diff --git a/src/rendering/swrenderer/plane/r_flatplane.cpp b/src/rendering/swrenderer/plane/r_flatplane.cpp index 9075fe9100..c17c9ed6b5 100644 --- a/src/rendering/swrenderer/plane/r_flatplane.cpp +++ b/src/rendering/swrenderer/plane/r_flatplane.cpp @@ -178,9 +178,9 @@ namespace swrenderer double distance2 = viewport->PlaneDepth(y + 1, planeheight); double xmagnitude = fabs(ystepscale * (distance2 - distance) * viewport->FocalLengthX); double ymagnitude = fabs(xstepscale * (distance2 - distance) * viewport->FocalLengthX); - double magnitude = MAX(ymagnitude, xmagnitude); + double magnitude = max(ymagnitude, xmagnitude); double min_lod = -1000.0; - drawerargs.SetTextureLOD(MAX(log2(magnitude) + r_lod_bias, min_lod)); + drawerargs.SetTextureLOD(max(log2(magnitude) + r_lod_bias, min_lod)); } if (plane_shade) diff --git a/src/rendering/swrenderer/plane/r_planerenderer.cpp b/src/rendering/swrenderer/plane/r_planerenderer.cpp index f251d5c71e..35919a59f1 100644 --- a/src/rendering/swrenderer/plane/r_planerenderer.cpp +++ b/src/rendering/swrenderer/plane/r_planerenderer.cpp @@ -65,14 +65,14 @@ namespace swrenderer int stop; // Draw any spans that have just closed - stop = MIN(t1, b2); + stop = min(t1, b2); while (t2 < stop) { int y = t2++; int x2 = spanend[y]; RenderLine(y, xr, x2); } - stop = MAX(b1, t2); + stop = max(b1, t2); while (b2 > stop) { int y = --b2; @@ -81,12 +81,12 @@ namespace swrenderer } // Mark any spans that have just opened - stop = MIN(t2, b1); + stop = min(t2, b1); while (t1 < stop) { spanend[t1++] = x; } - stop = MAX(b2, t2); + stop = max(b2, t2); while (b1 > stop) { spanend[--b1] = x; diff --git a/src/rendering/swrenderer/plane/r_skyplane.cpp b/src/rendering/swrenderer/plane/r_skyplane.cpp index cc59301ad7..cf88e0439f 100644 --- a/src/rendering/swrenderer/plane/r_skyplane.cpp +++ b/src/rendering/swrenderer/plane/r_skyplane.cpp @@ -109,8 +109,8 @@ namespace swrenderer // giving a total sky width of 1024 pixels. So if the sky texture is no wider than 1024, // we map it to a cylinder with circumfrence 1024. For larger ones, we use the width of // the texture as the cylinder's circumfrence. - sky1cyl = MAX(sskytex1->GetWidth(), fixed_t(sskytex1->GetScale().X * 1024)); - sky2cyl = MAX(sskytex2->GetWidth(), fixed_t(sskytex2->GetScale().Y * 1024)); + sky1cyl = max(sskytex1->GetWidth(), fixed_t(sskytex1->GetScale().X * 1024)); + sky2cyl = max(sskytex2->GetWidth(), fixed_t(sskytex2->GetScale().Y * 1024)); } void RenderSkyPlane::Render(VisiblePlane *pl) @@ -199,7 +199,7 @@ namespace swrenderer skyflip = l->args[2] ? 0u : ~0u; int frontxscale = int(frontskytex->GetScale().X * 1024); - frontcyl = MAX(frontskytex->GetWidth(), frontxscale); + frontcyl = max(frontskytex->GetWidth(), frontxscale); if (Level->skystretch) { skymid = skymid * frontskytex->GetScaledHeight() / (SKYSTRETCH_HEIGHT + skyoffset); diff --git a/src/rendering/swrenderer/scene/r_light.cpp b/src/rendering/swrenderer/scene/r_light.cpp index 5b8a689b2a..4a8de1950c 100644 --- a/src/rendering/swrenderer/scene/r_light.cpp +++ b/src/rendering/swrenderer/scene/r_light.cpp @@ -149,7 +149,7 @@ namespace swrenderer bool nolightfade = !foggy && ((viewport->Level()->flags3 & LEVEL3_NOLIGHTFADE)); if (nolightfade) { - return (MAX(255 - lightlevel, 0) * NUMCOLORMAPS) << (FRACBITS - 8); + return (max(255 - lightlevel, 0) * NUMCOLORMAPS) << (FRACBITS - 8); } else { diff --git a/src/rendering/swrenderer/scene/r_light.h b/src/rendering/swrenderer/scene/r_light.h index d14c73b556..8f1d6adccb 100644 --- a/src/rendering/swrenderer/scene/r_light.h +++ b/src/rendering/swrenderer/scene/r_light.h @@ -43,12 +43,12 @@ // Convert a shade and visibility to a clamped colormap index. // Result is not fixed point. // Change R_CalcTiltedLighting() when this changes. -#define GETPALOOKUP(vis,shade) (clamp (((shade)-FLOAT2FIXED(MIN(MAXLIGHTVIS,double(vis))))>>FRACBITS, 0, NUMCOLORMAPS-1)) +#define GETPALOOKUP(vis,shade) (clamp (((shade)-FLOAT2FIXED(min(MAXLIGHTVIS,double(vis))))>>FRACBITS, 0, NUMCOLORMAPS-1)) // Calculate the light multiplier for dc_light/ds_light // This is used instead of GETPALOOKUP when ds_colormap/dc_colormap is set to the base colormap // Returns a value between 0 and 1 in fixed point -#define LIGHTSCALE(vis,shade) FLOAT2FIXED(clamp((FIXED2DBL(shade) - (MIN(MAXLIGHTVIS,double(vis)))) / NUMCOLORMAPS, 0.0, (NUMCOLORMAPS-1)/(double)NUMCOLORMAPS)) +#define LIGHTSCALE(vis,shade) FLOAT2FIXED(clamp((FIXED2DBL(shade) - (min(MAXLIGHTVIS,double(vis)))) / NUMCOLORMAPS, 0.0, (NUMCOLORMAPS-1)/(double)NUMCOLORMAPS)) struct FSWColormap; @@ -82,7 +82,7 @@ namespace swrenderer // The vis value to pass into the GETPALOOKUP or LIGHTSCALE macros double WallVis(double screenZ, bool foggy) const { return WallGlobVis(foggy) / screenZ; } - double SpriteVis(double screenZ, bool foggy) const { return SpriteGlobVis(foggy) / MAX(screenZ, MINZ); } + double SpriteVis(double screenZ, bool foggy) const { return SpriteGlobVis(foggy) / max(screenZ, MINZ); } double FlatPlaneVis(int screenY, double planeheight, bool foggy, RenderViewport *viewport) const { return FlatPlaneGlobVis(foggy) / planeheight * fabs(viewport->CenterY - screenY); } double SlopePlaneGlobVis(bool foggy) const { return (NoLightFade && !foggy) ? 0.0f : TiltVisibility; } diff --git a/src/rendering/swrenderer/scene/r_opaque_pass.cpp b/src/rendering/swrenderer/scene/r_opaque_pass.cpp index 9bb69562cb..5c7e60e6de 100644 --- a/src/rendering/swrenderer/scene/r_opaque_pass.cpp +++ b/src/rendering/swrenderer/scene/r_opaque_pass.cpp @@ -700,7 +700,7 @@ namespace swrenderer if (!(clip3d->fakeFloor->fakeFloor->flags & FF_RENDERPLANES)) continue; if (clip3d->fakeFloor->fakeFloor->alpha == 0) continue; if (clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE && clip3d->fakeFloor->fakeFloor->flags & FF_INVERTSECTOR) continue; - fixed_t fakeAlpha = MIN(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); + fixed_t fakeAlpha = min(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); if (clip3d->fakeFloor->validcount != validcount) { clip3d->fakeFloor->validcount = validcount; @@ -764,7 +764,7 @@ namespace swrenderer if (!(clip3d->fakeFloor->fakeFloor->flags & FF_RENDERPLANES)) continue; if (clip3d->fakeFloor->fakeFloor->alpha == 0) continue; if (!(clip3d->fakeFloor->fakeFloor->flags & FF_THISINSIDE) && (clip3d->fakeFloor->fakeFloor->flags & (FF_SWIMMABLE | FF_INVERTSECTOR)) == (FF_SWIMMABLE | FF_INVERTSECTOR)) continue; - fixed_t fakeAlpha = MIN(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); + fixed_t fakeAlpha = min(Scale(clip3d->fakeFloor->fakeFloor->alpha, OPAQUE, 255), OPAQUE); if (clip3d->fakeFloor->validcount != validcount) { diff --git a/src/rendering/swrenderer/segments/r_drawsegment.cpp b/src/rendering/swrenderer/segments/r_drawsegment.cpp index fd7517d723..ce704b3878 100644 --- a/src/rendering/swrenderer/segments/r_drawsegment.cpp +++ b/src/rendering/swrenderer/segments/r_drawsegment.cpp @@ -104,21 +104,21 @@ namespace swrenderer DrawSegmentGroup group; group.BeginIndex = index; - group.EndIndex = MIN(index + groupSize, SegmentsCount()); + group.EndIndex = min(index + groupSize, SegmentsCount()); group.x1 = ds->x1; group.x2 = ds->x2; - group.neardepth = MIN(ds->WallC.sz1, ds->WallC.sz2); - group.fardepth = MAX(ds->WallC.sz1, ds->WallC.sz2); + group.neardepth = min(ds->WallC.sz1, ds->WallC.sz2); + group.fardepth = max(ds->WallC.sz1, ds->WallC.sz2); for (unsigned int groupIndex = group.BeginIndex + 1; groupIndex < group.EndIndex; groupIndex++) { ds = Segment(groupIndex); - group.x1 = MIN(group.x1, ds->x1); - group.x2 = MAX(group.x2, ds->x2); - group.neardepth = MIN(group.neardepth, ds->WallC.sz1); - group.neardepth = MIN(group.neardepth, ds->WallC.sz2); - group.fardepth = MAX(ds->WallC.sz1, group.fardepth); - group.fardepth = MAX(ds->WallC.sz2, group.fardepth); + group.x1 = min(group.x1, ds->x1); + group.x2 = max(group.x2, ds->x2); + group.neardepth = min(group.neardepth, ds->WallC.sz1); + group.neardepth = min(group.neardepth, ds->WallC.sz2); + group.fardepth = max(ds->WallC.sz1, group.fardepth); + group.fardepth = max(ds->WallC.sz2, group.fardepth); } for (int x = group.x1; x < group.x2; x++) diff --git a/src/rendering/swrenderer/textures/r_swtexture.cpp b/src/rendering/swrenderer/textures/r_swtexture.cpp index 662c12d573..1336abfd2e 100644 --- a/src/rendering/swrenderer/textures/r_swtexture.cpp +++ b/src/rendering/swrenderer/textures/r_swtexture.cpp @@ -364,8 +364,8 @@ void FSoftwareTexture::CreatePixelsBgraWithMipmaps() int buffersize = 0; for (int i = 0; i < levels; i++) { - int w = MAX(GetPhysicalWidth() >> i, 1); - int h = MAX(GetPhysicalHeight() >> i, 1); + int w = max(GetPhysicalWidth() >> i, 1); + int h = max(GetPhysicalHeight() >> i, 1); buffersize += w * h; } PixelsBgra.Resize(buffersize); @@ -379,7 +379,7 @@ int FSoftwareTexture::MipmapLevels() int heightbits = 0; while ((GetPhysicalHeight() >> heightbits) != 0) heightbits++; - return MAX(widthbits, heightbits); + return max(widthbits, heightbits); } //========================================================================== @@ -430,20 +430,20 @@ void FSoftwareTexture::GenerateBgraMipmaps() Color4f *dest = src + GetPhysicalWidth() * GetPhysicalHeight(); for (int i = 1; i < levels; i++) { - int srcw = MAX(GetPhysicalWidth() >> (i - 1), 1); - int srch = MAX(GetPhysicalHeight() >> (i - 1), 1); - int w = MAX(GetPhysicalWidth() >> i, 1); - int h = MAX(GetPhysicalHeight() >> i, 1); + int srcw = max(GetPhysicalWidth() >> (i - 1), 1); + int srch = max(GetPhysicalHeight() >> (i - 1), 1); + int w = max(GetPhysicalWidth() >> i, 1); + int h = max(GetPhysicalHeight() >> i, 1); // Downscale for (int x = 0; x < w; x++) { int sx0 = x * 2; - int sx1 = MIN((x + 1) * 2, srcw - 1); + int sx1 = min((x + 1) * 2, srcw - 1); for (int y = 0; y < h; y++) { int sy0 = y * 2; - int sy1 = MIN((y + 1) * 2, srch - 1); + int sy1 = min((y + 1) * 2, srch - 1); Color4f src00 = src[sy0 + sx0 * srch]; Color4f src01 = src[sy1 + sx0 * srch]; @@ -493,14 +493,14 @@ void FSoftwareTexture::GenerateBgraMipmaps() uint32_t *dest = PixelsBgra.Data() + GetPhysicalWidth() * GetPhysicalHeight(); for (int i = 1; i < levels; i++) { - int w = MAX(GetPhysicalWidth() >> i, 1); - int h = MAX(GetPhysicalHeight() >> i, 1); + int w = max(GetPhysicalWidth() >> i, 1); + int h = max(GetPhysicalHeight() >> i, 1); for (int j = 0; j < w * h; j++) { - uint32_t a = (uint32_t)clamp(powf(MAX(src[j].a, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); - uint32_t r = (uint32_t)clamp(powf(MAX(src[j].r, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); - uint32_t g = (uint32_t)clamp(powf(MAX(src[j].g, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); - uint32_t b = (uint32_t)clamp(powf(MAX(src[j].b, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); + uint32_t a = (uint32_t)clamp(powf(max(src[j].a, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); + uint32_t r = (uint32_t)clamp(powf(max(src[j].r, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); + uint32_t g = (uint32_t)clamp(powf(max(src[j].g, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); + uint32_t b = (uint32_t)clamp(powf(max(src[j].b, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f); dest[j] = (a << 24) | (r << 16) | (g << 8) | b; } src += w * h; diff --git a/src/rendering/swrenderer/textures/warpbuffer.h b/src/rendering/swrenderer/textures/warpbuffer.h index 114b8af002..7787068505 100644 --- a/src/rendering/swrenderer/textures/warpbuffer.h +++ b/src/rendering/swrenderer/textures/warpbuffer.h @@ -43,7 +43,7 @@ void WarpBuffer(TYPE *Pixels, const TYPE *source, int width, int height, int xmu if (warptype == 1) { - TYPE *buffer = (TYPE *)alloca(sizeof(TYPE) * MAX(width, height)); + TYPE *buffer = (TYPE *)alloca(sizeof(TYPE) * max(width, height)); // [mxd] Rewrote to fix animation for NPo2 textures unsigned timebase = unsigned(time * Speed * 32 / 28); for (y = height - 1; y >= 0; y--) diff --git a/src/rendering/swrenderer/textures/warptexture.cpp b/src/rendering/swrenderer/textures/warptexture.cpp index ce3cb2f522..10e51ddb0b 100644 --- a/src/rendering/swrenderer/textures/warptexture.cpp +++ b/src/rendering/swrenderer/textures/warptexture.cpp @@ -126,20 +126,20 @@ void FWarpTexture::GenerateBgraMipmapsFast() int levels = MipmapLevels(); for (int i = 1; i < levels; i++) { - int srcw = MAX(GetPhysicalWidth() >> (i - 1), 1); - int srch = MAX(GetPhysicalHeight() >> (i - 1), 1); - int w = MAX(GetPhysicalWidth() >> i, 1); - int h = MAX(GetPhysicalHeight() >> i, 1); + int srcw = max(GetPhysicalWidth() >> (i - 1), 1); + int srch = max(GetPhysicalHeight() >> (i - 1), 1); + int w = max(GetPhysicalWidth() >> i, 1); + int h = max(GetPhysicalHeight() >> i, 1); for (int x = 0; x < w; x++) { int sx0 = x * 2; - int sx1 = MIN((x + 1) * 2, srcw - 1); + int sx1 = min((x + 1) * 2, srcw - 1); for (int y = 0; y < h; y++) { int sy0 = y * 2; - int sy1 = MIN((y + 1) * 2, srch - 1); + int sy1 = min((y + 1) * 2, srch - 1); uint32_t src00 = src[sy0 + sx0 * srch]; uint32_t src01 = src[sy1 + sx0 * srch]; diff --git a/src/rendering/swrenderer/things/r_particle.cpp b/src/rendering/swrenderer/things/r_particle.cpp index 6e9f2b00ed..85374269c9 100644 --- a/src/rendering/swrenderer/things/r_particle.cpp +++ b/src/rendering/swrenderer/things/r_particle.cpp @@ -120,8 +120,8 @@ namespace swrenderer // calculate edges of the shape double psize = particle->size / 8.0; - x1 = MAX(renderportal->WindowLeft, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx - psize) * xscale)); - x2 = MIN(renderportal->WindowRight, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx + psize) * xscale)); + x1 = max(renderportal->WindowLeft, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx - psize) * xscale)); + x2 = min(renderportal->WindowRight, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx + psize) * xscale)); if (x1 >= x2) return; @@ -285,7 +285,7 @@ namespace swrenderer if (ds->drawsegclip.CurrentPortalUniq == CurrentPortalUniq) { RenderDrawSegment renderer(thread); - renderer.Render(ds, MAX(ds->x1, x1), MIN(ds->x2, x2), clip3DFloor); + renderer.Render(ds, max(ds->x1, x1), min(ds->x2, x2), clip3DFloor); } } } diff --git a/src/rendering/swrenderer/things/r_visiblesprite.cpp b/src/rendering/swrenderer/things/r_visiblesprite.cpp index 16e3435c50..d9ecacda6c 100644 --- a/src/rendering/swrenderer/things/r_visiblesprite.cpp +++ b/src/rendering/swrenderer/things/r_visiblesprite.cpp @@ -61,8 +61,8 @@ namespace swrenderer DrawSegment *ds = segmentlist->TranslucentSegment(index); if (ds->drawsegclip.SubsectorDepth >= SubsectorDepth && ds->drawsegclip.CurrentPortalUniq == renderportal->CurrentPortalUniq) { - int r1 = MAX(ds->x1, 0); - int r2 = MIN(ds->x2, viewwidth - 1); + int r1 = max(ds->x1, 0); + int r2 = min(ds->x2, viewwidth - 1); RenderDrawSegment renderer(thread); renderer.Render(ds, r1, r2, clip3DFloor); @@ -200,17 +200,17 @@ namespace swrenderer { // seen below floor: clip top if (!spr->IsVoxel() && h > topclip) { - topclip = short(MIN(h, viewheight)); + topclip = short(min(h, viewheight)); } - hzt = MIN(hzt, hz); + hzt = min(hzt, hz); } else { // seen in the middle: clip bottom if (!spr->IsVoxel() && h < botclip) { - botclip = MAX(0, h); + botclip = max(0, h); } - hzb = MAX(hzb, hz); + hzb = max(hzb, hz); } } if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECMF_FAKEFLOORONLY)) @@ -222,17 +222,17 @@ namespace swrenderer { // seen above ceiling: clip bottom if (!spr->IsVoxel() && h < botclip) { - botclip = MAX(0, h); + botclip = max(0, h); } - hzb = MAX(hzb, hz); + hzb = max(hzb, hz); } else { // seen in the middle: clip top if (!spr->IsVoxel() && h > topclip) { - topclip = MIN(h, viewheight); + topclip = min(h, viewheight); } - hzt = MIN(hzt, hz); + hzt = min(hzt, hz); } } } @@ -242,7 +242,7 @@ namespace swrenderer int clip = xs_RoundToInt(viewport->CenterY - (spr->texturemid - spr->pic->GetHeight() + spr->floorclip) * spr->yscale); if (clip < botclip) { - botclip = MAX(0, clip); + botclip = max(0, clip); } } @@ -262,10 +262,10 @@ namespace swrenderer int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale); if (h < botclip) { - botclip = MAX(0, h); + botclip = max(0, h); } } - hzb = MAX(hzb, clip3DFloor.sclipBottom); + hzb = max(hzb, clip3DFloor.sclipBottom); } if (clip3DFloor.clipTop) { @@ -283,10 +283,10 @@ namespace swrenderer int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale); if (h > topclip) { - topclip = short(MIN(h, viewheight)); + topclip = short(min(h, viewheight)); } } - hzt = MIN(hzt, clip3DFloor.sclipTop); + hzt = min(hzt, clip3DFloor.sclipTop); } if (topclip >= botclip) @@ -322,8 +322,8 @@ namespace swrenderer DrawSegment *ds = segmentlist->TranslucentSegment(index); if (ds->drawsegclip.SubsectorDepth >= subsectordepth && ds->drawsegclip.CurrentPortalUniq == renderportal->CurrentPortalUniq) { - int r1 = MAX(ds->x1, 0); - int r2 = MIN(ds->x2, viewwidth - 1); + int r1 = max(ds->x1, 0); + int r2 = min(ds->x2, viewwidth - 1); RenderDrawSegment renderer(thread); renderer.Render(ds, r1, r2, clip3DFloor); @@ -341,8 +341,8 @@ namespace swrenderer continue; } - float neardepth = MIN(ds->WallC.sz1, ds->WallC.sz2); - float fardepth = MAX(ds->WallC.sz1, ds->WallC.sz2); + float neardepth = min(ds->WallC.sz1, ds->WallC.sz2); + float fardepth = max(ds->WallC.sz1, ds->WallC.sz2); // Check if sprite is in front of draw seg: if ((!spr->IsWallSprite() && neardepth > spr->depth) || ((spr->IsWallSprite() || fardepth > spr->depth) && @@ -351,8 +351,8 @@ namespace swrenderer { if (ds->drawsegclip.CurrentPortalUniq == renderportal->CurrentPortalUniq) { - int r1 = MAX(ds->x1, x1); - int r2 = MIN(ds->x2, x2); + int r1 = max(ds->x1, x1); + int r2 = min(ds->x2, x2); RenderDrawSegment renderer(thread); renderer.Render(ds, r1, r2, clip3DFloor); @@ -370,8 +370,8 @@ namespace swrenderer if (group.fardepth < spr->depth) { - int r1 = MAX(group.x1, x1); - int r2 = MIN(group.x2, x2); + int r1 = max(group.x1, x1); + int r2 = min(group.x2, x2); // Clip bottom short *clip1 = clipbot + r1; @@ -410,11 +410,11 @@ namespace swrenderer continue; } - int r1 = MAX(ds->x1, x1); - int r2 = MIN(ds->x2, x2); + int r1 = max(ds->x1, x1); + int r2 = min(ds->x2, x2); - float neardepth = MIN(ds->WallC.sz1, ds->WallC.sz2); - float fardepth = MAX(ds->WallC.sz1, ds->WallC.sz2); + float neardepth = min(ds->WallC.sz1, ds->WallC.sz2); + float fardepth = max(ds->WallC.sz1, ds->WallC.sz2); // Check if sprite is in front of draw seg: if ((!spr->IsWallSprite() && neardepth > spr->depth) || ((spr->IsWallSprite() || fardepth > spr->depth) && diff --git a/src/rendering/swrenderer/things/r_voxel.cpp b/src/rendering/swrenderer/things/r_voxel.cpp index dc8ef9de1c..ee343d2c2c 100644 --- a/src/rendering/swrenderer/things/r_voxel.cpp +++ b/src/rendering/swrenderer/things/r_voxel.cpp @@ -324,7 +324,7 @@ namespace swrenderer // Select mip level i = abs(DMulScale(dasprx - globalposx, cosang, daspry - globalposy, sinang, 6)); - i = DivScale(i, MIN(daxscale, dayscale), 6); + i = DivScale(i, min(daxscale, dayscale), 6); j = xs_Fix<13>::ToFix(viewport->FocalLengthX); for (k = 0; i >= j && k < voxobj->NumMips; ++k) { @@ -372,7 +372,7 @@ namespace swrenderer gyinc = DMulScale(sprcosang, cosang, sprsinang, sinang, 10); if ((abs(globalposz - dasprz) >> 10) >= abs(dazscale)) return; - x = 0; y = 0; j = MAX(mip->SizeX, mip->SizeY); + x = 0; y = 0; j = max(mip->SizeX, mip->SizeY); fixed_t *ggxinc = (fixed_t *)alloca((j + 1) * sizeof(fixed_t) * 2); fixed_t *ggyinc = ggxinc + (j + 1); for (i = 0; i <= j; i++) @@ -487,8 +487,8 @@ namespace swrenderer if (flags & DVF_FIND_X1X2) { - coverageX1 = MIN(coverageX1, lx); - coverageX2 = MAX(coverageX2, rx); + coverageX1 = min(coverageX1, lx); + coverageX2 = max(coverageX2, rx); continue; } @@ -550,9 +550,9 @@ namespace swrenderer else yinc = (((1 << 24) - 1) / (z2 - z1)) * zleng >> 8; } // [RH] Clip each column separately, not just by the first one. - for (int stripwidth = MIN(countof(z1a), rx - lx), lxt = lx; + for (int stripwidth = min(countof(z1a), rx - lx), lxt = lx; lxt < rx; - (lxt += countof(z1a)), stripwidth = MIN(countof(z1a), rx - lxt)) + (lxt += countof(z1a)), stripwidth = min(countof(z1a), rx - lxt)) { // Calculate top and bottom pixels locations for (int xxx = 0; xxx < stripwidth; ++xxx) @@ -560,7 +560,7 @@ namespace swrenderer if (zleng == 1) { yplc[xxx] = 0; - z1a[xxx] = MAX(z1, daumost[lxt + xxx]); + z1a[xxx] = max(z1, daumost[lxt + xxx]); } else { @@ -575,7 +575,7 @@ namespace swrenderer z1a[xxx] = z1; } } - z2a[xxx] = MIN(z2, dadmost[lxt + xxx]); + z2a[xxx] = min(z2, dadmost[lxt + xxx]); } const uint8_t *columnColors = col; @@ -991,8 +991,8 @@ namespace swrenderer int ztop = slab->ztop; int zbottom = ztop + slab->zleng; - //ztop = MAX(ztop, minZ); - //zbottom = MIN(zbottom, maxZ); + //ztop = max(ztop, minZ); + //zbottom = min(zbottom, maxZ); for (int z = ztop; z < zbottom; z++) { @@ -1023,10 +1023,10 @@ namespace swrenderer DVector3 screenPos = viewport->PointViewToScreen(viewPos); DVector2 screenExtent = viewport->ScaleViewToScreen({ extentX, extentY }, viewPos.Z, pixelstretch); - int x1 = MAX((int)(screenPos.X - screenExtent.X), 0); - int x2 = MIN((int)(screenPos.X + screenExtent.X + 0.5f), viewwidth - 1); - int y1 = MAX((int)(screenPos.Y - screenExtent.Y), 0); - int y2 = MIN((int)(screenPos.Y + screenExtent.Y + 0.5f), viewheight - 1); + int x1 = max((int)(screenPos.X - screenExtent.X), 0); + int x2 = min((int)(screenPos.X + screenExtent.X + 0.5f), viewwidth - 1); + int y1 = max((int)(screenPos.Y - screenExtent.Y), 0); + int y2 = min((int)(screenPos.Y + screenExtent.Y + 0.5f), viewheight - 1); int pixelsize = viewport->RenderTarget->IsBgra() ? 4 : 1; @@ -1034,8 +1034,8 @@ namespace swrenderer { for (int x = x1; x < x2; x++) { - int columnY1 = MAX(y1, (int)cliptop[x]); - int columnY2 = MIN(y2, (int)clipbottom[x]); + int columnY1 = max(y1, (int)cliptop[x]); + int columnY2 = min(y2, (int)clipbottom[x]); if (columnY1 < columnY2) { drawerargs.SetDest(x, columnY1); diff --git a/src/rendering/swrenderer/things/r_wallsprite.cpp b/src/rendering/swrenderer/things/r_wallsprite.cpp index bc14fc148e..971f42b2eb 100644 --- a/src/rendering/swrenderer/things/r_wallsprite.cpp +++ b/src/rendering/swrenderer/things/r_wallsprite.cpp @@ -159,8 +159,8 @@ namespace swrenderer { auto spr = this; - int x1 = MAX(spr->x1, spr->wallc.sx1); - int x2 = MIN(spr->x2, spr->wallc.sx2); + int x1 = max(spr->x1, spr->wallc.sx1); + int x2 = min(spr->x2, spr->wallc.sx2); if (x1 >= x2) return; diff --git a/src/rendering/swrenderer/viewport/r_drawerargs.cpp b/src/rendering/swrenderer/viewport/r_drawerargs.cpp index cf12dc41fb..9591b4498f 100644 --- a/src/rendering/swrenderer/viewport/r_drawerargs.cpp +++ b/src/rendering/swrenderer/viewport/r_drawerargs.cpp @@ -81,7 +81,7 @@ namespace swrenderer shadeConstants.fade_green = mBaseColormap->Fade.g; shadeConstants.fade_blue = mBaseColormap->Fade.b; shadeConstants.fade_alpha = mBaseColormap->Fade.a; - shadeConstants.desaturate = MIN(abs(mBaseColormap->Desaturate), 255) * 255 / 256; + shadeConstants.desaturate = min(abs(mBaseColormap->Desaturate), 255) * 255 / 256; shadeConstants.simple_shade = (mBaseColormap->Color.d == 0x00ffffff && mBaseColormap->Fade.d == 0x00000000 && mBaseColormap->Desaturate == 0); } else diff --git a/src/rendering/swrenderer/viewport/r_spritedrawer.cpp b/src/rendering/swrenderer/viewport/r_spritedrawer.cpp index 316f6af912..442237852c 100644 --- a/src/rendering/swrenderer/viewport/r_spritedrawer.cpp +++ b/src/rendering/swrenderer/viewport/r_spritedrawer.cpp @@ -70,8 +70,8 @@ namespace swrenderer iscale = -iscale; float vstepY = iscale / WallC.sz1 / (viewport->InvZtoScale / WallC.sz1); - int x1 = MAX(WallC.sx1, clipx1); - int x2 = MIN(WallC.sx2, clipx2); + int x1 = max(WallC.sx1, clipx1); + int x2 = min(WallC.sx2, clipx2); if (x1 >= x2) return; @@ -127,10 +127,10 @@ namespace swrenderer void SpriteDrawerArgs::DrawMasked2D(RenderThread* thread, double x0, double x1, double y0, double y1, FSoftwareTexture* tex, FRenderStyle style) { - int sx0 = MAX((int)x0, 0); - int sx1 = MIN((int)x1, viewwidth); - int sy0 = MAX((int)y0, 0); - int sy1 = MIN((int)y1, viewheight); + int sx0 = max((int)x0, 0); + int sx1 = min((int)x1, viewwidth); + int sy0 = max((int)y0, 0); + int sy1 = min((int)y1, viewheight); if (sx0 >= sx1 || sy0 >= sy1) return; @@ -169,9 +169,9 @@ namespace swrenderer { double xmagnitude = fabs(static_cast(texelStepX)* (1.0 / 0x1'0000'0000LL)); double ymagnitude = fabs(static_cast(texelStepY)* (1.0 / 0x1'0000'0000LL)); - double magnitude = MAX(ymagnitude, xmagnitude); + double magnitude = max(ymagnitude, xmagnitude); double min_lod = -1000.0; - double lod = MAX(log2(magnitude) + r_lod_bias, min_lod); + double lod = max(log2(magnitude) + r_lod_bias, min_lod); bool magnifying = lod < 0.0f; int mipmap_offset = 0; @@ -184,8 +184,8 @@ namespace swrenderer { mipmap_offset += mip_width * mip_height; level--; - mip_width = MAX(mip_width >> 1, 1); - mip_height = MAX(mip_height >> 1, 1); + mip_width = max(mip_width >> 1, 1); + mip_height = max(mip_height >> 1, 1); } } @@ -195,7 +195,7 @@ namespace swrenderer bool filter_nearest = (magnifying && !r_magfilter) || (!magnifying && !r_minfilter); if (filter_nearest) { - xoffset = MAX(MIN(xoffset, (mip_width << FRACBITS) - 1), 0); + xoffset = max(min(xoffset, (mip_width << FRACBITS) - 1), 0); int tx = xoffset >> FRACBITS; dc_source = (uint8_t*)(pixels + tx * mip_height); @@ -205,10 +205,10 @@ namespace swrenderer } else { - xoffset = MAX(MIN(xoffset - (FRACUNIT / 2), (mip_width << FRACBITS) - 1), 0); + xoffset = max(min(xoffset - (FRACUNIT / 2), (mip_width << FRACBITS) - 1), 0); int tx0 = xoffset >> FRACBITS; - int tx1 = MIN(tx0 + 1, mip_width - 1); + int tx1 = min(tx0 + 1, mip_width - 1); dc_source = (uint8_t*)(pixels + tx0 * mip_height); dc_source2 = (uint8_t*)(pixels + tx1 * mip_height); dc_textureheight = mip_height; @@ -282,12 +282,12 @@ namespace swrenderer dc_yl--; fixed_t maxfrac = ((top + length) << FRACBITS) - 1; - dc_texturefrac = MAX(dc_texturefrac, 0); - dc_texturefrac = MIN(dc_texturefrac, maxfrac); + dc_texturefrac = max(dc_texturefrac, 0); + dc_texturefrac = min(dc_texturefrac, maxfrac); if (dc_iscale > 0) - dc_count = MIN(dc_count, (maxfrac - dc_texturefrac + dc_iscale - 1) / dc_iscale); + dc_count = min(dc_count, (maxfrac - dc_texturefrac + dc_iscale - 1) / dc_iscale); else if (dc_iscale < 0) - dc_count = MIN(dc_count, (dc_texturefrac - dc_iscale) / (-dc_iscale)); + dc_count = min(dc_count, (dc_texturefrac - dc_iscale) / (-dc_iscale)); (thread->Drawers(dc_viewport)->*colfunc)(*this); } From 1d0aed219e52c8e6a993ec265965737e3fee1ab7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:16:52 +0200 Subject: [PATCH 11/22] - replaced MIN/MAX in all non-common code. --- src/console/c_cmds.cpp | 4 +-- src/d_net.cpp | 16 +++++------ src/events.cpp | 4 +-- src/g_game.cpp | 6 ++-- src/g_statusbar/sbarinfo.cpp | 13 +++++---- src/g_statusbar/sbarinfo_commands.cpp | 6 ++-- src/gamedata/info.cpp | 2 +- src/intermission/intermission.cpp | 4 +-- src/maploader/glnodes.cpp | 2 +- src/maploader/maploader.cpp | 8 +++--- src/menu/doommenu.cpp | 4 +-- src/p_states.cpp | 2 +- src/playsim/dthinker.cpp | 2 +- src/playsim/mapthinkers/a_lightning.cpp | 4 +-- src/playsim/mapthinkers/a_quake.cpp | 18 ++++++------ src/playsim/p_3dfloors.cpp | 2 +- src/playsim/p_3dmidtex.cpp | 4 +-- src/playsim/p_acs.cpp | 6 ++-- src/playsim/p_actionfunctions.cpp | 10 +++---- src/playsim/p_enemy.cpp | 4 +-- src/playsim/p_interaction.cpp | 8 +++--- src/playsim/p_map.cpp | 12 ++++---- src/playsim/p_maputl.cpp | 8 +++--- src/playsim/p_mobj.cpp | 10 +++---- src/playsim/p_secnodes.cpp | 2 +- src/playsim/p_sight.cpp | 4 +-- src/playsim/p_teleport.cpp | 2 +- src/playsim/p_user.cpp | 6 ++-- src/r_data/r_sections.h | 4 +-- src/r_data/r_translate.cpp | 14 +++++----- src/rendering/2d/f_wipe.cpp | 8 +++--- src/rendering/2d/v_blend.cpp | 6 ++-- src/rendering/hwrenderer/doom_aabbtree.cpp | 20 ++++++------- src/rendering/hwrenderer/scene/hw_walls.cpp | 28 +++++++++---------- src/rendering/swrenderer/line/r_wallsetup.cpp | 2 +- .../swrenderer/viewport/r_spritedrawer.cpp | 8 +++--- src/scripting/vmthunks.cpp | 6 ++-- src/serializer_doom.cpp | 2 +- src/sound/s_advsound.cpp | 2 +- src/sound/s_doomsound.cpp | 4 +-- src/utility/nodebuilder/nodebuild.cpp | 10 +++---- src/utility/nodebuilder/nodebuild_utility.cpp | 4 +-- src/wi_stuff.cpp | 2 +- 43 files changed, 147 insertions(+), 146 deletions(-) diff --git a/src/console/c_cmds.cpp b/src/console/c_cmds.cpp index 5134344784..15e932d205 100644 --- a/src/console/c_cmds.cpp +++ b/src/console/c_cmds.cpp @@ -469,7 +469,7 @@ CCMD (puke) return; } int arg[4] = { 0, 0, 0, 0 }; - int argn = MIN(argc - 2, countof(arg)), i; + int argn = min(argc - 2, countof(arg)), i; for (i = 0; i < argn; ++i) { @@ -516,7 +516,7 @@ CCMD (pukename) always = true; argstart = 3; } - argn = MIN(argc - argstart, countof(arg)); + argn = min(argc - argstart, countof(arg)); for (i = 0; i < argn; ++i) { arg[i] = atoi(argv[argstart + i]); diff --git a/src/d_net.cpp b/src/d_net.cpp index 28e28637aa..b6d8da2f5b 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -222,7 +222,7 @@ static struct TicSpecial { int i; - specialsize = MAX(specialsize * 2, needed + 30); + specialsize = max(specialsize * 2, needed + 30); DPrintf (DMSG_NOTIFY, "Expanding special size to %zu\n", specialsize); @@ -1151,7 +1151,7 @@ void NetUpdate (void) netbuffer[k++] = lowtic; } - numtics = MAX(0, lowtic - realstart); + numtics = max(0, lowtic - realstart); if (numtics > BACKUPTICS) I_Error ("NetUpdate: Node %d missed too many tics", i); @@ -1160,7 +1160,7 @@ void NetUpdate (void) case 0: default: resendto[i] = lowtic; break; - case 1: resendto[i] = MAX(0, lowtic - 1); break; + case 1: resendto[i] = max(0, lowtic - 1); break; case 2: resendto[i] = nettics[i]; break; } @@ -1836,7 +1836,7 @@ static void TicStabilityEnd() { using namespace std::chrono; uint64_t stabilityendtime = duration_cast(steady_clock::now().time_since_epoch()).count(); - stabilityticduration = std::min(stabilityendtime - stabilitystarttime, (uint64_t)1'000'000); + stabilityticduration = min(stabilityendtime - stabilitystarttime, (uint64_t)1'000'000); } // @@ -2750,7 +2750,7 @@ static void RunScript(uint8_t **stream, AActor *pawn, int snum, int argn, int al arg[i] = argval; } } - P_StartScript(pawn->Level, pawn, NULL, snum, primaryLevel->MapName, arg, MIN(countof(arg), argn), ACS_NET | always); + P_StartScript(pawn->Level, pawn, NULL, snum, primaryLevel->MapName, arg, min(countof(arg), argn), ACS_NET | always); } void Net_SkipCommand (int type, uint8_t **stream) @@ -2913,15 +2913,15 @@ int Net_GetLatency(int *ld, int *ad) localdelay = ((localdelay / BACKUPTICS) * ticdup) * (1000 / TICRATE); int severity = 0; - if (MAX(localdelay, arbitratordelay) > 200) + if (max(localdelay, arbitratordelay) > 200) { severity = 1; } - if (MAX(localdelay, arbitratordelay) > 400) + if (max(localdelay, arbitratordelay) > 400) { severity = 2; } - if (MAX(localdelay, arbitratordelay) >= ((BACKUPTICS / 2 - 1) * ticdup) * (1000 / TICRATE)) + if (max(localdelay, arbitratordelay) >= ((BACKUPTICS / 2 - 1) * ticdup) * (1000 / TICRATE)) { severity = 3; } diff --git a/src/events.cpp b/src/events.cpp index a9362e03b3..6da8118bb4 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -1249,7 +1249,7 @@ CCMD(event) else { int arg[3] = { 0, 0, 0 }; - int argn = MIN(argc - 2, countof(arg)); + int argn = min(argc - 2, countof(arg)); for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call locally @@ -1274,7 +1274,7 @@ CCMD(netevent) else { int arg[3] = { 0, 0, 0 }; - int argn = MIN(argc - 2, countof(arg)); + int argn = min(argc - 2, countof(arg)); for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call networked diff --git a/src/g_game.cpp b/src/g_game.cpp index f394d1a855..fe49f74a8c 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -837,7 +837,7 @@ void G_AddViewPitch (int look, bool mouse) } else { - LocalViewPitch = MIN(LocalViewPitch + look, 0x78000000); + LocalViewPitch = min(LocalViewPitch + look, 0x78000000); } } else if (look < 0) @@ -849,7 +849,7 @@ void G_AddViewPitch (int look, bool mouse) } else { - LocalViewPitch = MAX(LocalViewPitch + look, -0x78000000); + LocalViewPitch = max(LocalViewPitch + look, -0x78000000); } } if (look != 0) @@ -1319,7 +1319,7 @@ void G_Ticker () // Do some more aggressive GC maintenance when the game ticker is inactive. if ((gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL) || paused || P_CheckTickerPaused()) { - size_t ac = std::max(10, GC::AllocCount); + size_t ac = max(10, GC::AllocCount); for (size_t i = 0; i < ac; i++) { if (!GC::CheckGC()) break; diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 7efaff6412..d32b94bc22 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -34,6 +34,7 @@ */ #include "doomtype.h" +#include "basics.h" #include "doomstat.h" #include "v_font.h" #include "v_video.h" @@ -1235,7 +1236,7 @@ public: wrapper->StatusbarToRealCoords(dx, dy, w, h); if(clearDontDraw) - ClearRect(twod, static_cast(MAX(dx, dcx)), static_cast(MAX(dy, dcy)), static_cast(MIN(dcr,w+MAX(dx, dcx))), static_cast(MIN(dcb,MAX(dy, dcy)+h)), GPalette.BlackIndex, 0); + ClearRect(twod, static_cast(max(dx, dcx)), static_cast(max(dy, dcy)), static_cast(min(dcr,w+max(dx, dcx))), static_cast(min(dcb,max(dy, dcy)+h)), GPalette.BlackIndex, 0); else { if(alphaMap) @@ -1245,8 +1246,8 @@ public: DTA_DestHeightF, h, DTA_ClipLeft, static_cast(dcx), DTA_ClipTop, static_cast(dcy), - DTA_ClipRight, static_cast(MIN(INT_MAX, dcr)), - DTA_ClipBottom, static_cast(MIN(INT_MAX, dcb)), + DTA_ClipRight, static_cast(min(INT_MAX, dcr)), + DTA_ClipBottom, static_cast(min(INT_MAX, dcb)), DTA_TranslationIndex, translate ? GetTranslation() : 0, DTA_ColorOverlay, dim ? DIM_OVERLAY : 0, DTA_CenterBottomOffset, (offsetflags & SBarInfoCommand::CENTER_BOTTOM) == SBarInfoCommand::CENTER_BOTTOM, @@ -1262,8 +1263,8 @@ public: DTA_DestHeightF, h, DTA_ClipLeft, static_cast(dcx), DTA_ClipTop, static_cast(dcy), - DTA_ClipRight, static_cast(MIN(INT_MAX, dcr)), - DTA_ClipBottom, static_cast(MIN(INT_MAX, dcb)), + DTA_ClipRight, static_cast(min(INT_MAX, dcr)), + DTA_ClipBottom, static_cast(min(INT_MAX, dcb)), DTA_TranslationIndex, translate ? GetTranslation() : 0, DTA_ColorOverlay, dim ? DIM_OVERLAY : 0, DTA_CenterBottomOffset, (offsetflags & SBarInfoCommand::CENTER_BOTTOM) == SBarInfoCommand::CENTER_BOTTOM, @@ -1309,7 +1310,7 @@ public: } if(clearDontDraw) - ClearRect(twod, static_cast(rcx), static_cast(rcy), static_cast(MIN(rcr, rcx+w)), static_cast(MIN(rcb, rcy+h)), GPalette.BlackIndex, 0); + ClearRect(twod, static_cast(rcx), static_cast(rcy), static_cast(min(rcr, rcx+w)), static_cast(min(rcb, rcy+h)), GPalette.BlackIndex, 0); else { if(alphaMap) diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index 55cbefdbe4..a6e084ea3f 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -284,7 +284,7 @@ class CommandDrawImage : public SBarInfoCommandFlowControl if (Slots[armorType] > 0 && SlotsIncrement[armorType] > 0) { //combine the alpha values - alpha *= MIN(1., Slots[armorType] / SlotsIncrement[armorType]); + alpha *= min(1., Slots[armorType] / SlotsIncrement[armorType]); texture = statusBar->Images[image]; } else @@ -2796,7 +2796,7 @@ class CommandDrawBar : public SBarInfoCommand if(max != 0 && value > 0) { - value = MIN(value / max, 1.); + value = min(value / max, 1.); } else value = 0; @@ -2805,7 +2805,7 @@ class CommandDrawBar : public SBarInfoCommand // [BL] Since we used a percentage (in order to get the most fluid animation) // we need to establish a cut off point so the last pixel won't hang as the animation slows if(pixel == -1 && statusBar->Images[foreground]) - pixel = MAX(1 / 65536., 1./statusBar->Images[foreground]->GetDisplayWidth()); + pixel = std::max(1 / 65536., 1./statusBar->Images[foreground]->GetDisplayWidth()); if(fabs(drawValue - value) < pixel) drawValue = value; diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index 455a4cb22b..c72d789ab3 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -730,7 +730,7 @@ void PClassActor::SetPainChance(FName type, int chance) if (chance >= 0) { - ActorInfo()->PainChances.Push({ type, MIN(chance, 256) }); + ActorInfo()->PainChances.Push({ type, min(chance, 256) }); } } diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index bca2de20f7..2a63588e52 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -386,7 +386,7 @@ void DIntermissionScreenText::Drawer () // line feed characters. int numrows; auto font = generic_ui ? NewSmallFont : SmallFont; - auto fontscale = MAX(generic_ui ? MIN(twod->GetWidth() / 640, twod->GetHeight() / 400) : MIN(twod->GetWidth() / 400, twod->GetHeight() / 250), 1); + auto fontscale = max(generic_ui ? min(twod->GetWidth() / 640, twod->GetHeight() / 400) : min(twod->GetWidth() / 400, twod->GetHeight() / 250), 1); int cleanwidth = twod->GetWidth() / fontscale; int cleanheight = twod->GetHeight() / fontscale; int refwidth = generic_ui ? 640 : 320; @@ -403,7 +403,7 @@ void DIntermissionScreenText::Drawer () int cx = (mTextX - refwidth/2) * fontscale + twod->GetWidth() / 2; int cy = (mTextY - refheight/2) * fontscale + twod->GetHeight() / 2; - cx = MAX(0, cx); + cx = max(0, cx); int startx = cx; if (usesDefault) diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index 843afeaa53..2ab09e9294 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -708,7 +708,7 @@ static bool MatchHeader(const char * label, const char * hdata) if (memcmp(hdata, "LEVEL=", 6) == 0) { size_t labellen = strlen(label); - labellen = MIN(size_t(8), labellen); + labellen = min(size_t(8), labellen); if (strnicmp(hdata+6, label, labellen)==0 && (hdata[6+labellen]==0xa || hdata[6+labellen]==0xd)) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 7faaa01d1d..14174a8cd2 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -870,7 +870,7 @@ bool MapLoader::LoadSegs (MapData * map) if (vnum1 >= numvertexes || vnum2 >= numvertexes) { - throw badseg(0, i, MAX(vnum1, vnum2)); + throw badseg(0, i, max(vnum1, vnum2)); } li->v1 = &Level->vertexes[vnum1]; @@ -1890,7 +1890,7 @@ void MapLoader::LoadLineDefs2 (MapData * map) Level->sides.Alloc(count); memset(&Level->sides[0], 0, count * sizeof(side_t)); - sidetemp.Resize(MAX(count, Level->vertexes.Size())); + sidetemp.Resize(max(count, Level->vertexes.Size())); for (i = 0; i < count; i++) { sidetemp[i].a.special = sidetemp[i].a.tag = 0; @@ -1918,7 +1918,7 @@ void MapLoader::LoopSidedefs (bool firstloop) int i; int numsides = Level->sides.Size(); - sidetemp.Resize(MAX(Level->vertexes.Size(), numsides)); + sidetemp.Resize(max(Level->vertexes.Size(), numsides)); for (i = 0; i < (int)Level->vertexes.Size(); ++i) { @@ -2816,7 +2816,7 @@ void MapLoader::LoadReject (MapData * map, bool junk) else { // Check if the reject has some actual content. If not, free it. - rejectsize = MIN (rejectsize, neededsize); + rejectsize = min (rejectsize, neededsize); Level->rejectmatrix.Alloc(rejectsize); map->Read (ML_REJECT, &Level->rejectmatrix[0], rejectsize); diff --git a/src/menu/doommenu.cpp b/src/menu/doommenu.cpp index 0851323d41..e6a62f3c5a 100644 --- a/src/menu/doommenu.cpp +++ b/src/menu/doommenu.cpp @@ -620,7 +620,7 @@ void M_StartupEpisodeMenu(FNewGameStartup *gs) if (*c == '$') c = GStrings(c + 1); int textwidth = ld->mFont->StringWidth(c); int textright = posx + textwidth; - if (posx + textright > 320) posx = std::max(0, 320 - textright); + if (posx + textright > 320) posx = max(0, 320 - textright); } for(unsigned i = 0; i < AllEpisodes.Size(); i++) @@ -1164,7 +1164,7 @@ void M_StartupSkillMenu(FNewGameStartup *gs) if (*c == '$') c = GStrings(c + 1); int textwidth = ld->mFont->StringWidth(c); int textright = posx + textwidth; - if (posx + textright > 320) posx = std::max(0, 320 - textright); + if (posx + textright > 320) posx = max(0, 320 - textright); } unsigned firstitem = ld->mItems.Size(); diff --git a/src/p_states.cpp b/src/p_states.cpp index 2e52243b19..778b13a190 100644 --- a/src/p_states.cpp +++ b/src/p_states.cpp @@ -79,7 +79,7 @@ DEFINE_ACTION_FUNCTION(FState, GetSpriteTexture) if (numret > 0) ret[0].SetInt(sprframe->Texture[rotation].GetIndex()); if (numret > 1) ret[1].SetInt(!!(sprframe->Flip & (1 << rotation))); if (numret > 2) ret[2].SetVector2(DVector2(scalex, scaley)); - return MIN(3, numret); + return min(3, numret); } diff --git a/src/playsim/dthinker.cpp b/src/playsim/dthinker.cpp index cabdf86685..d71e138804 100644 --- a/src/playsim/dthinker.cpp +++ b/src/playsim/dthinker.cpp @@ -247,7 +247,7 @@ void FThinkerCollection::RunThinkers(FLevelLocals *Level) Printf(TEXTCOLOR_YELLOW "Total, ms Averg, ms Calls Actor class\n"); Printf(TEXTCOLOR_YELLOW "---------- ---------- ------ --------------------\n"); - const unsigned count = MIN(profilelimit > 0 ? profilelimit : UINT_MAX, sorted.Size()); + const unsigned count = min(profilelimit > 0 ? profilelimit : UINT_MAX, sorted.Size()); for (unsigned i = 0; i < count; ++i) { diff --git a/src/playsim/mapthinkers/a_lightning.cpp b/src/playsim/mapthinkers/a_lightning.cpp index 9f2504f095..8fd3f3f163 100644 --- a/src/playsim/mapthinkers/a_lightning.cpp +++ b/src/playsim/mapthinkers/a_lightning.cpp @@ -157,11 +157,11 @@ void DLightningThinker::LightningFlash () LightningLightLevels[j] = tempSec->lightlevel; if (special == Light_IndoorLightning1) { - tempSec->SetLightLevel(MIN (tempSec->lightlevel+64, flashLight)); + tempSec->SetLightLevel(min (tempSec->lightlevel+64, flashLight)); } else if (special == Light_IndoorLightning2) { - tempSec->SetLightLevel(MIN (tempSec->lightlevel+32, flashLight)); + tempSec->SetLightLevel(min (tempSec->lightlevel+32, flashLight)); } else { diff --git a/src/playsim/mapthinkers/a_quake.cpp b/src/playsim/mapthinkers/a_quake.cpp index b906665e83..b612c8de9e 100644 --- a/src/playsim/mapthinkers/a_quake.cpp +++ b/src/playsim/mapthinkers/a_quake.cpp @@ -210,8 +210,8 @@ double DEarthquake::GetModIntensity(double intensity, bool fake) const { // Defaults to middle of the road. divider = m_CountdownStart; - scalar = (m_Flags & QF_MAX) ? MAX(m_Countdown, m_CountdownStart - m_Countdown) - : MIN(m_Countdown, m_CountdownStart - m_Countdown); + scalar = (m_Flags & QF_MAX) ? max(m_Countdown, m_CountdownStart - m_Countdown) + : min(m_Countdown, m_CountdownStart - m_Countdown); } scalar = (scalar > divider) ? divider : scalar; @@ -311,20 +311,20 @@ int DEarthquake::StaticGetQuakeIntensities(double ticFrac, AActor *victim, FQuak if (!(quake->m_Flags & QF_WAVE)) { - jiggers.RollIntensity = MAX(r, jiggers.RollIntensity) * falloff; + jiggers.RollIntensity = max(r, jiggers.RollIntensity) * falloff; intensity *= falloff; if (quake->m_Flags & QF_RELATIVE) { - jiggers.RelIntensity.X = MAX(intensity.X, jiggers.RelIntensity.X); - jiggers.RelIntensity.Y = MAX(intensity.Y, jiggers.RelIntensity.Y); - jiggers.RelIntensity.Z = MAX(intensity.Z, jiggers.RelIntensity.Z); + jiggers.RelIntensity.X = max(intensity.X, jiggers.RelIntensity.X); + jiggers.RelIntensity.Y = max(intensity.Y, jiggers.RelIntensity.Y); + jiggers.RelIntensity.Z = max(intensity.Z, jiggers.RelIntensity.Z); } else { - jiggers.Intensity.X = MAX(intensity.X, jiggers.Intensity.X); - jiggers.Intensity.Y = MAX(intensity.Y, jiggers.Intensity.Y); - jiggers.Intensity.Z = MAX(intensity.Z, jiggers.Intensity.Z); + jiggers.Intensity.X = max(intensity.X, jiggers.Intensity.X); + jiggers.Intensity.Y = max(intensity.Y, jiggers.Intensity.Y); + jiggers.Intensity.Z = max(intensity.Z, jiggers.Intensity.Z); } } else diff --git a/src/playsim/p_3dfloors.cpp b/src/playsim/p_3dfloors.cpp index ece17634ba..fa4d9b8278 100644 --- a/src/playsim/p_3dfloors.cpp +++ b/src/playsim/p_3dfloors.cpp @@ -780,7 +780,7 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li double low1 = (open.lowfloorthroughportal & 1) ? open.lowfloor : lowestfloor[0]; double low2 = (open.lowfloorthroughportal & 2) ? open.lowfloor : lowestfloor[1]; - open.lowfloor = MIN(low1, low2); + open.lowfloor = min(low1, low2); } } } diff --git a/src/playsim/p_3dmidtex.cpp b/src/playsim/p_3dmidtex.cpp index 5d764d4e0c..8589983769 100644 --- a/src/playsim/p_3dmidtex.cpp +++ b/src/playsim/p_3dmidtex.cpp @@ -244,14 +244,14 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, double *ptextop, do if(line->flags & ML_DONTPEGBOTTOM) { *ptexbot = y_offset + - MAX(line->frontsector->GetPlaneTexZ(sector_t::floor), line->backsector->GetPlaneTexZ(sector_t::floor)); + max(line->frontsector->GetPlaneTexZ(sector_t::floor), line->backsector->GetPlaneTexZ(sector_t::floor)); *ptextop = *ptexbot + textureheight; } else { *ptextop = y_offset + - MIN(line->frontsector->GetPlaneTexZ(sector_t::ceiling), line->backsector->GetPlaneTexZ(sector_t::ceiling)); + min(line->frontsector->GetPlaneTexZ(sector_t::ceiling), line->backsector->GetPlaneTexZ(sector_t::ceiling)); *ptexbot = *ptextop - textureheight; } diff --git a/src/playsim/p_acs.cpp b/src/playsim/p_acs.cpp index 674aad0f44..545bdd9c8d 100644 --- a/src/playsim/p_acs.cpp +++ b/src/playsim/p_acs.cpp @@ -2454,7 +2454,7 @@ bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len, // Use unsigned iterator here to avoid issue with GCC 4.9/5.x // optimizer. Might be some undefined behavior in this code, // but I don't know what it is. - unsigned int initsize = MIN (ArrayStore[arraynum].ArraySize, (LittleLong(chunk[1])-4)/4); + unsigned int initsize = min (ArrayStore[arraynum].ArraySize, (LittleLong(chunk[1])-4)/4); int32_t *elems = ArrayStore[arraynum].Elements; for (unsigned int j = 0; j < initsize; ++j) { @@ -2532,7 +2532,7 @@ bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len, { int32_t *elems = ArrayStore[arraynum].Elements; // Ending zeros may be left out. - for (int j = MIN(LittleLong(chunk[1])-5, ArrayStore[arraynum].ArraySize); j > 0; --j, ++elems, ++chunkData) + for (int j = min(LittleLong(chunk[1])-5, ArrayStore[arraynum].ArraySize); j > 0; --j, ++elems, ++chunkData) { // For ATAG, a value of 0 = Integer, 1 = String, 2 = FunctionPtr // Our implementation uses the same tags for both String and FunctionPtr @@ -10309,7 +10309,7 @@ DLevelScript::DLevelScript (FLevelLocals *l, AActor *who, line_t *where, int num assert(code->VarCount >= code->ArgCount); Localvars.Resize(code->VarCount); memset(&Localvars[0], 0, code->VarCount * sizeof(int32_t)); - for (int i = 0; i < MIN(argcount, code->ArgCount); ++i) + for (int i = 0; i < min(argcount, code->ArgCount); ++i) { Localvars[i] = args[i]; } diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index af1c07e01b..244dbca5eb 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -1921,9 +1921,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_Burst) // base the number of shards on the size of the dead thing, so bigger // things break up into more shards than smaller things. // An self with radius 20 and height 64 creates ~40 chunks. - numChunks = MAX (4, int(self->radius * self->Height)/32); + numChunks = max (4, int(self->radius * self->Height)/32); i = (pr_burst.Random2()) % (numChunks/4); - for (i = MAX (24, numChunks + i); i >= 0; i--) + for (i = max (24, numChunks + i); i >= 0; i--) { double xo = (pr_burst() - 128) * self->radius / 128; double yo = (pr_burst() - 128) * self->radius / 128; @@ -2492,7 +2492,7 @@ DEFINE_ACTION_FUNCTION(AActor, CheckIfTargetInLOS) else { target = viewport; viewport = self; } } - fov = MIN(fov, 360.); + fov = min(fov, 360.); if (fov > 0) { @@ -4785,11 +4785,11 @@ DEFINE_ACTION_FUNCTION(AActor, A_FaceMovementDirection) { if (pdelta > 0) { - current -= MIN(pitchlimit, pdelta); + current -= min(pitchlimit, pdelta); } else //if (pdelta < 0) { - current += MIN(pitchlimit, -pdelta); + current += min(pitchlimit, -pdelta); } mobj->SetPitch(current, !!(flags & FMDF_INTERPOLATE)); } diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index b877bcd12d..a3144b14a8 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -2987,12 +2987,12 @@ void A_Face(AActor *self, AActor *other, DAngle max_turn, DAngle max_pitch, DAng { if (self->Angles.Pitch > other_pitch) { - max_pitch = MIN(max_pitch, (self->Angles.Pitch - other_pitch).Normalized360()); + max_pitch = min(max_pitch, (self->Angles.Pitch - other_pitch).Normalized360()); self->Angles.Pitch -= max_pitch; } else { - max_pitch = MIN(max_pitch, (other_pitch - self->Angles.Pitch).Normalized360()); + max_pitch = min(max_pitch, (other_pitch - self->Angles.Pitch).Normalized360()); self->Angles.Pitch += max_pitch; } } diff --git a/src/playsim/p_interaction.cpp b/src/playsim/p_interaction.cpp index a054b763c8..b58ba727df 100644 --- a/src/playsim/p_interaction.cpp +++ b/src/playsim/p_interaction.cpp @@ -90,7 +90,7 @@ void P_TouchSpecialThing (AActor *special, AActor *toucher) // The pickup is at or above the toucher's feet OR // The pickup is below the toucher. - if (delta > toucher->Height || delta < MIN(-32., -special->Height)) + if (delta > toucher->Height || delta < min(-32., -special->Height)) { // out of reach return; } @@ -1467,7 +1467,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da } } - const int realdamage = MAX(0, damage); + const int realdamage = max(0, damage); target->Level->localEventManager->WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); needevent = false; @@ -1475,7 +1475,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da return realdamage; } } - return MAX(0, damage); + return max(0, damage); } static int DoDamageMobj(AActor *target, AActor *inflictor, AActor *source, int damage, FName mod, int flags, DAngle angle) @@ -1492,7 +1492,7 @@ static int DoDamageMobj(AActor *target, AActor *inflictor, AActor *source, int d target->Level->localEventManager->WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); } - return MAX(0, realdamage); + return max(0, realdamage); } DEFINE_ACTION_FUNCTION(AActor, DamageMobj) diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index a6784e00ea..283fac9cfc 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -2357,7 +2357,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, // This is so that it does not walk off of things onto a drop off. if (thing->flags2 & MF2_ONMOBJ) { - floorz = MAX(thing->Z(), tm.floorz); + floorz = max(thing->Z(), tm.floorz); } if (floorz - tm.dropoffz > thing->MaxDropOffHeight && @@ -4035,8 +4035,8 @@ struct aim_t floorportalstate = false; } } - if (ceilingportalstate) EnterSectorPortal(sector_t::ceiling, 0, lastsector, toppitch, MIN(0., bottompitch)); - if (floorportalstate) EnterSectorPortal(sector_t::floor, 0, lastsector, MAX(0., toppitch), bottompitch); + if (ceilingportalstate) EnterSectorPortal(sector_t::ceiling, 0, lastsector, toppitch, min(0., bottompitch)); + if (floorportalstate) EnterSectorPortal(sector_t::floor, 0, lastsector, max(0., toppitch), bottompitch); FPathTraverse it(lastsector->Level, startpos.X, startpos.Y, aimtrace.X, aimtrace.Y, PT_ADDLINES | PT_ADDTHINGS | PT_COMPATIBLE | PT_DELTA, startfrac); intercept_t *in; @@ -4114,11 +4114,11 @@ struct aim_t // check portal in backsector when aiming up/downward is possible, the line doesn't have portals on both sides and there's actually a portal in the backsector if ((planestocheck & aim_up) && toppitch < 0 && open.top != LINEOPEN_MAX && !entersec->PortalBlocksMovement(sector_t::ceiling)) { - EnterSectorPortal(sector_t::ceiling, in->frac, entersec, toppitch, MIN(0., bottompitch)); + EnterSectorPortal(sector_t::ceiling, in->frac, entersec, toppitch, min(0., bottompitch)); } if ((planestocheck & aim_down) && bottompitch > 0 && open.bottom != LINEOPEN_MIN && !entersec->PortalBlocksMovement(sector_t::floor)) { - EnterSectorPortal(sector_t::floor, in->frac, entersec, MAX(0., toppitch), bottompitch); + EnterSectorPortal(sector_t::floor, in->frac, entersec, max(0., toppitch), bottompitch); } continue; // shot continues } @@ -6663,7 +6663,7 @@ void PIT_CeilingRaise(AActor *thing, FChangePosition *cpos) AActor *onmobj; if (!P_TestMobjZ(thing, true, &onmobj) && onmobj->Z() <= thing->Z()) { - thing->SetZ(MIN(thing->ceilingz - thing->Height, onmobj->Top())); + thing->SetZ(min(thing->ceilingz - thing->Height, onmobj->Top())); thing->UpdateRenderSectorList(); } } diff --git a/src/playsim/p_maputl.cpp b/src/playsim/p_maputl.cpp index 4f3af3c85b..f99f2a6bbb 100644 --- a/src/playsim/p_maputl.cpp +++ b/src/playsim/p_maputl.cpp @@ -527,10 +527,10 @@ void AActor::LinkToWorld(FLinkContext *ctx, bool spawningmapthing, sector_t *sec } else { // [RH] Link into every block this actor touches, not just the center one - x1 = MAX(0, x1); - y1 = MAX(0, y1); - x2 = MIN(Level->blockmap.bmapwidth - 1, x2); - y2 = MIN(Level->blockmap.bmapheight - 1, y2); + x1 = max(0, x1); + y1 = max(0, y1); + x2 = min(Level->blockmap.bmapwidth - 1, x2); + y2 = min(Level->blockmap.bmapheight - 1, y2); for (int y = y1; y <= y2; ++y) { for (int x = x1; x <= x2; ++x) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index a9674122b5..7eafb45261 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -1774,7 +1774,7 @@ bool P_SeekerMissile (AActor *actor, double thresh, double turnMax, bool precise DAngle pitch = 0.; if (!(actor->flags3 & (MF3_FLOORHUGGER|MF3_CEILINGHUGGER))) { // Need to seek vertically - double dist = MAX(1., actor->Distance2D(target)); + double dist = max(1., actor->Distance2D(target)); // Aim at a player's eyes and at the middle of the actor for everything else. double aimheight = target->Height/2; if (target->player) @@ -1849,7 +1849,7 @@ double P_XYMovement (AActor *mo, DVector2 scroll) // preserve the direction instead of clamping x and y independently. double cx = mo->Vel.X == 0 ? 1. : clamp(mo->Vel.X, -maxmove, maxmove) / mo->Vel.X; double cy = mo->Vel.Y == 0 ? 1. : clamp(mo->Vel.Y, -maxmove, maxmove) / mo->Vel.Y; - double fac = MIN(cx, cy); + double fac = min(cx, cy); mo->Vel.X *= fac; mo->Vel.Y *= fac; @@ -2439,7 +2439,7 @@ void P_ZMovement (AActor *mo, double oldfloorz) } if (mo->Vel.Z < sinkspeed) { // Dropping too fast, so slow down toward sinkspeed. - mo->Vel.Z -= MAX(sinkspeed*2, -8.); + mo->Vel.Z -= max(sinkspeed*2, -8.); if (mo->Vel.Z > sinkspeed) { mo->Vel.Z = sinkspeed; @@ -2447,7 +2447,7 @@ void P_ZMovement (AActor *mo, double oldfloorz) } else if (mo->Vel.Z > sinkspeed) { // Dropping too slow/going up, so trend toward sinkspeed. - mo->Vel.Z = startvelz + MAX(sinkspeed/3, -8.); + mo->Vel.Z = startvelz + max(sinkspeed/3, -8.); if (mo->Vel.Z < sinkspeed) { mo->Vel.Z = sinkspeed; @@ -6693,7 +6693,7 @@ AActor *P_OldSpawnMissile(AActor *source, AActor *owner, AActor *dest, PClassAct th->VelFromAngle(); - double dist = source->DistanceBySpeed(dest, MAX(1., th->Speed)); + double dist = source->DistanceBySpeed(dest, max(1., th->Speed)); th->Vel.Z = (dest->Z() - source->Z()) / dist; if (th->flags4 & MF4_SPECTRAL) diff --git a/src/playsim/p_secnodes.cpp b/src/playsim/p_secnodes.cpp index 3e479e77ce..f43b0e30e3 100644 --- a/src/playsim/p_secnodes.cpp +++ b/src/playsim/p_secnodes.cpp @@ -390,7 +390,7 @@ void AActor::UpdateRenderSectorList() { int bx = Level->blockmap.GetBlockX(X()); int by = Level->blockmap.GetBlockY(Y()); - FBoundingBox bb(X(), Y(), MIN(radius*1.5, 128.)); // Don't go further than 128 map units, even for large actors + FBoundingBox bb(X(), Y(), min(radius*1.5, 128.)); // Don't go further than 128 map units, even for large actors // Are there any portals near the actor's position? if (Level->blockmap.isValidBlock(bx, by) && Level->PortalBlockmap(bx, by).neighborContainsLines) { diff --git a/src/playsim/p_sight.cpp b/src/playsim/p_sight.cpp index 0f1738f38c..f75b1f61da 100644 --- a/src/playsim/p_sight.cpp +++ b/src/playsim/p_sight.cpp @@ -192,8 +192,8 @@ void SightCheck::P_SightOpening(SightOpening &open, const line_t *linedef, doubl if (ff == 0) ff = front->floorplane.ZatPoint(x, y); if (bf == 0) bf = back->floorplane.ZatPoint(x, y); - open.bottom = MAX(ff, bf); - open.top = MIN(fc, bc); + open.bottom = max(ff, bf); + open.top = min(fc, bc); // we only want to know if there is an opening, not how large it is. open.range = open.bottom < open.top; diff --git a/src/playsim/p_teleport.cpp b/src/playsim/p_teleport.cpp index a5cec345a2..4ea15d9ce6 100644 --- a/src/playsim/p_teleport.cpp +++ b/src/playsim/p_teleport.cpp @@ -200,7 +200,7 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) // [RH] Zoom player's field of vision // [BC] && bHaltVelocity. if (telezoom && thing->player->mo == thing && !(flags & TELF_KEEPVELOCITY)) - thing->player->FOV = MIN (175.f, thing->player->DesiredFOV + 45.f); + thing->player->FOV = min (175.f, thing->player->DesiredFOV + 45.f); } } // [BC] && bHaltVelocity. diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 9d976431b7..618d72c6bc 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -453,7 +453,7 @@ void player_t::SetSubtitle(int num, FSoundID soundid) if (text != nullptr) { SubtitleText = lumpname; - int sl = soundid == 0 ? 7000 : std::max(7000, S_GetMSLength(soundid)); + int sl = soundid == 0 ? 7000 : max(7000, S_GetMSLength(soundid)); SubtitleCounter = sl * TICRATE / 1000; } } @@ -623,8 +623,8 @@ EXTERN_CVAR(Bool, cl_oldfreelooklimit); static int GetSoftPitch(bool down) { - int MAX_DN_ANGLE = MIN(56, (int)maxviewpitch); // Max looking down angle - int MAX_UP_ANGLE = MIN(32, (int)maxviewpitch); // Max looking up angle + int MAX_DN_ANGLE = min(56, (int)maxviewpitch); // Max looking down angle + int MAX_UP_ANGLE = min(32, (int)maxviewpitch); // Max looking up angle return (down ? MAX_DN_ANGLE : ((cl_oldfreelooklimit) ? MAX_UP_ANGLE : MAX_DN_ANGLE)); } diff --git a/src/r_data/r_sections.h b/src/r_data/r_sections.h index 221d19e638..fd13a80e7a 100644 --- a/src/r_data/r_sections.h +++ b/src/r_data/r_sections.h @@ -72,8 +72,8 @@ struct BoundingRect double distanceTo(const BoundingRect &other) const { if (intersects(other)) return 0; - return std::max(std::min(fabs(left - other.right), fabs(right - other.left)), - std::min(fabs(top - other.bottom), fabs(bottom - other.top))); + return max(min(fabs(left - other.right), fabs(right - other.left)), + min(fabs(top - other.bottom), fabs(bottom - other.top))); } void addVertex(double x, double y) diff --git a/src/r_data/r_translate.cpp b/src/r_data/r_translate.cpp index cc847a9638..252dc0ee0c 100644 --- a/src/r_data/r_translate.cpp +++ b/src/r_data/r_translate.cpp @@ -144,7 +144,7 @@ int CreateBloodTranslation(PalEntry color) trans.Remap[0] = 0; for (i = 1; i < 256; i++) { - int bright = std::max(std::max(GPalette.BaseColors[i].r, GPalette.BaseColors[i].g), GPalette.BaseColors[i].b); + int bright = max(std::max(GPalette.BaseColors[i].r, GPalette.BaseColors[i].g), GPalette.BaseColors[i].b); PalEntry pe = PalEntry(255, color.r*bright/255, color.g*bright/255, color.b*bright/255); int entry = ColorMatcher.Pick(pe.r, pe.g, pe.b); @@ -484,7 +484,7 @@ static void R_CreatePlayerTranslation (float h, float s, float v, const FPlayerC // Build player sprite translation //h = 45.f; - v = MAX (0.1f, v); + v = max (0.1f, v); for (i = start; i <= end; i++) { @@ -498,7 +498,7 @@ static void R_CreatePlayerTranslation (float h, float s, float v, const FPlayerC float mv[18] = { .16f, .19f, .22f, .25f, .31f, .35f, .38f, .41f, .47f, .54f, .60f, .65f, .71f, .77f, .83f, .89f, .94f, 1.f }; // Build player sprite translation - v = MAX (0.1f, v); + v = max (0.1f, v); for (i = start; i <= end; i++) { @@ -513,12 +513,12 @@ static void R_CreatePlayerTranslation (float h, float s, float v, const FPlayerC if (gameinfo.gametype == GAME_Heretic) { // Build rain/lifegem translation - bases = MIN(bases * 1.3f, 1.f); - basev = MIN(basev * 1.3f, 1.f); + bases = min(bases * 1.3f, 1.f); + basev = min(basev * 1.3f, 1.f); for (i = 145; i <= 168; i++) { - s = MIN(bases, 0.8965f - 0.0962f * (float)(i - 161)); - v = MIN(1.f, (0.2102f + 0.0489f * (float)(i - 144)) * basev); + s = min(bases, 0.8965f - 0.0962f * (float)(i - 161)); + v = min(1.f, (0.2102f + 0.0489f * (float)(i - 144)) * basev); HSVtoRGB(&r, &g, &b, h, s, v); SetRemap(alttable, i, r, g, b); SetPillarRemap(pillartable, i, h, s, v); diff --git a/src/rendering/2d/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp index 320bb869dd..44a2dc1b53 100644 --- a/src/rendering/2d/f_wipe.cpp +++ b/src/rendering/2d/f_wipe.cpp @@ -74,11 +74,11 @@ int wipe_CalcBurn (uint8_t *burnarray, int width, int height, int density) { unsigned int offs = (a+b) & (width - 1); unsigned int v = M_Random(); - v = MIN(from[offs] + 4 + (v & 15) + (v >> 3) + (M_Random() & 31), 255u); + v = min(from[offs] + 4 + (v & 15) + (v >> 3) + (M_Random() & 31), 255u); from[offs] = from[width*2 + ((offs + width*3/2) & (width - 1))] = v; } - density = MIN(density + 10, width * 7); + density = min(density + 10, width * 7); from = burnarray; for (b = 0; b <= height; b += 2) @@ -289,7 +289,7 @@ bool Wiper_Melt::Run(int ticks) else if (y[i] < HEIGHT) { int dy = (y[i] < 16) ? y[i] + 1 : 8; - y[i] = MIN(y[i] + dy, HEIGHT); + y[i] = min(y[i] + dy, HEIGHT); done = false; } if (ticks == 0) @@ -311,7 +311,7 @@ bool Wiper_Melt::Run(int ticks) int w = startScreen->GetTexelWidth(); int h = startScreen->GetTexelHeight(); dpt.x = i * w / WIDTH; - dpt.y = MAX(0, y[i] * h / HEIGHT); + dpt.y = max(0, y[i] * h / HEIGHT); rect.left = dpt.x; rect.top = 0; rect.right = (i + 1) * w / WIDTH; diff --git a/src/rendering/2d/v_blend.cpp b/src/rendering/2d/v_blend.cpp index 88476cfc97..7f37a56854 100644 --- a/src/rendering/2d/v_blend.cpp +++ b/src/rendering/2d/v_blend.cpp @@ -141,7 +141,7 @@ void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int if (painFlash.a != 0) { - cnt = DamageToAlpha[MIN (CPlayer->damagecount * painFlash.a / 255, (uint32_t)113)]; + cnt = DamageToAlpha[min (CPlayer->damagecount * painFlash.a / 255, (uint32_t)113)]; // [BC] Allow users to tone down the intensity of the blood on the screen. cnt = (int)( cnt * blood_fade_scalar ); @@ -164,7 +164,7 @@ void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int if (CPlayer->poisoncount) { - cnt = MIN (CPlayer->poisoncount, 64); + cnt = min (CPlayer->poisoncount, 64); if (paletteflash & PF_POISON) { V_AddBlend(44/255.f, 92/255.f, 36/255.f, ((cnt + 7) >> 3) * 0.1f, blend); @@ -190,7 +190,7 @@ void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int } else { - cnt= MIN(CPlayer->hazardcount/8, 64); + cnt= min(CPlayer->hazardcount/8, 64); float r = ((Level->hazardcolor & 0xff0000) >> 16) / 255.f; float g = ((Level->hazardcolor & 0xff00) >> 8) / 255.f; float b = ((Level->hazardcolor & 0xff)) / 255.f; diff --git a/src/rendering/hwrenderer/doom_aabbtree.cpp b/src/rendering/hwrenderer/doom_aabbtree.cpp index 21256271df..5420e561e0 100644 --- a/src/rendering/hwrenderer/doom_aabbtree.cpp +++ b/src/rendering/hwrenderer/doom_aabbtree.cpp @@ -57,8 +57,8 @@ DoomLevelAABBTree::DoomLevelAABBTree(FLevelLocals *lev) FVector2 aabb_min, aabb_max; const auto &left = nodes[staticroot]; const auto &right = nodes[dynamicroot]; - aabb_min.X = MIN(left.aabb_left, right.aabb_left); - aabb_min.Y = MIN(left.aabb_top, right.aabb_top); + aabb_min.X = min(left.aabb_left, right.aabb_left); + aabb_min.Y = min(left.aabb_top, right.aabb_top); aabb_max.X = MAX(left.aabb_right, right.aabb_right); aabb_max.Y = MAX(left.aabb_bottom, right.aabb_bottom); nodes.Push({ aabb_min, aabb_max, staticroot, dynamicroot }); @@ -137,9 +137,9 @@ bool DoomLevelAABBTree::Update() float y2 = (float)line.v2->fY(); int nodeIndex = path[0]; - nodes[nodeIndex].aabb_left = MIN(x1, x2); + nodes[nodeIndex].aabb_left = min(x1, x2); nodes[nodeIndex].aabb_right = MAX(x1, x2); - nodes[nodeIndex].aabb_top = MIN(y1, y2); + nodes[nodeIndex].aabb_top = min(y1, y2); nodes[nodeIndex].aabb_bottom = MAX(y1, y2); for (unsigned int j = 1; j < path.Size(); j++) @@ -147,8 +147,8 @@ bool DoomLevelAABBTree::Update() auto &cur = nodes[path[j]]; const auto &left = nodes[cur.left_node]; const auto &right = nodes[cur.right_node]; - cur.aabb_left = MIN(left.aabb_left, right.aabb_left); - cur.aabb_top = MIN(left.aabb_top, right.aabb_top); + cur.aabb_left = min(left.aabb_left, right.aabb_left); + cur.aabb_top = min(left.aabb_top, right.aabb_top); cur.aabb_right = MAX(left.aabb_right, right.aabb_right); cur.aabb_bottom = MAX(left.aabb_bottom, right.aabb_bottom); } @@ -181,10 +181,10 @@ int DoomLevelAABBTree::GenerateTreeNode(int *lines, int num_lines, const FVector float x2 = (float)maplines[mapLines[lines[i]]].v2->fX(); float y2 = (float)maplines[mapLines[lines[i]]].v2->fY(); - aabb_min.X = MIN(aabb_min.X, x1); - aabb_min.X = MIN(aabb_min.X, x2); - aabb_min.Y = MIN(aabb_min.Y, y1); - aabb_min.Y = MIN(aabb_min.Y, y2); + aabb_min.X = min(aabb_min.X, x1); + aabb_min.X = min(aabb_min.X, x2); + aabb_min.Y = min(aabb_min.Y, y1); + aabb_min.Y = min(aabb_min.Y, y2); aabb_max.X = MAX(aabb_max.X, x1); aabb_max.X = MAX(aabb_max.X, x2); aabb_max.Y = MAX(aabb_max.Y, y1); diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index f3ea5a2dfa..3ee54345d6 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -705,7 +705,7 @@ bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool trans if ((maplightbottomleftztop[1]) || (maplightbottomleft>ztop[0] && maplightbottomright(fabsf(glseg.x2 - glseg.x1), fabsf(glseg.y2 - glseg.y1)); + float clen = max(fabsf(glseg.x2 - glseg.x1), fabsf(glseg.y2 - glseg.y1)); float dch = ztop[1] - ztop[0]; float dfh = maplightbottomright - maplightbottomleft; @@ -745,7 +745,7 @@ bool HWWall::SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool trans if ((maplightbottomleftzbottom[1]) || (maplightbottomleft>zbottom[0] && maplightbottomright(fabsf(glseg.x2 - glseg.x1), fabsf(glseg.y2 - glseg.y1)); + float clen = max(fabsf(glseg.x2 - glseg.x1), fabsf(glseg.y2 - glseg.y1)); float dch = zbottom[1] - zbottom[0]; float dfh = maplightbottomright - maplightbottomleft; @@ -1283,12 +1283,12 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, rowoffset = tci.RowOffset(seg->sidedef->GetTextureYOffset(side_t::mid)); if ((seg->linedef->flags & ML_DONTPEGBOTTOM) >0) { - texturebottom = MAX(realfront->GetPlaneTexZ(sector_t::floor), realback->GetPlaneTexZ(sector_t::floor) + zalign) + rowoffset; + texturebottom = max(realfront->GetPlaneTexZ(sector_t::floor), realback->GetPlaneTexZ(sector_t::floor) + zalign) + rowoffset; texturetop = texturebottom + tci.mRenderHeight; } else { - texturetop = MIN(realfront->GetPlaneTexZ(sector_t::ceiling), realback->GetPlaneTexZ(sector_t::ceiling) + zalign) + rowoffset; + texturetop = min(realfront->GetPlaneTexZ(sector_t::ceiling), realback->GetPlaneTexZ(sector_t::ceiling) + zalign) + rowoffset; texturebottom = texturetop - tci.mRenderHeight; } } @@ -1319,8 +1319,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, else { // texture is missing - use the higher plane - topleft = MAX(bch1,fch1); - topright = MAX(bch2,fch2); + topleft = max(bch1,fch1); + topright = max(bch2,fch2); } } else if ((bch1>fch1 || bch2>fch2) && @@ -1334,8 +1334,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, else { // But not if there can be visual artifacts. - topleft = MIN(bch1,fch1); - topright = MIN(bch2,fch2); + topleft = min(bch1,fch1); + topright = min(bch2,fch2); } // @@ -1347,8 +1347,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, if (!tex || !tex->isValid()) { // texture is missing - use the lower plane - bottomleft = MIN(bfh1,ffh1); - bottomright = MIN(bfh2,ffh2); + bottomleft = min(bfh1,ffh1); + bottomright = min(bfh2,ffh2); } else if (bfh1=ffh1 && bfh2>=ffh2))) { @@ -1360,8 +1360,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, else { // normal case - use the higher plane - bottomleft = MAX(bfh1,ffh1); - bottomright = MAX(bfh2,ffh2); + bottomleft = max(bfh1,ffh1); + bottomright = max(bfh2,ffh2); } // @@ -1514,8 +1514,8 @@ void HWWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, int i,t=0; float v_factor=(zbottom[0]-ztop[0])/(tcs[LOLFT].v-tcs[UPLFT].v); // only split the vertical area of the polygon that does not contain slopes. - float splittopv = MAX(tcs[UPLFT].v, tcs[UPRGT].v); - float splitbotv = MIN(tcs[LOLFT].v, tcs[LORGT].v); + float splittopv = max(tcs[UPLFT].v, tcs[UPRGT].v); + float splitbotv = min(tcs[LOLFT].v, tcs[LORGT].v); // this is split vertically into sections. for(i=0;i= 1) ret[0].SetInt(retv); if (numret >= 2) ret[1].SetInt(slot); if (numret >= 3) ret[2].SetInt(index); - return MIN(numret, 3); + return min(numret, 3); } static PClassActor *GetWeapon(FWeaponSlots *self, int slot, int index) @@ -2123,7 +2123,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetInventoryIcon, GetInventoryIcon FTextureID icon = FSetTextureID(GetInventoryIcon(item, flags, &applyscale)); if (numret >= 1) ret[0].SetInt(icon.GetIndex()); if (numret >= 2) ret[1].SetInt(applyscale); - return MIN(numret, 2); + return min(numret, 2); } //===================================================================================== @@ -2489,7 +2489,7 @@ DEFINE_ACTION_FUNCTION(_Screen, GetViewWindow) if (numret > 1) ret[1].SetInt(viewwindowy); if (numret > 2) ret[2].SetInt(viewwidth); if (numret > 3) ret[3].SetInt(viewheight); - return MIN(numret, 4); + return min(numret, 4); } DEFINE_ACTION_FUNCTION(_Console, MidPrint) diff --git a/src/serializer_doom.cpp b/src/serializer_doom.cpp index 4a011c28d7..953bb9afcc 100644 --- a/src/serializer_doom.cpp +++ b/src/serializer_doom.cpp @@ -117,7 +117,7 @@ FSerializer &SerializeArgs(FSerializer& arc, const char *key, int *args, int *de { if (val->IsArray()) { - unsigned int cnt = MIN(val->Size(), 5); + unsigned int cnt = min(val->Size(), 5); for (unsigned int i = 0; i < cnt; i++) { const rapidjson::Value &aval = (*val)[i]; diff --git a/src/sound/s_advsound.cpp b/src/sound/s_advsound.cpp index a982d9b67b..eb441d60d8 100644 --- a/src/sound/s_advsound.cpp +++ b/src/sound/s_advsound.cpp @@ -1008,7 +1008,7 @@ static void S_AddSNDINFO (int lump) sc.MustGetString (); sfx = soundEngine->FindSoundTentative (sc.String); sc.MustGetNumber (); - S_sfx[sfx].NearLimit = MIN(MAX(sc.Number, 0), 255); + S_sfx[sfx].NearLimit = min(max(sc.Number, 0), 255); if (sc.CheckFloat()) { S_sfx[sfx].LimitRange = float(sc.Float * sc.Float); diff --git a/src/sound/s_doomsound.cpp b/src/sound/s_doomsound.cpp index c8cbd4bb8b..6b95490679 100644 --- a/src/sound/s_doomsound.cpp +++ b/src/sound/s_doomsound.cpp @@ -1004,11 +1004,11 @@ static void CalcSectorSoundOrg(const DVector3& listenpos, const sector_t* sec, i // Set sound vertical position based on channel. if (channum == CHAN_FLOOR) { - pos.Y = (float)MIN(sec->floorplane.ZatPoint(listenpos), listenpos.Z); + pos.Y = (float)min(sec->floorplane.ZatPoint(listenpos), listenpos.Z); } else if (channum == CHAN_CEILING) { - pos.Y = (float)MAX(sec->ceilingplane.ZatPoint(listenpos), listenpos.Z); + pos.Y = (float)max(sec->ceilingplane.ZatPoint(listenpos), listenpos.Z); } else if (channum == CHAN_INTERIOR) { diff --git a/src/utility/nodebuilder/nodebuild.cpp b/src/utility/nodebuilder/nodebuild.cpp index a097efd431..0efe38b0ef 100644 --- a/src/utility/nodebuilder/nodebuild.cpp +++ b/src/utility/nodebuilder/nodebuild.cpp @@ -150,10 +150,10 @@ int FNodeBuilder::CreateNode (uint32_t set, unsigned int count, fixed_t bbox[4]) D(PrintSet (2, set2)); node.intchildren[0] = CreateNode (set1, count1, node.nb_bbox[0]); node.intchildren[1] = CreateNode (set2, count2, node.nb_bbox[1]); - bbox[BOXTOP] = MAX (node.nb_bbox[0][BOXTOP], node.nb_bbox[1][BOXTOP]); - bbox[BOXBOTTOM] = MIN (node.nb_bbox[0][BOXBOTTOM], node.nb_bbox[1][BOXBOTTOM]); - bbox[BOXLEFT] = MIN (node.nb_bbox[0][BOXLEFT], node.nb_bbox[1][BOXLEFT]); - bbox[BOXRIGHT] = MAX (node.nb_bbox[0][BOXRIGHT], node.nb_bbox[1][BOXRIGHT]); + bbox[BOXTOP] = max (node.nb_bbox[0][BOXTOP], node.nb_bbox[1][BOXTOP]); + bbox[BOXBOTTOM] = min (node.nb_bbox[0][BOXBOTTOM], node.nb_bbox[1][BOXBOTTOM]); + bbox[BOXLEFT] = min (node.nb_bbox[0][BOXLEFT], node.nb_bbox[1][BOXLEFT]); + bbox[BOXRIGHT] = max (node.nb_bbox[0][BOXRIGHT], node.nb_bbox[1][BOXRIGHT]); return (int)Nodes.Push (node); } else @@ -643,7 +643,7 @@ int FNodeBuilder::Heuristic (node_t &node, uint32_t set, bool honorNoSplit) frac = 1 - frac; } int penalty = int(1 / frac); - score = MAX(score - penalty, 1); + score = std::max(score - penalty, 1); D(Printf ("Penalized splitter by %d for being near endpt of seg %d (%f).\n", penalty, i, frac)); } diff --git a/src/utility/nodebuilder/nodebuild_utility.cpp b/src/utility/nodebuilder/nodebuild_utility.cpp index d94f84d079..5aff74b5b1 100644 --- a/src/utility/nodebuilder/nodebuild_utility.cpp +++ b/src/utility/nodebuilder/nodebuild_utility.cpp @@ -699,9 +699,9 @@ int FNodeBuilder::FVertexMap::InsertVertex (FNodeBuilder::FPrivVert &vert) // both sides of the boundary so that SelectVertexClose can find // it by checking in only one block. fixed64_t minx = MAX (MinX, fixed64_t(vert.x) - VERTEX_EPSILON); - fixed64_t maxx = MIN (MaxX, fixed64_t(vert.x) + VERTEX_EPSILON); + fixed64_t maxx = min (MaxX, fixed64_t(vert.x) + VERTEX_EPSILON); fixed64_t miny = MAX (MinY, fixed64_t(vert.y) - VERTEX_EPSILON); - fixed64_t maxy = MIN (MaxY, fixed64_t(vert.y) + VERTEX_EPSILON); + fixed64_t maxy = min (MaxY, fixed64_t(vert.y) + VERTEX_EPSILON); int blk[4] = { diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 0172223ec9..2393f08101 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -831,7 +831,7 @@ DEFINE_ACTION_FUNCTION(DStatusScreen, GetPlayerWidths) if (numret > 0) ret[0].SetInt(maxnamewidth); if (numret > 1) ret[1].SetInt(maxscorewidth); if (numret > 2) ret[2].SetInt(maxiconheight); - return MIN(numret, 3); + return min(numret, 3); } //==================================================================== From 75c8e0af7ca1d633aa3c6f3871b81d5f47371ef9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:21:50 +0200 Subject: [PATCH 12/22] - use the standard library's 'clamp' function instead of our homegrown variant. --- src/common/engine/renderstyle.cpp | 2 +- src/common/textures/hw_ihwtexture.cpp | 4 ++-- src/common/utility/basics.h | 1 + src/common/utility/templates.h | 13 ------------- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/common/engine/renderstyle.cpp b/src/common/engine/renderstyle.cpp index 1a29292eae..e31538b4f8 100644 --- a/src/common/engine/renderstyle.cpp +++ b/src/common/engine/renderstyle.cpp @@ -32,7 +32,7 @@ ** */ -#include "templates.h" +#include "basics.h" #include "renderstyle.h" #include "c_cvars.h" diff --git a/src/common/textures/hw_ihwtexture.cpp b/src/common/textures/hw_ihwtexture.cpp index aebf387d4c..f86daa5c16 100644 --- a/src/common/textures/hw_ihwtexture.cpp +++ b/src/common/textures/hw_ihwtexture.cpp @@ -34,7 +34,7 @@ */ #include "hw_ihwtexture.h" -#include "templates.h" +#include "basics.h" #include "tarray.h" #include "xs_Float.h" @@ -68,7 +68,7 @@ static void ResampleBoxPrecalc(TArray& boxes, int oldDim) BoxPrecalc& precalc = boxes[dst]; precalc.boxStart = clamp(int(src_p - scale_factor_1 / 2.0 + 1), 0, oldDim - 1); - precalc.boxEnd = clamp(MAX(precalc.boxStart + 1, int(src_p + scale_factor_2)), 0, oldDim - 1); + precalc.boxEnd = clamp(max(precalc.boxStart + 1, int(src_p + scale_factor_2)), 0, oldDim - 1); } } diff --git a/src/common/utility/basics.h b/src/common/utility/basics.h index 703a84c301..29ee195934 100644 --- a/src/common/utility/basics.h +++ b/src/common/utility/basics.h @@ -105,3 +105,4 @@ enum EStateUseFlags using std::min; using std::max; +using std::clamp; diff --git a/src/common/utility/templates.h b/src/common/utility/templates.h index 3f3e596f0c..7babf3f996 100644 --- a/src/common/utility/templates.h +++ b/src/common/utility/templates.h @@ -129,18 +129,5 @@ const T MAX (const T a, const T b) return a > b ? a : b; } -//========================================================================== -// -// clamp -// -// Clamps in to the range [min,max]. -//========================================================================== - -template -inline constexpr -T clamp (const T in, const X min, const Y max) -{ - return in <= (T) min ? (T) min : in >= (T) max ? (T) max : in; -} #endif //__TEMPLATES_H__ From 07a181090b11ed0931b15c537dff870b199cd8af Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:45:58 +0200 Subject: [PATCH 13/22] - missed some MAX's. --- src/g_dumpinfo.cpp | 2 +- src/g_statusbar/hudmessages.cpp | 4 ++-- src/g_statusbar/shared_sbar.cpp | 2 +- src/gamedata/textures/buildloader.cpp | 2 +- src/hu_scores.cpp | 8 ++++---- src/maploader/specials.cpp | 2 +- src/playsim/a_dynlight.cpp | 2 +- src/playsim/actor.h | 4 ++-- src/r_data/colormaps.cpp | 2 +- src/r_data/sprites.cpp | 2 +- src/rendering/hwrenderer/doom_aabbtree.cpp | 20 +++++++++---------- src/sound/s_sndseq.cpp | 2 +- src/utility/nodebuilder/nodebuild_utility.cpp | 4 ++-- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 6cdcc593bc..a026863dec 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -390,7 +390,7 @@ CCMD(skyfog) if (argv.argc() > 1) { // Do this only on the primary level. - primaryLevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); + primaryLevel->skyfog = max(0, (int)strtoull(argv[1], NULL, 0)); } } diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index ba9b7a1902..f35832528f 100644 --- a/src/g_statusbar/hudmessages.cpp +++ b/src/g_statusbar/hudmessages.cpp @@ -340,7 +340,7 @@ void DHUDMessage::ResetText (const char *text) for (auto &line : Lines) { Height += Font->GetHeight (); - Width = MAX (Width, line.Width); + Width = max (Width, line.Width); } } @@ -751,7 +751,7 @@ void DHUDMessageTypeOnFadeOut::Serialize(FSerializer &arc) LineLen = CurrLine = 0; } - clamp(LineVisible, 0, LineLen); + LineVisible = clamp(LineVisible, 0, LineLen); } } diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index e6f386b7c5..74811fada4 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -531,7 +531,7 @@ DVector2 DBaseStatusBar::GetHUDScale() const // Since status bars and HUDs can be designed for non 320x200 screens this needs to be factored in here. // The global scaling factors are for resources at 320x200, so if the actual ones are higher resolution // the resulting scaling factor needs to be reduced accordingly. - int realscale = MAX(1, (320 * scale) / hres); + int realscale = max(1, (320 * scale) / hres); return{ double(realscale), double(realscale * (hud_aspectscale ? 1.2 : 1.)) }; } diff --git a/src/gamedata/textures/buildloader.cpp b/src/gamedata/textures/buildloader.cpp index 047ad14be2..78c6a6af72 100644 --- a/src/gamedata/textures/buildloader.cpp +++ b/src/gamedata/textures/buildloader.cpp @@ -178,7 +178,7 @@ void AddTiles(const FString& pathprefix, const void* tiles, FRemapTable *remap) } speed = (anm >> 24) & 15; - speed = MAX(1, (1 << speed) * 1000 / 120); // Convert from 120 Hz to 1000 Hz. + speed = max(1, (1 << speed) * 1000 / 120); // Convert from 120 Hz to 1000 Hz. TexAnim.AddSimpleAnim(texnum, picanm[pic] & 63, type, speed); } diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 6e662ab6bb..68dd60c330 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -149,7 +149,7 @@ static int FontScale; void HU_DrawScores (player_t *player) { displayFont = NewSmallFont; - FontScale = MAX(screen->GetHeight() / 400, 1); + FontScale = max(screen->GetHeight() / 400, 1); if (deathmatch) { @@ -273,11 +273,11 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER HU_GetPlayerWidths(maxnamewidth, maxscorewidth, maxiconheight); height = displayFont->GetHeight() * FontScale; - lineheight = MAX(height, maxiconheight * CleanYfac); + lineheight = max(height, maxiconheight * CleanYfac); ypadding = (lineheight - height + 1) / 2; bottom = StatusBar->GetTopOfStatusbar(); - y = MAX(48*CleanYfac, (bottom - MAXPLAYERS * (height + CleanYfac + 1)) / 2); + y = max(48*CleanYfac, (bottom - MAXPLAYERS * (height + CleanYfac + 1)) / 2); HU_DrawTimeRemaining (bottom - height); @@ -304,7 +304,7 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER } } - int scorexwidth = twod->GetWidth() / MAX(8, numTeams); + int scorexwidth = twod->GetWidth() / max(8, numTeams); int numscores = 0; int scorex; diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index 280eba2792..d0fa1d5a9f 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -452,7 +452,7 @@ static void SetupSectorDamage(sector_t *sector, int damage, int interval, int le if (sector->damageamount == 0 && !(sector->Flags & (SECF_EXIT1|SECF_EXIT2))) { sector->damageamount = damage; - sector->damageinterval = MAX(1, interval); + sector->damageinterval = max(1, interval); sector->leakydamage = leakchance; sector->damagetype = type; sector->Flags = (sector->Flags & ~SECF_DAMAGEFLAGS) | (flags & SECF_DAMAGEFLAGS); diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index 8a5838f1d1..6c1e72fd38 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -395,7 +395,7 @@ void FDynamicLight::UpdateLocation() if (lighttype == FlickerLight || lighttype == RandomFlickerLight || lighttype == PulseLight) { - intensity = float(MAX(GetIntensity(), GetSecondaryIntensity())); + intensity = float(max(GetIntensity(), GetSecondaryIntensity())); } else { diff --git a/src/playsim/actor.h b/src/playsim/actor.h index e604cbfeb4..7226aa97f6 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1301,7 +1301,7 @@ public: double RenderRadius() const { - return MAX(radius, renderradius); + return max(radius, renderradius); } DVector3 PosRelative(int grp) const; @@ -1453,7 +1453,7 @@ public: // Better have it in one place, if something needs to be changed about the formula. double DistanceBySpeed(AActor *dest, double speed) const { - return MAX(1., Distance2D(dest) / speed); + return max(1., Distance2D(dest) / speed); } int ApplyDamageFactor(FName damagetype, int damage) const; diff --git a/src/r_data/colormaps.cpp b/src/r_data/colormaps.cpp index b46a9b49c5..7dd7279f20 100644 --- a/src/r_data/colormaps.cpp +++ b/src/r_data/colormaps.cpp @@ -156,7 +156,7 @@ void R_InitColormaps (bool allowCustomColormap) g /= 256; b /= 256; // The calculated average is too dark so brighten it according to the palettes's overall brightness - int maxcol = MAX(MAX(palette_brightness, r), MAX(g, b)); + int maxcol = max(max(palette_brightness, r), max(g, b)); fakecmaps[j].blend = PalEntry (255, r * 255 / maxcol, g * 255 / maxcol, b * 255 / maxcol); } diff --git a/src/r_data/sprites.cpp b/src/r_data/sprites.cpp index 3b88669e80..b3b5cf4517 100644 --- a/src/r_data/sprites.cpp +++ b/src/r_data/sprites.cpp @@ -452,7 +452,7 @@ void R_InitSpriteDefs () { // voxel applies to a specific frame j = vh->Frame - 'A'; sprtemp[j].Voxel = voxdef; - maxframe = MAX(maxframe, j); + maxframe = max(maxframe, j); } } } diff --git a/src/rendering/hwrenderer/doom_aabbtree.cpp b/src/rendering/hwrenderer/doom_aabbtree.cpp index 5420e561e0..718040b8e3 100644 --- a/src/rendering/hwrenderer/doom_aabbtree.cpp +++ b/src/rendering/hwrenderer/doom_aabbtree.cpp @@ -59,8 +59,8 @@ DoomLevelAABBTree::DoomLevelAABBTree(FLevelLocals *lev) const auto &right = nodes[dynamicroot]; aabb_min.X = min(left.aabb_left, right.aabb_left); aabb_min.Y = min(left.aabb_top, right.aabb_top); - aabb_max.X = MAX(left.aabb_right, right.aabb_right); - aabb_max.Y = MAX(left.aabb_bottom, right.aabb_bottom); + aabb_max.X = max(left.aabb_right, right.aabb_right); + aabb_max.Y = max(left.aabb_bottom, right.aabb_bottom); nodes.Push({ aabb_min, aabb_max, staticroot, dynamicroot }); } @@ -138,9 +138,9 @@ bool DoomLevelAABBTree::Update() int nodeIndex = path[0]; nodes[nodeIndex].aabb_left = min(x1, x2); - nodes[nodeIndex].aabb_right = MAX(x1, x2); + nodes[nodeIndex].aabb_right = max(x1, x2); nodes[nodeIndex].aabb_top = min(y1, y2); - nodes[nodeIndex].aabb_bottom = MAX(y1, y2); + nodes[nodeIndex].aabb_bottom = max(y1, y2); for (unsigned int j = 1; j < path.Size(); j++) { @@ -149,8 +149,8 @@ bool DoomLevelAABBTree::Update() const auto &right = nodes[cur.right_node]; cur.aabb_left = min(left.aabb_left, right.aabb_left); cur.aabb_top = min(left.aabb_top, right.aabb_top); - cur.aabb_right = MAX(left.aabb_right, right.aabb_right); - cur.aabb_bottom = MAX(left.aabb_bottom, right.aabb_bottom); + cur.aabb_right = max(left.aabb_right, right.aabb_right); + cur.aabb_bottom = max(left.aabb_bottom, right.aabb_bottom); } treelines[i] = treeline; @@ -185,10 +185,10 @@ int DoomLevelAABBTree::GenerateTreeNode(int *lines, int num_lines, const FVector aabb_min.X = min(aabb_min.X, x2); aabb_min.Y = min(aabb_min.Y, y1); aabb_min.Y = min(aabb_min.Y, y2); - aabb_max.X = MAX(aabb_max.X, x1); - aabb_max.X = MAX(aabb_max.X, x2); - aabb_max.Y = MAX(aabb_max.Y, y1); - aabb_max.Y = MAX(aabb_max.Y, y2); + aabb_max.X = max(aabb_max.X, x1); + aabb_max.X = max(aabb_max.X, x2); + aabb_max.Y = max(aabb_max.Y, y1); + aabb_max.Y = max(aabb_max.Y, y2); median += centroids[mapLines[lines[i]]]; } diff --git a/src/sound/s_sndseq.cpp b/src/sound/s_sndseq.cpp index abe16c3c83..ed82d8a571 100644 --- a/src/sound/s_sndseq.cpp +++ b/src/sound/s_sndseq.cpp @@ -704,7 +704,7 @@ void S_ParseSndSeq (int levellump) delaybase = sc.Number; ScriptTemp.Push(MakeCommand(SS_CMD_DELAYRAND, sc.Number)); sc.MustGetNumber (); - ScriptTemp.Push(MAX(1, sc.Number - delaybase + 1)); + ScriptTemp.Push(max(1, sc.Number - delaybase + 1)); break; case SS_STRING_VOLUME: // volume is in range 0..100 diff --git a/src/utility/nodebuilder/nodebuild_utility.cpp b/src/utility/nodebuilder/nodebuild_utility.cpp index 5aff74b5b1..30ead3424d 100644 --- a/src/utility/nodebuilder/nodebuild_utility.cpp +++ b/src/utility/nodebuilder/nodebuild_utility.cpp @@ -698,9 +698,9 @@ int FNodeBuilder::FVertexMap::InsertVertex (FNodeBuilder::FPrivVert &vert) // If a vertex is near a block boundary, then it will be inserted on // both sides of the boundary so that SelectVertexClose can find // it by checking in only one block. - fixed64_t minx = MAX (MinX, fixed64_t(vert.x) - VERTEX_EPSILON); + fixed64_t minx = max (MinX, fixed64_t(vert.x) - VERTEX_EPSILON); fixed64_t maxx = min (MaxX, fixed64_t(vert.x) + VERTEX_EPSILON); - fixed64_t miny = MAX (MinY, fixed64_t(vert.y) - VERTEX_EPSILON); + fixed64_t miny = max (MinY, fixed64_t(vert.y) - VERTEX_EPSILON); fixed64_t maxy = min (MaxY, fixed64_t(vert.y) + VERTEX_EPSILON); int blk[4] = From eb69bbcae0537508db71e30f4bb9d72f38551ea2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:46:17 +0200 Subject: [PATCH 14/22] - replaced MIN/MAX in common code. --- src/common/2d/v_2ddrawer.cpp | 2 +- src/common/2d/v_draw.cpp | 24 ++++++------ src/common/audio/sound/oalsound.cpp | 14 +++---- src/common/audio/sound/s_sound.cpp | 8 ++-- src/common/console/c_commandbuffer.cpp | 2 +- src/common/console/c_console.cpp | 2 +- src/common/console/c_dispatch.cpp | 2 +- src/common/console/c_tabcomplete.cpp | 2 +- src/common/engine/palettecontainer.cpp | 6 +-- src/common/filesystem/file_rff.cpp | 2 +- src/common/filesystem/file_zip.cpp | 4 +- src/common/fonts/font.cpp | 2 +- src/common/objects/dobjgc.cpp | 6 +-- src/common/platform/posix/cocoa/i_input.mm | 2 +- src/common/platform/posix/cocoa/i_video.mm | 2 +- src/common/platform/posix/cocoa/st_console.mm | 2 +- src/common/platform/posix/i_system.h | 2 +- src/common/platform/win32/i_system.cpp | 2 +- src/common/platform/win32/st_start.cpp | 2 +- src/common/platform/win32/st_start_util.cpp | 2 +- src/common/rendering/gl/gl_renderstate.h | 2 +- src/common/rendering/gl/gl_shaderprogram.cpp | 2 +- .../rendering/gles/gles_framebuffer.cpp | 2 +- src/common/rendering/gles/gles_renderstate.h | 2 +- .../rendering/hwrenderer/data/hw_skydome.cpp | 2 +- .../postprocessing/hw_postprocess.cpp | 16 ++++---- .../polyrenderer/backend/poly_framebuffer.cpp | 4 +- .../polyrenderer/drawers/poly_thread.cpp | 20 +++++----- .../polyrenderer/drawers/poly_thread.h | 6 +-- .../polyrenderer/drawers/screen_blend.cpp | 24 ++++++------ .../drawers/screen_scanline_setup.cpp | 38 +++++++++---------- .../polyrenderer/drawers/screen_shader.cpp | 28 +++++++------- .../polyrenderer/drawers/screen_triangle.cpp | 10 ++--- src/common/rendering/r_thread.h | 6 +-- src/common/rendering/r_videoscale.cpp | 4 +- src/common/rendering/v_framebuffer.cpp | 2 +- src/common/rendering/v_video.cpp | 6 +-- .../vulkan/renderer/vk_renderstate.cpp | 2 +- .../rendering/vulkan/system/vk_buffers.cpp | 8 ++-- .../rendering/vulkan/system/vk_builders.h | 2 +- .../vulkan/system/vk_framebuffer.cpp | 8 ++-- .../rendering/vulkan/system/vk_swapchain.cpp | 8 ++-- .../vulkan/textures/vk_hwtexture.cpp | 6 +-- .../vulkan/textures/vk_imagetransition.cpp | 4 +- src/common/scripting/backend/codegen.cpp | 2 +- src/common/scripting/core/symbols.cpp | 2 +- src/common/scripting/core/types.cpp | 2 +- src/common/scripting/core/vmdisasm.cpp | 2 +- src/common/scripting/interface/vmnatives.cpp | 8 ++-- src/common/scripting/jit/jit_runtime.cpp | 4 +- src/common/scripting/vm/vmframe.cpp | 2 +- src/common/statusbar/base_sbar.cpp | 12 +++--- src/common/textures/bitmap.h | 8 ++-- src/common/textures/formats/fontchars.cpp | 4 +- src/common/textures/formats/pngtexture.cpp | 6 +-- src/common/textures/formats/tgatexture.cpp | 4 +- src/common/textures/hw_ihwtexture.cpp | 4 +- src/common/textures/m_png.cpp | 8 ++-- src/common/textures/texture.cpp | 2 +- src/common/utility/cmdlib.cpp | 4 +- src/common/utility/files_decompress.cpp | 4 +- src/common/utility/palette.cpp | 20 +++++----- src/common/utility/templates.h | 36 ------------------ 63 files changed, 200 insertions(+), 236 deletions(-) diff --git a/src/common/2d/v_2ddrawer.cpp b/src/common/2d/v_2ddrawer.cpp index 612eef005b..ddbdba5382 100644 --- a/src/common/2d/v_2ddrawer.cpp +++ b/src/common/2d/v_2ddrawer.cpp @@ -455,7 +455,7 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) // Note that this only works for unflipped and unrotated full textures. if (parms.windowleft > 0 || parms.windowright < parms.texwidth) { - double wi = std::min(parms.windowright, parms.texwidth); + double wi = min(parms.windowright, parms.texwidth); x += parms.windowleft * xscale; w -= (parms.texwidth - wi + parms.windowleft) * xscale; diff --git a/src/common/2d/v_draw.cpp b/src/common/2d/v_draw.cpp index a0438ad13b..b35e7723a1 100644 --- a/src/common/2d/v_draw.cpp +++ b/src/common/2d/v_draw.cpp @@ -151,8 +151,8 @@ int GetUIScale(F2DDrawer *drawer, int altval) // block scales that result in something larger than the current screen. int vmax = drawer->GetHeight() / 200; int hmax = drawer->GetWidth() / 320; - int max = MAX(vmax, hmax); - return MAX(1,MIN(scaleval, max)); + int max = std::max(vmax, hmax); + return std::max(1,min(scaleval, max)); } // The new console font is twice as high, so the scaling calculation must factor that in. @@ -172,8 +172,8 @@ int GetConScale(F2DDrawer* drawer, int altval) // block scales that result in something larger than the current screen. int vmax = drawer->GetHeight() / 400; int hmax = drawer->GetWidth() / 640; - int max = MAX(vmax, hmax); - return MAX(1, MIN(scaleval, max)); + int max = std::max(vmax, hmax); + return std::max(1, min(scaleval, max)); } @@ -357,7 +357,7 @@ DEFINE_ACTION_FUNCTION(_Screen, GetClipRect) if (numret > 1) ret[1].SetInt(y); if (numret > 2) ret[2].SetInt(w); if (numret > 3) ret[3].SetInt(h); - return MIN(numret, 4); + return min(numret, 4); } @@ -460,7 +460,7 @@ DEFINE_ACTION_FUNCTION(_Screen, GetFullscreenRect) if (numret >= 2) ret[1].SetFloat(rect.top); if (numret >= 3) ret[2].SetFloat(rect.width); if (numret >= 4) ret[3].SetFloat(rect.height); - return MIN(numret, 4); + return min(numret, 4); } @@ -905,7 +905,7 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double break; case DTA_Alpha: - parms->Alpha = (float)(MIN(1., ListGetDouble(tags))); + parms->Alpha = (float)(min(1., ListGetDouble(tags))); break; case DTA_AlphaChannel: @@ -1090,7 +1090,7 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double break; case DTA_ShadowAlpha: - //parms->shadowAlpha = (float)MIN(1., ListGetDouble(tags)); + //parms->shadowAlpha = (float)min(1., ListGetDouble(tags)); break; case DTA_ShadowColor: @@ -1286,10 +1286,10 @@ static void VirtualToRealCoords(F2DDrawer *drawer, double Width, double Height, { case 1: default: - myratio = MIN(64.0f / 27.0f, myratio); + myratio = min(64.0f / 27.0f, myratio); break; case 0: - myratio = MIN(16.0f / 9.0f, myratio); + myratio = min(16.0f / 9.0f, myratio); case -1: break; } @@ -1348,7 +1348,7 @@ DEFINE_ACTION_FUNCTION(_Screen, VirtualToRealCoords) VirtualToRealCoords(twod, x, y, w, h, vw, vh, vbottom, handleaspect); if (numret >= 1) ret[0].SetVector2(DVector2(x, y)); if (numret >= 2) ret[1].SetVector2(DVector2(w, h)); - return MIN(numret, 2); + return min(numret, 2); } void VirtualToRealCoordsInt(F2DDrawer *drawer, int &x, int &y, int &w, int &h, @@ -1594,7 +1594,7 @@ DEFINE_ACTION_FUNCTION(_Screen, DrawLineFrame) void V_CalcCleanFacs(int designwidth, int designheight, int realwidth, int realheight, int* cleanx, int* cleany, int* _cx1, int* _cx2) { if (designheight < 240 && realheight >= 480) designheight = 240; - *cleanx = *cleany = std::min(realwidth / designwidth, realheight / designheight); + *cleanx = *cleany = min(realwidth / designwidth, realheight / designheight); } diff --git a/src/common/audio/sound/oalsound.cpp b/src/common/audio/sound/oalsound.cpp index 252688572b..96b01c7611 100644 --- a/src/common/audio/sound/oalsound.cpp +++ b/src/common/audio/sound/oalsound.cpp @@ -579,7 +579,7 @@ OpenALSoundRenderer::OpenALSoundRenderer() // Make sure one source is capable of stereo output with the rest doing // mono, without running out of voices attribs.Push(ALC_MONO_SOURCES); - attribs.Push(std::max(snd_channels, 2) - 1); + attribs.Push(max(snd_channels, 2) - 1); attribs.Push(ALC_STEREO_SOURCES); attribs.Push(1); if(ALC.SOFT_HRTF) @@ -681,7 +681,7 @@ OpenALSoundRenderer::OpenALSoundRenderer() // At least Apple's OpenAL implementation returns zeroes, // although it can generate reasonable number of sources. - const int numChannels = std::max(snd_channels, 2); + const int numChannels = max(snd_channels, 2); int numSources = numMono + numStereo; if (0 == numSources) @@ -689,7 +689,7 @@ OpenALSoundRenderer::OpenALSoundRenderer() numSources = numChannels; } - Sources.Resize(std::min(numChannels, numSources)); + Sources.Resize(min(numChannels, numSources)); for(unsigned i = 0;i < Sources.Size();i++) { alGenSources(1, &Sources[i]); @@ -1346,7 +1346,7 @@ FISoundChannel *OpenALSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener float gain = GetRolloff(rolloff, dist * distscale); // Don't let the ref distance go to 0, or else distance attenuation is // lost with the inverse distance model. - alSourcef(source, AL_REFERENCE_DISTANCE, std::max(gain*dist, 0.0004f)); + alSourcef(source, AL_REFERENCE_DISTANCE, max(gain*dist, 0.0004f)); alSourcef(source, AL_MAX_DISTANCE, std::numeric_limits::max()); alSourcef(source, AL_ROLLOFF_FACTOR, 1.f); } @@ -1466,9 +1466,9 @@ void OpenALSoundRenderer::ChannelPitch(FISoundChannel *chan, float pitch) ALuint source = GET_PTRID(chan->SysChannel); if (WasInWater && !(chan->ChanFlags & CHANF_UI)) - alSourcef(source, AL_PITCH, std::max(pitch, 0.0001f)*PITCH_MULT); + alSourcef(source, AL_PITCH, max(pitch, 0.0001f)*PITCH_MULT); else - alSourcef(source, AL_PITCH, std::max(pitch, 0.0001f)); + alSourcef(source, AL_PITCH, max(pitch, 0.0001f)); } void OpenALSoundRenderer::StopChannel(FISoundChannel *chan) @@ -1622,7 +1622,7 @@ void OpenALSoundRenderer::UpdateSoundParams3D(SoundListener *listener, FISoundCh { float dist = sqrtf(dist_sqr); float gain = GetRolloff(&chan->Rolloff, dist * chan->DistanceScale); - alSourcef(source, AL_REFERENCE_DISTANCE, std::max(gain*dist, 0.0004f)); + alSourcef(source, AL_REFERENCE_DISTANCE, max(gain*dist, 0.0004f)); } alSourcei(source, AL_SOURCE_RELATIVE, AL_FALSE); diff --git a/src/common/audio/sound/s_sound.cpp b/src/common/audio/sound/s_sound.cpp index f6acbb885a..55e281be19 100644 --- a/src/common/audio/sound/s_sound.cpp +++ b/src/common/audio/sound/s_sound.cpp @@ -407,7 +407,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, sfx = &S_sfx[sound_id]; // Scale volume according to SNDINFO data. - volume = std::min(volume * sfx->Volume, 1.f); + volume = min(volume * sfx->Volume, 1.f); if (volume <= 0) return NULL; @@ -847,7 +847,7 @@ bool SoundEngine::CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_ CalcPosVel(chan, &chanorigin, NULL); // scale the limit distance with the attenuation. An attenuation of 0 means the limit distance is infinite and all sounds within the level are inside the limit. - float attn = std::min(chan->DistanceScale, attenuation); + float attn = min(chan->DistanceScale, attenuation); if (attn <= 0 || (chanorigin - pos).LengthSquared() <= limit_range / attn) { count++; @@ -1074,8 +1074,8 @@ void SoundEngine::ChangeSoundPitch(int sourcetype, const void *source, int chann void SoundEngine::SetPitch(FSoundChan *chan, float pitch) { assert(chan != nullptr); - GSnd->ChannelPitch(chan, std::max(0.0001f, pitch)); - chan->Pitch = std::max(1, int(float(DEFAULT_PITCH) * pitch)); + GSnd->ChannelPitch(chan, max(0.0001f, pitch)); + chan->Pitch = max(1, int(float(DEFAULT_PITCH) * pitch)); } //========================================================================== diff --git a/src/common/console/c_commandbuffer.cpp b/src/common/console/c_commandbuffer.cpp index bf459350fb..b079d7f762 100644 --- a/src/common/console/c_commandbuffer.cpp +++ b/src/common/console/c_commandbuffer.cpp @@ -144,7 +144,7 @@ void FCommandBuffer::MakeStartPosGood() { // The cursor is in front of the visible part of the line n = CursorPosCells; } - StartPosCells = std::max(0, n); + StartPosCells = max(0, n); bool overflow; StartPos = CharsForCells(StartPosCells, &overflow); if (overflow) diff --git a/src/common/console/c_console.cpp b/src/common/console/c_console.cpp index 5cafbb0803..4a3abb172a 100644 --- a/src/common/console/c_console.cpp +++ b/src/common/console/c_console.cpp @@ -856,7 +856,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) { // Scroll console buffer down if (ev->subtype == EV_GUI_WheelDown) { - RowAdjust = std::max (0, RowAdjust - 3); + RowAdjust = max (0, RowAdjust - 3); } else { diff --git a/src/common/console/c_dispatch.cpp b/src/common/console/c_dispatch.cpp index ce9f2cef70..c634492211 100644 --- a/src/common/console/c_dispatch.cpp +++ b/src/common/console/c_dispatch.cpp @@ -1092,7 +1092,7 @@ void C_SearchForPullins(FExecList *exec, const char *file, FCommandLine &argv) lastSlash1 = strrchr(file, '/'); lastSlash2 = strrchr(file, '\\'); - lastSlash = MAX(lastSlash1, lastSlash2); + lastSlash = max(lastSlash1, lastSlash2); #endif for (int i = 1; i < argv.argc(); ++i) diff --git a/src/common/console/c_tabcomplete.cpp b/src/common/console/c_tabcomplete.cpp index ca83390626..eccd64b031 100644 --- a/src/common/console/c_tabcomplete.cpp +++ b/src/common/console/c_tabcomplete.cpp @@ -273,7 +273,7 @@ bool C_TabCompleteList () } } nummatches++; - maxwidth = std::max (maxwidth, strlen (TabCommands[i].TabName.GetChars())); + maxwidth = max (maxwidth, strlen (TabCommands[i].TabName.GetChars())); } } if (nummatches > 1) diff --git a/src/common/engine/palettecontainer.cpp b/src/common/engine/palettecontainer.cpp index 41a92735da..4793fd67c7 100644 --- a/src/common/engine/palettecontainer.cpp +++ b/src/common/engine/palettecontainer.cpp @@ -565,9 +565,9 @@ bool FRemapTable::AddDesaturation(int start, int end, double r1, double g1, doub GPalette.BaseColors[c].g * 143 + GPalette.BaseColors[c].b * 37) / 256.0; - PalEntry pe = PalEntry( MIN(255, int(r1 + intensity*r2)), - MIN(255, int(g1 + intensity*g2)), - MIN(255, int(b1 + intensity*b2))); + PalEntry pe = PalEntry( min(255, int(r1 + intensity*r2)), + min(255, int(g1 + intensity*g2)), + min(255, int(b1 + intensity*b2))); int cc = GPalette.Remap[c]; diff --git a/src/common/filesystem/file_rff.cpp b/src/common/filesystem/file_rff.cpp index c69b50246e..61603c800a 100644 --- a/src/common/filesystem/file_rff.cpp +++ b/src/common/filesystem/file_rff.cpp @@ -219,7 +219,7 @@ int FRFFLump::FillCache() if (Flags & LUMPF_COMPRESSED) { - int cryptlen = MIN (LumpSize, 256); + int cryptlen = min (LumpSize, 256); uint8_t *data = (uint8_t *)Cache; for (int i = 0; i < cryptlen; ++i) diff --git a/src/common/filesystem/file_zip.cpp b/src/common/filesystem/file_zip.cpp index db5bdf902a..32a3a78077 100644 --- a/src/common/filesystem/file_zip.cpp +++ b/src/common/filesystem/file_zip.cpp @@ -124,7 +124,7 @@ static uint32_t Zip_FindCentralDir(FileReader &fin) uint32_t uPosFound=0; FileSize = (uint32_t)fin.GetLength(); - uMaxBack = MIN(0xffff, FileSize); + uMaxBack = min(0xffff, FileSize); uBackRead = 4; while (uBackRead < uMaxBack) @@ -137,7 +137,7 @@ static uint32_t Zip_FindCentralDir(FileReader &fin) uBackRead += BUFREADCOMMENT; uReadPos = FileSize - uBackRead; - uReadSize = MIN((BUFREADCOMMENT + 4), (FileSize - uReadPos)); + uReadSize = min((BUFREADCOMMENT + 4), (FileSize - uReadPos)); if (fin.Seek(uReadPos, FileReader::SeekSet) != 0) break; diff --git a/src/common/fonts/font.cpp b/src/common/fonts/font.cpp index 5edd09eb17..0e1a2d3fbb 100644 --- a/src/common/fonts/font.cpp +++ b/src/common/fonts/font.cpp @@ -936,7 +936,7 @@ int FFont::StringWidth(const uint8_t *string, int spacing) const } } - return std::max(maxw, w); + return max(maxw, w); } //========================================================================== diff --git a/src/common/objects/dobjgc.cpp b/src/common/objects/dobjgc.cpp index 58b27c4b76..8270286ef6 100644 --- a/src/common/objects/dobjgc.cpp +++ b/src/common/objects/dobjgc.cpp @@ -348,7 +348,7 @@ static size_t SingleStep() State = GCS_Finalize; } //assert(old >= AllocBytes); - Estimate -= MAX(0, old - AllocBytes); + Estimate -= max(0, old - AllocBytes); return (GCSWEEPMAX - finalize_count) * GCSWEEPCOST + finalize_count * GCFINALIZECOST; } @@ -625,7 +625,7 @@ CCMD(gc) } else { - GC::Pause = MAX(1,atoi(argv[2])); + GC::Pause = max(1,atoi(argv[2])); } } else if (stricmp(argv[1], "stepmul") == 0) @@ -636,7 +636,7 @@ CCMD(gc) } else { - GC::StepMul = MAX(100, atoi(argv[2])); + GC::StepMul = max(100, atoi(argv[2])); } } } diff --git a/src/common/platform/posix/cocoa/i_input.mm b/src/common/platform/posix/cocoa/i_input.mm index c329da3b93..ebda85a2e7 100644 --- a/src/common/platform/posix/cocoa/i_input.mm +++ b/src/common/platform/posix/cocoa/i_input.mm @@ -644,7 +644,7 @@ void ProcessMouseButtonEvent(NSEvent* theEvent) break; } - event.data1 = MIN(KEY_MOUSE1 + [theEvent buttonNumber], NSInteger(KEY_MOUSE8)); + event.data1 = min(KEY_MOUSE1 + [theEvent buttonNumber], NSInteger(KEY_MOUSE8)); D_PostEvent(&event); } diff --git a/src/common/platform/posix/cocoa/i_video.mm b/src/common/platform/posix/cocoa/i_video.mm index 193466f0d8..8f730e488c 100644 --- a/src/common/platform/posix/cocoa/i_video.mm +++ b/src/common/platform/posix/cocoa/i_video.mm @@ -969,7 +969,7 @@ bool I_GetVulkanPlatformExtensions(unsigned int *count, const char **names) else { const bool result = *count >= extensionCount; - *count = std::min(*count, extensionCount); + *count = min(*count, extensionCount); for (unsigned int i = 0; i < *count; ++i) { diff --git a/src/common/platform/posix/cocoa/st_console.mm b/src/common/platform/posix/cocoa/st_console.mm index af26ae1722..1c45776e6c 100644 --- a/src/common/platform/posix/cocoa/st_console.mm +++ b/src/common/platform/posix/cocoa/st_console.mm @@ -510,7 +510,7 @@ void FConsoleWindow::NetProgress(const int count) if (m_netMaxPos > 1) { [m_netCountText setStringValue:[NSString stringWithFormat:@"%d / %d", m_netCurPos, m_netMaxPos]]; - [m_netProgressBar setDoubleValue:MIN(m_netCurPos, m_netMaxPos)]; + [m_netProgressBar setDoubleValue:min(m_netCurPos, m_netMaxPos)]; } } diff --git a/src/common/platform/posix/i_system.h b/src/common/platform/posix/i_system.h index b73261eafb..a64703ee2d 100644 --- a/src/common/platform/posix/i_system.h +++ b/src/common/platform/posix/i_system.h @@ -66,7 +66,7 @@ static inline char *strlwr(char *str) } inline int I_GetNumaNodeCount() { return 1; } -inline int I_GetNumaNodeThreadCount(int numaNode) { return std::max(std::thread::hardware_concurrency(), 1); } +inline int I_GetNumaNodeThreadCount(int numaNode) { return max(std::thread::hardware_concurrency(), 1); } inline void I_SetThreadNumaNode(std::thread &thread, int numaNode) { } #endif diff --git a/src/common/platform/win32/i_system.cpp b/src/common/platform/win32/i_system.cpp index 103b26f317..e67f1c8a5c 100644 --- a/src/common/platform/win32/i_system.cpp +++ b/src/common/platform/win32/i_system.cpp @@ -778,7 +778,7 @@ static HCURSOR CreateAlphaCursor(FBitmap &source, int leftofs, int topofs) // Find closest integer scale factor for the monitor DPI HDC screenDC = GetDC(0); int dpi = GetDeviceCaps(screenDC, LOGPIXELSX); - int scale = std::max((dpi + 96 / 2 - 1) / 96, 1); + int scale = max((dpi + 96 / 2 - 1) / 96, 1); ReleaseDC(0, screenDC); memset(&bi, 0, sizeof(bi)); diff --git a/src/common/platform/win32/st_start.cpp b/src/common/platform/win32/st_start.cpp index f36371a9b1..8e8acaeffb 100644 --- a/src/common/platform/win32/st_start.cpp +++ b/src/common/platform/win32/st_start.cpp @@ -351,7 +351,7 @@ void FBasicStartupScreen :: NetProgress(int count) mysnprintf (buf, countof(buf), "%d/%d", NetCurPos, NetMaxPos); SetDlgItemTextA (NetStartPane, IDC_NETSTARTCOUNT, buf); - SendDlgItemMessage (NetStartPane, IDC_NETSTARTPROGRESS, PBM_SETPOS, std::min(NetCurPos, NetMaxPos), 0); + SendDlgItemMessage (NetStartPane, IDC_NETSTARTPROGRESS, PBM_SETPOS, min(NetCurPos, NetMaxPos), 0); } } diff --git a/src/common/platform/win32/st_start_util.cpp b/src/common/platform/win32/st_start_util.cpp index 8c6074863e..bfad116621 100644 --- a/src/common/platform/win32/st_start_util.cpp +++ b/src/common/platform/win32/st_start_util.cpp @@ -831,7 +831,7 @@ void FStrifeStartupScreen::DrawStuff(int old_laser, int new_laser) ST_LASERSPACE_X + new_laser, ST_LASERSPACE_Y, ST_LASER_WIDTH, ST_LASER_HEIGHT); // The bot jumps up and down like crazy. - y = std::max(0, (new_laser >> 1) % 5 - 2); + y = max(0, (new_laser >> 1) % 5 - 2); if (y > 0) { ST_Util_ClearBlock(bitmap_info, 0xF0, ST_BOT_X, ST_BOT_Y, ST_BOT_WIDTH, y); diff --git a/src/common/rendering/gl/gl_renderstate.h b/src/common/rendering/gl/gl_renderstate.h index 948255d710..9cfe3d7a26 100644 --- a/src/common/rendering/gl/gl_renderstate.h +++ b/src/common/rendering/gl/gl_renderstate.h @@ -107,7 +107,7 @@ public: void EnableDrawBuffers(int count, bool apply = false) override { - count = std::min(count, 3); + count = min(count, 3); if (mNumDrawBuffers != count) { static GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; diff --git a/src/common/rendering/gl/gl_shaderprogram.cpp b/src/common/rendering/gl/gl_shaderprogram.cpp index eb322fb942..2b6df32545 100644 --- a/src/common/rendering/gl/gl_shaderprogram.cpp +++ b/src/common/rendering/gl/gl_shaderprogram.cpp @@ -263,7 +263,7 @@ FString FShaderProgram::PatchShader(ShaderType type, const FString &code, const // If we have 4.2, always use it because it adds important new syntax. if (maxGlslVersion < 420 && gl.glslversion >= 4.2f) maxGlslVersion = 420; - int shaderVersion = std::min((int)round(gl.glslversion * 10) * 10, maxGlslVersion); + int shaderVersion = min((int)round(gl.glslversion * 10) * 10, maxGlslVersion); patchedCode.AppendFormat("#version %d\n", shaderVersion); // TODO: Find some way to add extension requirements to the patching diff --git a/src/common/rendering/gles/gles_framebuffer.cpp b/src/common/rendering/gles/gles_framebuffer.cpp index 3a74ee6bc1..80c252b63d 100644 --- a/src/common/rendering/gles/gles_framebuffer.cpp +++ b/src/common/rendering/gles/gles_framebuffer.cpp @@ -122,7 +122,7 @@ void OpenGLFrameBuffer::InitializeState() { static bool first=true; - mPipelineNbr = gl_pipeline_depth == 0? std::min(4, HW_MAX_PIPELINE_BUFFERS) : clamp(*gl_pipeline_depth, 1, HW_MAX_PIPELINE_BUFFERS); + mPipelineNbr = gl_pipeline_depth == 0? min(4, HW_MAX_PIPELINE_BUFFERS) : clamp(*gl_pipeline_depth, 1, HW_MAX_PIPELINE_BUFFERS); mPipelineType = 1; InitGLES(); diff --git a/src/common/rendering/gles/gles_renderstate.h b/src/common/rendering/gles/gles_renderstate.h index 7b77685416..4dd8516ecc 100644 --- a/src/common/rendering/gles/gles_renderstate.h +++ b/src/common/rendering/gles/gles_renderstate.h @@ -109,7 +109,7 @@ public: void EnableDrawBuffers(int count, bool apply = false) override { /* - count = std::min(count, 3); + count = min(count, 3); if (mNumDrawBuffers != count) { static GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; diff --git a/src/common/rendering/hwrenderer/data/hw_skydome.cpp b/src/common/rendering/hwrenderer/data/hw_skydome.cpp index e9e1bc364f..9bbe5787fa 100644 --- a/src/common/rendering/hwrenderer/data/hw_skydome.cpp +++ b/src/common/rendering/hwrenderer/data/hw_skydome.cpp @@ -98,7 +98,7 @@ std::pair& R_GetSkyCapColor(FGameTexture* tex) const uint32_t* buffer = (const uint32_t*)bitmap.GetPixels(); if (buffer) { - sky.Colors.first = averageColor((uint32_t*)buffer, w * MIN(30, h), 0); + sky.Colors.first = averageColor((uint32_t*)buffer, w * min(30, h), 0); if (h > 30) { sky.Colors.second = averageColor(((uint32_t*)buffer) + (h - 30) * w, w * 30, 0); diff --git a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp index 219bb9bd64..2c6b262aba 100644 --- a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp +++ b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp @@ -326,9 +326,9 @@ void PPLensDistort::Render(PPRenderState *renderstate) // Scale factor to keep sampling within the input texture float r2 = aspect * aspect * 0.25f + 0.25f; float sqrt_r2 = sqrt(r2); - float f0 = 1.0f + MAX(r2 * (k[0] + kcube[0] * sqrt_r2), 0.0f); - float f2 = 1.0f + MAX(r2 * (k[2] + kcube[2] * sqrt_r2), 0.0f); - float f = MAX(f0, f2); + float f0 = 1.0f + max(r2 * (k[0] + kcube[0] * sqrt_r2), 0.0f); + float f2 = 1.0f + max(r2 * (k[2] + kcube[2] * sqrt_r2), 0.0f); + float f = max(f0, f2); float scale = 1.0f / f; LensUniforms uniforms; @@ -498,8 +498,8 @@ void PPCameraExposure::Render(PPRenderState *renderstate, int sceneWidth, int sc void PPCameraExposure::UpdateTextures(int width, int height) { - int firstwidth = MAX(width / 2, 1); - int firstheight = MAX(height / 2, 1); + int firstwidth = max(width / 2, 1); + int firstheight = max(height / 2, 1); if (ExposureLevels.size() > 0 && ExposureLevels[0].Viewport.width == firstwidth && ExposureLevels[0].Viewport.height == firstheight) { @@ -511,8 +511,8 @@ void PPCameraExposure::UpdateTextures(int width, int height) int i = 0; do { - width = MAX(width / 2, 1); - height = MAX(height / 2, 1); + width = max(width / 2, 1); + height = max(height / 2, 1); PPExposureLevel blevel; blevel.Viewport.left = 0; @@ -746,7 +746,7 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW LinearDepthUniforms linearUniforms; linearUniforms.SampleIndex = 0; linearUniforms.LinearizeDepthA = 1.0f / screen->GetZFar() - 1.0f / screen->GetZNear(); - linearUniforms.LinearizeDepthB = MAX(1.0f / screen->GetZNear(), 1.e-8f); + linearUniforms.LinearizeDepthB = max(1.0f / screen->GetZNear(), 1.e-8f); linearUniforms.InverseDepthRangeA = 1.0f; linearUniforms.InverseDepthRangeB = 0.0f; linearUniforms.Scale = sceneScale; diff --git a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp index 6f8ead0c5d..6837865707 100644 --- a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp @@ -219,8 +219,8 @@ void PolyFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::functionGetWidth(), image->GetWidth()); - bounds.height = std::min(tex->GetHeight(), image->GetHeight()); + bounds.width = min(tex->GetWidth(), image->GetWidth()); + bounds.height = min(tex->GetHeight(), image->GetHeight()); renderFunc(bounds); diff --git a/src/common/rendering/polyrenderer/drawers/poly_thread.cpp b/src/common/rendering/polyrenderer/drawers/poly_thread.cpp index 338b12139c..38faabafbc 100644 --- a/src/common/rendering/polyrenderer/drawers/poly_thread.cpp +++ b/src/common/rendering/polyrenderer/drawers/poly_thread.cpp @@ -100,10 +100,10 @@ void PolyTriangleThreadData::SetScissor(int x, int y, int w, int h) void PolyTriangleThreadData::UpdateClip() { - clip.left = MAX(MAX(viewport_x, scissor.left), 0); - clip.top = MAX(MAX(viewport_y, scissor.top), 0); - clip.right = MIN(MIN(viewport_x + viewport_width, scissor.right), dest_width); - clip.bottom = MIN(MIN(viewport_y + viewport_height, scissor.bottom), dest_height); + clip.left = max(max(viewport_x, scissor.left), 0); + clip.top = max(max(viewport_y, scissor.top), 0); + clip.right = min(min(viewport_x + viewport_width, scissor.right), dest_width); + clip.bottom = min(min(viewport_y + viewport_height, scissor.bottom), dest_height); } void PolyTriangleThreadData::PushStreamData(const StreamData &data, const PolyPushConstants &constants) @@ -206,11 +206,11 @@ void PolyTriangleThreadData::SetStencil(int stencilRef, int op) StencilTestValue = stencilRef; if (op == SOP_Increment) { - StencilWriteValue = MIN(stencilRef + 1, (int)255); + StencilWriteValue = min(stencilRef + 1, (int)255); } else if (op == SOP_Decrement) { - StencilWriteValue = MAX(stencilRef - 1, (int)0); + StencilWriteValue = max(stencilRef - 1, (int)0); } else // SOP_Keep { @@ -453,8 +453,8 @@ void PolyTriangleThreadData::DrawShadedLine(const ShadedTriVertex *const* vert) { float clipdistance1 = clipdistance[0 * numclipdistances + p]; float clipdistance2 = clipdistance[1 * numclipdistances + p]; - if (clipdistance1 < 0.0f) t1 = MAX(-clipdistance1 / (clipdistance2 - clipdistance1), t1); - if (clipdistance2 < 0.0f) t2 = MIN(1.0f + clipdistance2 / (clipdistance1 - clipdistance2), t2); + if (clipdistance1 < 0.0f) t1 = max(-clipdistance1 / (clipdistance2 - clipdistance1), t1); + if (clipdistance2 < 0.0f) t2 = min(1.0f + clipdistance2 / (clipdistance1 - clipdistance2), t2); if (t1 >= t2) return; } @@ -792,8 +792,8 @@ int PolyTriangleThreadData::ClipEdge(const ShadedTriVertex *const* verts) // Clip halfspace if ((clipdistance1 >= 0.0f || clipdistance2 >= 0.0f) && outputverts + 1 < max_additional_vertices) { - float t1 = (clipdistance1 < 0.0f) ? MAX(-clipdistance1 / (clipdistance2 - clipdistance1), 0.0f) : 0.0f; - float t2 = (clipdistance2 < 0.0f) ? MIN(1.0f + clipdistance2 / (clipdistance1 - clipdistance2), 1.0f) : 1.0f; + float t1 = (clipdistance1 < 0.0f) ? max(-clipdistance1 / (clipdistance2 - clipdistance1), 0.0f) : 0.0f; + float t2 = (clipdistance2 < 0.0f) ? min(1.0f + clipdistance2 / (clipdistance1 - clipdistance2), 1.0f) : 1.0f; // add t1 vertex for (int k = 0; k < 3; k++) diff --git a/src/common/rendering/polyrenderer/drawers/poly_thread.h b/src/common/rendering/polyrenderer/drawers/poly_thread.h index 8d7b8bce6f..abaa43e32f 100644 --- a/src/common/rendering/polyrenderer/drawers/poly_thread.h +++ b/src/common/rendering/polyrenderer/drawers/poly_thread.h @@ -85,16 +85,16 @@ public: int skipped_by_thread(int first_line) { - int clip_first_line = MAX(first_line, numa_start_y); + int clip_first_line = max(first_line, numa_start_y); int core_skip = (num_cores - (clip_first_line - core) % num_cores) % num_cores; return clip_first_line + core_skip - first_line; } int count_for_thread(int first_line, int count) { - count = MIN(count, numa_end_y - first_line); + count = min(count, numa_end_y - first_line); int c = (count - skipped_by_thread(first_line) + num_cores - 1) / num_cores; - return MAX(c, 0); + return max(c, 0); } struct Scanline diff --git a/src/common/rendering/polyrenderer/drawers/screen_blend.cpp b/src/common/rendering/polyrenderer/drawers/screen_blend.cpp index afe5402890..536acb7b03 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_blend.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_blend.cpp @@ -336,10 +336,10 @@ void BlendColorAdd_Src_One(int y, int x0, int x1, PolyTriangleThreadData* thread uint32_t srcscale = APART(src); srcscale += srcscale >> 7; - uint32_t a = MIN((((APART(src) * srcscale) + 127) >> 8) + APART(dst), 255); - uint32_t r = MIN((((RPART(src) * srcscale) + 127) >> 8) + RPART(dst), 255); - uint32_t g = MIN((((GPART(src) * srcscale) + 127) >> 8) + GPART(dst), 255); - uint32_t b = MIN((((BPART(src) * srcscale) + 127) >> 8) + BPART(dst), 255); + uint32_t a = min((((APART(src) * srcscale) + 127) >> 8) + APART(dst), 255); + uint32_t r = min((((RPART(src) * srcscale) + 127) >> 8) + RPART(dst), 255); + uint32_t g = min((((GPART(src) * srcscale) + 127) >> 8) + GPART(dst), 255); + uint32_t b = min((((BPART(src) * srcscale) + 127) >> 8) + BPART(dst), 255); line[x] = MAKEARGB(a, r, g, b); } @@ -382,10 +382,10 @@ void BlendColorAdd_SrcCol_One(int y, int x0, int x1, PolyTriangleThreadData* thr srcscale_g += srcscale_g >> 7; srcscale_b += srcscale_b >> 7; - uint32_t a = MIN((((APART(src) * srcscale_a) + 127) >> 8) + APART(dst), 255); - uint32_t r = MIN((((RPART(src) * srcscale_r) + 127) >> 8) + RPART(dst), 255); - uint32_t g = MIN((((GPART(src) * srcscale_g) + 127) >> 8) + GPART(dst), 255); - uint32_t b = MIN((((BPART(src) * srcscale_b) + 127) >> 8) + BPART(dst), 255); + uint32_t a = min((((APART(src) * srcscale_a) + 127) >> 8) + APART(dst), 255); + uint32_t r = min((((RPART(src) * srcscale_r) + 127) >> 8) + RPART(dst), 255); + uint32_t g = min((((GPART(src) * srcscale_g) + 127) >> 8) + GPART(dst), 255); + uint32_t b = min((((BPART(src) * srcscale_b) + 127) >> 8) + BPART(dst), 255); line[x] = MAKEARGB(a, r, g, b); } @@ -514,10 +514,10 @@ void BlendColorRevSub_Src_One(int y, int x0, int x1, PolyTriangleThreadData* thr uint32_t srcscale = APART(src); srcscale += srcscale >> 7; - uint32_t a = MAX(APART(dst) - (((APART(src) * srcscale) + 127) >> 8), 0); - uint32_t r = MAX(RPART(dst) - (((RPART(src) * srcscale) + 127) >> 8), 0); - uint32_t g = MAX(GPART(dst) - (((GPART(src) * srcscale) + 127) >> 8), 0); - uint32_t b = MAX(BPART(dst) - (((BPART(src) * srcscale) + 127) >> 8), 0); + uint32_t a = max(APART(dst) - (((APART(src) * srcscale) + 127) >> 8), 0); + uint32_t r = max(RPART(dst) - (((RPART(src) * srcscale) + 127) >> 8), 0); + uint32_t g = max(GPART(dst) - (((GPART(src) * srcscale) + 127) >> 8), 0); + uint32_t b = max(BPART(dst) - (((BPART(src) * srcscale) + 127) >> 8), 0); line[x] = MAKEARGB(a, r, g, b); } diff --git a/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp b/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp index 5aa4855d67..bd53077921 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp @@ -124,7 +124,7 @@ static void WriteDynLightArray(int x0, int x1, PolyTriangleThreadData* thread) // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) __m128 Lx = _mm_sub_ps(lightposX, _mm_loadu_ps(&worldposX[x])); __m128 Ly = _mm_sub_ps(lightposY, _mm_loadu_ps(&worldposY[x])); __m128 Lz = _mm_sub_ps(lightposZ, _mm_loadu_ps(&worldposZ[x])); @@ -179,7 +179,7 @@ static void WriteDynLightArray(int x0, int x1, PolyTriangleThreadData* thread) // L = light-pos // dist = sqrt(dot(L, L)) - // distance_attenuation = 1 - MIN(dist * (1/radius), 1) + // distance_attenuation = 1 - min(dist * (1/radius), 1) float Lx = lightposX - worldposX[x]; float Ly = lightposY - worldposY[x]; float Lz = lightposZ - worldposZ[x]; @@ -191,7 +191,7 @@ static void WriteDynLightArray(int x0, int x1, PolyTriangleThreadData* thread) float rcp_dist = _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(dist2))); #endif float dist = dist2 * rcp_dist; - float distance_attenuation = 256.0f - MIN(dist * light_radius, 256.0f); + float distance_attenuation = 256.0f - min(dist * light_radius, 256.0f); // The simple light type float simple_attenuation = distance_attenuation; @@ -202,7 +202,7 @@ static void WriteDynLightArray(int x0, int x1, PolyTriangleThreadData* thread) Ly *= rcp_dist; Lz *= rcp_dist; float dotNL = worldnormalX * Lx + worldnormalY * Ly + worldnormalZ * Lz; - float point_attenuation = MAX(dotNL, 0.0f) * distance_attenuation; + float point_attenuation = max(dotNL, 0.0f) * distance_attenuation; uint32_t attenuation = (uint32_t)(is_attenuated ? (int32_t)point_attenuation : (int32_t)simple_attenuation); @@ -211,9 +211,9 @@ static void WriteDynLightArray(int x0, int x1, PolyTriangleThreadData* thread) lit_b += (BPART(light_color) * attenuation) >> 8; } - lit_r = MIN(lit_r, 255); - lit_g = MIN(lit_g, 255); - lit_b = MIN(lit_b, 255); + lit_r = min(lit_r, 255); + lit_g = min(lit_g, 255); + lit_b = min(lit_b, 255); lightarray[x] = MAKEARGB(lit_a, lit_r, lit_g, lit_b); // Palette version: @@ -255,7 +255,7 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar uint32_t* lightarray = thread->scanline.lightarray; for (int x = x0; x < x1; x++) { - uint32_t l = MIN(lightpos >> 8, 256); + uint32_t l = min(lightpos >> 8, 256); uint32_t r = vColorR[x]; uint32_t g = vColorG[x]; @@ -273,9 +273,9 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar g += (uint32_t)(constants->uDynLightColor.Y * 255.0f); b += (uint32_t)(constants->uDynLightColor.Z * 255.0f); - r = MIN(r, 255); - g = MIN(g, 255); - b = MIN(b, 255); + r = min(r, 255); + g = min(g, 255); + b = min(b, 255); } lightarray[x] = MAKEARGB(a, r, g, b); @@ -287,7 +287,7 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar uint32_t* lightarray = thread->scanline.lightarray; for (int x = x0; x < x1; x++) { - uint32_t l = MIN((FRACUNIT - clamp(shade - MIN(maxvis, lightpos), 0, maxlight)) >> 8, 256); + uint32_t l = min((FRACUNIT - clamp(shade - min(maxvis, lightpos), 0, maxlight)) >> 8, 256); uint32_t r = vColorR[x]; uint32_t g = vColorG[x]; uint32_t b = vColorB[x]; @@ -304,9 +304,9 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar g += (uint32_t)(constants->uDynLightColor.Y * 255.0f); b += (uint32_t)(constants->uDynLightColor.Z * 255.0f); - r = MIN(r, 255); - g = MIN(g, 255); - b = MIN(b, 255); + r = min(r, 255); + g = min(g, 255); + b = min(b, 255); } lightarray[x] = MAKEARGB(a, r, g, b); @@ -327,7 +327,7 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar uint32_t g = thread->scanline.vColorG[x]; uint32_t b = thread->scanline.vColorB[x]; - float fogdist = MAX(16.0f, w[x]); + float fogdist = max(16.0f, w[x]); float fogfactor = std::exp2(constants->uFogDensity * fogdist); // brightening around the player for light mode 2: @@ -365,9 +365,9 @@ static void WriteLightArray(int y, int x0, int x1, const TriDrawTriangleArgs* ar g += (uint32_t)(constants->uDynLightColor.Y * 255.0f); b += (uint32_t)(constants->uDynLightColor.Z * 255.0f); - r = MIN(r, 255); - g = MIN(g, 255); - b = MIN(b, 255); + r = min(r, 255); + g = min(g, 255); + b = min(b, 255); } lightarray[x] = MAKEARGB(a, r, g, b); diff --git a/src/common/rendering/polyrenderer/drawers/screen_shader.cpp b/src/common/rendering/polyrenderer/drawers/screen_shader.cpp index 7e225bef1f..023142cb94 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_shader.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_shader.cpp @@ -291,9 +291,9 @@ static void FuncNormal_AddColor(int x0, int x1, PolyTriangleThreadData* thread) uint32_t texel = fragcolor[x]; fragcolor[x] = MAKEARGB( APART(texel), - MIN(r + RPART(texel), (uint32_t)255), - MIN(g + GPART(texel), (uint32_t)255), - MIN(b + BPART(texel), (uint32_t)255)); + min(r + RPART(texel), (uint32_t)255), + min(g + GPART(texel), (uint32_t)255), + min(b + BPART(texel), (uint32_t)255)); } } @@ -309,9 +309,9 @@ static void FuncNormal_AddObjectColor(int x0, int x1, PolyTriangleThreadData* th uint32_t texel = fragcolor[x]; fragcolor[x] = MAKEARGB( APART(texel), - MIN((r * RPART(texel)) >> 8, (uint32_t)255), - MIN((g * GPART(texel)) >> 8, (uint32_t)255), - MIN((b * BPART(texel)) >> 8, (uint32_t)255)); + min((r * RPART(texel)) >> 8, (uint32_t)255), + min((g * GPART(texel)) >> 8, (uint32_t)255), + min((b * BPART(texel)) >> 8, (uint32_t)255)); } } @@ -331,9 +331,9 @@ static void FuncNormal_AddObjectColor2(int x0, int x1, PolyTriangleThreadData* t uint32_t texel = fragcolor[x]; fragcolor[x] = MAKEARGB( APART(texel), - MIN((r * RPART(texel)) >> 8, (uint32_t)255), - MIN((g * GPART(texel)) >> 8, (uint32_t)255), - MIN((b * BPART(texel)) >> 8, (uint32_t)255)); + min((r * RPART(texel)) >> 8, (uint32_t)255), + min((g * GPART(texel)) >> 8, (uint32_t)255), + min((b * BPART(texel)) >> 8, (uint32_t)255)); } } @@ -473,7 +473,7 @@ static void GetLightColor(int x0, int x1, PolyTriangleThreadData* thread) mulG += mulG >> 7; mulB += mulB >> 7; - float fogdist = MAX(16.0f, w[x]); + float fogdist = max(16.0f, w[x]); float fogfactor = std::exp2(uFogDensity * fogdist); uint32_t a = (APART(fg) * mulA + 127) >> 8; @@ -512,7 +512,7 @@ static void MainFP(int x0, int x1, PolyTriangleThreadData* thread) float fogfactor = 0.0f; if (constants->uFogEnabled != 0) { - fogdist = MAX(16.0f, w[x]); + fogdist = max(16.0f, w[x]); fogfactor = std::exp2(constants->uFogDensity * fogdist); } frag = vec4(uFogColor.rgb, (1.0 - fogfactor) * frag.a * 0.75 * vColor.a);*/ @@ -594,9 +594,9 @@ static void MainFP(int x0, int x1, PolyTriangleThreadData* thread) b = (BPART(fragcolor[x]) * b + 127) >> 8; // frag.rgb = frag.rgb + uFogColor.rgb; - r = MIN(r + fogR, (uint32_t)255); - g = MIN(g + fogG, (uint32_t)255); - b = MIN(b + fogB, (uint32_t)255); + r = min(r + fogR, (uint32_t)255); + g = min(g + fogG, (uint32_t)255); + b = min(b + fogB, (uint32_t)255); fragcolor[x] = MAKEARGB(a, r, g, b); } diff --git a/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp b/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp index 53c9afabed..dfa82fd2cb 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp @@ -207,17 +207,17 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs* args, PolyTriangleThreadDat SortVertices(args, sortedVertices); int clipleft = thread->clip.left; - int cliptop = MAX(thread->clip.top, thread->numa_start_y); + int cliptop = max(thread->clip.top, thread->numa_start_y); int clipright = thread->clip.right; - int clipbottom = MIN(thread->clip.bottom, thread->numa_end_y); + int clipbottom = min(thread->clip.bottom, thread->numa_end_y); int topY = (int)(sortedVertices[0]->y + 0.5f); int midY = (int)(sortedVertices[1]->y + 0.5f); int bottomY = (int)(sortedVertices[2]->y + 0.5f); - topY = MAX(topY, cliptop); - midY = MIN(midY, clipbottom); - bottomY = MIN(bottomY, clipbottom); + topY = max(topY, cliptop); + midY = min(midY, clipbottom); + bottomY = min(bottomY, clipbottom); if (topY >= bottomY) return; diff --git a/src/common/rendering/r_thread.h b/src/common/rendering/r_thread.h index 87319cf0cd..e5aea8541d 100644 --- a/src/common/rendering/r_thread.h +++ b/src/common/rendering/r_thread.h @@ -78,7 +78,7 @@ public: // The number of lines to skip to reach the first line to be rendered by this thread int skipped_by_thread(int first_line) { - int clip_first_line = MAX(first_line, numa_start_y); + int clip_first_line = max(first_line, numa_start_y); int core_skip = (num_cores - (clip_first_line - core) % num_cores) % num_cores; return clip_first_line + core_skip - first_line; } @@ -86,9 +86,9 @@ public: // The number of lines to be rendered by this thread int count_for_thread(int first_line, int count) { - count = MIN(count, numa_end_y - first_line); + count = min(count, numa_end_y - first_line); int c = (count - skipped_by_thread(first_line) + num_cores - 1) / num_cores; - return MAX(c, 0); + return max(c, 0); } // Calculate the dest address for the first line to be rendered by this thread diff --git a/src/common/rendering/r_videoscale.cpp b/src/common/rendering/r_videoscale.cpp index 1f5a7bb385..265003246c 100644 --- a/src/common/rendering/r_videoscale.cpp +++ b/src/common/rendering/r_videoscale.cpp @@ -193,7 +193,7 @@ int ViewportScaledWidth(int width, int height) width = ((float)width/height > ActiveRatio(width, height)) ? (int)(height * ActiveRatio(width, height)) : width; height = ((float)width/height < ActiveRatio(width, height)) ? (int)(width / ActiveRatio(width, height)) : height; } - return (int)std::max((int32_t)min_width, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledWidth(width, height))); + return (int)max((int32_t)min_width, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledWidth(width, height))); } int ViewportScaledHeight(int width, int height) @@ -205,7 +205,7 @@ int ViewportScaledHeight(int width, int height) height = ((float)width/height < ActiveRatio(width, height)) ? (int)(width / ActiveRatio(width, height)) : height; width = ((float)width/height > ActiveRatio(width, height)) ? (int)(height * ActiveRatio(width, height)) : width; } - return (int)std::max((int32_t)min_height, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledHeight(width, height))); + return (int)max((int32_t)min_height, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledHeight(width, height))); } float ViewportPixelAspect() diff --git a/src/common/rendering/v_framebuffer.cpp b/src/common/rendering/v_framebuffer.cpp index d1f148f1b7..c0ebb4c25d 100644 --- a/src/common/rendering/v_framebuffer.cpp +++ b/src/common/rendering/v_framebuffer.cpp @@ -186,7 +186,7 @@ void DFrameBuffer::SetViewportRects(IntRect *bounds) int screenWidth = GetWidth(); int screenHeight = GetHeight(); float scaleX, scaleY; - scaleX = std::min(clientWidth / (float)screenWidth, clientHeight / ((float)screenHeight * ViewportPixelAspect())); + scaleX = min(clientWidth / (float)screenWidth, clientHeight / ((float)screenHeight * ViewportPixelAspect())); scaleY = scaleX * ViewportPixelAspect(); mOutputLetterbox.width = (int)round(screenWidth * scaleX); mOutputLetterbox.height = (int)round(screenHeight * scaleY); diff --git a/src/common/rendering/v_video.cpp b/src/common/rendering/v_video.cpp index 0478944662..2d4e08942c 100644 --- a/src/common/rendering/v_video.cpp +++ b/src/common/rendering/v_video.cpp @@ -252,7 +252,7 @@ void DCanvas::Resize(int width, int height, bool optimizepitch) } else { - Pitch = width + MAX(0, CPU.DataL1LineSize - 8); + Pitch = width + max(0, CPU.DataL1LineSize - 8); } } int bytes_per_pixel = Bgra ? 4 : 1; @@ -275,7 +275,7 @@ void V_UpdateModeSize (int width, int height) // This reference size is being used so that on 800x450 (small 16:9) a scale of 2 gets used. - CleanXfac = std::max(std::min(screen->GetWidth() / 400, screen->GetHeight() / 240), 1); + CleanXfac = max(min(screen->GetWidth() / 400, screen->GetHeight() / 240), 1); if (CleanXfac >= 4) CleanXfac--; // Otherwise we do not have enough space for the episode/skill menus in some languages. CleanYfac = CleanXfac; CleanWidth = screen->GetWidth() / CleanXfac; @@ -292,7 +292,7 @@ void V_UpdateModeSize (int width, int height) else if (w < 1920) factor = 2; else factor = int(factor * 0.7); - CleanYfac_1 = CleanXfac_1 = factor;// MAX(1, int(factor * 0.7)); + CleanYfac_1 = CleanXfac_1 = factor;// max(1, int(factor * 0.7)); CleanWidth_1 = width / CleanXfac_1; CleanHeight_1 = height / CleanYfac_1; diff --git a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp index a2df4a28eb..c5ff778314 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp @@ -228,7 +228,7 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ColorMask = mColorMask; pipelineKey.CullMode = mCullMode; pipelineKey.NumTextureLayers = mMaterial.mMaterial ? mMaterial.mMaterial->NumLayers() : 0; - pipelineKey.NumTextureLayers = std::max(pipelineKey.NumTextureLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS);// Always force minimum 8 textures as the shader requires it + pipelineKey.NumTextureLayers = max(pipelineKey.NumTextureLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS);// Always force minimum 8 textures as the shader requires it if (mSpecialEffect > EFF_NONE) { pipelineKey.SpecialEffect = mSpecialEffect; diff --git a/src/common/rendering/vulkan/system/vk_buffers.cpp b/src/common/rendering/vulkan/system/vk_buffers.cpp index ce1ac503d8..420b19f878 100644 --- a/src/common/rendering/vulkan/system/vk_buffers.cpp +++ b/src/common/rendering/vulkan/system/vk_buffers.cpp @@ -73,7 +73,7 @@ void VKBuffer::SetData(size_t size, const void *data, BufferUsageType usage) { auto fb = GetVulkanFrameBuffer(); - size_t bufsize = std::max(size, (size_t)16); // For supporting zero byte buffers + size_t bufsize = max(size, (size_t)16); // For supporting zero byte buffers // If SetData is called multiple times we have to keep the old buffers alive as there might still be draw commands referencing them if (mBuffer) @@ -153,7 +153,7 @@ void VKBuffer::SetData(size_t size, const void *data, BufferUsageType usage) void VKBuffer::SetSubData(size_t offset, size_t size, const void *data) { - size = std::max(size, (size_t)16); // For supporting zero byte buffers + size = max(size, (size_t)16); // For supporting zero byte buffers auto fb = GetVulkanFrameBuffer(); if (mStaging) @@ -174,7 +174,7 @@ void VKBuffer::SetSubData(size_t offset, size_t size, const void *data) void VKBuffer::Resize(size_t newsize) { - newsize = std::max(newsize, (size_t)16); // For supporting zero byte buffers + newsize = max(newsize, (size_t)16); // For supporting zero byte buffers auto fb = GetVulkanFrameBuffer(); @@ -222,7 +222,7 @@ void VKBuffer::Unmap() void *VKBuffer::Lock(unsigned int size) { - size = std::max(size, (unsigned int)16); // For supporting zero byte buffers + size = max(size, (unsigned int)16); // For supporting zero byte buffers if (!mBuffer) { diff --git a/src/common/rendering/vulkan/system/vk_builders.h b/src/common/rendering/vulkan/system/vk_builders.h index af9cbc3ebc..0b053e8d88 100644 --- a/src/common/rendering/vulkan/system/vk_builders.h +++ b/src/common/rendering/vulkan/system/vk_builders.h @@ -571,7 +571,7 @@ inline BufferBuilder::BufferBuilder() inline void BufferBuilder::setSize(size_t size) { - bufferInfo.size = std::max(size, (size_t)16); + bufferInfo.size = max(size, (size_t)16); } inline void BufferBuilder::setUsage(VkBufferUsageFlags bufferUsage, VmaMemoryUsage memoryUsage, VmaAllocationCreateFlags allocFlags) diff --git a/src/common/rendering/vulkan/system/vk_framebuffer.cpp b/src/common/rendering/vulkan/system/vk_framebuffer.cpp index 131a3e6fb1..160876da47 100644 --- a/src/common/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_framebuffer.cpp @@ -309,7 +309,7 @@ void VulkanFrameBuffer::WaitForCommands(bool finish, bool uploadOnly) swapChain->QueuePresent(presentImageIndex, mRenderFinishedSemaphore.get()); } - int numWaitFences = MIN(mNextSubmit, (int)maxConcurrentSubmitCount); + int numWaitFences = min(mNextSubmit, (int)maxConcurrentSubmitCount); if (numWaitFences > 0) { @@ -345,8 +345,8 @@ void VulkanFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::functionGetWidth(), image->Image->width); - bounds.height = std::min(tex->GetHeight(), image->Image->height); + bounds.width = min(tex->GetWidth(), image->Image->width); + bounds.height = min(tex->GetHeight(), image->Image->height); renderFunc(bounds); @@ -628,7 +628,7 @@ void VulkanFrameBuffer::UpdateGpuStats() if (q.endIndex <= q.startIndex) continue; - int64_t timeElapsed = std::max(static_cast(timestamps[q.endIndex] - timestamps[q.startIndex]), (int64_t)0); + int64_t timeElapsed = max(static_cast(timestamps[q.endIndex] - timestamps[q.startIndex]), (int64_t)0); double timeNS = timeElapsed * timestampPeriod; FString out; diff --git a/src/common/rendering/vulkan/system/vk_swapchain.cpp b/src/common/rendering/vulkan/system/vk_swapchain.cpp index dcacd16206..789259695b 100644 --- a/src/common/rendering/vulkan/system/vk_swapchain.cpp +++ b/src/common/rendering/vulkan/system/vk_swapchain.cpp @@ -161,8 +161,8 @@ bool VulkanSwapChain::CreateSwapChain(VkSwapchainKHR oldSwapChain) VkSurfaceCapabilitiesKHR surfaceCapabilities = GetSurfaceCapabilities(); actualExtent = { static_cast(width), static_cast(height) }; - actualExtent.width = std::max(surfaceCapabilities.minImageExtent.width, std::min(surfaceCapabilities.maxImageExtent.width, actualExtent.width)); - actualExtent.height = std::max(surfaceCapabilities.minImageExtent.height, std::min(surfaceCapabilities.maxImageExtent.height, actualExtent.height)); + actualExtent.width = max(surfaceCapabilities.minImageExtent.width, min(surfaceCapabilities.maxImageExtent.width, actualExtent.width)); + actualExtent.height = max(surfaceCapabilities.minImageExtent.height, min(surfaceCapabilities.maxImageExtent.height, actualExtent.height)); if (actualExtent.width == 0 || actualExtent.height == 0) { swapChain = VK_NULL_HANDLE; @@ -176,9 +176,9 @@ bool VulkanSwapChain::CreateSwapChain(VkSwapchainKHR oldSwapChain) // When vsync is on we only want two images. This creates a slight performance penalty in exchange for reduced input latency (less mouse lag). // When vsync is off we want three images as it allows us to generate new images even during the vertical blanking period where one entry is being used by the presentation engine. if (swapChainPresentMode == VK_PRESENT_MODE_MAILBOX_KHR || swapChainPresentMode == VK_PRESENT_MODE_IMMEDIATE_KHR) - imageCount = std::min(imageCount, (uint32_t)3); + imageCount = min(imageCount, (uint32_t)3); else - imageCount = std::min(imageCount, (uint32_t)2); + imageCount = min(imageCount, (uint32_t)2); VkSwapchainCreateInfoKHR swapChainCreateInfo = {}; swapChainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp index dce6dcb6f6..c62a7173ea 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp @@ -218,8 +218,8 @@ int VkHardwareTexture::GetMipLevels(int w, int h) int levels = 1; while (w > 1 || h > 1) { - w = std::max(w >> 1, 1); - h = std::max(h >> 1, 1); + w = max(w >> 1, 1); + h = max(h >> 1, 1); levels++; } return levels; @@ -391,7 +391,7 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state) int numLayers = NumLayers(); auto fb = GetVulkanFrameBuffer(); - auto descriptor = fb->GetRenderPassManager()->AllocateTextureDescriptorSet(std::max(numLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS)); + auto descriptor = fb->GetRenderPassManager()->AllocateTextureDescriptorSet(max(numLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS)); descriptor->SetDebugName("VkHardwareTexture.mDescriptorSets"); diff --git a/src/common/rendering/vulkan/textures/vk_imagetransition.cpp b/src/common/rendering/vulkan/textures/vk_imagetransition.cpp index a135a3f0ff..a5f2892969 100644 --- a/src/common/rendering/vulkan/textures/vk_imagetransition.cpp +++ b/src/common/rendering/vulkan/textures/vk_imagetransition.cpp @@ -117,8 +117,8 @@ void VkTextureImage::GenerateMipmaps(VulkanCommandBuffer *cmdbuffer) barrier0.execute(cmdbuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); Layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - int nextWidth = std::max(mipWidth >> 1, 1); - int nextHeight = std::max(mipHeight >> 1, 1); + int nextWidth = max(mipWidth >> 1, 1); + int nextHeight = max(mipHeight >> 1, 1); VkImageBlit blit = {}; blit.srcOffsets[0] = { 0, 0, 0 }; diff --git a/src/common/scripting/backend/codegen.cpp b/src/common/scripting/backend/codegen.cpp index 5be4b48be6..2195d745ad 100644 --- a/src/common/scripting/backend/codegen.cpp +++ b/src/common/scripting/backend/codegen.cpp @@ -8896,7 +8896,7 @@ ExpEmit FxVMFunctionCall::Emit(VMFunctionBuilder *build) ArgList.ShrinkToFit(); if (!staticcall) emitters.SetVirtualReg(selfemit.RegNum); - int resultcount = vmfunc->Proto->ReturnTypes.Size() == 0 ? 0 : std::max(AssignCount, 1); + int resultcount = vmfunc->Proto->ReturnTypes.Size() == 0 ? 0 : max(AssignCount, 1); assert((unsigned)resultcount <= vmfunc->Proto->ReturnTypes.Size()); for (int i = 0; i < resultcount; i++) diff --git a/src/common/scripting/core/symbols.cpp b/src/common/scripting/core/symbols.cpp index c6e38551ff..0540c647c7 100644 --- a/src/common/scripting/core/symbols.cpp +++ b/src/common/scripting/core/symbols.cpp @@ -345,7 +345,7 @@ PField *PSymbolTable::AddField(FName name, PType *type, uint32_t flags, unsigned // its fields. if (Align != nullptr) { - *Align = MAX(*Align, type->Align); + *Align = max(*Align, type->Align); } if (AddSymbol(field) == nullptr) diff --git a/src/common/scripting/core/types.cpp b/src/common/scripting/core/types.cpp index 260aff1064..3fb97cb329 100644 --- a/src/common/scripting/core/types.cpp +++ b/src/common/scripting/core/types.cpp @@ -1702,7 +1702,7 @@ bool PArray::ReadValue(FSerializer &ar, const char *key, void *addr) const { bool readsomething = false; unsigned count = ar.ArraySize(); - unsigned loop = std::min(count, ElementCount); + unsigned loop = min(count, ElementCount); uint8_t *addrb = (uint8_t *)addr; for(unsigned i=0;iNumRegD, sfunc->NumRegF, sfunc->NumRegA, sfunc->NumRegS, sfunc->MaxParam); VMDumpConstants(dump, sfunc); diff --git a/src/common/scripting/interface/vmnatives.cpp b/src/common/scripting/interface/vmnatives.cpp index 13f3e2558e..77cd6b4b1c 100644 --- a/src/common/scripting/interface/vmnatives.cpp +++ b/src/common/scripting/interface/vmnatives.cpp @@ -80,7 +80,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, StatusbarToRealCoords, StatusbarTo if (numret > 1) ret[1].SetFloat(y); if (numret > 2) ret[2].SetFloat(w); if (numret > 3) ret[3].SetFloat(h); - return MIN(4, numret); + return min(4, numret); } void SBar_DrawTexture(DStatusBarCore* self, int texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY, int style, int color, int translation, double clipwidth) @@ -228,7 +228,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, TransformRect, SBar_TransformRect) if (numret > 1) ret[1].SetFloat(y); if (numret > 2) ret[2].SetFloat(w); if (numret > 3) ret[3].SetFloat(h); - return MIN(4, numret); + return min(4, numret); } static void SBar_Fill(DStatusBarCore* self, int color, double x, double y, double w, double h, int flags) @@ -437,7 +437,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, GetSize, GetTextureSize) x = GetTextureSize(texid, &y); if (numret > 0) ret[0].SetInt(x); if (numret > 1) ret[1].SetInt(y); - return MIN(numret, 2); + return min(numret, 2); } //========================================================================== @@ -941,7 +941,7 @@ DEFINE_ACTION_FUNCTION(FKeyBindings, GetKeysForCommand) self->GetKeysForCommand(cmd.GetChars(), &k1, &k2); if (numret > 0) ret[0].SetInt(k1); if (numret > 1) ret[1].SetInt(k2); - return MIN(numret, 2); + return min(numret, 2); } DEFINE_ACTION_FUNCTION(FKeyBindings, GetAllKeysForCommand) diff --git a/src/common/scripting/jit/jit_runtime.cpp b/src/common/scripting/jit/jit_runtime.cpp index b0a9dc488e..a646ebf9b0 100644 --- a/src/common/scripting/jit/jit_runtime.cpp +++ b/src/common/scripting/jit/jit_runtime.cpp @@ -56,7 +56,7 @@ static void *AllocJitMemory(size_t size) } else { - const size_t bytesToAllocate = std::max(size_t(1024 * 1024), size); + const size_t bytesToAllocate = max(size_t(1024 * 1024), size); size_t allocatedSize = 0; void *p = OSUtils::allocVirtualMemory(bytesToAllocate, &allocatedSize, OSUtils::kVMWritable | OSUtils::kVMExecutable); if (!p) @@ -803,7 +803,7 @@ static int CaptureStackTrace(int max_frames, void **out_frames) #elif defined(WIN32) // JIT isn't supported here, so just do nothing. - return 0;//return RtlCaptureStackBackTrace(0, MIN(max_frames, 32), out_frames, nullptr); + return 0;//return RtlCaptureStackBackTrace(0, min(max_frames, 32), out_frames, nullptr); #else return backtrace(out_frames, max_frames); #endif diff --git a/src/common/scripting/vm/vmframe.cpp b/src/common/scripting/vm/vmframe.cpp index 4b50f9b215..75dab6305f 100644 --- a/src/common/scripting/vm/vmframe.cpp +++ b/src/common/scripting/vm/vmframe.cpp @@ -746,7 +746,7 @@ ADD_STAT(VM) for (auto d : VMCycles) { added += d.TimeMS(); - peak = MAX(peak, d.TimeMS()); + peak = max(peak, d.TimeMS()); } for (auto d : VMCalls) addedc += d; memmove(&VMCycles[1], &VMCycles[0], 9 * sizeof(cycle_t)); diff --git a/src/common/statusbar/base_sbar.cpp b/src/common/statusbar/base_sbar.cpp index e63c21fb26..383e8a1480 100644 --- a/src/common/statusbar/base_sbar.cpp +++ b/src/common/statusbar/base_sbar.cpp @@ -293,11 +293,11 @@ static void ST_CalcCleanFacs(int designwidth, int designheight, int realwidth, i } // Use whichever pair of cwidth/cheight or width/height that produces less difference // between CleanXfac and CleanYfac. - cx1 = MAX(cwidth / designwidth, 1); - cy1 = MAX(cheight / designheight, 1); - cx2 = MAX(realwidth / designwidth, 1); - cy2 = MAX(realheight / designheight, 1); - if (abs(cx1 - cy1) <= abs(cx2 - cy2) || MAX(cx1, cx2) >= 4) + cx1 = max(cwidth / designwidth, 1); + cy1 = max(cheight / designheight, 1); + cx2 = max(realwidth / designwidth, 1); + cy2 = max(realheight / designheight, 1); + if (abs(cx1 - cy1) <= abs(cx2 - cy2) || max(cx1, cx2) >= 4) { // e.g. 640x360 looks better with this. *cleanx = cx1; *cleany = cy1; @@ -489,7 +489,7 @@ void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flag if (boxwidth <= 0 || (boxheight > 0 && scale2 < scale1)) scale1 = scale2; } - else scale1 = MIN(scale1, scale2); + else scale1 = min(scale1, scale2); boxwidth = texwidth * scale1; boxheight = texheight * scale1; diff --git a/src/common/textures/bitmap.h b/src/common/textures/bitmap.h index 36d5207712..dc20547789 100644 --- a/src/common/textures/bitmap.h +++ b/src/common/textures/bitmap.h @@ -460,7 +460,7 @@ struct bCopyAlpha struct bOverlay { static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = (s*a + d*(255-a))/255; } - static __forceinline void OpA(uint8_t &d, uint8_t s, FCopyInfo *i) { d = MAX(s,d); } + static __forceinline void OpA(uint8_t &d, uint8_t s, FCopyInfo *i) { d = max(s,d); } static __forceinline bool ProcessAlpha0() { return false; } }; @@ -473,21 +473,21 @@ struct bBlend struct bAdd { - static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = MIN((d*BLENDUNIT + s*i->alpha) >> BLENDBITS, 255); } + static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = min((d*BLENDUNIT + s*i->alpha) >> BLENDBITS, 255); } static __forceinline void OpA(uint8_t &d, uint8_t s, FCopyInfo *i) { d = s; } static __forceinline bool ProcessAlpha0() { return false; } }; struct bSubtract { - static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = MAX((d*BLENDUNIT - s*i->alpha) >> BLENDBITS, 0); } + static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = max((d*BLENDUNIT - s*i->alpha) >> BLENDBITS, 0); } static __forceinline void OpA(uint8_t &d, uint8_t s, FCopyInfo *i) { d = s; } static __forceinline bool ProcessAlpha0() { return false; } }; struct bReverseSubtract { - static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = MAX((-d*BLENDUNIT + s*i->alpha) >> BLENDBITS, 0); } + static __forceinline void OpC(uint8_t &d, uint8_t s, uint8_t a, FCopyInfo *i) { d = max((-d*BLENDUNIT + s*i->alpha) >> BLENDBITS, 0); } static __forceinline void OpA(uint8_t &d, uint8_t s, FCopyInfo *i) { d = s; } static __forceinline bool ProcessAlpha0() { return false; } }; diff --git a/src/common/textures/formats/fontchars.cpp b/src/common/textures/formats/fontchars.cpp index 44a72ca6e3..a486004374 100644 --- a/src/common/textures/formats/fontchars.cpp +++ b/src/common/textures/formats/fontchars.cpp @@ -113,7 +113,7 @@ TArray FFontChar2::CreatePalettedPixels(int) if (runlen != 0) { uint8_t color = lump.ReadUInt8(); - color = MIN(color, max); + color = min(color, max); *dest_p = color; dest_p += dest_adv; x--; @@ -137,7 +137,7 @@ TArray FFontChar2::CreatePalettedPixels(int) { uint8_t color = lump.ReadUInt8(); setlen = (-code) + 1; - setval = MIN(color, max); + setval = min(color, max); } } } diff --git a/src/common/textures/formats/pngtexture.cpp b/src/common/textures/formats/pngtexture.cpp index 294e218aaa..b16057a8d9 100644 --- a/src/common/textures/formats/pngtexture.cpp +++ b/src/common/textures/formats/pngtexture.cpp @@ -244,7 +244,7 @@ FPNGTexture::FPNGTexture (FileReader &lump, int lumpnum, int width, int height, break; case MAKE_ID('P','L','T','E'): - PaletteSize = MIN (len / 3, 256); + PaletteSize = min (len / 3, 256); StartOfPalette = (uint32_t)lump.Tell(); lump.Seek(len, FileReader::SeekCur); break; @@ -762,7 +762,7 @@ FBitmap FPNGFileTexture::GetBgraBitmap(const PalEntry *remap, int *trans) lump->Seek (len, FileReader::SeekCur); else { - PaletteSize = std::min (len / 3, 256); + PaletteSize = min (len / 3, 256); for(int i = 0; i < PaletteSize; i++) { pe[i].r = lump->ReadUInt8(); @@ -794,4 +794,4 @@ FBitmap FPNGFileTexture::GetBgraBitmap(const PalEntry *remap, int *trans) bmp.CopyPixelDataRGB(0, 0, Pixels.Data(), Width, Height, 3, pixwidth, 0, CF_RGB); } return bmp; -} +} \ No newline at end of file diff --git a/src/common/textures/formats/tgatexture.cpp b/src/common/textures/formats/tgatexture.cpp index 80c7b04a89..3f6c8b0d7c 100644 --- a/src/common/textures/formats/tgatexture.cpp +++ b/src/common/textures/formats/tgatexture.cpp @@ -153,7 +153,7 @@ void FTGATexture::ReadCompressed(FileReader &lump, uint8_t * buffer, int bytespe { b&=~128; lump.Read(data, bytesperpixel); - for (int i=MIN(Size, (b+1)); i>0; i--) + for (int i=min(Size, (b+1)); i>0; i--) { buffer[0] = data[0]; if (bytesperpixel>=2) buffer[1] = data[1]; @@ -164,7 +164,7 @@ void FTGATexture::ReadCompressed(FileReader &lump, uint8_t * buffer, int bytespe } else { - lump.Read(buffer, MIN(Size, (b+1))*bytesperpixel); + lump.Read(buffer, min(Size, (b+1))*bytesperpixel); buffer += (b+1)*bytesperpixel; } Size -= b+1; diff --git a/src/common/textures/hw_ihwtexture.cpp b/src/common/textures/hw_ihwtexture.cpp index f86daa5c16..296bfd40da 100644 --- a/src/common/textures/hw_ihwtexture.cpp +++ b/src/common/textures/hw_ihwtexture.cpp @@ -67,8 +67,8 @@ static void ResampleBoxPrecalc(TArray& boxes, int oldDim) const int src_p = int(dst * scale_factor_1); BoxPrecalc& precalc = boxes[dst]; - precalc.boxStart = clamp(int(src_p - scale_factor_1 / 2.0 + 1), 0, oldDim - 1); - precalc.boxEnd = clamp(max(precalc.boxStart + 1, int(src_p + scale_factor_2)), 0, oldDim - 1); + precalc.boxStart = std::clamp(int(src_p - scale_factor_1 / 2.0 + 1), 0, oldDim - 1); + precalc.boxEnd = std::clamp(std::max(precalc.boxStart + 1, int(src_p + scale_factor_2)), 0, oldDim - 1); } } diff --git a/src/common/textures/m_png.cpp b/src/common/textures/m_png.cpp index e58742da44..8467a5d424 100644 --- a/src/common/textures/m_png.cpp +++ b/src/common/textures/m_png.cpp @@ -246,7 +246,7 @@ bool M_AppendPNGText (FileWriter *file, const char *keyword, const char *text) { struct { uint32_t len, id; char key[80]; } head; int len = (int)strlen (text); - int keylen = std::min ((int)strlen (keyword), 79); + int keylen = min ((int)strlen (keyword), 79); uint32_t crc; head.len = BigLong(len + keylen + 1); @@ -329,7 +329,7 @@ char *M_GetPNGText (PNGHandle *png, const char *keyword) if (strncmp (keyword, png->TextChunks[i], 80) == 0) { // Woo! A match was found! - keylen = std::min (80, strlen (keyword) + 1); + keylen = min (80, strlen (keyword) + 1); textlen = strlen (png->TextChunks[i] + keylen) + 1; char *str = new char[textlen]; strcpy (str, png->TextChunks[i] + keylen); @@ -351,7 +351,7 @@ bool M_GetPNGText (PNGHandle *png, const char *keyword, char *buffer, size_t buf if (strncmp (keyword, png->TextChunks[i], 80) == 0) { // Woo! A match was found! - keylen = std::min (80, strlen (keyword) + 1); + keylen = min (80, strlen (keyword) + 1); strncpy (buffer, png->TextChunks[i] + keylen, buffsize); return true; } @@ -566,7 +566,7 @@ bool M_ReadIDAT (FileReader &file, uint8_t *buffer, int width, int height, int p if (stream.avail_in == 0 && chunklen > 0) { stream.next_in = chunkbuffer; - stream.avail_in = (uInt)file.Read (chunkbuffer, std::min(chunklen,sizeof(chunkbuffer))); + stream.avail_in = (uInt)file.Read (chunkbuffer, min(chunklen,sizeof(chunkbuffer))); chunklen -= stream.avail_in; } diff --git a/src/common/textures/texture.cpp b/src/common/textures/texture.cpp index 6d24f11549..6cee890dbf 100644 --- a/src/common/textures/texture.cpp +++ b/src/common/textures/texture.cpp @@ -387,7 +387,7 @@ FTextureBuffer FTexture::CreateTexBuffer(int translation, int flags) FContentIdBuilder builder; builder.id = 0; builder.imageID = GetImage()->GetId(); - builder.translation = MAX(0, translation); + builder.translation = max(0, translation); builder.expand = exx; result.mContentId = builder.id; } diff --git a/src/common/utility/cmdlib.cpp b/src/common/utility/cmdlib.cpp index 9551cbf42a..39a02af22b 100644 --- a/src/common/utility/cmdlib.cpp +++ b/src/common/utility/cmdlib.cpp @@ -248,7 +248,7 @@ bool GetFileInfo(const char* pathname, size_t *size, time_t *time) bool res = _wstat64(wstr.c_str(), &info) == 0; #endif if (!res || (info.st_mode & S_IFDIR)) return false; - if (size) *size = info.st_size; + if (size) *size = (size_t)info.st_size; if (time) *time = info.st_mtime; return res; } @@ -1060,7 +1060,7 @@ void md5Update(FileReader& file, MD5Context& md5, unsigned len) while (len > 0) { - t = std::min(len, sizeof(readbuf)); + t = min(len, sizeof(readbuf)); len -= t; t = (long)file.Read(readbuf, t); md5.Update(readbuf, t); diff --git a/src/common/utility/files_decompress.cpp b/src/common/utility/files_decompress.cpp index c79d762e69..2750768767 100644 --- a/src/common/utility/files_decompress.cpp +++ b/src/common/utility/files_decompress.cpp @@ -509,7 +509,7 @@ class DecompressorLZSS : public DecompressorBase // Partial overlap: Copy in 2 or 3 chunks. do { - unsigned int copy = std::min(len, pos+1); + unsigned int copy = min(len, pos+1); memcpy(Stream.InternalBuffer, copyStart, copy); Stream.InternalBuffer += copy; Stream.InternalOut += copy; @@ -575,7 +575,7 @@ public: break; } - unsigned int copy = std::min(Stream.InternalOut, AvailOut); + unsigned int copy = min(Stream.InternalOut, AvailOut); if(copy > 0) { memcpy(Out, Stream.WindowData, copy); diff --git a/src/common/utility/palette.cpp b/src/common/utility/palette.cpp index 3b6e71e553..e1869562cc 100644 --- a/src/common/utility/palette.cpp +++ b/src/common/utility/palette.cpp @@ -500,7 +500,7 @@ PalEntry averageColor(const uint32_t* data, int size, int maxout) g = g / size; b = b / size; - int maxv = MAX(MAX(r, g), b); + int maxv = max(max(r, g), b); if (maxv && maxout) { @@ -802,9 +802,9 @@ void UpdateSpecialColormap(PalEntry* BaseColors, unsigned int index, float r1, f BaseColors[c].g * 143 + BaseColors[c].b * 37) / 256.0; - PalEntry pe = PalEntry(std::min(255, int(r1 + intensity * r2)), - std::min(255, int(g1 + intensity * g2)), - std::min(255, int(b1 + intensity * b2))); + PalEntry pe = PalEntry(min(255, int(r1 + intensity * r2)), + min(255, int(g1 + intensity * g2)), + min(255, int(b1 + intensity * b2))); cm->Colormap[c] = BestColor((uint32_t*)BaseColors, pe.r, pe.g, pe.b); } @@ -813,9 +813,9 @@ void UpdateSpecialColormap(PalEntry* BaseColors, unsigned int index, float r1, f // This table is used by the texture composition code for (int i = 0; i < 256; i++) { - cm->GrayscaleToColor[i] = PalEntry(std::min(255, int(r1 + i * r2)), - std::min(255, int(g1 + i * g2)), - std::min(255, int(b1 + i * b2))); + cm->GrayscaleToColor[i] = PalEntry(min(255, int(r1 + i * r2)), + min(255, int(g1 + i * g2)), + min(255, int(b1 + i * b2))); } } @@ -911,7 +911,7 @@ int ReadPalette(int lumpnum, uint8_t* buffer) fr.Seek(len, FileReader::SeekCur); else { - int PaletteSize = MIN(len, 768); + int PaletteSize = min(len, 768); fr.Read(buffer, PaletteSize); return PaletteSize / 3; } @@ -930,7 +930,7 @@ int ReadPalette(int lumpnum, uint8_t* buffer) sc.MustGetString(); sc.MustGetNumber(); // version - ignore sc.MustGetNumber(); - int colors = MIN(256, sc.Number) * 3; + int colors = min(256, sc.Number) * 3; for (int i = 0; i < colors; i++) { sc.MustGetNumber(); @@ -944,7 +944,7 @@ int ReadPalette(int lumpnum, uint8_t* buffer) } else { - memcpy(buffer, lumpmem, MIN(768, lump.GetSize())); + memcpy(buffer, lumpmem, min(768, lump.GetSize())); return 256; } } diff --git a/src/common/utility/templates.h b/src/common/utility/templates.h index 7babf3f996..22b9f3d3f2 100644 --- a/src/common/utility/templates.h +++ b/src/common/utility/templates.h @@ -93,41 +93,5 @@ const ClassType *BinarySearch (const ClassType *first, int max, return NULL; } -//========================================================================== -// -// MIN -// -// Returns the minimum of a and b. -//========================================================================== - -#ifdef MIN -#undef MIN -#endif - -template -inline -const T MIN (const T a, const T b) -{ - return a < b ? a : b; -} - -//========================================================================== -// -// MAX -// -// Returns the maximum of a and b. -//========================================================================== - -#ifdef MAX -#undef MAX -#endif - -template -inline -const T MAX (const T a, const T b) -{ - return a > b ? a : b; -} - #endif //__TEMPLATES_H__ From 77d74a11d12c6e4e19d757c1e43d31f81752e2c1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 10:49:12 +0200 Subject: [PATCH 15/22] - removed most templates.h includes. --- src/am_map.cpp | 2 +- src/common/2d/v_2ddrawer.cpp | 2 +- src/common/2d/v_draw.cpp | 2 +- src/common/audio/music/i_music.cpp | 2 +- src/common/audio/sound/oalsound.cpp | 2 +- src/common/audio/sound/s_environment.cpp | 2 +- src/common/audio/sound/s_reverbedit.cpp | 2 +- src/common/audio/sound/s_sound.cpp | 2 +- src/common/console/c_bind.cpp | 2 +- src/common/console/c_buttons.cpp | 2 +- src/common/console/c_console.cpp | 2 +- src/common/console/c_dispatch.cpp | 2 +- src/common/engine/i_net.cpp | 2 +- src/common/engine/palettecontainer.cpp | 2 +- src/common/engine/sc_man.cpp | 4 ++-- src/common/filesystem/file_rff.cpp | 2 +- src/common/filesystem/file_zip.cpp | 2 +- src/common/fonts/font.cpp | 2 +- src/common/fonts/v_font.cpp | 2 +- src/common/menu/menudef.cpp | 2 +- src/common/objects/dobjgc.cpp | 2 +- src/common/platform/posix/cocoa/i_joystick.cpp | 2 +- src/common/platform/posix/sdl/i_joystick.cpp | 2 +- src/common/platform/win32/base_sysfb.cpp | 2 +- src/common/platform/win32/gl_sysfb.cpp | 2 +- src/common/platform/win32/i_dijoy.cpp | 2 +- src/common/platform/win32/i_rawps2.cpp | 2 +- src/common/platform/win32/i_system.cpp | 2 +- src/common/platform/win32/i_xinput.cpp | 2 +- src/common/platform/win32/st_start.cpp | 2 +- src/common/platform/win32/win32basevideo.cpp | 2 +- src/common/platform/win32/win32glvideo.cpp | 2 +- src/common/rendering/gl/gl_debug.cpp | 2 +- src/common/rendering/gl/gl_framebuffer.cpp | 2 +- src/common/rendering/gl/gl_hwtexture.cpp | 2 +- src/common/rendering/gl/gl_postprocess.cpp | 2 +- src/common/rendering/gl/gl_postprocessstate.cpp | 2 +- src/common/rendering/gl/gl_renderbuffers.cpp | 2 +- src/common/rendering/gl/gl_renderstate.cpp | 2 +- src/common/rendering/gl/gl_stereo3d.cpp | 2 +- src/common/rendering/gles/gles_framebuffer.cpp | 2 +- src/common/rendering/gles/gles_hwtexture.cpp | 2 +- src/common/rendering/gles/gles_postprocess.cpp | 2 +- src/common/rendering/gles/gles_postprocessstate.cpp | 2 +- src/common/rendering/gles/gles_renderbuffers.cpp | 2 +- src/common/rendering/gles/gles_renderstate.cpp | 2 +- .../rendering/hwrenderer/postprocessing/hw_postprocess.cpp | 2 +- src/common/rendering/i_modelvertexbuffer.h | 2 +- .../rendering/polyrenderer/backend/poly_framebuffer.cpp | 2 +- src/common/rendering/polyrenderer/backend/poly_hwtexture.cpp | 2 +- .../rendering/polyrenderer/backend/poly_renderstate.cpp | 2 +- src/common/rendering/polyrenderer/drawers/poly_thread.cpp | 2 +- src/common/rendering/polyrenderer/drawers/poly_triangle.cpp | 2 +- .../rendering/polyrenderer/drawers/screen_scanline_setup.cpp | 2 +- src/common/rendering/polyrenderer/drawers/screen_shader.cpp | 2 +- src/common/rendering/polyrenderer/drawers/screen_triangle.cpp | 2 +- src/common/rendering/r_thread.cpp | 2 +- src/common/rendering/r_thread.h | 2 +- src/common/rendering/r_videoscale.cpp | 2 +- src/common/rendering/v_video.cpp | 2 +- src/common/scripting/backend/codegen.cpp | 2 +- src/common/scripting/core/symbols.cpp | 2 +- src/common/scripting/core/vmdisasm.cpp | 2 +- src/common/scripting/frontend/zcc_parser.cpp | 2 +- src/common/scripting/interface/vmnatives.cpp | 2 +- src/common/scripting/vm/vmframe.cpp | 2 +- src/common/statusbar/base_sbar.cpp | 2 +- src/common/textures/animtexture.cpp | 2 +- src/common/textures/bitmap.h | 2 +- src/common/textures/formats/pngtexture.cpp | 2 +- src/common/textures/formats/tgatexture.cpp | 2 +- src/common/textures/gametexture.cpp | 2 +- src/common/textures/imagetexture.cpp | 2 +- src/common/textures/texture.cpp | 2 +- src/common/textures/texturemanager.cpp | 2 +- src/common/utility/files.cpp | 2 +- src/common/utility/files_decompress.cpp | 2 +- src/common/utility/palette.cpp | 2 +- src/common/utility/r_memory.cpp | 2 +- src/common/utility/s_playlist.cpp | 2 +- src/g_game.cpp | 2 +- src/g_level.cpp | 2 +- src/g_statusbar/hudmessages.cpp | 2 +- src/g_statusbar/shared_sbar.cpp | 2 +- src/gamedata/d_dehacked.cpp | 2 +- src/gamedata/decallib.cpp | 2 +- src/gamedata/g_mapinfo.cpp | 2 +- src/gamedata/r_defs.h | 2 +- src/gamedata/textures/anim_switches.cpp | 2 +- src/gamedata/textures/buildloader.cpp | 2 +- src/hu_scores.cpp | 2 +- src/intermission/intermission.cpp | 2 +- src/maploader/glnodes.cpp | 2 +- src/maploader/specials.cpp | 2 +- src/p_setup.cpp | 2 +- src/p_states.cpp | 1 + src/playsim/actor.h | 2 +- src/playsim/fragglescript/t_func.cpp | 2 +- src/playsim/mapthinkers/a_lightning.cpp | 2 +- src/playsim/mapthinkers/a_lights.cpp | 2 +- src/playsim/mapthinkers/a_quake.cpp | 2 +- src/playsim/p_3dfloors.cpp | 2 +- src/playsim/p_3dmidtex.cpp | 2 +- src/playsim/p_enemy.cpp | 2 +- src/playsim/p_linkedsectors.cpp | 2 +- src/playsim/p_map.cpp | 2 +- src/playsim/p_mobj.cpp | 2 +- src/playsim/p_pspr.cpp | 2 +- src/playsim/p_spec.cpp | 2 +- src/playsim/p_switch.cpp | 2 +- src/playsim/p_user.cpp | 2 +- src/r_data/colormaps.cpp | 2 +- src/r_data/gldefs.cpp | 2 +- src/r_data/r_translate.cpp | 2 +- src/r_data/r_vanillatrans.cpp | 2 +- src/r_data/v_palette.cpp | 2 +- src/rendering/2d/f_wipe.cpp | 2 +- src/rendering/2d/v_blend.cpp | 2 +- src/rendering/hwrenderer/scene/hw_lighting.h | 2 +- src/rendering/r_utility.cpp | 2 +- src/rendering/swrenderer/drawers/r_draw.cpp | 2 +- src/rendering/swrenderer/drawers/r_draw_pal.cpp | 2 +- src/rendering/swrenderer/drawers/r_draw_rgba.cpp | 2 +- src/rendering/swrenderer/line/r_farclip_line.cpp | 2 +- src/rendering/swrenderer/line/r_fogboundary.cpp | 2 +- src/rendering/swrenderer/line/r_line.cpp | 2 +- src/rendering/swrenderer/line/r_renderdrawsegment.cpp | 2 +- src/rendering/swrenderer/line/r_wallsetup.cpp | 2 +- src/rendering/swrenderer/plane/r_flatplane.cpp | 2 +- src/rendering/swrenderer/plane/r_planerenderer.cpp | 2 +- src/rendering/swrenderer/plane/r_skyplane.cpp | 2 +- src/rendering/swrenderer/plane/r_slopeplane.cpp | 2 +- src/rendering/swrenderer/plane/r_visibleplane.cpp | 2 +- src/rendering/swrenderer/plane/r_visibleplanelist.cpp | 2 +- src/rendering/swrenderer/r_renderthread.cpp | 2 +- src/rendering/swrenderer/r_swcolormaps.cpp | 2 +- src/rendering/swrenderer/scene/r_3dfloors.cpp | 2 +- src/rendering/swrenderer/scene/r_light.cpp | 2 +- src/rendering/swrenderer/scene/r_opaque_pass.cpp | 2 +- src/rendering/swrenderer/scene/r_portal.cpp | 2 +- src/rendering/swrenderer/scene/r_scene.cpp | 2 +- src/rendering/swrenderer/scene/r_translucent_pass.cpp | 2 +- src/rendering/swrenderer/segments/r_clipsegment.cpp | 2 +- src/rendering/swrenderer/segments/r_drawsegment.cpp | 2 +- src/rendering/swrenderer/segments/r_portalsegment.cpp | 2 +- src/rendering/swrenderer/things/r_decal.cpp | 2 +- src/rendering/swrenderer/things/r_model.cpp | 2 +- src/rendering/swrenderer/things/r_particle.cpp | 2 +- src/rendering/swrenderer/things/r_playersprite.cpp | 2 +- src/rendering/swrenderer/things/r_sprite.cpp | 2 +- src/rendering/swrenderer/things/r_visiblesprite.cpp | 2 +- src/rendering/swrenderer/things/r_visiblespritelist.cpp | 2 +- src/rendering/swrenderer/things/r_voxel.cpp | 2 +- src/rendering/swrenderer/things/r_wallsprite.cpp | 2 +- src/rendering/swrenderer/viewport/r_drawerargs.h | 2 +- src/rendering/swrenderer/viewport/r_viewport.cpp | 2 +- src/scripting/backend/codegen_doom.cpp | 2 +- src/sound/s_advsound.cpp | 2 +- src/win32/i_steam.cpp | 2 +- 159 files changed, 160 insertions(+), 159 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 148648ae8c..4259f0548b 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -29,7 +29,7 @@ #include #include "doomdef.h" -#include "templates.h" + #include "g_level.h" #include "st_stuff.h" #include "p_local.h" diff --git a/src/common/2d/v_2ddrawer.cpp b/src/common/2d/v_2ddrawer.cpp index ddbdba5382..1827123499 100644 --- a/src/common/2d/v_2ddrawer.cpp +++ b/src/common/2d/v_2ddrawer.cpp @@ -33,7 +33,7 @@ */ #include -#include "templates.h" + #include "v_2ddrawer.h" #include "vectors.h" #include "vm.h" diff --git a/src/common/2d/v_draw.cpp b/src/common/2d/v_draw.cpp index b35e7723a1..4a99b8cac0 100644 --- a/src/common/2d/v_draw.cpp +++ b/src/common/2d/v_draw.cpp @@ -36,7 +36,7 @@ #include #include "v_draw.h" #include "vm.h" -#include "templates.h" + #include "texturemanager.h" #include "r_videoscale.h" #include "c_cvars.h" diff --git a/src/common/audio/music/i_music.cpp b/src/common/audio/music/i_music.cpp index b73c630ca6..26989992da 100644 --- a/src/common/audio/music/i_music.cpp +++ b/src/common/audio/music/i_music.cpp @@ -43,7 +43,7 @@ #include "m_argv.h" #include "filesystem.h" #include "c_dispatch.h" -#include "templates.h" + #include "stats.h" #include "cmdlib.h" #include "c_cvars.h" diff --git a/src/common/audio/sound/oalsound.cpp b/src/common/audio/sound/oalsound.cpp index 96b01c7611..4ef36cb4d8 100644 --- a/src/common/audio/sound/oalsound.cpp +++ b/src/common/audio/sound/oalsound.cpp @@ -36,7 +36,7 @@ #include #include "c_cvars.h" -#include "templates.h" + #include "oalsound.h" #include "c_dispatch.h" #include "v_text.h" diff --git a/src/common/audio/sound/s_environment.cpp b/src/common/audio/sound/s_environment.cpp index d2e52e21a4..c5f1a5cf7f 100644 --- a/src/common/audio/sound/s_environment.cpp +++ b/src/common/audio/sound/s_environment.cpp @@ -34,7 +34,7 @@ #include "s_soundinternal.h" #include "sc_man.h" -#include "templates.h" + #include "cmdlib.h" diff --git a/src/common/audio/sound/s_reverbedit.cpp b/src/common/audio/sound/s_reverbedit.cpp index 25993a4000..398d4f2f59 100644 --- a/src/common/audio/sound/s_reverbedit.cpp +++ b/src/common/audio/sound/s_reverbedit.cpp @@ -36,7 +36,7 @@ #include "s_soundinternal.h" #include "sc_man.h" #include "cmdlib.h" -#include "templates.h" + #include "filesystem.h" #include "i_system.h" #include "printf.h" diff --git a/src/common/audio/sound/s_sound.cpp b/src/common/audio/sound/s_sound.cpp index 55e281be19..46119a3222 100644 --- a/src/common/audio/sound/s_sound.cpp +++ b/src/common/audio/sound/s_sound.cpp @@ -36,7 +36,7 @@ #include #include -#include "templates.h" + #include "s_soundinternal.h" #include "m_swap.h" #include "superfasthash.h" diff --git a/src/common/console/c_bind.cpp b/src/common/console/c_bind.cpp index b390dc1220..a83951cca2 100644 --- a/src/common/console/c_bind.cpp +++ b/src/common/console/c_bind.cpp @@ -41,7 +41,7 @@ #include "c_dispatch.h" #include "configfile.h" #include "filesystem.h" -#include "templates.h" + #include "i_time.h" #include "printf.h" #include "sc_man.h" diff --git a/src/common/console/c_buttons.cpp b/src/common/console/c_buttons.cpp index 0ea14dd463..860824ca5e 100644 --- a/src/common/console/c_buttons.cpp +++ b/src/common/console/c_buttons.cpp @@ -34,7 +34,7 @@ */ #include "c_buttons.h" -#include "templates.h" + #include "c_dispatch.h" #include "printf.h" #include "cmdlib.h" diff --git a/src/common/console/c_console.cpp b/src/common/console/c_console.cpp index 4a3abb172a..b40708808e 100644 --- a/src/common/console/c_console.cpp +++ b/src/common/console/c_console.cpp @@ -34,7 +34,7 @@ #include -#include "templates.h" + #include "version.h" #include "c_bind.h" #include "c_console.h" diff --git a/src/common/console/c_dispatch.cpp b/src/common/console/c_dispatch.cpp index c634492211..004c5be3ef 100644 --- a/src/common/console/c_dispatch.cpp +++ b/src/common/console/c_dispatch.cpp @@ -39,7 +39,7 @@ #include #include -#include "templates.h" + #include "cmdlib.h" #include "c_console.h" #include "c_dispatch.h" diff --git a/src/common/engine/i_net.cpp b/src/common/engine/i_net.cpp index 94388656f1..64fd4acaf8 100644 --- a/src/common/engine/i_net.cpp +++ b/src/common/engine/i_net.cpp @@ -75,7 +75,7 @@ #include "cmdlib.h" #include "printf.h" #include "i_interface.h" -#include "templates.h" + #include "i_net.h" diff --git a/src/common/engine/palettecontainer.cpp b/src/common/engine/palettecontainer.cpp index 4793fd67c7..73fb2bdb90 100644 --- a/src/common/engine/palettecontainer.cpp +++ b/src/common/engine/palettecontainer.cpp @@ -37,7 +37,7 @@ #include "m_crc32.h" #include "printf.h" #include "colormatcher.h" -#include "templates.h" + #include "palettecontainer.h" #include "files.h" diff --git a/src/common/engine/sc_man.cpp b/src/common/engine/sc_man.cpp index f24f25d929..29b0b445b7 100644 --- a/src/common/engine/sc_man.cpp +++ b/src/common/engine/sc_man.cpp @@ -40,11 +40,11 @@ #include "engineerrors.h" #include "sc_man.h" #include "cmdlib.h" -#include "templates.h" + #include "printf.h" #include "name.h" #include "v_text.h" -#include "templates.h" + #include "zstring.h" #include "name.h" #include diff --git a/src/common/filesystem/file_rff.cpp b/src/common/filesystem/file_rff.cpp index 61603c800a..e8c4fce814 100644 --- a/src/common/filesystem/file_rff.cpp +++ b/src/common/filesystem/file_rff.cpp @@ -34,7 +34,7 @@ */ #include "resourcefile.h" -#include "templates.h" + #include "printf.h" //========================================================================== diff --git a/src/common/filesystem/file_zip.cpp b/src/common/filesystem/file_zip.cpp index 32a3a78077..812e617830 100644 --- a/src/common/filesystem/file_zip.cpp +++ b/src/common/filesystem/file_zip.cpp @@ -36,7 +36,7 @@ #include #include "file_zip.h" #include "cmdlib.h" -#include "templates.h" + #include "printf.h" #include "w_zip.h" diff --git a/src/common/fonts/font.cpp b/src/common/fonts/font.cpp index 0e1a2d3fbb..9dc4fee33a 100644 --- a/src/common/fonts/font.cpp +++ b/src/common/fonts/font.cpp @@ -40,7 +40,7 @@ #include #include -#include "templates.h" + #include "m_swap.h" #include "v_font.h" #include "printf.h" diff --git a/src/common/fonts/v_font.cpp b/src/common/fonts/v_font.cpp index 0042f48c3e..a9c6d1cf67 100644 --- a/src/common/fonts/v_font.cpp +++ b/src/common/fonts/v_font.cpp @@ -39,7 +39,7 @@ #include #include -#include "templates.h" + #include "m_swap.h" #include "v_font.h" #include "filesystem.h" diff --git a/src/common/menu/menudef.cpp b/src/common/menu/menudef.cpp index ef3397df08..f22f9f9b75 100644 --- a/src/common/menu/menudef.cpp +++ b/src/common/menu/menudef.cpp @@ -50,7 +50,7 @@ #include "texturemanager.h" #include "printf.h" #include "i_interface.h" -#include "templates.h" + bool CheckSkipGameOptionBlock(FScanner& sc); diff --git a/src/common/objects/dobjgc.cpp b/src/common/objects/dobjgc.cpp index 8270286ef6..91cfafaef4 100644 --- a/src/common/objects/dobjgc.cpp +++ b/src/common/objects/dobjgc.cpp @@ -57,7 +57,7 @@ // HEADER FILES ------------------------------------------------------------ #include "dobject.h" -#include "templates.h" + #include "c_dispatch.h" #include "menu.h" #include "stats.h" diff --git a/src/common/platform/posix/cocoa/i_joystick.cpp b/src/common/platform/posix/cocoa/i_joystick.cpp index 9a003acac7..2bbfedb1d3 100644 --- a/src/common/platform/posix/cocoa/i_joystick.cpp +++ b/src/common/platform/posix/cocoa/i_joystick.cpp @@ -39,7 +39,7 @@ #include "i_system.h" #include "m_argv.h" #include "m_joy.h" -#include "templates.h" + #include "v_text.h" #include "printf.h" #include "keydef.h" diff --git a/src/common/platform/posix/sdl/i_joystick.cpp b/src/common/platform/posix/sdl/i_joystick.cpp index fe4b25eb64..0fa33ba636 100644 --- a/src/common/platform/posix/sdl/i_joystick.cpp +++ b/src/common/platform/posix/sdl/i_joystick.cpp @@ -34,7 +34,7 @@ #include "basics.h" #include "cmdlib.h" -#include "templates.h" + #include "m_joy.h" #include "keydef.h" diff --git a/src/common/platform/win32/base_sysfb.cpp b/src/common/platform/win32/base_sysfb.cpp index 3cb8858a33..9c9bb4a546 100644 --- a/src/common/platform/win32/base_sysfb.cpp +++ b/src/common/platform/win32/base_sysfb.cpp @@ -39,7 +39,7 @@ #include "gl_sysfb.h" #include "hardware.h" -#include "templates.h" + #include "version.h" #include "c_console.h" #include "v_video.h" diff --git a/src/common/platform/win32/gl_sysfb.cpp b/src/common/platform/win32/gl_sysfb.cpp index 17822d2130..8aa266883a 100644 --- a/src/common/platform/win32/gl_sysfb.cpp +++ b/src/common/platform/win32/gl_sysfb.cpp @@ -39,7 +39,7 @@ #include "gl_sysfb.h" #include "hardware.h" -#include "templates.h" + #include "version.h" #include "c_console.h" #include "v_video.h" diff --git a/src/common/platform/win32/i_dijoy.cpp b/src/common/platform/win32/i_dijoy.cpp index 79b6fcf8fd..e4021cc104 100644 --- a/src/common/platform/win32/i_dijoy.cpp +++ b/src/common/platform/win32/i_dijoy.cpp @@ -45,7 +45,7 @@ #include "i_input.h" #include "d_eventbase.h" -#include "templates.h" + #include "gameconfigfile.h" #include "cmdlib.h" #include "v_text.h" diff --git a/src/common/platform/win32/i_rawps2.cpp b/src/common/platform/win32/i_rawps2.cpp index 2a7547f3e1..90e575a715 100644 --- a/src/common/platform/win32/i_rawps2.cpp +++ b/src/common/platform/win32/i_rawps2.cpp @@ -38,7 +38,7 @@ #include "i_input.h" #include "d_eventbase.h" -#include "templates.h" + #include "gameconfigfile.h" #include "m_argv.h" #include "cmdlib.h" diff --git a/src/common/platform/win32/i_system.cpp b/src/common/platform/win32/i_system.cpp index e67f1c8a5c..1de30932d7 100644 --- a/src/common/platform/win32/i_system.cpp +++ b/src/common/platform/win32/i_system.cpp @@ -73,7 +73,7 @@ #include "i_input.h" #include "c_dispatch.h" -#include "templates.h" + #include "gameconfigfile.h" #include "v_font.h" #include "i_system.h" diff --git a/src/common/platform/win32/i_xinput.cpp b/src/common/platform/win32/i_xinput.cpp index 7085de82f4..2e8b79dc36 100644 --- a/src/common/platform/win32/i_xinput.cpp +++ b/src/common/platform/win32/i_xinput.cpp @@ -40,7 +40,7 @@ #include "i_input.h" #include "d_eventbase.h" -#include "templates.h" + #include "gameconfigfile.h" #include "m_argv.h" #include "cmdlib.h" diff --git a/src/common/platform/win32/st_start.cpp b/src/common/platform/win32/st_start.cpp index 8e8acaeffb..71ff4b1cd4 100644 --- a/src/common/platform/win32/st_start.cpp +++ b/src/common/platform/win32/st_start.cpp @@ -41,7 +41,7 @@ #include "st_start.h" #include "cmdlib.h" -#include "templates.h" + #include "i_system.h" #include "i_input.h" #include "hardware.h" diff --git a/src/common/platform/win32/win32basevideo.cpp b/src/common/platform/win32/win32basevideo.cpp index fc2ae67c42..b579b21f33 100644 --- a/src/common/platform/win32/win32basevideo.cpp +++ b/src/common/platform/win32/win32basevideo.cpp @@ -35,7 +35,7 @@ #include #include "hardware.h" -#include "templates.h" + #include "version.h" #include "c_console.h" #include "v_video.h" diff --git a/src/common/platform/win32/win32glvideo.cpp b/src/common/platform/win32/win32glvideo.cpp index abc9768cc6..3508f07da7 100644 --- a/src/common/platform/win32/win32glvideo.cpp +++ b/src/common/platform/win32/win32glvideo.cpp @@ -40,7 +40,7 @@ #include "gl_sysfb.h" #include "hardware.h" -#include "templates.h" + #include "version.h" #include "c_console.h" #include "v_video.h" diff --git a/src/common/rendering/gl/gl_debug.cpp b/src/common/rendering/gl/gl_debug.cpp index c6c3adbfc9..38625e73df 100644 --- a/src/common/rendering/gl/gl_debug.cpp +++ b/src/common/rendering/gl/gl_debug.cpp @@ -19,7 +19,7 @@ ** 3. This notice may not be removed or altered from any source distribution. */ -#include "templates.h" + #include "gl_system.h" #include "gl_debug.h" #include "stats.h" diff --git a/src/common/rendering/gl/gl_framebuffer.cpp b/src/common/rendering/gl/gl_framebuffer.cpp index 668965a111..4e1af90b2f 100644 --- a/src/common/rendering/gl/gl_framebuffer.cpp +++ b/src/common/rendering/gl/gl_framebuffer.cpp @@ -36,7 +36,7 @@ #include "gl_system.h" #include "v_video.h" #include "m_png.h" -#include "templates.h" + #include "i_time.h" #include "gl_interface.h" diff --git a/src/common/rendering/gl/gl_hwtexture.cpp b/src/common/rendering/gl/gl_hwtexture.cpp index 0043a67b81..a23ef82cc0 100644 --- a/src/common/rendering/gl/gl_hwtexture.cpp +++ b/src/common/rendering/gl/gl_hwtexture.cpp @@ -34,7 +34,7 @@ */ #include "gl_system.h" -#include "templates.h" + #include "c_cvars.h" #include "hw_material.h" diff --git a/src/common/rendering/gl/gl_postprocess.cpp b/src/common/rendering/gl/gl_postprocess.cpp index 949fee4b06..f5ec0bfaef 100644 --- a/src/common/rendering/gl/gl_postprocess.cpp +++ b/src/common/rendering/gl/gl_postprocess.cpp @@ -33,7 +33,7 @@ #include "flatvertices.h" #include "r_videoscale.h" #include "v_video.h" -#include "templates.h" + #include "hw_vrmodes.h" #include "v_draw.h" diff --git a/src/common/rendering/gl/gl_postprocessstate.cpp b/src/common/rendering/gl/gl_postprocessstate.cpp index 2e6a04f050..e490e87088 100644 --- a/src/common/rendering/gl/gl_postprocessstate.cpp +++ b/src/common/rendering/gl/gl_postprocessstate.cpp @@ -19,7 +19,7 @@ ** 3. This notice may not be removed or altered from any source distribution. */ -#include "templates.h" + #include "gl_system.h" #include "gl_interface.h" #include "gl_postprocessstate.h" diff --git a/src/common/rendering/gl/gl_renderbuffers.cpp b/src/common/rendering/gl/gl_renderbuffers.cpp index 134009fc46..08c3de3c1f 100644 --- a/src/common/rendering/gl/gl_renderbuffers.cpp +++ b/src/common/rendering/gl/gl_renderbuffers.cpp @@ -30,7 +30,7 @@ #include "gl_postprocessstate.h" #include "gl_shaderprogram.h" #include "gl_buffers.h" -#include "templates.h" + #include EXTERN_CVAR(Int, gl_debug_level) diff --git a/src/common/rendering/gl/gl_renderstate.cpp b/src/common/rendering/gl/gl_renderstate.cpp index c660fb98e1..d742f35fdc 100644 --- a/src/common/rendering/gl/gl_renderstate.cpp +++ b/src/common/rendering/gl/gl_renderstate.cpp @@ -25,7 +25,7 @@ ** */ -#include "templates.h" + #include "gl_system.h" #include "gl_interface.h" #include "hw_cvars.h" diff --git a/src/common/rendering/gl/gl_stereo3d.cpp b/src/common/rendering/gl/gl_stereo3d.cpp index c81a8e66a3..1d98874e3e 100644 --- a/src/common/rendering/gl/gl_stereo3d.cpp +++ b/src/common/rendering/gl/gl_stereo3d.cpp @@ -34,7 +34,7 @@ #include "gl_framebuffer.h" #include "gl_shaderprogram.h" #include "gl_buffers.h" -#include "templates.h" + EXTERN_CVAR(Int, vr_mode) EXTERN_CVAR(Float, vid_saturation) diff --git a/src/common/rendering/gles/gles_framebuffer.cpp b/src/common/rendering/gles/gles_framebuffer.cpp index 80c252b63d..3391a6f024 100644 --- a/src/common/rendering/gles/gles_framebuffer.cpp +++ b/src/common/rendering/gles/gles_framebuffer.cpp @@ -36,7 +36,7 @@ #include "gles_system.h" #include "v_video.h" #include "m_png.h" -#include "templates.h" + #include "i_time.h" #include "gles_framebuffer.h" diff --git a/src/common/rendering/gles/gles_hwtexture.cpp b/src/common/rendering/gles/gles_hwtexture.cpp index 00370481b6..a342f24c24 100644 --- a/src/common/rendering/gles/gles_hwtexture.cpp +++ b/src/common/rendering/gles/gles_hwtexture.cpp @@ -34,7 +34,7 @@ */ #include "gles_system.h" -#include "templates.h" + #include "c_cvars.h" #include "hw_material.h" diff --git a/src/common/rendering/gles/gles_postprocess.cpp b/src/common/rendering/gles/gles_postprocess.cpp index 7292ef2280..b53de2f50d 100644 --- a/src/common/rendering/gles/gles_postprocess.cpp +++ b/src/common/rendering/gles/gles_postprocess.cpp @@ -32,7 +32,7 @@ #include "flatvertices.h" #include "r_videoscale.h" #include "v_video.h" -#include "templates.h" + #include "hw_vrmodes.h" #include "v_draw.h" diff --git a/src/common/rendering/gles/gles_postprocessstate.cpp b/src/common/rendering/gles/gles_postprocessstate.cpp index 2164061258..ea89218375 100644 --- a/src/common/rendering/gles/gles_postprocessstate.cpp +++ b/src/common/rendering/gles/gles_postprocessstate.cpp @@ -19,7 +19,7 @@ ** 3. This notice may not be removed or altered from any source distribution. */ -#include "templates.h" + #include "gles_system.h" #include "gles_postprocessstate.h" diff --git a/src/common/rendering/gles/gles_renderbuffers.cpp b/src/common/rendering/gles/gles_renderbuffers.cpp index 91f8ce4620..1d8147ae11 100644 --- a/src/common/rendering/gles/gles_renderbuffers.cpp +++ b/src/common/rendering/gles/gles_renderbuffers.cpp @@ -28,7 +28,7 @@ #include "gles_postprocessstate.h" #include "gles_shaderprogram.h" #include "gles_buffers.h" -#include "templates.h" + #include EXTERN_CVAR(Int, gl_debug_level) diff --git a/src/common/rendering/gles/gles_renderstate.cpp b/src/common/rendering/gles/gles_renderstate.cpp index 0a9e4ca138..961ec8121a 100644 --- a/src/common/rendering/gles/gles_renderstate.cpp +++ b/src/common/rendering/gles/gles_renderstate.cpp @@ -25,7 +25,7 @@ ** */ -#include "templates.h" + #include "gles_system.h" #include "hw_cvars.h" #include "flatvertices.h" diff --git a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp index 2c6b262aba..5034b79359 100644 --- a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp +++ b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp @@ -26,7 +26,7 @@ #include "hwrenderer/postprocessing/hw_postprocessshader.h" #include #include "texturemanager.h" -#include "templates.h" + #include "stats.h" Postprocess hw_postprocess; diff --git a/src/common/rendering/i_modelvertexbuffer.h b/src/common/rendering/i_modelvertexbuffer.h index febec3c71b..aea703c272 100644 --- a/src/common/rendering/i_modelvertexbuffer.h +++ b/src/common/rendering/i_modelvertexbuffer.h @@ -1,6 +1,6 @@ #pragma once -#include "templates.h" + struct FModelVertex { diff --git a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp index 6837865707..cbe49da6fd 100644 --- a/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_framebuffer.cpp @@ -22,7 +22,7 @@ #include "v_video.h" #include "m_png.h" -#include "templates.h" + #include "r_videoscale.h" #include "i_time.h" #include "v_text.h" diff --git a/src/common/rendering/polyrenderer/backend/poly_hwtexture.cpp b/src/common/rendering/polyrenderer/backend/poly_hwtexture.cpp index 0e56303fe7..3b931aa467 100644 --- a/src/common/rendering/polyrenderer/backend/poly_hwtexture.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_hwtexture.cpp @@ -20,7 +20,7 @@ ** */ -#include "templates.h" + #include "c_cvars.h" #include "hw_material.h" #include "hw_cvars.h" diff --git a/src/common/rendering/polyrenderer/backend/poly_renderstate.cpp b/src/common/rendering/polyrenderer/backend/poly_renderstate.cpp index 14077e4893..38411e5597 100644 --- a/src/common/rendering/polyrenderer/backend/poly_renderstate.cpp +++ b/src/common/rendering/polyrenderer/backend/poly_renderstate.cpp @@ -23,7 +23,7 @@ #include "polyrenderer/backend/poly_renderstate.h" #include "polyrenderer/backend/poly_framebuffer.h" #include "polyrenderer/backend/poly_hwtexture.h" -#include "templates.h" + #include "hw_skydome.h" #include "hw_viewpointuniforms.h" #include "hw_lightbuffer.h" diff --git a/src/common/rendering/polyrenderer/drawers/poly_thread.cpp b/src/common/rendering/polyrenderer/drawers/poly_thread.cpp index 38faabafbc..502705ca5f 100644 --- a/src/common/rendering/polyrenderer/drawers/poly_thread.cpp +++ b/src/common/rendering/polyrenderer/drawers/poly_thread.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "filesystem.h" #include "v_video.h" diff --git a/src/common/rendering/polyrenderer/drawers/poly_triangle.cpp b/src/common/rendering/polyrenderer/drawers/poly_triangle.cpp index 986ac946a2..8c142a06d4 100644 --- a/src/common/rendering/polyrenderer/drawers/poly_triangle.cpp +++ b/src/common/rendering/polyrenderer/drawers/poly_triangle.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "filesystem.h" #include "v_video.h" diff --git a/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp b/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp index bd53077921..6cb9ee2cb1 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "poly_thread.h" #include "screen_scanline_setup.h" #include diff --git a/src/common/rendering/polyrenderer/drawers/screen_shader.cpp b/src/common/rendering/polyrenderer/drawers/screen_shader.cpp index 023142cb94..00ba5d7430 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_shader.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_shader.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "poly_thread.h" #include "screen_scanline_setup.h" #include diff --git a/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp b/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp index dfa82fd2cb..9cfa4b5c26 100644 --- a/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp +++ b/src/common/rendering/polyrenderer/drawers/screen_triangle.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "filesystem.h" #include "v_video.h" diff --git a/src/common/rendering/r_thread.cpp b/src/common/rendering/r_thread.cpp index 0415bd40c3..09ecde78b2 100644 --- a/src/common/rendering/r_thread.cpp +++ b/src/common/rendering/r_thread.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "i_system.h" #include "filesystem.h" #include "v_video.h" diff --git a/src/common/rendering/r_thread.h b/src/common/rendering/r_thread.h index e5aea8541d..f1e49d4166 100644 --- a/src/common/rendering/r_thread.h +++ b/src/common/rendering/r_thread.h @@ -27,7 +27,7 @@ #include #include #include -#include "templates.h" + #include "c_cvars.h" #include "basics.h" diff --git a/src/common/rendering/r_videoscale.cpp b/src/common/rendering/r_videoscale.cpp index 265003246c..f94621e9da 100644 --- a/src/common/rendering/r_videoscale.cpp +++ b/src/common/rendering/r_videoscale.cpp @@ -34,7 +34,7 @@ #include "c_dispatch.h" #include "c_cvars.h" #include "v_video.h" -#include "templates.h" + #include "r_videoscale.h" #include "cmdlib.h" #include "v_draw.h" diff --git a/src/common/rendering/v_video.cpp b/src/common/rendering/v_video.cpp index 2d4e08942c..4a86385939 100644 --- a/src/common/rendering/v_video.cpp +++ b/src/common/rendering/v_video.cpp @@ -61,7 +61,7 @@ #include "texturemanager.h" #include "i_interface.h" #include "v_draw.h" -#include "templates.h" + EXTERN_CVAR(Int, menu_resolution_custom_width) EXTERN_CVAR(Int, menu_resolution_custom_height) diff --git a/src/common/scripting/backend/codegen.cpp b/src/common/scripting/backend/codegen.cpp index 2195d745ad..185c79d598 100644 --- a/src/common/scripting/backend/codegen.cpp +++ b/src/common/scripting/backend/codegen.cpp @@ -43,7 +43,7 @@ #include "texturemanager.h" #include "m_random.h" #include "v_font.h" -#include "templates.h" + extern FRandom pr_exrandom; FMemArena FxAlloc(65536); diff --git a/src/common/scripting/core/symbols.cpp b/src/common/scripting/core/symbols.cpp index 0540c647c7..be0b11e185 100644 --- a/src/common/scripting/core/symbols.cpp +++ b/src/common/scripting/core/symbols.cpp @@ -35,7 +35,7 @@ #include #include "dobject.h" -#include "templates.h" + #include "serializer.h" #include "types.h" #include "vm.h" diff --git a/src/common/scripting/core/vmdisasm.cpp b/src/common/scripting/core/vmdisasm.cpp index 8fbf0aa8b8..0f68b3a1d6 100644 --- a/src/common/scripting/core/vmdisasm.cpp +++ b/src/common/scripting/core/vmdisasm.cpp @@ -33,7 +33,7 @@ #include "dobject.h" #include "c_console.h" -#include "templates.h" + #include "vmintern.h" #include "printf.h" diff --git a/src/common/scripting/frontend/zcc_parser.cpp b/src/common/scripting/frontend/zcc_parser.cpp index e176c646e3..0d19286533 100644 --- a/src/common/scripting/frontend/zcc_parser.cpp +++ b/src/common/scripting/frontend/zcc_parser.cpp @@ -40,7 +40,7 @@ #include "version.h" #include "zcc_parser.h" #include "zcc_compile.h" -#include "templates.h" + TArray Includes; TArray IncludeLocs; diff --git a/src/common/scripting/interface/vmnatives.cpp b/src/common/scripting/interface/vmnatives.cpp index 77cd6b4b1c..c326b2e1b4 100644 --- a/src/common/scripting/interface/vmnatives.cpp +++ b/src/common/scripting/interface/vmnatives.cpp @@ -41,7 +41,7 @@ #include "c_cvars.h" #include "c_bind.h" #include "c_dispatch.h" -#include "templates.h" + #include "menu.h" #include "vm.h" #include "gstrings.h" diff --git a/src/common/scripting/vm/vmframe.cpp b/src/common/scripting/vm/vmframe.cpp index 75dab6305f..1fc82549d6 100644 --- a/src/common/scripting/vm/vmframe.cpp +++ b/src/common/scripting/vm/vmframe.cpp @@ -37,7 +37,7 @@ #include "v_text.h" #include "stats.h" #include "c_dispatch.h" -#include "templates.h" + #include "vmintern.h" #include "types.h" #include "jit.h" diff --git a/src/common/statusbar/base_sbar.cpp b/src/common/statusbar/base_sbar.cpp index 383e8a1480..9ea4a6d260 100644 --- a/src/common/statusbar/base_sbar.cpp +++ b/src/common/statusbar/base_sbar.cpp @@ -35,7 +35,7 @@ #include -#include "templates.h" + #include "base_sbar.h" #include "printf.h" #include "v_draw.h" diff --git a/src/common/textures/animtexture.cpp b/src/common/textures/animtexture.cpp index 8f8add3f7b..0390216413 100644 --- a/src/common/textures/animtexture.cpp +++ b/src/common/textures/animtexture.cpp @@ -34,7 +34,7 @@ #include "animtexture.h" #include "bitmap.h" #include "texturemanager.h" -#include "templates.h" + //========================================================================== // diff --git a/src/common/textures/bitmap.h b/src/common/textures/bitmap.h index dc20547789..88df40307b 100644 --- a/src/common/textures/bitmap.h +++ b/src/common/textures/bitmap.h @@ -37,7 +37,7 @@ #define __BITMAP_H__ #include "basics.h" -#include "templates.h" + #include "palentry.h" struct FCopyInfo; diff --git a/src/common/textures/formats/pngtexture.cpp b/src/common/textures/formats/pngtexture.cpp index b16057a8d9..dd0976a8e5 100644 --- a/src/common/textures/formats/pngtexture.cpp +++ b/src/common/textures/formats/pngtexture.cpp @@ -35,7 +35,7 @@ */ #include "files.h" -#include "templates.h" + #include "m_png.h" #include "bitmap.h" #include "imagehelpers.h" diff --git a/src/common/textures/formats/tgatexture.cpp b/src/common/textures/formats/tgatexture.cpp index 3f6c8b0d7c..d2e12e1aa3 100644 --- a/src/common/textures/formats/tgatexture.cpp +++ b/src/common/textures/formats/tgatexture.cpp @@ -35,7 +35,7 @@ #include "files.h" #include "filesystem.h" -#include "templates.h" + #include "bitmap.h" #include "imagehelpers.h" #include "image.h" diff --git a/src/common/textures/gametexture.cpp b/src/common/textures/gametexture.cpp index 29d1ee2dd4..c5979a7a97 100644 --- a/src/common/textures/gametexture.cpp +++ b/src/common/textures/gametexture.cpp @@ -37,7 +37,7 @@ #include "printf.h" #include "files.h" #include "filesystem.h" -#include "templates.h" + #include "textures.h" #include "bitmap.h" #include "colormatcher.h" diff --git a/src/common/textures/imagetexture.cpp b/src/common/textures/imagetexture.cpp index 5ec15c7b59..261333c98b 100644 --- a/src/common/textures/imagetexture.cpp +++ b/src/common/textures/imagetexture.cpp @@ -35,7 +35,7 @@ #include "files.h" #include "filesystem.h" -#include "templates.h" + #include "bitmap.h" #include "image.h" #include "textures.h" diff --git a/src/common/textures/texture.cpp b/src/common/textures/texture.cpp index 6cee890dbf..5b88c3cef0 100644 --- a/src/common/textures/texture.cpp +++ b/src/common/textures/texture.cpp @@ -37,7 +37,7 @@ #include "printf.h" #include "files.h" #include "filesystem.h" -#include "templates.h" + #include "textures.h" #include "bitmap.h" #include "colormatcher.h" diff --git a/src/common/textures/texturemanager.cpp b/src/common/textures/texturemanager.cpp index c4fcfd8412..65e267b842 100644 --- a/src/common/textures/texturemanager.cpp +++ b/src/common/textures/texturemanager.cpp @@ -37,7 +37,7 @@ #include "filesystem.h" #include "printf.h" #include "c_cvars.h" -#include "templates.h" + #include "gstrings.h" #include "textures.h" #include "texturemanager.h" diff --git a/src/common/utility/files.cpp b/src/common/utility/files.cpp index e932622146..6f915a2ceb 100644 --- a/src/common/utility/files.cpp +++ b/src/common/utility/files.cpp @@ -34,7 +34,7 @@ */ #include "files.h" -#include "templates.h" // just for 'clamp' + // just for 'clamp' #include "zstring.h" diff --git a/src/common/utility/files_decompress.cpp b/src/common/utility/files_decompress.cpp index 2750768767..7d7d65442d 100644 --- a/src/common/utility/files_decompress.cpp +++ b/src/common/utility/files_decompress.cpp @@ -42,7 +42,7 @@ #include #include "files.h" -#include "templates.h" + #include "zstring.h" #include "cmdlib.h" diff --git a/src/common/utility/palette.cpp b/src/common/utility/palette.cpp index e1869562cc..28115a5213 100644 --- a/src/common/utility/palette.cpp +++ b/src/common/utility/palette.cpp @@ -39,7 +39,7 @@ #include "files.h" #include "filesystem.h" #include "printf.h" -#include "templates.h" + #include "m_png.h" /****************************/ diff --git a/src/common/utility/r_memory.cpp b/src/common/utility/r_memory.cpp index 99a75d0f7a..383cdbeb4c 100644 --- a/src/common/utility/r_memory.cpp +++ b/src/common/utility/r_memory.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "r_memory.h" #include diff --git a/src/common/utility/s_playlist.cpp b/src/common/utility/s_playlist.cpp index d284a3e900..d457d01376 100644 --- a/src/common/utility/s_playlist.cpp +++ b/src/common/utility/s_playlist.cpp @@ -37,7 +37,7 @@ #include "cmdlib.h" #include "s_playlist.h" -#include "templates.h" + #include "v_text.h" #include "files.h" diff --git a/src/g_game.cpp b/src/g_game.cpp index fe49f74a8c..dac60dbf34 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -29,7 +29,7 @@ #include #include "i_time.h" -#include "templates.h" + #include "version.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/g_level.cpp b/src/g_level.cpp index 5247c49686..011b778e2c 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -33,7 +33,7 @@ */ #include -#include "templates.h" + #include "d_main.h" #include "g_level.h" #include "g_game.h" diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index f35832528f..ccf6174c30 100644 --- a/src/g_statusbar/hudmessages.cpp +++ b/src/g_statusbar/hudmessages.cpp @@ -32,7 +32,7 @@ ** */ -#include "templates.h" + #include "doomdef.h" #include "sbar.h" #include "c_cvars.h" diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 74811fada4..d4b94f3a4b 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -35,7 +35,7 @@ #include -#include "templates.h" + #include "sbar.h" #include "c_cvars.h" #include "c_dispatch.h" diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index a82146ad54..8dd52cf958 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -44,7 +44,7 @@ #include #include "doomtype.h" -#include "templates.h" + #include "doomstat.h" #include "info.h" #include "d_dehacked.h" diff --git a/src/gamedata/decallib.cpp b/src/gamedata/decallib.cpp index 8079455456..e765959b8f 100644 --- a/src/gamedata/decallib.cpp +++ b/src/gamedata/decallib.cpp @@ -40,7 +40,7 @@ #include "m_random.h" #include "weightedlist.h" #include "statnums.h" -#include "templates.h" + #include "a_sharedglobal.h" #include "gi.h" #include "b_bot.h" diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 3b823c59e4..ef526b3018 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -34,7 +34,7 @@ */ #include -#include "templates.h" + #include "g_level.h" #include "filesystem.h" #include "cmdlib.h" diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index c2606635ad..7ab94f58f9 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -31,7 +31,7 @@ #define __R_DEFS_H__ #include "doomdef.h" -#include "templates.h" + #include "m_bbox.h" #include "dobjgc.h" #include "r_data/r_translate.h" diff --git a/src/gamedata/textures/anim_switches.cpp b/src/gamedata/textures/anim_switches.cpp index 7767539abf..21c6ff14ef 100644 --- a/src/gamedata/textures/anim_switches.cpp +++ b/src/gamedata/textures/anim_switches.cpp @@ -32,7 +32,7 @@ ** */ -#include "templates.h" + #include "textures.h" #include "s_sound.h" #include "r_state.h" diff --git a/src/gamedata/textures/buildloader.cpp b/src/gamedata/textures/buildloader.cpp index 78c6a6af72..bfcc632251 100644 --- a/src/gamedata/textures/buildloader.cpp +++ b/src/gamedata/textures/buildloader.cpp @@ -36,7 +36,7 @@ #include "files.h" #include "filesystem.h" -#include "templates.h" + #include "cmdlib.h" #include "colormatcher.h" #include "bitmap.h" diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 68dd60c330..c7fa10cdb0 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -37,7 +37,7 @@ #include "c_console.h" #include "teaminfo.h" -#include "templates.h" + #include "v_video.h" #include "doomstat.h" #include "g_level.h" diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 2a63588e52..64a5388781 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -50,7 +50,7 @@ #include "d_net.h" #include "g_levellocals.h" #include "utf8.h" -#include "templates.h" + #include "s_music.h" #include "texturemanager.h" #include "v_draw.h" diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index 2ab09e9294..21da9462a3 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -43,7 +43,7 @@ #endif #include -#include "templates.h" + #include "m_argv.h" #include "c_dispatch.h" #include "m_swap.h" diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index d0fa1d5a9f..b0a0761310 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -67,7 +67,7 @@ #include -#include "templates.h" + #include "doomdef.h" #include "doomstat.h" #include "d_event.h" diff --git a/src/p_setup.cpp b/src/p_setup.cpp index d05865820c..41aaa4aa5e 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -30,7 +30,7 @@ #include // for alloca() #endif -#include "templates.h" + #include "d_player.h" #include "m_argv.h" #include "g_game.h" diff --git a/src/p_states.cpp b/src/p_states.cpp index 778b13a190..6c3ff2f338 100644 --- a/src/p_states.cpp +++ b/src/p_states.cpp @@ -39,6 +39,7 @@ #include "v_text.h" #include "thingdef.h" #include "r_state.h" +#include "templates.h" // stores indices for symbolic state labels for some old-style DECORATE functions. diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 7226aa97f6..e83c0966dd 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -30,7 +30,7 @@ #define __P_MOBJ_H__ // Basics. -#include "templates.h" + // We need the thinker_t stuff. #include "dthinker.h" diff --git a/src/playsim/fragglescript/t_func.cpp b/src/playsim/fragglescript/t_func.cpp index e0d85cfab0..effbd5d3c0 100644 --- a/src/playsim/fragglescript/t_func.cpp +++ b/src/playsim/fragglescript/t_func.cpp @@ -34,7 +34,7 @@ //--------------------------------------------------------------------------- // -#include "templates.h" + #include "p_local.h" #include "t_script.h" #include "sbar.h" diff --git a/src/playsim/mapthinkers/a_lightning.cpp b/src/playsim/mapthinkers/a_lightning.cpp index 8fd3f3f163..854e262121 100644 --- a/src/playsim/mapthinkers/a_lightning.cpp +++ b/src/playsim/mapthinkers/a_lightning.cpp @@ -26,7 +26,7 @@ #include "doomstat.h" #include "p_lnspec.h" #include "m_random.h" -#include "templates.h" + #include "s_sound.h" #include "p_acs.h" #include "r_sky.h" diff --git a/src/playsim/mapthinkers/a_lights.cpp b/src/playsim/mapthinkers/a_lights.cpp index 68c417446a..e53f1a5c51 100644 --- a/src/playsim/mapthinkers/a_lights.cpp +++ b/src/playsim/mapthinkers/a_lights.cpp @@ -26,7 +26,7 @@ //----------------------------------------------------------------------------- -#include "templates.h" + #include "m_random.h" #include "doomdef.h" diff --git a/src/playsim/mapthinkers/a_quake.cpp b/src/playsim/mapthinkers/a_quake.cpp index b612c8de9e..93aff41eca 100644 --- a/src/playsim/mapthinkers/a_quake.cpp +++ b/src/playsim/mapthinkers/a_quake.cpp @@ -22,7 +22,7 @@ // Hexen's earthquake system, significantly enhanced // -#include "templates.h" + #include "doomtype.h" #include "doomstat.h" #include "p_local.h" diff --git a/src/playsim/p_3dfloors.cpp b/src/playsim/p_3dfloors.cpp index fa4d9b8278..dd5a2bb0a7 100644 --- a/src/playsim/p_3dfloors.cpp +++ b/src/playsim/p_3dfloors.cpp @@ -35,7 +35,7 @@ ** */ -#include "templates.h" + #include "p_local.h" #include "p_lnspec.h" #include "p_maputl.h" diff --git a/src/playsim/p_3dmidtex.cpp b/src/playsim/p_3dmidtex.cpp index 8589983769..315ded0c9c 100644 --- a/src/playsim/p_3dmidtex.cpp +++ b/src/playsim/p_3dmidtex.cpp @@ -35,7 +35,7 @@ */ -#include "templates.h" + #include "p_3dmidtex.h" #include "p_local.h" #include "p_terrain.h" diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index a3144b14a8..3fe51585d0 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -31,7 +31,7 @@ #include -#include "templates.h" + #include "m_random.h" #include "doomdef.h" diff --git a/src/playsim/p_linkedsectors.cpp b/src/playsim/p_linkedsectors.cpp index 5d327643e8..1b5a958e5b 100644 --- a/src/playsim/p_linkedsectors.cpp +++ b/src/playsim/p_linkedsectors.cpp @@ -33,7 +33,7 @@ ** */ -#include "templates.h" + #include "p_local.h" #include "p_lnspec.h" #include "p_spec.h" diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index 283fac9cfc..0cc2a524fd 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -61,7 +61,7 @@ #include #include -#include "templates.h" + #include "m_bbox.h" #include "m_random.h" diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 7eafb45261..d2bc9aba16 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -58,7 +58,7 @@ // HEADER FILES ------------------------------------------------------------ #include -#include "templates.h" + #include "m_random.h" #include "doomdef.h" diff --git a/src/playsim/p_pspr.cpp b/src/playsim/p_pspr.cpp index 91a07d8ece..97e58bd680 100644 --- a/src/playsim/p_pspr.cpp +++ b/src/playsim/p_pspr.cpp @@ -36,7 +36,7 @@ #include "s_sound.h" #include "doomstat.h" #include "p_pspr.h" -#include "templates.h" + #include "g_level.h" #include "d_player.h" #include "serializer_doom.h" diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index 147a34db1d..ab682f1719 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -67,7 +67,7 @@ #include -#include "templates.h" + #include "doomdef.h" #include "doomstat.h" #include "d_event.h" diff --git a/src/playsim/p_switch.cpp b/src/playsim/p_switch.cpp index 51dda852c8..b73d927930 100644 --- a/src/playsim/p_switch.cpp +++ b/src/playsim/p_switch.cpp @@ -32,7 +32,7 @@ ** */ -#include "templates.h" + #include "doomdef.h" #include "p_local.h" diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 618d72c6bc..d1a0b42a41 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -58,7 +58,7 @@ ** */ -#include "templates.h" + #include "doomdef.h" #include "d_event.h" #include "p_local.h" diff --git a/src/r_data/colormaps.cpp b/src/r_data/colormaps.cpp index 7dd7279f20..0a616add05 100644 --- a/src/r_data/colormaps.cpp +++ b/src/r_data/colormaps.cpp @@ -42,7 +42,7 @@ #include "filesystem.h" #include "r_sky.h" #include "colormaps.h" -#include "templates.h" + #include "c_cvars.h" CUSTOM_CVAR(Bool, cl_customizeinvulmap, false, CVAR_ARCHIVE|CVAR_NOINITCALL) diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index 6be82c77da..087f0552f4 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -35,7 +35,7 @@ #include #include "sc_man.h" -#include "templates.h" + #include "filesystem.h" #include "gi.h" #include "r_state.h" diff --git a/src/r_data/r_translate.cpp b/src/r_data/r_translate.cpp index 252dc0ee0c..0f130e30a6 100644 --- a/src/r_data/r_translate.cpp +++ b/src/r_data/r_translate.cpp @@ -34,7 +34,7 @@ #include -#include "templates.h" + #include "r_data/r_translate.h" #include "v_video.h" #include "g_game.h" diff --git a/src/r_data/r_vanillatrans.cpp b/src/r_data/r_vanillatrans.cpp index e969dd3d89..f63d7ee328 100644 --- a/src/r_data/r_vanillatrans.cpp +++ b/src/r_data/r_vanillatrans.cpp @@ -36,7 +36,7 @@ ** **/ -#include "templates.h" + #include "c_cvars.h" #include "filesystem.h" #include "doomtype.h" diff --git a/src/r_data/v_palette.cpp b/src/r_data/v_palette.cpp index 1c757e29e9..74473d5a55 100644 --- a/src/r_data/v_palette.cpp +++ b/src/r_data/v_palette.cpp @@ -34,7 +34,7 @@ #include "g_level.h" -#include "templates.h" + #include "v_video.h" #include "filesystem.h" #include "i_video.h" diff --git a/src/rendering/2d/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp index 44a2dc1b53..fd7d02df8c 100644 --- a/src/rendering/2d/f_wipe.cpp +++ b/src/rendering/2d/f_wipe.cpp @@ -26,7 +26,7 @@ #include "v_video.h" #include "m_random.h" #include "f_wipe.h" -#include "templates.h" + #include "bitmap.h" #include "hw_material.h" #include "v_draw.h" diff --git a/src/rendering/2d/v_blend.cpp b/src/rendering/2d/v_blend.cpp index 7f37a56854..9fdba41791 100644 --- a/src/rendering/2d/v_blend.cpp +++ b/src/rendering/2d/v_blend.cpp @@ -34,7 +34,7 @@ #include -#include "templates.h" + #include "sbar.h" #include "c_cvars.h" #include "c_dispatch.h" diff --git a/src/rendering/hwrenderer/scene/hw_lighting.h b/src/rendering/hwrenderer/scene/hw_lighting.h index 2fd972b885..f4cc443808 100644 --- a/src/rendering/hwrenderer/scene/hw_lighting.h +++ b/src/rendering/hwrenderer/scene/hw_lighting.h @@ -2,7 +2,7 @@ #include "c_cvars.h" #include "v_palette.h" -#include "templates.h" + #include "r_utility.h" struct Colormap; diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index 908b1646a1..4dcb03bc91 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -32,7 +32,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "d_net.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/drawers/r_draw.cpp b/src/rendering/swrenderer/drawers/r_draw.cpp index 01b79134ad..5fd8c50519 100644 --- a/src/rendering/swrenderer/drawers/r_draw.cpp +++ b/src/rendering/swrenderer/drawers/r_draw.cpp @@ -35,7 +35,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "filesystem.h" diff --git a/src/rendering/swrenderer/drawers/r_draw_pal.cpp b/src/rendering/swrenderer/drawers/r_draw_pal.cpp index 0d6b97f2f0..375053145d 100644 --- a/src/rendering/swrenderer/drawers/r_draw_pal.cpp +++ b/src/rendering/swrenderer/drawers/r_draw_pal.cpp @@ -36,7 +36,7 @@ #ifndef NO_SSE #include #endif -#include "templates.h" + #include "doomtype.h" #include "doomdef.h" #include "r_defs.h" diff --git a/src/rendering/swrenderer/drawers/r_draw_rgba.cpp b/src/rendering/swrenderer/drawers/r_draw_rgba.cpp index c8d87ef9e8..0e43daadc5 100644 --- a/src/rendering/swrenderer/drawers/r_draw_rgba.cpp +++ b/src/rendering/swrenderer/drawers/r_draw_rgba.cpp @@ -34,7 +34,7 @@ */ #include -#include "templates.h" + #include "doomdef.h" #include "filesystem.h" diff --git a/src/rendering/swrenderer/line/r_farclip_line.cpp b/src/rendering/swrenderer/line/r_farclip_line.cpp index 1583ed90aa..8b2cd07f2d 100644 --- a/src/rendering/swrenderer/line/r_farclip_line.cpp +++ b/src/rendering/swrenderer/line/r_farclip_line.cpp @@ -20,7 +20,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/line/r_fogboundary.cpp b/src/rendering/swrenderer/line/r_fogboundary.cpp index 46cf673bd3..ca8438bbb6 100644 --- a/src/rendering/swrenderer/line/r_fogboundary.cpp +++ b/src/rendering/swrenderer/line/r_fogboundary.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/line/r_line.cpp b/src/rendering/swrenderer/line/r_line.cpp index de4f4f3078..5422c2760e 100644 --- a/src/rendering/swrenderer/line/r_line.cpp +++ b/src/rendering/swrenderer/line/r_line.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "engineerrors.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/line/r_renderdrawsegment.cpp b/src/rendering/swrenderer/line/r_renderdrawsegment.cpp index bd67b88f08..ca29e532d0 100644 --- a/src/rendering/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/rendering/swrenderer/line/r_renderdrawsegment.cpp @@ -21,7 +21,7 @@ // #include -#include "templates.h" + #include "doomdef.h" #include "m_bbox.h" diff --git a/src/rendering/swrenderer/line/r_wallsetup.cpp b/src/rendering/swrenderer/line/r_wallsetup.cpp index 8ed62fddba..b0372d5b5f 100644 --- a/src/rendering/swrenderer/line/r_wallsetup.cpp +++ b/src/rendering/swrenderer/line/r_wallsetup.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/plane/r_flatplane.cpp b/src/rendering/swrenderer/plane/r_flatplane.cpp index c17c9ed6b5..be03135421 100644 --- a/src/rendering/swrenderer/plane/r_flatplane.cpp +++ b/src/rendering/swrenderer/plane/r_flatplane.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "engineerrors.h" #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/plane/r_planerenderer.cpp b/src/rendering/swrenderer/plane/r_planerenderer.cpp index 35919a59f1..9875fe0fe5 100644 --- a/src/rendering/swrenderer/plane/r_planerenderer.cpp +++ b/src/rendering/swrenderer/plane/r_planerenderer.cpp @@ -23,7 +23,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/plane/r_skyplane.cpp b/src/rendering/swrenderer/plane/r_skyplane.cpp index cf88e0439f..c3ae7bf85c 100644 --- a/src/rendering/swrenderer/plane/r_skyplane.cpp +++ b/src/rendering/swrenderer/plane/r_skyplane.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/plane/r_slopeplane.cpp b/src/rendering/swrenderer/plane/r_slopeplane.cpp index 6bc8e946ca..279009415a 100644 --- a/src/rendering/swrenderer/plane/r_slopeplane.cpp +++ b/src/rendering/swrenderer/plane/r_slopeplane.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/plane/r_visibleplane.cpp b/src/rendering/swrenderer/plane/r_visibleplane.cpp index 75c562194c..c8517cac42 100644 --- a/src/rendering/swrenderer/plane/r_visibleplane.cpp +++ b/src/rendering/swrenderer/plane/r_visibleplane.cpp @@ -23,7 +23,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/plane/r_visibleplanelist.cpp b/src/rendering/swrenderer/plane/r_visibleplanelist.cpp index a265be5d25..791ae85873 100644 --- a/src/rendering/swrenderer/plane/r_visibleplanelist.cpp +++ b/src/rendering/swrenderer/plane/r_visibleplanelist.cpp @@ -23,7 +23,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/r_renderthread.cpp b/src/rendering/swrenderer/r_renderthread.cpp index 4c3e4d2c66..f19e0bc645 100644 --- a/src/rendering/swrenderer/r_renderthread.cpp +++ b/src/rendering/swrenderer/r_renderthread.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "doomdef.h" #include "m_bbox.h" diff --git a/src/rendering/swrenderer/r_swcolormaps.cpp b/src/rendering/swrenderer/r_swcolormaps.cpp index f488e4e82d..0ce48fe5f0 100644 --- a/src/rendering/swrenderer/r_swcolormaps.cpp +++ b/src/rendering/swrenderer/r_swcolormaps.cpp @@ -52,7 +52,7 @@ #include "r_data/colormaps.h" #include "r_swcolormaps.h" #include "v_video.h" -#include "templates.h" + #include "r_utility.h" #include "swrenderer/r_renderer.h" #include diff --git a/src/rendering/swrenderer/scene/r_3dfloors.cpp b/src/rendering/swrenderer/scene/r_3dfloors.cpp index 8196462f46..78c88b0aba 100644 --- a/src/rendering/swrenderer/scene/r_3dfloors.cpp +++ b/src/rendering/swrenderer/scene/r_3dfloors.cpp @@ -32,7 +32,7 @@ ** */ -#include "templates.h" + #include "doomdef.h" #include "p_local.h" #include "c_dispatch.h" diff --git a/src/rendering/swrenderer/scene/r_light.cpp b/src/rendering/swrenderer/scene/r_light.cpp index 4a8de1950c..2e6046ffbc 100644 --- a/src/rendering/swrenderer/scene/r_light.cpp +++ b/src/rendering/swrenderer/scene/r_light.cpp @@ -23,7 +23,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/scene/r_opaque_pass.cpp b/src/rendering/swrenderer/scene/r_opaque_pass.cpp index 5c7e60e6de..dc6d22e7e2 100644 --- a/src/rendering/swrenderer/scene/r_opaque_pass.cpp +++ b/src/rendering/swrenderer/scene/r_opaque_pass.cpp @@ -28,7 +28,7 @@ #include -#include "templates.h" + #include "doomdef.h" diff --git a/src/rendering/swrenderer/scene/r_portal.cpp b/src/rendering/swrenderer/scene/r_portal.cpp index f0c914671c..f56c702a6f 100644 --- a/src/rendering/swrenderer/scene/r_portal.cpp +++ b/src/rendering/swrenderer/scene/r_portal.cpp @@ -24,7 +24,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "d_net.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/scene/r_scene.cpp b/src/rendering/swrenderer/scene/r_scene.cpp index 2558a2f2af..7bc3bec2f9 100644 --- a/src/rendering/swrenderer/scene/r_scene.cpp +++ b/src/rendering/swrenderer/scene/r_scene.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "v_draw.h" #include "filesystem.h" #include "doomdef.h" diff --git a/src/rendering/swrenderer/scene/r_translucent_pass.cpp b/src/rendering/swrenderer/scene/r_translucent_pass.cpp index 9d83549d07..101f53ef7a 100644 --- a/src/rendering/swrenderer/scene/r_translucent_pass.cpp +++ b/src/rendering/swrenderer/scene/r_translucent_pass.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/segments/r_clipsegment.cpp b/src/rendering/swrenderer/segments/r_clipsegment.cpp index 3afb4bab39..b08cab770c 100644 --- a/src/rendering/swrenderer/segments/r_clipsegment.cpp +++ b/src/rendering/swrenderer/segments/r_clipsegment.cpp @@ -20,7 +20,7 @@ //----------------------------------------------------------------------------- #include -#include "templates.h" + #include "doomdef.h" #include "m_bbox.h" diff --git a/src/rendering/swrenderer/segments/r_drawsegment.cpp b/src/rendering/swrenderer/segments/r_drawsegment.cpp index ce704b3878..6905ebf444 100644 --- a/src/rendering/swrenderer/segments/r_drawsegment.cpp +++ b/src/rendering/swrenderer/segments/r_drawsegment.cpp @@ -20,7 +20,7 @@ //----------------------------------------------------------------------------- #include -#include "templates.h" + #include "doomdef.h" #include "m_bbox.h" diff --git a/src/rendering/swrenderer/segments/r_portalsegment.cpp b/src/rendering/swrenderer/segments/r_portalsegment.cpp index 6f69c7869f..dbdd7892d4 100644 --- a/src/rendering/swrenderer/segments/r_portalsegment.cpp +++ b/src/rendering/swrenderer/segments/r_portalsegment.cpp @@ -20,7 +20,7 @@ //----------------------------------------------------------------------------- #include -#include "templates.h" + #include "doomdef.h" #include "m_bbox.h" diff --git a/src/rendering/swrenderer/things/r_decal.cpp b/src/rendering/swrenderer/things/r_decal.cpp index ffe06c0a1b..aa2a40b88f 100644 --- a/src/rendering/swrenderer/things/r_decal.cpp +++ b/src/rendering/swrenderer/things/r_decal.cpp @@ -21,7 +21,7 @@ #include #include -#include "templates.h" + #include "doomdef.h" #include "doomstat.h" diff --git a/src/rendering/swrenderer/things/r_model.cpp b/src/rendering/swrenderer/things/r_model.cpp index 548dc7bab2..4e61e362de 100644 --- a/src/rendering/swrenderer/things/r_model.cpp +++ b/src/rendering/swrenderer/things/r_model.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "doomdef.h" #include "sbar.h" #include "r_data/r_translate.h" diff --git a/src/rendering/swrenderer/things/r_particle.cpp b/src/rendering/swrenderer/things/r_particle.cpp index 85374269c9..3986a8b2d0 100644 --- a/src/rendering/swrenderer/things/r_particle.cpp +++ b/src/rendering/swrenderer/things/r_particle.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/things/r_playersprite.cpp b/src/rendering/swrenderer/things/r_playersprite.cpp index f1fc735ab7..45d3d5fa26 100644 --- a/src/rendering/swrenderer/things/r_playersprite.cpp +++ b/src/rendering/swrenderer/things/r_playersprite.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/things/r_sprite.cpp b/src/rendering/swrenderer/things/r_sprite.cpp index 3602afa11d..39c2e82e35 100644 --- a/src/rendering/swrenderer/things/r_sprite.cpp +++ b/src/rendering/swrenderer/things/r_sprite.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/things/r_visiblesprite.cpp b/src/rendering/swrenderer/things/r_visiblesprite.cpp index d9ecacda6c..9d12a83ee8 100644 --- a/src/rendering/swrenderer/things/r_visiblesprite.cpp +++ b/src/rendering/swrenderer/things/r_visiblesprite.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/things/r_visiblespritelist.cpp b/src/rendering/swrenderer/things/r_visiblespritelist.cpp index 99c3748ce1..9f48806400 100644 --- a/src/rendering/swrenderer/things/r_visiblespritelist.cpp +++ b/src/rendering/swrenderer/things/r_visiblespritelist.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/things/r_voxel.cpp b/src/rendering/swrenderer/things/r_voxel.cpp index ee343d2c2c..fa5a38c68d 100644 --- a/src/rendering/swrenderer/things/r_voxel.cpp +++ b/src/rendering/swrenderer/things/r_voxel.cpp @@ -32,7 +32,7 @@ // the GNU General Public License v3.0. #include -#include "templates.h" + #include "doomdef.h" #include "sbar.h" #include "r_data/r_translate.h" diff --git a/src/rendering/swrenderer/things/r_wallsprite.cpp b/src/rendering/swrenderer/things/r_wallsprite.cpp index 971f42b2eb..e00b38148f 100644 --- a/src/rendering/swrenderer/things/r_wallsprite.cpp +++ b/src/rendering/swrenderer/things/r_wallsprite.cpp @@ -23,7 +23,7 @@ #include #include #include "p_lnspec.h" -#include "templates.h" + #include "doomdef.h" #include "m_swap.h" diff --git a/src/rendering/swrenderer/viewport/r_drawerargs.h b/src/rendering/swrenderer/viewport/r_drawerargs.h index 0cd5d3d20f..339e00e554 100644 --- a/src/rendering/swrenderer/viewport/r_drawerargs.h +++ b/src/rendering/swrenderer/viewport/r_drawerargs.h @@ -1,7 +1,7 @@ #pragma once -#include "templates.h" + #include "doomtype.h" #include "doomdef.h" #include "r_defs.h" diff --git a/src/rendering/swrenderer/viewport/r_viewport.cpp b/src/rendering/swrenderer/viewport/r_viewport.cpp index 3fdbe558e8..767627b4f5 100644 --- a/src/rendering/swrenderer/viewport/r_viewport.cpp +++ b/src/rendering/swrenderer/viewport/r_viewport.cpp @@ -22,7 +22,7 @@ #include #include -#include "templates.h" + #include "filesystem.h" #include "doomdef.h" diff --git a/src/scripting/backend/codegen_doom.cpp b/src/scripting/backend/codegen_doom.cpp index 30385519ce..1d008446ce 100644 --- a/src/scripting/backend/codegen_doom.cpp +++ b/src/scripting/backend/codegen_doom.cpp @@ -44,7 +44,7 @@ #include "texturemanager.h" #include "m_random.h" #include "v_font.h" -#include "templates.h" + #include "actor.h" #include "p_lnspec.h" #include "g_levellocals.h" diff --git a/src/sound/s_advsound.cpp b/src/sound/s_advsound.cpp index eb441d60d8..7d37c99521 100644 --- a/src/sound/s_advsound.cpp +++ b/src/sound/s_advsound.cpp @@ -34,7 +34,7 @@ // HEADER FILES ------------------------------------------------------------ -#include "templates.h" + #include "actor.h" #include "c_dispatch.h" #include "filesystem.h" diff --git a/src/win32/i_steam.cpp b/src/win32/i_steam.cpp index 862cb584be..3aab303919 100644 --- a/src/win32/i_steam.cpp +++ b/src/win32/i_steam.cpp @@ -71,7 +71,7 @@ #include "d_net.h" #include "g_game.h" #include "c_dispatch.h" -#include "templates.h" + #include "gameconfigfile.h" #include "v_font.h" #include "g_level.h" From ce99cda01978788d4d4acdd0487b71e3c7fe2089 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 30 Oct 2021 11:38:20 +0200 Subject: [PATCH 16/22] - fixed compilation on non-Windows. In this header we must explicitly use the std:: namespace for min/max. --- src/common/platform/posix/i_system.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/platform/posix/i_system.h b/src/common/platform/posix/i_system.h index a64703ee2d..b73261eafb 100644 --- a/src/common/platform/posix/i_system.h +++ b/src/common/platform/posix/i_system.h @@ -66,7 +66,7 @@ static inline char *strlwr(char *str) } inline int I_GetNumaNodeCount() { return 1; } -inline int I_GetNumaNodeThreadCount(int numaNode) { return max(std::thread::hardware_concurrency(), 1); } +inline int I_GetNumaNodeThreadCount(int numaNode) { return std::max(std::thread::hardware_concurrency(), 1); } inline void I_SetThreadNumaNode(std::thread &thread, int numaNode) { } #endif From 5ca3ab3fc934190c4c0e0b8b57a7275375d81657 Mon Sep 17 00:00:00 2001 From: drfrag Date: Sat, 30 Oct 2021 12:31:19 +0200 Subject: [PATCH 17/22] - Fix abort with dir command and empty string on Windows. --- src/common/utility/cmdlib.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/utility/cmdlib.cpp b/src/common/utility/cmdlib.cpp index 39a02af22b..5e43336e25 100644 --- a/src/common/utility/cmdlib.cpp +++ b/src/common/utility/cmdlib.cpp @@ -866,6 +866,10 @@ FString ExpandEnvVars(const char *searchpathstring) FString NicePath(const char *path) { #ifdef _WIN32 + if (*path == '\0') + { + return FString("."); + } return ExpandEnvVars(path); #else if (path == NULL || *path == '\0') From 8db550d25121b04a3631a3aafd20a6f50c5db6dd Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 30 Oct 2021 15:58:07 +0300 Subject: [PATCH 18/22] - fixed compilation of POSIX Debug targets src/rendering/2d/f_wipe.cpp:291: undefined reference to `Wiper_Melt::HEIGHT' --- src/rendering/2d/f_wipe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/2d/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp index fd7d02df8c..c9d49d2eea 100644 --- a/src/rendering/2d/f_wipe.cpp +++ b/src/rendering/2d/f_wipe.cpp @@ -160,7 +160,7 @@ public: bool Run(int ticks) override; private: - static const int WIDTH = 320, HEIGHT = 200; + static constexpr int WIDTH = 320, HEIGHT = 200; int y[WIDTH]; }; From fba5c7884d59eafd96bd416dd3814a1756237b5d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 3 Nov 2021 18:41:33 -0400 Subject: [PATCH 19/22] - add `LoadBrightmaps`, `LoadLights`, and `LoadWidescreen` directives for `IWADINFO` - these function exactly the same as their `GAMEINFO` equivalents. --- src/d_iwad.cpp | 24 ++++++++++++++++++++++++ src/d_main.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 567c7df454..b1b0e88de0 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -221,6 +221,24 @@ void FIWadManager::ParseIWadInfo(const char *fn, const char *data, int datasize, sc.MustGetString(); iwad->Song = sc.String; } + else if (sc.Compare("LoadLights")) + { + sc.MustGetStringName("="); + sc.MustGetNumber(); + iwad->LoadLights = sc.Number; + } + else if (sc.Compare("LoadBrightmaps")) + { + sc.MustGetStringName("="); + sc.MustGetNumber(); + iwad->LoadBrightmaps = sc.Number; + } + else if (sc.Compare("LoadWidescreen")) + { + sc.MustGetStringName("="); + sc.MustGetNumber(); + iwad->LoadWidescreen = sc.Number; + } else { sc.ScriptError("Unknown keyword '%s'", sc.String); @@ -805,6 +823,12 @@ const FIWADInfo *FIWadManager::FindIWAD(TArray &wadfiles, const char *i GameStartupInfo.BkColor = iwad_info->BkColor; GameStartupInfo.FgColor = iwad_info->FgColor; } + if (GameStartupInfo.LoadWidescreen == -1) + GameStartupInfo.LoadWidescreen = iwad_info->LoadWidescreen; + if (GameStartupInfo.LoadLights == -1) + GameStartupInfo.LoadLights = iwad_info->LoadLights; + if (GameStartupInfo.LoadBrightmaps == -1) + GameStartupInfo.LoadBrightmaps = iwad_info->LoadBrightmaps; if (GameStartupInfo.Type == 0) GameStartupInfo.Type = iwad_info->StartupType; if (GameStartupInfo.Song.IsEmpty()) GameStartupInfo.Song = iwad_info->Song; I_SetIWADInfo(); diff --git a/src/d_main.h b/src/d_main.h index e2159af641..ba614b2bb9 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -90,6 +90,9 @@ struct FIWADInfo TArray Lumps; // Lump names for identification TArray DeleteLumps; // Lumps which must be deleted from the directory. int flags = 0; + int LoadWidescreen = -1; + int LoadBrightmaps = -1; + int LoadLights = -1; }; struct FFoundWadInfo From 7f66df2625a42477ae07bb8941ab465c4bd174a2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 5 Nov 2021 10:16:50 +0100 Subject: [PATCH 20/22] - fixed compiler warnings --- src/rendering/2d/f_wipe.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/2d/f_wipe.cpp b/src/rendering/2d/f_wipe.cpp index c9d49d2eea..5e345e9457 100644 --- a/src/rendering/2d/f_wipe.cpp +++ b/src/rendering/2d/f_wipe.cpp @@ -160,7 +160,7 @@ public: bool Run(int ticks) override; private: - static constexpr int WIDTH = 320, HEIGHT = 200; + enum { WIDTH = 320, HEIGHT = 200 }; int y[WIDTH]; }; @@ -289,7 +289,7 @@ bool Wiper_Melt::Run(int ticks) else if (y[i] < HEIGHT) { int dy = (y[i] < 16) ? y[i] + 1 : 8; - y[i] = min(y[i] + dy, HEIGHT); + y[i] = min(y[i] + dy, HEIGHT); done = false; } if (ticks == 0) From 6ee89275cafeae9415b3fc3f26959e02894e01c9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 6 Nov 2021 23:54:38 +0100 Subject: [PATCH 21/22] - removed the zmusic.dll for ARM. This should be rebuilt from source to get the latest version. --- bin/windows/zmusic/arm64/zmusic.dll | Bin 3704320 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bin/windows/zmusic/arm64/zmusic.dll diff --git a/bin/windows/zmusic/arm64/zmusic.dll b/bin/windows/zmusic/arm64/zmusic.dll deleted file mode 100644 index 9417d1e41ae83ec5347a8f2a864b43ef20a3537e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3704320 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

fhqM^wLbsVL)92Ngda$vFBxOi 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 z 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