cbuffer ps_default_cb : register(b2)
{
  float4 gHDRRate : packoffset(c0);
  float4 gAlphaParam : packoffset(c1);
  float4 gTexBlendAlpha[2] : packoffset(c2);
  float4 gTexBlendScaleBias[2] : packoffset(c4);
  float4 gNormalTexBlendAlpha : packoffset(c6);
  float4 gNormalTexBlendScaleBias : packoffset(c7);
  float4 gShadowCsBias : packoffset(c8);
  float4 gIDandFresnel : packoffset(c9);
  float4 gReflectionColor : packoffset(c10);
  float4 gReflectionVisibilityParam : packoffset(c11);
  float4 gEyePosition : packoffset(c12);
  float4 gEyePlane : packoffset(c13);
  float4 gIblDiffuseColor : packoffset(c14);
  float4 gIblSpecularColor : packoffset(c15);
  float4 gVelvetyRimParam : packoffset(c16);
  float4 gSpecularColor : packoffset(c17);
  float4 gSpecularVisibilityParam : packoffset(c18);
  float4 gVelvetyColor : packoffset(c19);
  float4 gRimColor : packoffset(c20);
  float4 gLScatterHighFreq : packoffset(c21);
  float4 gMaterialMulColor : packoffset(c22);
  float4 gMaterialAddColor : packoffset(c23);
  float4 gMaterialParam : packoffset(c24);
  float4 gMaterialParam2 : packoffset(c25);
}

SamplerState gTextureSampler0_SamplerState_s : register(s0);
SamplerState gTextureSampler1_SamplerState_s : register(s1);
SamplerState gTextureSampler2_SamplerState_s : register(s2);
Texture2D<float4> gTextureSampler0_Texture : register(t0);
Texture2D<float4> gTextureSampler1_Texture : register(t1);
Texture2D<float4> gTextureSampler2_Texture : register(t2);

#define cmp -
Texture1D<float4> IniParams : register(t120);

void main(
  float4 v0 : SV_Position0,
  linear centroid float4 v1 : COLOR1,
  linear centroid float3 v2 : COLOR0,
  linear centroid float4 v3 : TEXCOORD0,
  linear centroid float4 v4 : TEXCOORD1,
  float4 v5 : TEXCOORD2,
  linear centroid float4 v6 : TEXCOORD3,
  linear centroid float4 v7 : TEXCOORD4,
  linear centroid float4 v8 : TEXCOORD5,
  uint v9 : SV_IsFrontFace0,
  out float4 o0 : SV_Target0,
  out float4 o1 : SV_Target1,
  out float4 o2 : SV_Target2,
  out float4 o3 : SV_Target3)
{
  float4 r0,r1,r2;
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xyz = gTextureSampler0_Texture.Sample(gTextureSampler0_SamplerState_s, v3.xy).xyz;
  r0.xyz = r0.xyz * gMaterialMulColor.xyz + gMaterialAddColor.xyz;
  o0.xyz = v2.xyz * r0.xyz;
  r0.x = v9.x ? 1 : -1;
  o0.w = saturate(v1.w * r0.x);

  r0.xyz = v8.xyz * r0.xxx;
  r1.xyz = gTextureSampler1_Texture.Sample(gTextureSampler1_SamplerState_s, v3.zw).xyz;
  r1.xyz = r1.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r2.xyz = v7.xyz * r1.yyy;
  r1.xyw = r1.xxx * v6.xyz + r2.xyz;
  r0.xyz = r1.zzz * r0.xyz + r1.xyw;
  r0.w = cmp(gMaterialParam2.y != 0.000000);
  r0.xyz = r0.www ? -r0.xyz : r0.xyz;
  r0.w = dot(r0.xyz, r0.xyz);
  r0.w = rsqrt(r0.w);
  o1.xyz = r0.xyz * r0.www;
  o1.w = gShadowCsBias.z;

  o2.xyzw = gTextureSampler2_Texture.Sample(gTextureSampler2_SamplerState_s, v4.xy).xyzw;
  o3.xyz = gIDandFresnel.xyw;
  o3.w = gMaterialMulColor.w;

  // =========================================================
  // --- Specular & Gloss Adjust (Modifying o3.x) ---
  // =========================================================

  // Scale original gIDandFresnel.x to control specular/leather shine intensity:
  // 1.2 - Subtle leather sheen
  // 1.5 - Glossy leather texture
  // 2.0 - High-gloss metallic finish
  o3.x = saturate(gIDandFresnel.x * 2.0); 

  // =========================================================

  return;
}