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.
This commit is contained in:
Baconator2558 2025-11-12 16:00:31 -06:00 committed by GitHub
parent 26f9799621
commit 458d683e41
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 24 additions and 1 deletions

View file

@ -112,7 +112,8 @@ include_constants = {
],
"include/PR/gbi_extension.h": [
"^G_VTX_EXT$",
"^G_PPARTTOCOLOR$"
"^G_PPARTTOCOLOR$",
"^G_SETENVRGB$"
],
}

View file

@ -2944,6 +2944,9 @@ G_TEXRECT = 0xe4
--- @type integer
G_VTX_EXT = 0x11
--- @type integer
G_SETENVRGB = 0xd1
--- @type integer
G_PPARTTOCOLOR = 0xd3

View file

@ -1298,6 +1298,7 @@
## [gbi_extension.h](#gbi_extension.h)
- G_VTX_EXT
- G_SETENVRGB
- G_PPARTTOCOLOR
[:arrow_up_small:](#)

View file

@ -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 //
////////////////////

View file

@ -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);

View file

@ -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;

View file

@ -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"