citra-emu
/
citra
Archived
1
0
Fork 0

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:
wwylele 2018-04-01 14:31:26 +03:00
parent bdf7b46fbb
commit b5763cb952
4 changed files with 12 additions and 30 deletions

View File

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

View File

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

View File

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

View File

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