pica/lighting: split FresnelSelector into bitfields
The FresnelSelector was already working like a bitfield, so just make it actual bitfield to reduce redundant code. Also, it is already confirmed that this field also affects shadow on alpha. Given that the only two source that can affect alpha components are both controlled by this field, this field should be renamed to a general alpha switch
This commit is contained in:
parent
bdf7b46fbb
commit
b5763cb952
|
@ -59,16 +59,6 @@ struct LightingRegs {
|
||||||
///< NOTE: '8' is intentional, '7' does not appear to be a valid configuration
|
///< NOTE: '8' is intentional, '7' does not appear to be a valid configuration
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Selects which lighting components are affected by fresnel
|
|
||||||
enum class LightingFresnelSelector : u32 {
|
|
||||||
None = 0, ///< Fresnel is disabled
|
|
||||||
PrimaryAlpha = 1, ///< Primary (diffuse) lighting alpha is affected by fresnel
|
|
||||||
SecondaryAlpha = 2, ///< Secondary (specular) lighting alpha is affected by fresnel
|
|
||||||
Both =
|
|
||||||
PrimaryAlpha |
|
|
||||||
SecondaryAlpha, ///< Both primary and secondary lighting alphas are affected by fresnel
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Factor used to scale the output of a lighting LUT
|
/// Factor used to scale the output of a lighting LUT
|
||||||
enum class LightingScale : u32 {
|
enum class LightingScale : u32 {
|
||||||
Scale1 = 0, ///< Scale is 1x
|
Scale1 = 0, ///< Scale is 1x
|
||||||
|
@ -188,7 +178,8 @@ struct LightingRegs {
|
||||||
|
|
||||||
union {
|
union {
|
||||||
BitField<0, 1, u32> enable_shadow;
|
BitField<0, 1, u32> enable_shadow;
|
||||||
BitField<2, 2, LightingFresnelSelector> fresnel_selector;
|
BitField<2, 1, u32> enable_primary_alpha;
|
||||||
|
BitField<3, 1, u32> enable_secondary_alpha;
|
||||||
BitField<4, 4, LightingConfig> config;
|
BitField<4, 4, LightingConfig> config;
|
||||||
BitField<16, 1, u32> shadow_primary;
|
BitField<16, 1, u32> shadow_primary;
|
||||||
BitField<17, 1, u32> shadow_secondary;
|
BitField<17, 1, u32> shadow_secondary;
|
||||||
|
|
|
@ -154,7 +154,8 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
|
||||||
state.lighting.lut_rb.scale = regs.lighting.lut_scale.GetScale(regs.lighting.lut_scale.rb);
|
state.lighting.lut_rb.scale = regs.lighting.lut_scale.GetScale(regs.lighting.lut_scale.rb);
|
||||||
|
|
||||||
state.lighting.config = regs.lighting.config0.config;
|
state.lighting.config = regs.lighting.config0.config;
|
||||||
state.lighting.fresnel_selector = regs.lighting.config0.fresnel_selector;
|
state.lighting.enable_primary_alpha = regs.lighting.config0.enable_primary_alpha;
|
||||||
|
state.lighting.enable_secondary_alpha = regs.lighting.config0.enable_secondary_alpha;
|
||||||
state.lighting.bump_mode = regs.lighting.config0.bump_mode;
|
state.lighting.bump_mode = regs.lighting.config0.bump_mode;
|
||||||
state.lighting.bump_selector = regs.lighting.config0.bump_selector;
|
state.lighting.bump_selector = regs.lighting.config0.bump_selector;
|
||||||
state.lighting.bump_renorm = regs.lighting.config0.disable_bump_renorm == 0;
|
state.lighting.bump_renorm = regs.lighting.config0.disable_bump_renorm == 0;
|
||||||
|
@ -803,15 +804,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
|
||||||
value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")";
|
value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")";
|
||||||
|
|
||||||
// Enabled for diffuse lighting alpha component
|
// Enabled for diffuse lighting alpha component
|
||||||
if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
|
if (lighting.enable_primary_alpha) {
|
||||||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
out += "diffuse_sum.a = " + value + ";\n";
|
out += "diffuse_sum.a = " + value + ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled for the specular lighting alpha component
|
// Enabled for the specular lighting alpha component
|
||||||
if (lighting.fresnel_selector ==
|
if (lighting.enable_secondary_alpha) {
|
||||||
LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
|
|
||||||
lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
out += "specular_sum.a = " + value + ";\n";
|
out += "specular_sum.a = " + value + ";\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,8 @@ struct PicaShaderConfigState {
|
||||||
bool clamp_highlights;
|
bool clamp_highlights;
|
||||||
|
|
||||||
Pica::LightingRegs::LightingConfig config;
|
Pica::LightingRegs::LightingConfig config;
|
||||||
Pica::LightingRegs::LightingFresnelSelector fresnel_selector;
|
bool enable_primary_alpha;
|
||||||
|
bool enable_secondary_alpha;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool enable;
|
bool enable;
|
||||||
|
|
|
@ -251,16 +251,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
|
||||||
lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel);
|
lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel);
|
||||||
|
|
||||||
// Enabled for diffuse lighting alpha component
|
// Enabled for diffuse lighting alpha component
|
||||||
if (lighting.config0.fresnel_selector ==
|
if (lighting.config0.enable_primary_alpha) {
|
||||||
LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
|
|
||||||
lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
diffuse_sum.a() = lut_value;
|
diffuse_sum.a() = lut_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled for the specular lighting alpha component
|
// Enabled for the specular lighting alpha component
|
||||||
if (lighting.config0.fresnel_selector ==
|
if (lighting.config0.enable_secondary_alpha) {
|
||||||
LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
|
|
||||||
lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
specular_sum.a() = lut_value;
|
specular_sum.a() = lut_value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -308,16 +304,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
|
||||||
if (lighting.config0.shadow_alpha) {
|
if (lighting.config0.shadow_alpha) {
|
||||||
// Alpha shadow also uses the Fresnel selecotr to determine which alpha to apply
|
// Alpha shadow also uses the Fresnel selecotr to determine which alpha to apply
|
||||||
// Enabled for diffuse lighting alpha component
|
// Enabled for diffuse lighting alpha component
|
||||||
if (lighting.config0.fresnel_selector ==
|
if (lighting.config0.enable_primary_alpha) {
|
||||||
LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
|
|
||||||
lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
diffuse_sum.a() *= shadow.w;
|
diffuse_sum.a() *= shadow.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled for the specular lighting alpha component
|
// Enabled for the specular lighting alpha component
|
||||||
if (lighting.config0.fresnel_selector ==
|
if (lighting.config0.enable_secondary_alpha) {
|
||||||
LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
|
|
||||||
lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
|
|
||||||
specular_sum.a() *= shadow.w;
|
specular_sum.a() *= shadow.w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue