From 458d683e41ab69017f442c0d667ff9328008819d Mon Sep 17 00:00:00 2001 From: Baconator2558 <77943363+Baconator2558@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:00:31 -0600 Subject: [PATCH] Add gsDPSetEnvRGB() (#997) This command sets the RGB values of a material's environment color without setting the alpha. This is important, as functions like `geo_update_layer_transparency()` use the environment color alpha to control a model's overall opacity. However, if one of the model's materials sets its own environment color alpha, then that will take priority. This command allows these models to still use environment colors in their materials. --- autogen/convert_constants.py | 3 ++- autogen/lua_definitions/constants.lua | 3 +++ docs/lua/constants.md | 1 + include/PR/gbi_extension.h | 7 +++++++ include/gfx_symbols.h | 1 + src/pc/gfx/gfx_pc.c | 9 +++++++++ src/pc/lua/smlua_constants_autogen.c | 1 + 7 files changed, 24 insertions(+), 1 deletion(-) diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py index f3939d1cc..46b521710 100644 --- a/autogen/convert_constants.py +++ b/autogen/convert_constants.py @@ -112,7 +112,8 @@ include_constants = { ], "include/PR/gbi_extension.h": [ "^G_VTX_EXT$", - "^G_PPARTTOCOLOR$" + "^G_PPARTTOCOLOR$", + "^G_SETENVRGB$" ], } diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 5f9b76fa0..e2fd6a244 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_SETENVRGB = 0xd1 + --- @type integer G_PPARTTOCOLOR = 0xd3 diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 5c834b889..7632878e6 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_SETENVRGB - G_PPARTTOCOLOR [:arrow_up_small:](#) diff --git a/include/PR/gbi_extension.h b/include/PR/gbi_extension.h index 1aba0aa61..352385b36 100644 --- a/include/PR/gbi_extension.h +++ b/include/PR/gbi_extension.h @@ -97,6 +97,13 @@ #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) +//////////////////// +// RDP commands // +//////////////////// +#define G_SETENVRGB 0xd1 +#define gsDPSetEnvRGB(r, g, b) \ + sDPRGBColor(G_SETENVRGB, r,g,b,255) + //////////////////// // G_PPARTTOCOLOR // //////////////////// diff --git a/include/gfx_symbols.h b/include/gfx_symbols.h index a12858e8d..b1678b102 100644 --- a/include/gfx_symbols.h +++ b/include/gfx_symbols.h @@ -33,6 +33,7 @@ define_gfx_symbol(gsSPGeometryMode, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE define_gfx_symbol(gsSPGeometryModeSetFirst, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsDPSetPrimColor, 6, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsDPSetEnvColor, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); +define_gfx_symbol(gsDPSetEnvRGB, 3, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsDPSetFogColor, 4, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsSPFogPosition, 2, false, GFX_PARAM_TYPE_INT, GFX_PARAM_TYPE_INT); define_gfx_symbol(gsDPSetAlphaCompare, 1, false, GFX_PARAM_TYPE_INT); diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index 9c1a6b62e..b8a742bc7 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -1509,6 +1509,12 @@ static void gfx_dp_set_env_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { rdp.env_color.a = a; } +static void gfx_dp_set_env_rgb(uint8_t r, uint8_t g, uint8_t b) { + rdp.env_color.r = r; + rdp.env_color.g = g; + rdp.env_color.b = b; +} + static void gfx_dp_set_prim_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { rdp.prim_color.r = r; rdp.prim_color.g = g; @@ -1848,6 +1854,9 @@ static void OPTIMIZE_O3 gfx_run_dl(Gfx* cmd) { case G_SETENVCOLOR: gfx_dp_set_env_color(C1(24, 8), C1(16, 8), C1(8, 8), C1(0, 8)); break; + case G_SETENVRGB: + gfx_dp_set_env_rgb(C1(24, 8), C1(16, 8), C1(8, 8)); + break; case G_SETPRIMCOLOR: gfx_dp_set_prim_color(C1(24, 8), C1(16, 8), C1(8, 8), C1(0, 8)); break; diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 3f2c1b199..f94175f1c 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_SETENVRGB=0xd1\n" "G_PPARTTOCOLOR=0xd3\n" "BACKGROUND_OCEAN_SKY=0\n" "BACKGROUND_FLAMING_SKY=1\n"