diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py index 5e857ead2..615b442fe 100644 --- a/autogen/convert_constants.py +++ b/autogen/convert_constants.py @@ -110,7 +110,10 @@ include_constants = { "^G_TEXRECTFLIP$", "^G_TEXRECT$", ], - "include/PR/gbi_extension.h": [ "G_VTX_EXT" ], + "include/PR/gbi_extension.h": [ + "^G_VTX_EXT$", + "^G_PPARTTOCOLOR$" + ], } # Constants that exist in the source code but should not appear diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 84747083a..776566d78 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -2944,6 +2944,9 @@ G_TEXRECT = 0xe4 --- @type integer G_VTX_EXT = 0x11 +--- @type integer +G_PPARTTOCOLOR = 0xd3 + BACKGROUND_OCEAN_SKY = 0 --- @type SkyBackgroundParams BACKGROUND_FLAMING_SKY = 1 --- @type SkyBackgroundParams BACKGROUND_UNDERWATER_CITY = 2 --- @type SkyBackgroundParams diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index b6fc5eecb..5d22cfe05 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -406,6 +406,12 @@ s64 DynOS_Gfx_ParseGfxConstants(const String& _Arg, bool* found) { gfx_constant(G_LIGHTING_ENGINE_EXT); gfx_constant(G_PACKED_NORMALS_EXT); + gfx_constant(G_COL_PRIM); + gfx_constant(G_COL_ENV); + + gfx_constant(G_CP_LIGHT); + gfx_constant(G_CP_AMBIENT); + // Common values gfx_constant(CALC_DXT(4,G_IM_SIZ_4b_BYTES)); gfx_constant(CALC_DXT(8,G_IM_SIZ_4b_BYTES)); diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 4cdd52dde..744db5da8 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -1298,6 +1298,7 @@ ## [gbi_extension.h](#gbi_extension.h) - G_VTX_EXT +- G_PPARTTOCOLOR [:arrow_up_small:](#) diff --git a/include/PR/gbi_extension.h b/include/PR/gbi_extension.h index fb08a5a0d..1ea2d51b7 100644 --- a/include/PR/gbi_extension.h +++ b/include/PR/gbi_extension.h @@ -93,3 +93,28 @@ #define gDPSetTextureClippingDjui(pkt, x1, y1, x2, y2) gSetClippingDjui(pkt, G_TEXCLIP_DJUI, x1, y1, x2, y2) #define gDPSetTextureOverrideDjui(pkt, texture, w, h, bitSize) gSetOverrideDjui(pkt, G_TEXOVERRIDE_DJUI, texture, w, h, bitSize) + +//////////////////// +// G_PPARTTOCOLOR // +//////////////////// + +#define G_PPARTTOCOLOR 0xd3 + +#define G_COL_PRIM 0x0 +#define G_COL_ENV 0x1 + +#define G_CP_LIGHT 0x0 +#define G_CP_AMBIENT 0x1 + +#define gSPCopyPlayerPartToColor(pkt, color, part, offset) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_PPARTTOCOLOR, 24, 8)) | (_SHIFTL(color, 16, 8)); \ + _g->words.w1 = ((2 * ((part) + 1)) + 1 + offset); \ +} + +#define gsSPCopyPlayerPartToColor(color, part, offset) \ +{{ \ + (_SHIFTL(G_PPARTTOCOLOR, 24, 8)) | (_SHIFTL(color, 16, 8)), \ + ((2 * ((part) + 1)) + 1 + offset) \ +}} diff --git a/include/gfx_symbols.h b/include/gfx_symbols.h index fc205f0f2..0c8801995 100644 --- a/include/gfx_symbols.h +++ b/include/gfx_symbols.h @@ -55,6 +55,7 @@ define_gfx_symbol(gsSPFogFactor, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_IN define_gfx_symbol(gsMoveWd, 3, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsSPLoadGeometryMode, 1, false, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsSPVertexNonGlobal, 3, true, GFX_PARAM_TYPE_VTX, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsSPCopyPlayerPartToColor, 3, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol_manual(gsSPTexture, 5, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol_manual(gsSPSetGeometryMode, 1, false, GFX_PARAM_TYPE_INT); diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index f498eb5ef..21329aca6 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -2114,6 +2114,23 @@ static void OPTIMIZE_O3 djui_gfx_dp_execute_djui(uint32_t opcode) { } } +static void gfx_sp_copy_playerpart_to_color(uint8_t color, uint32_t idx) { + SUPPORT_CHECK(color == G_COL_PRIM || color == G_COL_ENV); + + if (idx >= 1 && idx <= MAX_LIGHTS) { + Light_t *l = (rsp.current_lights + (idx - 1)); + struct RGBA *targetColor = NULL; + switch (color) { + case G_COL_PRIM: targetColor = &rdp.prim_color; break; + case G_COL_ENV: targetColor = &rdp.env_color; break; + } + + targetColor->r = l->col[0]; + targetColor->g = l->col[1]; + targetColor->b = l->col[2]; + } +} + static void OPTIMIZE_O3 djui_gfx_dp_set_clipping(uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2) { sDjuiClipX1 = x1; sDjuiClipY1 = y1; @@ -2177,5 +2194,8 @@ void OPTIMIZE_O3 ext_gfx_run_dl(Gfx* cmd) { case G_EXECUTE_DJUI: djui_gfx_dp_execute_djui(cmd->words.w1); break; + case G_PPARTTOCOLOR: + gfx_sp_copy_playerpart_to_color(C0(16, 8), cmd->words.w1); + break; } } diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 7f1ac1552..b993687d2 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -1523,6 +1523,7 @@ char gSmluaConstants[] = "" "G_TEXRECTFLIP=0xe5\n" "G_TEXRECT=0xe4\n" "G_VTX_EXT=0x11\n" +"G_PPARTTOCOLOR=0xd3\n" "BACKGROUND_OCEAN_SKY=0\n" "BACKGROUND_FLAMING_SKY=1\n" "BACKGROUND_UNDERWATER_CITY=2\n"