From 8f1830b079ea759aca8ed0bf9dcd1131b29eafd4 Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:58:55 +1000 Subject: [PATCH] cleanup old gfx symbol management code --- data/dynos_bin_gfx.cpp | 136 +++++------------------------------ include/gfx_symbols.h | 83 +++++++++++---------- src/pc/lua/smlua_functions.c | 1 - 3 files changed, 60 insertions(+), 160 deletions(-) diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index e7ac4f846..db149ca3d 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -6,6 +6,7 @@ extern "C" { #include "include/textures.h" #include "src/pc/lua/smlua.h" #include "src/pc/lua/utils/smlua_gfx_utils.h" +#include "include/macros.h" } static std::map> sGfxCommandCache; @@ -574,117 +575,6 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode* aNode, u64* pToke return 0; } -#define gfx_symbol_0(symb) \ - if (_Symbol == #symb) { \ - Gfx _Gfx[] = { symb() }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_1(symb, ptr) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - if (ptr) { aGfxData->mPointerList.Add(aHead); } \ - Gfx _Gfx[] = { symb(_Arg0) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_2(symb, ptr) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - if (ptr) { aGfxData->mPointerList.Add(aHead); } \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_3(symb, ptr) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - if (ptr) { aGfxData->mPointerList.Add(aHead); } \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_4(symb) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_5(symb) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_6(symb) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_7(symb) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - -#define gfx_symbol_8(symb) \ - if (_Symbol == #symb) { \ - s64 _Arg0 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg1 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg2 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg3 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg4 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg5 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg6 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - s64 _Arg7 = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); \ - Gfx _Gfx[] = { symb(_Arg0, _Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6, _Arg7) }; \ - memcpy(aHead, _Gfx, sizeof(_Gfx)); \ - aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ - return; \ - } - #define gfx_arg_with_suffix(argname, suffix) \ CHECK_TOKEN_INDEX(aTokenIndex,); \ const String& argname##_token = aNode->mTokens[aTokenIndex]; \ @@ -822,17 +712,29 @@ static void SetCurrentTextureAsPalette(GfxData* aGfxData) { } } -extern "C" { -#include "gfx_symbols.h" -} -#define define_gfx_symbol(symb, params, ...) gfx_symbol_##params(symb, ##__VA_ARGS__) - static void ParseGfxSymbol(GfxData* aGfxData, DataNode* aNode, Gfx*& aHead, u64& aTokenIndex) { CHECK_TOKEN_INDEX(aTokenIndex,); const String& _Symbol = aNode->mTokens[aTokenIndex++]; // Simple symbols - GFX_SYMBOLS(); + // Uses macro iterators to dynamically handle the correct number of parameters +#define HANDLE_PARAM(paramNum) s64 _Arg##paramNum = ParseGfxSymbolArg(aGfxData, aNode, &aTokenIndex, ""); +#define GET_ARG(paramNum) _Arg##paramNum +#define CALL_SYMB(symb, ...) symb(__VA_ARGS__) +#define define_gfx_symbol(symb, params, addPtr, ...) \ +if (_Symbol == #symb) { \ + REPEAT(HANDLE_PARAM, params); \ + if (addPtr) { aGfxData->mPointerList.Add(aHead); } \ + Gfx _Gfx[] = { CALL_SYMB(symb, LIST_ARGS(GET_ARG, params)) }; \ + memcpy(aHead, _Gfx, sizeof(_Gfx)); \ + aHead += (sizeof(_Gfx) / sizeof(_Gfx[0])); \ + return; \ +} +#include "gfx_symbols.h" +#undef HANDLE_PARAM +#undef GET_ARG +#undef CALL_SYMB +#undef define_gfx_symbol // Special symbols if (_Symbol == "gsSPTexture") { diff --git a/include/gfx_symbols.h b/include/gfx_symbols.h index f93e7ee2d..4566428a2 100644 --- a/include/gfx_symbols.h +++ b/include/gfx_symbols.h @@ -1,45 +1,44 @@ // To use this macro, define `define_gfx_symbol` before including this file. -#define GFX_SYMBOLS() \ -define_gfx_symbol(gsDPFullSync, 0); \ -define_gfx_symbol(gsDPTileSync, 0); \ -define_gfx_symbol(gsDPPipeSync, 0); \ -define_gfx_symbol(gsDPLoadSync, 0); \ -define_gfx_symbol(gsDPNoOp, 0); \ -define_gfx_symbol(gsDPNoOpTag, 1, false); \ -define_gfx_symbol(gsDPSetCycleType, 1, false); \ -define_gfx_symbol(gsSPLight, 2, true); \ -define_gfx_symbol(gsSPVertex, 3, true); \ -define_gfx_symbol(gsSP1Triangle, 4); \ -define_gfx_symbol(gsSP2Triangles, 8); \ -define_gfx_symbol(gsSPNumLights, 1, false); \ -define_gfx_symbol(gsDPSetDepthSource, 1, false); \ -define_gfx_symbol(gsDPSetTextureLUT, 1, false); \ -define_gfx_symbol(gsDPLoadBlock, 5); \ -define_gfx_symbol(gsDPSetRenderMode, 2, false); \ -define_gfx_symbol(gsSPGeometryMode, 2, false); \ -define_gfx_symbol(gsSPGeometryModeSetFirst, 2, false); \ -define_gfx_symbol(gsDPSetPrimColor, 6); \ -define_gfx_symbol(gsDPSetEnvColor, 4); \ -define_gfx_symbol(gsDPSetFogColor, 4); \ -define_gfx_symbol(gsSPFogPosition, 2, false); \ -define_gfx_symbol(gsDPSetAlphaCompare, 1, false); \ -define_gfx_symbol(gsDPSetTextureFilter, 1, false); \ -define_gfx_symbol(gsDPSetTexturePersp, 1, false); \ -define_gfx_symbol(gsDPSetTextureLOD, 1, false); \ -define_gfx_symbol(gsDPSetTextureConvert, 1, false); \ -define_gfx_symbol(gsSPCullDisplayList, 2, false); \ -define_gfx_symbol(gsDPSetAlphaDither, 1, false); \ -define_gfx_symbol(gsDPSetCombineKey, 1, false); \ -define_gfx_symbol(gsDPPipelineMode, 1, false); \ -define_gfx_symbol(gsSPSetOtherMode, 4); \ -define_gfx_symbol(gsDPSetTextureDetail, 1, false); \ -define_gfx_symbol(gsDPSetColorDither, 1, false); \ -define_gfx_symbol(gsDPSetPrimDepth, 2, false); \ -define_gfx_symbol(gsDPSetBlendColor, 4); \ -define_gfx_symbol(gsSPCopyLightEXT, 2, false); \ -define_gfx_symbol(gsSPCopyLightsPlayerPart, 1, false); \ -define_gfx_symbol(gsSPFogFactor, 2, false); \ -define_gfx_symbol(gsMoveWd, 3, false); \ -define_gfx_symbol(gsSPLoadGeometryMode, 1, false); \ +define_gfx_symbol(gsDPFullSync, 0, false); +define_gfx_symbol(gsDPTileSync, 0, false); +define_gfx_symbol(gsDPPipeSync, 0, false); +define_gfx_symbol(gsDPLoadSync, 0, false); +define_gfx_symbol(gsDPNoOp, 0, false); +define_gfx_symbol(gsDPNoOpTag, 1, false); +define_gfx_symbol(gsDPSetCycleType, 1, false); +define_gfx_symbol(gsSPLight, 2, true); +define_gfx_symbol(gsSPVertex, 3, true); +define_gfx_symbol(gsSP1Triangle, 4, false); +define_gfx_symbol(gsSP2Triangles, 8, false); +define_gfx_symbol(gsSPNumLights, 1, false); +define_gfx_symbol(gsDPSetDepthSource, 1, false); +define_gfx_symbol(gsDPSetTextureLUT, 1, false); +define_gfx_symbol(gsDPLoadBlock, 5, false); +define_gfx_symbol(gsDPSetRenderMode, 2, false); +define_gfx_symbol(gsSPGeometryMode, 2, false); +define_gfx_symbol(gsSPGeometryModeSetFirst, 2, false); +define_gfx_symbol(gsDPSetPrimColor, 6, false); +define_gfx_symbol(gsDPSetEnvColor, 4, false); +define_gfx_symbol(gsDPSetFogColor, 4, false); +define_gfx_symbol(gsSPFogPosition, 2, false); +define_gfx_symbol(gsDPSetAlphaCompare, 1, false); +define_gfx_symbol(gsDPSetTextureFilter, 1, false); +define_gfx_symbol(gsDPSetTexturePersp, 1, false); +define_gfx_symbol(gsDPSetTextureLOD, 1, false); +define_gfx_symbol(gsDPSetTextureConvert, 1, false); +define_gfx_symbol(gsSPCullDisplayList, 2, false); +define_gfx_symbol(gsDPSetAlphaDither, 1, false); +define_gfx_symbol(gsDPSetCombineKey, 1, false); +define_gfx_symbol(gsDPPipelineMode, 1, false); +define_gfx_symbol(gsSPSetOtherMode, 4, false); +define_gfx_symbol(gsDPSetTextureDetail, 1, false); +define_gfx_symbol(gsDPSetColorDither, 1, false); +define_gfx_symbol(gsDPSetPrimDepth, 2, false); +define_gfx_symbol(gsDPSetBlendColor, 4, false); +define_gfx_symbol(gsSPCopyLightEXT, 2, false); +define_gfx_symbol(gsSPCopyLightsPlayerPart, 1, false); +define_gfx_symbol(gsSPFogFactor, 2, false); +define_gfx_symbol(gsMoveWd, 3, false); +define_gfx_symbol(gsSPLoadGeometryMode, 1, false); define_gfx_symbol(gsSPVertexNonGlobal, 3, true); diff --git a/src/pc/lua/smlua_functions.c b/src/pc/lua/smlua_functions.c index 5a42e8ae9..7a21c50ef 100644 --- a/src/pc/lua/smlua_functions.c +++ b/src/pc/lua/smlua_functions.c @@ -19,7 +19,6 @@ #include "utils/smlua_anim_utils.h" #include "utils/smlua_collision_utils.h" #include "game/hardcoded.h" -#include "gfx_symbols.h" #include "include/macros.h" bool smlua_functions_valid_param_count(lua_State* L, int expected) {