diff --git a/src/pc/gfx/gfx_cc.h b/src/pc/gfx/gfx_cc.h index 5d0d9bfb..18814206 100644 --- a/src/pc/gfx/gfx_cc.h +++ b/src/pc/gfx/gfx_cc.h @@ -17,6 +17,9 @@ enum { CC_TEXEL1A, CC_COMBINED, CC_COMBINEDA, + CC_PRIMA, + CC_SHADEA, + CC_ENVA, CC_MAX, }; diff --git a/src/pc/gfx/gfx_opengl.c b/src/pc/gfx/gfx_opengl.c index 8c2a1ecf..b361fda6 100644 --- a/src/pc/gfx/gfx_opengl.c +++ b/src/pc/gfx/gfx_opengl.c @@ -389,7 +389,7 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC append_str(fs_buf, &fs_len, (opt_alpha) ? "vec4 texel = " : "vec3 texel = "); for (int i = 0; i < (opt_2cycle + 1); i++) { u8* cmd = &cc->shader_commands[i * 8]; - if (!color_alpha_same[i*2] && opt_alpha) { + if (!color_alpha_same[i] && opt_alpha) { append_str(fs_buf, &fs_len, "vec4("); append_formula(fs_buf, &fs_len, cmd, do_single[i*2+0], do_multiply[i*2+0], do_mix[i*2+0], false, false, true); append_str(fs_buf, &fs_len, ", "); diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index d2520518..09fd6c74 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -293,8 +293,11 @@ static void gfx_generate_cc(struct ColorCombiner *cc) { shader_cmd = cc->cm.use_2cycle ? SHADER_COMBINEDA : SHADER_0; break; case CC_PRIM: + case CC_PRIMA: case CC_SHADE: + case CC_SHADEA: case CC_ENV: + case CC_ENVA: case CC_LOD: if (input_number[cm_cmd] == 0) { cc->shader_input_mapping[next_input_number] = cm_cmd; @@ -1108,6 +1111,18 @@ static void OPTIMIZE_O3 gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t case CC_ENV: color = &rdp.env_color; break; + case CC_PRIMA: + memset(&tmp, rdp.prim_color.a, sizeof(tmp)); + color = &tmp; + break; + case CC_SHADEA: + memset(&tmp, v_arr[i]->color.a, sizeof(tmp)); + color = &tmp; + break; + case CC_ENVA: + memset(&tmp, rdp.env_color.a, sizeof(tmp)); + color = &tmp; + break; case CC_LOD: { float distance_frac = (v1->w - 3000.0f) / 3000.0f; @@ -1370,50 +1385,66 @@ static void gfx_dp_load_tile(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t static uint8_t color_comb_component_a(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED: return CC_COMBINED; - case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; - case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; - case G_CCMUX_PRIMITIVE: return CC_PRIM; - case G_CCMUX_SHADE: return CC_SHADE; - case G_CCMUX_ENVIRONMENT: return CC_ENV; - case G_CCMUX_1: return CC_1; - //case G_CCMUX_NOISE: return CC_NOISE; - case G_CCMUX_0: return CC_0; - default: return CC_0; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; + case G_CCMUX_PRIMITIVE: return CC_PRIM; + case G_CCMUX_SHADE: return CC_SHADE; + case G_CCMUX_ENVIRONMENT: return CC_ENV; + case G_CCMUX_1: return CC_1; + //case G_CCMUX_NOISE: return CC_NOISE; + case G_CCMUX_0: return CC_0; + + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; + case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; + case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; + + default: return CC_0; } } static uint8_t color_comb_component_b(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED: return CC_COMBINED; - case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; - case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; - case G_CCMUX_PRIMITIVE: return CC_PRIM; - case G_CCMUX_SHADE: return CC_SHADE; - case G_CCMUX_ENVIRONMENT: return CC_ENV; - //case G_CCMUX_CENTER: return CC_CENTER; // is this correct for "Chrome Key Center"? - //case G_CCMUX_K4: return CC_K4; - case G_CCMUX_0: return CC_0; - default: return CC_0; - } -} - -static uint8_t color_comb_component_c(uint32_t v, uint8_t cycle) { - switch (v) { - case G_CCMUX_COMBINED: return CC_COMBINED; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; case G_CCMUX_PRIMITIVE: return CC_PRIM; case G_CCMUX_SHADE: return CC_SHADE; case G_CCMUX_ENVIRONMENT: return CC_ENV; //case G_CCMUX_CENTER: return CC_CENTER; // is this correct for "Chrome Key Center"? - case G_CCMUX_COMBINED_ALPHA: return CC_COMBINEDA; + //case G_CCMUX_K4: return CC_K4; + case G_CCMUX_0: return CC_0; + + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; + case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; + case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; + + default: return CC_0; + } +} + +static uint8_t color_comb_component_c(uint32_t v, uint8_t cycle) { + switch (v) { + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; + case G_CCMUX_PRIMITIVE: return CC_PRIM; + case G_CCMUX_SHADE: return CC_SHADE; + case G_CCMUX_ENVIRONMENT: return CC_ENV; + //case G_CCMUX_CENTER: return CC_CENTER; // is this correct for "Chrome Key Center"? + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; case G_CCMUX_TEXEL0_ALPHA: return CC_TEXEL0A; case G_CCMUX_TEXEL1_ALPHA: return CC_TEXEL1A; - //case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMAA; - //case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; - //case G_CCMUX_ENV_ALPHA: return CC_ENVA; - //case G_CCMUX_LOD_FRACTION: return CC_LOD_FRACTION; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; + case G_CCMUX_LOD_FRACTION: return CC_LOD; //case G_CCMUX_PRIM_LOD_FRAC: return CC_PRIM_LOD_FRACTION; //case G_CCMUX_K5: return CC_K5; case G_CCMUX_0: return CC_0; @@ -1423,14 +1454,21 @@ static uint8_t color_comb_component_c(uint32_t v, uint8_t cycle) { static uint8_t color_comb_component_d(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED: return CC_COMBINED; - case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; - case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; - case G_CCMUX_PRIMITIVE: return CC_PRIM; - case G_CCMUX_SHADE: return CC_SHADE; - case G_CCMUX_ENVIRONMENT: return CC_ENV; - case G_CCMUX_1: return CC_1; - case G_CCMUX_0: return CC_0; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; + case G_CCMUX_PRIMITIVE: return CC_PRIM; + case G_CCMUX_SHADE: return CC_SHADE; + case G_CCMUX_ENVIRONMENT: return CC_ENV; + case G_CCMUX_1: return CC_1; + case G_CCMUX_0: return CC_0; + + case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; + case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; + default: return CC_0; } } @@ -1444,17 +1482,18 @@ static inline uint32_t color_comb_rgb(uint32_t a, uint32_t b, uint32_t c, uint32 static uint8_t color_comb_component_a_alpha(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED_ALPHA: return CC_COMBINEDA; + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; - //case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; - //case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; - //case G_CCMUX_ENV_ALPHA: return CC_ENVA; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; case G_CCMUX_1: return CC_1; case G_CCMUX_0: return CC_0; - case G_CCMUX_TEXEL0: return CC_TEXEL0; - case G_CCMUX_TEXEL1: return CC_TEXEL1; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; case G_CCMUX_PRIMITIVE: return CC_PRIM; case G_CCMUX_SHADE: return CC_SHADE; case G_CCMUX_ENVIRONMENT: return CC_ENV; @@ -1465,17 +1504,18 @@ static uint8_t color_comb_component_a_alpha(uint32_t v, uint8_t cycle) { static uint8_t color_comb_component_b_alpha(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED_ALPHA: return CC_COMBINEDA; + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; - //case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; - //case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; - //case G_CCMUX_ENV_ALPHA: return CC_ENVA; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; case G_CCMUX_1: return CC_1; case G_CCMUX_0: return CC_0; - case G_CCMUX_TEXEL0: return CC_TEXEL0; - case G_CCMUX_TEXEL1: return CC_TEXEL1; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; case G_CCMUX_PRIMITIVE: return CC_PRIM; case G_CCMUX_SHADE: return CC_SHADE; case G_CCMUX_ENVIRONMENT: return CC_ENV; @@ -1486,17 +1526,17 @@ static uint8_t color_comb_component_b_alpha(uint32_t v, uint8_t cycle) { static uint8_t color_comb_component_c_alpha(uint32_t v, uint8_t cycle) { switch (v) { - //case G_CCMUX_LOD_FRACTION: return CC_LOD_FRACTION; + case G_CCMUX_LOD_FRACTION: return CC_LOD; case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL1A; - //case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; - //case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; - //case G_CCMUX_ENV_ALPHA: return CC_ENVA; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; //case G_CCMUX_PRIM_LOD_FRAC: return CC_PRIM_LOD_FRACTION; case G_CCMUX_0: return CC_0; - case G_CCMUX_TEXEL0: return CC_TEXEL0; - case G_CCMUX_TEXEL1: return CC_TEXEL1; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; case G_CCMUX_PRIMITIVE: return CC_PRIM; case G_CCMUX_SHADE: return CC_SHADE; case G_CCMUX_ENVIRONMENT: return CC_ENV; @@ -1507,17 +1547,18 @@ static uint8_t color_comb_component_c_alpha(uint32_t v, uint8_t cycle) { static uint8_t color_comb_component_d_alpha(uint32_t v, uint8_t cycle) { switch (v) { - case G_CCMUX_COMBINED_ALPHA: return CC_COMBINEDA; + case G_CCMUX_COMBINED_ALPHA: return cycle ? CC_COMBINEDA : CC_0; case G_CCMUX_TEXEL0_ALPHA: return cycle ? CC_TEXEL1A : CC_TEXEL0A; case G_CCMUX_TEXEL1_ALPHA: return cycle ? CC_TEXEL0A : CC_TEXEL1A; - //case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; - //case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; - //case G_CCMUX_ENV_ALPHA: return CC_ENVA; + case G_CCMUX_PRIMITIVE_ALPHA: return CC_PRIMA; + case G_CCMUX_SHADE_ALPHA: return CC_SHADEA; + case G_CCMUX_ENV_ALPHA: return CC_ENVA; case G_CCMUX_1: return CC_1; case G_CCMUX_0: return CC_0; - case G_CCMUX_TEXEL0: return CC_TEXEL0; - case G_CCMUX_TEXEL1: return CC_TEXEL1; + case G_CCMUX_COMBINED: return cycle ? CC_COMBINED : CC_0; + case G_CCMUX_TEXEL0: return cycle ? CC_TEXEL1 : CC_TEXEL0; + case G_CCMUX_TEXEL1: return cycle ? CC_TEXEL0 : CC_TEXEL1; case G_CCMUX_PRIMITIVE: return CC_PRIM; case G_CCMUX_SHADE: return CC_SHADE; case G_CCMUX_ENVIRONMENT: return CC_ENV;