mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	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
					
				
					 4 changed files with 12 additions and 30 deletions
				
			
		|  | @ -59,16 +59,6 @@ struct LightingRegs { | |||
|                      ///< 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
 | ||||
|     enum class LightingScale : u32 { | ||||
|         Scale1 = 0, ///< Scale is 1x
 | ||||
|  | @ -188,7 +178,8 @@ struct LightingRegs { | |||
| 
 | ||||
|     union { | ||||
|         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<16, 1, u32> shadow_primary; | ||||
|         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.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_selector = regs.lighting.config0.bump_selector; | ||||
|     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 + ")"; | ||||
| 
 | ||||
|             // Enabled for diffuse lighting alpha component
 | ||||
|             if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha || | ||||
|                 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|             if (lighting.enable_primary_alpha) { | ||||
|                 out += "diffuse_sum.a = " + value + ";\n"; | ||||
|             } | ||||
| 
 | ||||
|             // Enabled for the specular lighting alpha component
 | ||||
|             if (lighting.fresnel_selector == | ||||
|                     LightingRegs::LightingFresnelSelector::SecondaryAlpha || | ||||
|                 lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|             if (lighting.enable_secondary_alpha) { | ||||
|                 out += "specular_sum.a = " + value + ";\n"; | ||||
|             } | ||||
|         } | ||||
|  |  | |||
|  | @ -76,7 +76,8 @@ struct PicaShaderConfigState { | |||
|         bool clamp_highlights; | ||||
| 
 | ||||
|         Pica::LightingRegs::LightingConfig config; | ||||
|         Pica::LightingRegs::LightingFresnelSelector fresnel_selector; | ||||
|         bool enable_primary_alpha; | ||||
|         bool enable_secondary_alpha; | ||||
| 
 | ||||
|         struct { | ||||
|             bool enable; | ||||
|  |  | |||
|  | @ -251,16 +251,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( | |||
|                             lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel); | ||||
| 
 | ||||
|             // Enabled for diffuse lighting alpha component
 | ||||
|             if (lighting.config0.fresnel_selector == | ||||
|                     LightingRegs::LightingFresnelSelector::PrimaryAlpha || | ||||
|                 lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|             if (lighting.config0.enable_primary_alpha) { | ||||
|                 diffuse_sum.a() = lut_value; | ||||
|             } | ||||
| 
 | ||||
|             // Enabled for the specular lighting alpha component
 | ||||
|             if (lighting.config0.fresnel_selector == | ||||
|                     LightingRegs::LightingFresnelSelector::SecondaryAlpha || | ||||
|                 lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|             if (lighting.config0.enable_secondary_alpha) { | ||||
|                 specular_sum.a() = lut_value; | ||||
|             } | ||||
|         } | ||||
|  | @ -308,16 +304,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( | |||
|     if (lighting.config0.shadow_alpha) { | ||||
|         // Alpha shadow also uses the Fresnel selecotr to determine which alpha to apply
 | ||||
|         // Enabled for diffuse lighting alpha component
 | ||||
|         if (lighting.config0.fresnel_selector == | ||||
|                 LightingRegs::LightingFresnelSelector::PrimaryAlpha || | ||||
|             lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|         if (lighting.config0.enable_primary_alpha) { | ||||
|             diffuse_sum.a() *= shadow.w; | ||||
|         } | ||||
| 
 | ||||
|         // Enabled for the specular lighting alpha component
 | ||||
|         if (lighting.config0.fresnel_selector == | ||||
|                 LightingRegs::LightingFresnelSelector::SecondaryAlpha || | ||||
|             lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { | ||||
|         if (lighting.config0.enable_secondary_alpha) { | ||||
|             specular_sum.a() *= shadow.w; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue