diff --git a/source/common/audio/sound/oalsound.cpp b/source/common/audio/sound/oalsound.cpp index acbf19740..d97c9d5a6 100644 --- a/source/common/audio/sound/oalsound.cpp +++ b/source/common/audio/sound/oalsound.cpp @@ -556,8 +556,6 @@ OpenALSoundRenderer::OpenALSoundRenderer() ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect"); ALC.SOFT_HRTF = !!alcIsExtensionPresent(Device, "ALC_SOFT_HRTF"); ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); - ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); - ALC.SOFT_output_limiter = !!alcIsExtensionPresent(Device, "ALC_SOFT_output_limiter"); const ALCchar *current = NULL; if(alcIsExtensionPresent(Device, "ALC_ENUMERATE_ALL_EXT")) @@ -594,11 +592,6 @@ OpenALSoundRenderer::OpenALSoundRenderer() else attribs.Push(ALC_DONT_CARE_SOFT); } - if (ALC.SOFT_output_limiter) - { - attribs.Push(ALC_OUTPUT_LIMITER_SOFT); - attribs.Push(ALC_TRUE /* or ALC_FALSE or ALC_DONT_CARE_SOFT */); - } // Other attribs..? attribs.Push(0); diff --git a/source/common/console/c_console.cpp b/source/common/console/c_console.cpp index 0b4a74a53..365d92889 100644 --- a/source/common/console/c_console.cpp +++ b/source/common/console/c_console.cpp @@ -968,6 +968,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) break; } // Intentional fall-through for command(s) added with Ctrl-D + [[fallthrough]]; case '\r': { @@ -1033,6 +1034,7 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) { break; } + [[fallthrough]]; case GK_ESCAPE: // Close console and clear command line. But if we're in the // fullscreen console mode, there's nothing to fall back on diff --git a/source/common/fonts/v_text.cpp b/source/common/fonts/v_text.cpp index 54dfbf290..59d843496 100644 --- a/source/common/fonts/v_text.cpp +++ b/source/common/fonts/v_text.cpp @@ -242,27 +242,6 @@ DEFINE_ACTION_FUNCTION(FFont, BreakLines) ACTION_RETURN_OBJECT(Create(broken)); } -DEFINE_ACTION_FUNCTION(FFont, BreakLines2) -{ - PARAM_SELF_STRUCT_PROLOGUE(FFont); - PARAM_STRING(text); - PARAM_INT(maxwidth); - - auto broken = V_BreakLines(self, maxwidth, text, true); - ACTION_RETURN_OBJECT(Create(broken)); -} - -DEFINE_ACTION_FUNCTION(_Hugohaft, BreakLines) -{ - PARAM_SELF_STRUCT_PROLOGUE(FFont); - PARAM_STRING(text); - PARAM_INT(maxwidth); - - auto broken = V_BreakLines(self, maxwidth, text, true); - ACTION_RETURN_OBJECT(Create(broken)); -} - - bool generic_ui; EXTERN_CVAR(String, language) diff --git a/source/common/menu/menudef.cpp b/source/common/menu/menudef.cpp index f510b6d7a..da73517b0 100644 --- a/source/common/menu/menudef.cpp +++ b/source/common/menu/menudef.cpp @@ -752,21 +752,13 @@ static void ParseListMenu(FScanner &sc) //============================================================================= // -// [Player701] Allow extending list menus +// [Player701] Common function for figuring out where to insert items +// for AddListMenu and AddOptionMenu // //============================================================================= -static void ParseAddListMenu(FScanner& sc) +static int GetInsertIndex(FScanner& sc, DMenuDescriptor* desc) { - sc.MustGetString(); - - DMenuDescriptor** pOld = MenuDescriptors.CheckKey(sc.String); - if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) - { - sc.ScriptError("%s is not a list menu that can be extended", sc.String); - return; - } - bool before = sc.CheckString("BEFORE"); bool after = sc.CheckString("AFTER"); @@ -777,10 +769,10 @@ static void ParseAddListMenu(FScanner& sc) // Find an existing menu item to use as insertion point sc.MustGetString(); - auto n = (*pOld)->mItems.Size(); - for (unsigned int i = 0; i < n; i++) + int n = desc->mItems.Size(); + for (int i = 0; i < n; i++) { - auto item = (*pOld)->mItems[i]; + auto item = desc->mItems[i]; if (item->mAction == sc.String) { @@ -796,7 +788,26 @@ static void ParseAddListMenu(FScanner& sc) // to avoid backwards compatibility issues. } - ParseListMenuBody(sc, (DListMenuDescriptor*)(*pOld), insertIndex); + return insertIndex; +} + +//============================================================================= +// +// [Player701] Allow extending list menus +// +//============================================================================= + +static void ParseAddListMenu(FScanner& sc) +{ + sc.MustGetString(); + + DMenuDescriptor** pOld = MenuDescriptors.CheckKey(sc.String); + if (pOld == nullptr || *pOld == nullptr || !(*pOld)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + sc.ScriptError("%s is not a list menu that can be extended", sc.String); + return; + } + ParseListMenuBody(sc, (DListMenuDescriptor*)(*pOld), GetInsertIndex(sc, *pOld)); } //============================================================================= @@ -915,7 +926,7 @@ static void ParseOptionSettings(FScanner &sc) // //============================================================================= -static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) +static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc, int insertIndex) { sc.MustGetStringName("{"); while (!sc.CheckString("}")) @@ -930,7 +941,7 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) if (!CheckSkipGameBlock(sc)) { // recursively parse sub-block - ParseOptionMenuBody(sc, desc); + ParseOptionMenuBody(sc, desc, insertIndex); } } else if (sc.Compare("ifnotgame")) @@ -938,7 +949,7 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) if (!CheckSkipGameBlock(sc, false)) { // recursively parse sub-block - ParseOptionMenuBody(sc, desc); + ParseOptionMenuBody(sc, desc, insertIndex); } } else if (sc.Compare("ifoption")) @@ -946,7 +957,7 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) if (!CheckSkipOptionBlock(sc)) { // recursively parse sub-block - ParseOptionMenuBody(sc, desc); + ParseOptionMenuBody(sc, desc, insertIndex); } } else if (sc.Compare("Class")) @@ -1084,7 +1095,16 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc) DMenuItemBase *item = (DMenuItemBase*)cls->CreateNew(); params[0] = item; VMCallWithDefaults(func->Variants[0].Implementation, params, nullptr, 0); - desc->mItems.Push((DMenuItemBase*)item); + + if (insertIndex == -1) + { + desc->mItems.Push(item); + } + else + { + desc->mItems.Insert(insertIndex, item); + insertIndex++; + } success = true; } @@ -1123,7 +1143,7 @@ static void ParseOptionMenu(FScanner &sc) desc->mDontDim = DefaultOptionMenuSettings->mDontDim; desc->mProtected = sc.CheckString("protected"); - ParseOptionMenuBody(sc, desc); + ParseOptionMenuBody(sc, desc, -1); ReplaceMenu(sc, desc); } @@ -1144,7 +1164,7 @@ static void ParseAddOptionMenu(FScanner &sc) sc.ScriptError("%s is not an option menu that can be extended", sc.String); return; } - ParseOptionMenuBody(sc, (DOptionMenuDescriptor*)(*pOld)); + ParseOptionMenuBody(sc, (DOptionMenuDescriptor*)(*pOld), GetInsertIndex(sc, *pOld)); } @@ -1424,7 +1444,7 @@ void M_ParseMenuDefs() } else if (sc.Compare("DEFAULTOPTIONMENU")) { - ParseOptionMenuBody(sc, DefaultOptionMenuSettings); + ParseOptionMenuBody(sc, DefaultOptionMenuSettings, -1); if (DefaultOptionMenuSettings->mItems.Size() > 0) { I_FatalError("You cannot add menu items to the menu default settings."); diff --git a/source/common/scripting/backend/codegen.cpp b/source/common/scripting/backend/codegen.cpp index cb9642a64..11db32019 100644 --- a/source/common/scripting/backend/codegen.cpp +++ b/source/common/scripting/backend/codegen.cpp @@ -2967,6 +2967,7 @@ FxExpression *FxMulDiv::Resolve(FCompileContext& ctx) case '/': // For division, the vector must be the first operand. if (right->IsVector()) goto error; + [[fallthrough]]; case '*': if (left->IsVector() && right->IsNumeric()) diff --git a/source/common/scripting/frontend/zcc_compile.cpp b/source/common/scripting/frontend/zcc_compile.cpp index 47696089e..1acd9899a 100644 --- a/source/common/scripting/frontend/zcc_compile.cpp +++ b/source/common/scripting/frontend/zcc_compile.cpp @@ -523,6 +523,7 @@ ZCCCompiler::ZCCCompiler(ZCC_AST &ast, DObject *_outer, PSymbolTable &_symbols, ProcessStruct(static_cast(node), tnode, nullptr); break; } + goto common; common: case AST_ConstantDef: @@ -2655,6 +2656,7 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast, bool substitute) } } // fall through if this isn't an array access node. + [[fallthrough]]; default: Error(fcall, "Invalid function identifier"); diff --git a/source/common/scripting/jit/jit_math.cpp b/source/common/scripting/jit/jit_math.cpp index 0b142563d..d2fb45c7d 100644 --- a/source/common/scripting/jit/jit_math.cpp +++ b/source/common/scripting/jit/jit_math.cpp @@ -963,7 +963,7 @@ void JitCompiler::EmitFLOP() FuncPtr func = nullptr; switch (C) { - default: I_Error("Unknown OP_FLOP subfunction"); + default: I_Error("Unknown OP_FLOP subfunction"); break; case FLOP_ABS: func = fabs; break; case FLOP_EXP: func = g_exp; break; case FLOP_LOG: func = g_log; break; diff --git a/source/common/utility/cmdlib.h b/source/common/utility/cmdlib.h index c3ea527f2..9c85aa05f 100644 --- a/source/common/utility/cmdlib.h +++ b/source/common/utility/cmdlib.h @@ -90,4 +90,14 @@ struct MD5Context; void md5Update(FileReader& file, MD5Context& md5, unsigned len); void uppercopy(char* to, const char* from); +inline void fillshort(void* buff, size_t count, uint16_t clear) +{ + int16_t* b2 = (int16_t*)buff; + for (size_t i = 0; i < count; ++i) + { + b2[i] = clear; + } +} + + #endif diff --git a/source/common/utility/m_fixed.h b/source/common/utility/m_fixed.h index b765f997a..99115df6e 100644 --- a/source/common/utility/m_fixed.h +++ b/source/common/utility/m_fixed.h @@ -6,48 +6,12 @@ #include "basics.h" -// Modern compilers are smart enough to do these multiplications intelligently. -__forceinline int32_t MulScale14(int32_t a, int32_t b) { return (int32_t)(((int64_t)a * b) >> 14); } // only used by R_DrawVoxel -__forceinline int32_t MulScale30(int32_t a, int32_t b) { return (int32_t)(((int64_t)a * b) >> 30); } // only used once in the node builder -__forceinline int32_t MulScale32(int32_t a, int32_t b) { return (int32_t)(((int64_t)a * b) >> 32); } // only used by R_DrawVoxel - -__forceinline uint32_t UMulScale16(uint32_t a, uint32_t b) { return (uint32_t)(((uint64_t)a * b) >> 16); } // used for sky drawing - -__forceinline int32_t DMulScale3(int32_t a, int32_t b, int32_t c, int32_t d) { return (int32_t)(((int64_t)a*b + (int64_t)c*d) >> 3); } // used for setting up slopes for Build maps -__forceinline int32_t DMulScale6(int32_t a, int32_t b, int32_t c, int32_t d) { return (int32_t)(((int64_t)a*b + (int64_t)c*d) >> 6); } // only used by R_DrawVoxel -__forceinline int32_t DMulScale10(int32_t a, int32_t b, int32_t c, int32_t d) { return (int32_t)(((int64_t)a*b + (int64_t)c*d) >> 10); } // only used by R_DrawVoxel -__forceinline int32_t DMulScale18(int32_t a, int32_t b, int32_t c, int32_t d) { return (int32_t)(((int64_t)a*b + (int64_t)c*d) >> 18); } // only used by R_DrawVoxel -__forceinline int32_t DMulScale32(int32_t a, int32_t b, int32_t c, int32_t d) { return (int32_t)(((int64_t)a*b + (int64_t)c*d) >> 32); } // used by R_PointOnSide. - -// Sadly, for divisions this is not true but these are so infrequently used that the C versions are just fine, despite not being fully optimal. -__forceinline int32_t DivScale6(int32_t a, int32_t b) { return (int32_t)(((int64_t)a << 6) / b); } // only used by R_DrawVoxel -__forceinline int32_t DivScale21(int32_t a, int32_t b) { return (int32_t)(((int64_t)a << 21) / b); } // only used by R_DrawVoxel -__forceinline int32_t DivScale30(int32_t a, int32_t b) { return (int32_t)(((int64_t)a << 30) / b); } // only used once in the node builder - -__forceinline void fillshort(void *buff, unsigned int count, uint16_t clear) -{ - int16_t *b2 = (int16_t *)buff; - for (unsigned int i = 0; i != count; ++i) - { - b2[i] = clear; - } -} +__forceinline constexpr int32_t MulScale(int32_t a, int32_t b, int32_t shift) { return (int32_t)(((int64_t)a * b) >> shift); } +__forceinline constexpr int32_t DMulScale(int32_t a, int32_t b, int32_t c, int32_t d, int32_t shift) { return (int32_t)(((int64_t)a * b + (int64_t)c * d) >> shift); } +__forceinline constexpr int32_t DivScale(int32_t a, int32_t b, int shift) { return (int32_t)(((int64_t)a << shift) / b); } #include "xs_Float.h" -inline int32_t FixedDiv (int32_t a, int32_t b) -{ - if ((uint32_t)abs(a) >> (31-16) >= (uint32_t)abs (b)) - return (a^b)<0 ? FIXED_MIN : FIXED_MAX; - - return (int32_t)(((int64_t)a << 16) / b); -} - -__forceinline constexpr int32_t FixedMul(int32_t a, int32_t b) -{ - return (int32_t)(((int64_t)a * b) >> 16); -} - inline fixed_t FloatToFixed(double f) { return xs_Fix<16>::ToFix(f); diff --git a/source/core/gi.cpp b/source/core/gi.cpp index abcf03e1e..3618d959e 100644 --- a/source/core/gi.cpp +++ b/source/core/gi.cpp @@ -49,4 +49,6 @@ DEFINE_GLOBAL(gameinfo) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gametype) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mBackButton) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mSliderColor) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mSliderBackColor) + diff --git a/source/core/gi.h b/source/core/gi.h index 865cd0e4b..a68ac8466 100644 --- a/source/core/gi.h +++ b/source/core/gi.h @@ -44,6 +44,7 @@ struct gameinfo_t { int gametype; FName mSliderColor; + FName mSliderBackColor; FString mBackButton; FString TitlePage; }; diff --git a/source/core/menu/razemenu.cpp b/source/core/menu/razemenu.cpp index ee1c2d07a..afd960c60 100644 --- a/source/core/menu/razemenu.cpp +++ b/source/core/menu/razemenu.cpp @@ -562,6 +562,7 @@ void SetDefaultMenuColors() OptionSettings.mFontColorHighlight = CR_YELLOW; OptionSettings.mFontColorSelection = CR_BRICK; gameinfo.mSliderColor = "Orange"; + gameinfo.mSliderBackColor = "White"; if (g_gameType & GAMEFLAG_BLOOD) { diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index a62ea5f1a..a0b2a0c83 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -531,6 +531,7 @@ struct GameInfoStruct native native int gametype; native String mBackButton; native Name mSliderColor; + native Name mSliderBackColor; } struct SystemTime diff --git a/wadsrc/static/zscript/engine/ui/menu/imagescroller.zs b/wadsrc/static/zscript/engine/ui/menu/imagescroller.zs index a5e581c71..45607448a 100644 --- a/wadsrc/static/zscript/engine/ui/menu/imagescroller.zs +++ b/wadsrc/static/zscript/engine/ui/menu/imagescroller.zs @@ -110,7 +110,7 @@ class ImageScrollerPageTextItem : ImageScrollerPage virtWidth = desc.virtWidth; virtHeight = desc.virtHeight; - mText = mFont.BreakLines(Stringtable.Localize(txt.Filter()), virtWidth / mTextScale); + mText = mFont.BreakLines(Stringtable.Localize(txt.Filter()), int(virtWidth / mTextScale)); mYpos = y >= 0? y : virtHeight / 2 - mText.Count() * mFont.GetHeight() * mTextScale / 2; } @@ -119,7 +119,7 @@ class ImageScrollerPageTextItem : ImageScrollerPage { Screen.DrawTexture(mTexture, true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, DTA_Color, mBrightness); - int fontheight = mFont.GetHeight() * mTextScale; + let fontheight = mFont.GetHeight() * mTextScale; let y = mYpos; let c = mText.Count(); for (int i = 0; i < c; i++) diff --git a/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs b/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs index c56b4796d..bde6114d1 100644 --- a/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs +++ b/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs @@ -766,13 +766,13 @@ class OptionMenuSliderBase : OptionMenuItem if (!mSliderShort) { - DrawSliderElement(Font.CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12", grayed); + DrawSliderElement(Font.FindFontColor(gameinfo.mSliderBackColor), x, cy, "\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x12", grayed); DrawSliderElement(Font.FindFontColor(gameinfo.mSliderColor), x + int((5 + ((ccur * 78) / range)) * 2 * CleanXfac_1), cy, "\x13", grayed); } else { // On 320x200 we need a shorter slider - DrawSliderElement(Font.CR_WHITE, x, cy, "\x10\x11\x11\x11\x11\x11\x12", grayed); + DrawSliderElement(Font.FindFontColor(gameinfo.mSliderBackColor), x, cy, "\x10\x11\x11\x11\x11\x11\x12", grayed); DrawSliderElement(Font.FindFontColor(gameinfo.mSliderColor), x + int((5 + ((ccur * 38) / range)) * 2 * CleanXfac_1), cy, "\x13", grayed); right -= 5*8*CleanXfac; }