// ---- Created with 3Dmigoto v1.4.9 on Sun Sep 27 02:33:43 2026

struct PointLight
{
    float4 position;               // Offset:    0
    float4 color;                  // Offset:   16
};

struct SpotLight
{
    float4 position;               // Offset:    0
    float4 direction;              // Offset:   16
    float4 color;                  // Offset:   32
    float4 attenuation;            // Offset:   48
};

cbuffer bool_register_block : register(b1)
{
  bool gLightScatterEnable : packoffset(c0);
  bool gFogEnable : packoffset(c0.y);
  int2 bool_register_block_padding : packoffset(c0.z);
}

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

cbuffer ps_light_cb : register(b6)
{
  float4 gAmbientColor[2] : packoffset(c0);
  float4 gHemisphereVector : packoffset(c2);
  row_major float3x4 gLightDirection : packoffset(c3);
  row_major float3x4 gLightColorDir : packoffset(c6);
  float4 gLightColorPoint[4] : packoffset(c9);
  float4 gLightPosition[4] : packoffset(c13);
}

cbuffer ps_scene_shadow_cb : register(b3)
{
  float4 gShadowDensityFactor : packoffset(c0);
  float4 gShadowDotDensityFactor : packoffset(c1);
  float4 gShadowDistanceFadeParam : packoffset(c2);
  float4 gShadowMethodParam[2] : packoffset(c3);
  float4 gShadowCsScaleAndSplit[4] : packoffset(c5);
  float4 gShadowCsOffsetAndParam[4] : packoffset(c9);
  float4 gShadowCsOffsetBiasScale : packoffset(c13);
  float4 gShadowCsOffsetSlopeScale : packoffset(c14);
  float4 gShadowCsScaleAndSplit1[4] : packoffset(c15);
  float4 gShadowCsOffsetAndParam1[4] : packoffset(c19);
  float4 gShadowCsOffsetBiasScale1 : packoffset(c23);
  float4 gShadowCsOffsetSlopeScale1 : packoffset(c24);
  float4 gShadowCsVectorAndHairTexSize : packoffset(c25);
}

cbuffer ps_scene_fog_cb : register(b4)
{
  float4 gFogMiddle : packoffset(c0);
  float4 gFogFarMiddle : packoffset(c1);
  float4 gFogDistance : packoffset(c2);
  float4 gFogDensity : packoffset(c3);
  float4 gHeightFogMiddle : packoffset(c4);
  float4 gHeightFogFarMiddle : packoffset(c5);
  float4 gHeightFogDistance : packoffset(c6);
  float4 gHeightFogDensity : packoffset(c7);
  float4 gLScatterSunColor : packoffset(c8);
  float4 gLScatterSunDir : packoffset(c9);
  float4 gLScatterOutTmp : packoffset(c10);
  float4 gLScatterRayTmp : packoffset(c11);
  float4 gLScatterMieTmp : packoffset(c12);
}

SamplerState gTextureSampler0_SamplerState_s : register(s0);
SamplerState gTextureSampler1_SamplerState_s : register(s1);
SamplerState gTextureSampler2_SamplerState_s : register(s2);
SamplerState gIblDiffuseSampler_SamplerState_s : register(s8);
SamplerState gIblSpecularLowSampler_SamplerState_s : register(s9);
SamplerComparisonState gSecondShadowSamplerDepth_SamplerState_s : register(s7);
SamplerComparisonState gShadowSamplerDepth_SamplerState_s : register(s11);
Texture2D<float4> gTextureSampler0_Texture : register(t0);
Texture2D<float4> gTextureSampler1_Texture : register(t1);
Texture2D<float4> gTextureSampler2_Texture : register(t2);
Texture2D<float4> gSecondShadowSamplerDepth_Texture : register(t7);
TextureCube<float4> gIblDiffuseSampler_Texture : register(t8);
TextureCube<float4> gIblSpecularLowSampler_Texture : register(t9);
Texture2D<float4> gShadowSamplerDepth_Texture : register(t11);
Texture2D<uint2> gHairShadowStencilTexture : register(t14);
StructuredBuffer<PointLight> gPointLightList : register(t16);
StructuredBuffer<SpotLight> gSpotLightList : register(t17);
Buffer<uint> gPointLightListIndices : register(t18);
Buffer<uint> gSpotLightListIndices : register(t19);

Texture2D<float4> gNylonDensityTexture : register(t101);


// 3Dmigoto declarations
#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,
  linear centroid float4 v9 : TEXCOORD7,
  float4 v10 : VS_TO_FS_SECOND_SDWCOORD_SEMANTICS0,
  uint v11 : SV_IsFrontFace0,
  out float4 o0 : SV_Target0)
{
  const float4 icb[] = { { 1.000000, 0, 0, 0},
                              { 0, 1.000000, 0, 0},
                              { 0, 0, 1.000000, 0},
                              { 0, 0, 0, 1.000000} };
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19;
  uint4 bitmask, uiDest;
  float4 fDest;




  r0.x = v11.x ? 1 : -1;
  r0.yzw = v8.xyz * r0.xxx;
  r1.x = v6.w;
  r1.y = v7.w;
  r1.z = v8.w;
  r2.xyz = -gEyePosition.xyz + r1.xyz;
  r2.w = dot(r2.xyz, r2.xyz);
  r2.w = sqrt(r2.w);
  r2.xyz = r2.xyz / r2.www;


// Store view direction vector
float3 myViewDir = -r2.xyz;

  r1.w = 1;
  r1.w = dot(gEyePlane.xyzw, r1.xyzw);


  r3.xyzw = gTextureSampler0_Texture.Sample(gTextureSampler0_SamplerState_s, v3.xy).xyzw;
  r4.x = cmp(gMaterialParam.z != 0.000000);
  r4.yz = ddx_coarse(v3.xy);
  r5.xy = ddy_coarse(v3.xy);
  r4.y = dot(r4.yz, r4.yz);
  r4.z = dot(r5.xy, r5.xy);
  r4.y = max(r4.y, r4.z);
  r4.y = log2(r4.y);
  r4.y = 0.5 * r4.y;
  r4.y = max(0, r4.y);
  r4.y = r4.y * 0.25 + 1;
  r4.z = r4.y * r3.w;
  r4.y = r3.w * r4.y + -gMaterialParam.w;
  r4.w = ddx_coarse(r4.z);
  r4.z = ddy_coarse(r4.z);
  r4.z = abs(r4.w) + abs(r4.z);
  r4.z = max(9.99999975e-05, r4.z);
  r4.y = r4.y / r4.z;
  r4.y = 0.5 + r4.y;
  r3.w = r4.x ? r4.y : r3.w;
  r4.x = -gHDRRate.x + r3.w;
  r4.x = cmp(r4.x < 0);
  if (r4.x != 0) discard;
  r3.xyz = r3.xyz * gMaterialMulColor.xyz + gMaterialAddColor.xyz;
  r3.w = saturate(gHDRRate.z + r3.w);
  r4.x = 1 + gHDRRate.y;
  r3.xyz = r4.xxx * r3.xyz;
  r4.xyz = gTextureSampler1_Texture.Sample(gTextureSampler1_SamplerState_s, v3.zw).xyz;
  r5.xyzw = gTextureSampler2_Texture.Sample(gTextureSampler2_SamplerState_s, v4.xy).xyzw;
  r4.xyz = r4.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r6.xyz = v7.xyz * r4.yyy;
  r4.xyw = r4.xxx * v6.xyz + r6.xyz;
  r4.xyz = r4.zzz * r0.yzw + r4.xyw;
  r6.xy = cmp(gMaterialParam2.yx != float2(0,0));
  r4.xyz = r6.xxx ? -r4.xyz : r4.xyz;
  r4.w = dot(r4.xyz, r4.xyz);
  r4.w = rsqrt(r4.w);
  r4.xyz = r4.xyz * r4.www;

// Store world normal vector
float3 myNormal = r4.xyz;


  r6.x = dot(r2.xyz, r4.xyz);
  r6.x = r6.x + r6.x;
  r7.xyz = r4.xyz * -r6.xxx + r2.xyz;
  r6.x = cmp(gShadowCsScaleAndSplit[3].w >= r1.w);
  if (r6.x != 0) {
    r6.x = cmp(gMaterialParam.y != 0.000000);
    if (r6.x != 0) {


      r6.z = dot(r0.yzw, r0.yzw);
      r6.z = rsqrt(r6.z);
      r0.yzw = r6.zzz * r0.yzw;
      r6.z = -gShadowCsOffsetAndParam[2].w + r1.w;
      r8.xyzw = gShadowCsOffsetBiasScale.xyzw * gShadowCsBias.zzzz;
      r9.xyzw = gShadowCsOffsetSlopeScale.xyzw * gShadowCsBias.zzzz;
      r10.x = cmp(r6.z >= gShadowCsScaleAndSplit[0].w);
      r10.y = cmp(r6.z >= gShadowCsScaleAndSplit[1].w);
      r10.z = cmp(r6.z >= gShadowCsScaleAndSplit[2].w);
      r10.w = cmp(r6.z >= gShadowCsScaleAndSplit[3].w);
      r10.xyzw = r10.xyzw ? float4(1,1,1,1) : 0;
      r6.w = dot(float4(1,1,1,1), r10.xyzw);
      r6.w = min(3, r6.w);
      r10.x = (uint)r6.w;



      r10.yzw = gShadowCsOffsetAndParam[r10.x].xyz + v9.xyz;


      r10.yz = gShadowCsScaleAndSplit[r10.x].xy * r10.yz;
      r10.yz = saturate(r10.yz);
      
      r11.x = saturate(gShadowCsOffsetAndParam[1].w * r10.y);
      r6.w = gShadowCsOffsetAndParam[0].w * r6.w;
      r11.y = saturate(r10.z * gShadowCsOffsetAndParam[0].w + r6.w);


      r6.w = dot(r8.xyzw, icb[r10.x].xyzw);
      r8.x = dot(r9.xyzw, icb[r10.x].xyzw);


      r0.y = dot(r0.yzw, gShadowCsVectorAndHairTexSize.xyz);
      r0.z = r8.x * abs(r0.y) + r6.w;
      r0.z = saturate(r10.w * gShadowCsScaleAndSplit[r10.x].z + r0.z);



      r0.w = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.z, int2(-1, -1)).x;


      r6.w = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.z, int2(-1, 0)).x;
      r0.w = r6.w + r0.w;
      r6.w = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.z, int2(0, -1)).x;
      r0.w = r6.w + r0.w;
      r0.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.z, int2(0, 0)).x;
      r0.z = r0.w + r0.z;
      r0.w = 0.25 * r0.z;
      r6.w = cmp((uint)r10.x < (uint)gShadowCsOffsetAndParam[3].w);
      if (r6.w != 0) {
        r6.z = gShadowCsScaleAndSplit[r10.x].w + -r6.z;
        r6.w = gShadowCsOffsetAndParam[2].w + gShadowCsOffsetAndParam[2].w;
        r8.x = cmp(r6.w >= abs(r6.z));
        if (r8.x != 0) {
          r8.x = (int)r10.x + 1;
          r8.x = min(3, (uint)r8.x);
          r9.x = (uint)r8.x;
          r10.xyz = gShadowCsOffsetAndParam[r8.x].xyz + v9.xyz;
          r10.xy = gShadowCsScaleAndSplit[r8.x].xy * r10.xy;
          r10.xy = saturate(r10.xy);
          r11.x = saturate(gShadowCsOffsetAndParam[1].w * r10.x);
          r9.x = gShadowCsOffsetAndParam[0].w * r9.x;
          r11.y = saturate(r10.y * gShadowCsOffsetAndParam[0].w + r9.x);
          r9.x = (int)r8.x + -1;
          r8.y = dot(r8.yzw, icb[r9.x].xyz);
          r8.z = dot(r9.yzw, icb[r9.x].xyz);
          r8.y = r8.z * abs(r0.y) + r8.y;
          r8.x = saturate(r10.z * gShadowCsScaleAndSplit[r8.x].z + r8.y);
          r8.y = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r8.x, int2(-1, -1)).x;
          r8.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r8.x, int2(-1, 0)).x;
          r8.y = r8.y + r8.z;
          r8.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r8.x, int2(0, -1)).x;
          r8.y = r8.y + r8.z;
          r8.x = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r8.x, int2(0, 0)).x;
          r8.x = r8.y + r8.x;
          r8.x = 0.25 * r8.x;
          r6.w = 1 / r6.w;
          r6.z = saturate(abs(r6.z) * r6.w);
          r6.w = r6.z * -2 + 3;
          r6.z = r6.z * r6.z;
          r6.z = r6.w * r6.z;
          r0.z = r0.z * 0.25 + -r8.x;
          r0.w = r6.z * r0.z + r8.x;
        }
      }
      r0.z = -gShadowCsOffsetAndParam1[2].w + r1.w;
      r8.x = cmp(r0.z >= gShadowCsScaleAndSplit1[0].w);
      r8.y = cmp(r0.z >= gShadowCsScaleAndSplit1[1].w);
      r8.z = cmp(r0.z >= gShadowCsScaleAndSplit1[2].w);
      r8.w = cmp(r0.z >= gShadowCsScaleAndSplit1[3].w);
      r8.xyzw = r8.xyzw ? float4(1,1,1,1) : 0;
      r6.z = dot(float4(1,1,1,1), r8.xyzw);
      r6.z = min(3, r6.z);
      r6.w = (uint)r6.z;
      r8.x = cmp((uint)r6.w < (uint)gShadowCsOffsetAndParam1[3].w);
      if (r8.x != 0) {
        r8.xyzw = gShadowCsOffsetBiasScale1.xyzw * gShadowCsBias.zzzz;
        r9.xyzw = gShadowCsOffsetSlopeScale1.xyzw * gShadowCsBias.zzzz;
        r10.xyz = gShadowCsOffsetAndParam1[r6.w].xyz + v9.xyz;
        r10.xy = gShadowCsScaleAndSplit1[r6.w].xy * r10.xy;
        r10.xy = saturate(r10.xy);
        r11.x = saturate(r10.x * gShadowCsOffsetAndParam1[1].w + gShadowCsOffsetAndParam[1].w);
        r6.z = gShadowCsOffsetAndParam1[0].w * r6.z;
        r11.y = saturate(r10.y * gShadowCsOffsetAndParam1[0].w + r6.z);
        r6.z = dot(r8.xyzw, icb[r6.w+0].xyzw);
        r8.x = dot(r9.xyzw, icb[r6.w+0].xyzw);
        r6.z = r8.x * abs(r0.y) + r6.z;
        r6.z = saturate(r10.z * gShadowCsScaleAndSplit1[r6.w].z + r6.z);
        r8.x = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r6.z, int2(-1, -1)).x;
        r9.x = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r6.z, int2(-1, 0)).x;
        r8.x = r9.x + r8.x;
        r9.x = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r6.z, int2(0, -1)).x;
        r8.x = r9.x + r8.x;
        r6.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r6.z, int2(0, 0)).x;
        r6.z = r8.x + r6.z;
        r8.x = 0.25 * r6.z;
        r9.x = (int)r6.w + 1;
        r9.x = min(3, (uint)r9.x);
        r10.x = cmp((uint)r9.x < (uint)gShadowCsOffsetAndParam1[3].w);
        if (r10.x != 0) {
          r0.z = gShadowCsScaleAndSplit1[r6.w].w + -r0.z;
          r6.w = gShadowCsOffsetAndParam1[2].w + gShadowCsOffsetAndParam1[2].w;
          r10.x = cmp(r6.w >= abs(r0.z));
          if (r10.x != 0) {
            r10.x = (uint)r9.x;
            r10.yzw = gShadowCsOffsetAndParam1[r9.x].xyz + v9.xyz;
            r10.yz = gShadowCsScaleAndSplit1[r9.x].xy * r10.yz;
            r10.yz = saturate(r10.yz);
            r11.x = saturate(r10.y * gShadowCsOffsetAndParam1[1].w + gShadowCsOffsetAndParam[1].w);
            r10.x = gShadowCsOffsetAndParam1[0].w * r10.x;
            r11.y = saturate(r10.z * gShadowCsOffsetAndParam1[0].w + r10.x);
            r10.x = (int)r9.x + -1;
            r8.y = dot(r8.yzw, icb[r10.x].xyz);
            r8.z = dot(r9.yzw, icb[r10.x].xyz);
            r0.y = r8.z * abs(r0.y) + r8.y;
            r0.y = saturate(r10.w * gShadowCsScaleAndSplit1[r9.x].z + r0.y);
            r8.y = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.y, int2(-1, -1)).x;
            r8.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.y, int2(-1, 0)).x;
            r8.y = r8.y + r8.z;
            r8.z = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.y, int2(0, -1)).x;
            r8.y = r8.y + r8.z;
            r0.y = gShadowSamplerDepth_Texture.SampleCmpLevelZero(gShadowSamplerDepth_SamplerState_s, r11.xy, r0.y, int2(0, 0)).x;
            r0.y = r8.y + r0.y;
            r0.y = 0.25 * r0.y;
            r6.w = 1 / r6.w;
            r0.z = saturate(r6.w * abs(r0.z));
            r6.w = r0.z * -2 + 3;
            r0.z = r0.z * r0.z;
            r0.z = r6.w * r0.z;
            r6.z = r6.z * 0.25 + -r0.y;
            r8.x = r0.z * r6.z + r0.y;
          }
        }
        r0.y = r8.x + r0.w;
        r0.w = min(1, r0.y);
      }
    } else {
      r0.w = 0;
    }
    r0.x = saturate(v1.w * r0.x);
    if (r6.x != 0) {
      r0.y = 255 * gIDandFresnel.w;
      r0.y = round(r0.y);
      r0.y = (uint)r0.y;
      r0.y = (int)r0.y & 7;
      if (r0.y == 0) {
        r6.xzw = saturate(v10.xyz);
        r0.z = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(-1, -1)).x;
        r8.x = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(-1, 0)).x;
        r0.z = r8.x + r0.z;
        r8.x = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(0, -1)).x;
        r0.z = r8.x + r0.z;
        r6.x = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(0, 0)).x;
        r0.z = r6.x + r0.z;
        r0.z = 0.25 * r0.z;
        r0.w = max(r0.w, r0.z);
      } else {
        r6.xz = gShadowCsVectorAndHairTexSize.ww * v10.xy;
        r8.xy = (int2)r6.xz;
        r8.zw = float2(0,0);
        r0.z = gHairShadowStencilTexture.Load(r8.xyz).y;
        r6.x = cmp((int)r0.z != 0);
        r0.y = cmp((int)r0.y != (int)r0.z);
        r0.y = r0.y ? r6.x : 0;
        if (r0.y != 0) {
          r6.xzw = saturate(v10.xyz);
          r0.y = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(-1, -1)).x;
          r0.z = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(-1, 0)).x;
          r0.y = r0.y + r0.z;
          r0.z = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(0, -1)).x;
          r0.y = r0.y + r0.z;
          r0.z = gSecondShadowSamplerDepth_Texture.SampleCmpLevelZero(gSecondShadowSamplerDepth_SamplerState_s, r6.xz, r6.w, int2(0, 0)).x;
          r0.y = r0.y + r0.z;
          r0.y = 0.25 * r0.y;
          r0.w = max(r0.w, r0.y);
        }
      }
    }
    r6.xzw = r0.www * gShadowDensityFactor.xyz + gShadowDensityFactor.www;
    r0.x = r0.w * r0.x;
    r0.xyz = r0.xxx * gShadowDotDensityFactor.xyz + gShadowDotDensityFactor.www;
  } else {
    r6.xzw = float3(1,1,1);
    r0.xyz = float3(1,1,1);
  }


  r8.xy = float2(0.0625,0.0625) * v0.xy;
  r8.xy = floor(r8.xy);
  r0.w = r8.y * 120 + r8.x;
  r0.w = (uint)r0.w;
  r8.x = mad((int)r0.w, 516, 2);
  r8.y = dot(r4.xyz, -r2.xyz);
  r8.z = saturate(abs(r8.y) * gVelvetyRimParam.z + gVelvetyRimParam.w);
  r8.w = gSpecularColor.y * gSpecularColor.y;
  r8.w = 0.159999996 * r8.w;
  r9.xyz = saturate(r3.xyz * gSpecularColor.xxx + r8.www);
  r8.w = 1 + -gSpecularColor.x;
  r3.xyz = r8.www * r3.xyz;
  r8.w = dot(r4.xyz, gHemisphereVector.xyz);
  r10.xyz = r8.www * gAmbientColor[1].xyz + gAmbientColor[0].xyz;
  r8.w = -gSpecularColor.w * r5.w + 1;
  r9.w = r8.w * r8.w;
  r10.w = r9.w * r9.w;
  r11.x = r9.w * r9.w + -1;
  r9.w = 0.5 * r9.w;
  r11.y = r9.w * r9.w;
  r9.w = -r9.w * r9.w + 1;
  r12.xyz = float3(1,1,1) + -r9.xyz;
  r13.xyz = r10.xyz;
  r14.xyz = float3(0,0,0);
  r11.z = 0;
  while (true) {


    r11.w = cmp((int)r11.z >= 3);


    if (r11.w != 0) break;
    r11.w = dot(gLightDirection[r11.z].xyz, r4.xyz);
    r12.w = saturate(r11.w);
    r13.w = cmp(0 < r11.w);
    if (r13.w != 0) {


      r15.xyz = gLightColorDir[r11.z].xyz * r6.xzw;
      r16.xyz = gLightColorDir[r11.z].xyz * r0.xyz;
      r15.xyz = r11.zzz ? r16.xyz : r15.xyz;
      

      r13.w = gLightColorDir[r11.z].w * gSpecularColor.z;
      r14.w = 0.318310142 * r12.w;
      r13.xyz = r14.www * r15.xyz + r13.xyz;
      r16.xyz = gLightDirection[r11.z].xyz + -r2.xyz;
      r14.w = dot(r16.xyz, r16.xyz);
      r14.w = rsqrt(r14.w);
      r16.xyz = r16.xyz * r14.www;
      r14.w = saturate(dot(gLightDirection[r11.z].xyz, r16.xyz));
      r15.w = saturate(dot(r16.xyz, r4.xyz));
      r15.w = r15.w * r15.w;
      r15.w = r15.w * r11.x + 1;
      r15.w = r15.w * r15.w;
      r15.w = r15.w * 3.14159012 + 9.99999975e-06;
      r15.w = r10.w / r15.w;
      r16.x = 1 + -r14.w;
      r16.y = r16.x * r16.x;
      r16.y = r16.y * r16.y;
      r16.x = r16.y * r16.x;
      r14.w = r14.w * r14.w;
      r14.w = r14.w * r9.w + r11.y;
      r14.w = rcp(r14.w);
      r16.x = r16.x * r14.w;
      r16.xyz = r16.xxx * r12.xyz;
      r16.xyz = r9.xyz * r14.www + r16.xyz;
      r13.w = r13.w * r12.w;
      r13.w = r13.w * r15.w;
      r16.xyz = r13.www * r16.xyz;
      r15.xyz = r16.xyz * r15.xyz + r14.xyz;
      r14.xyz = max(float3(0,0,0), r15.xyz);
    }
    r13.w = saturate(r11.w * gVelvetyRimParam.x + gVelvetyRimParam.y);
    r12.w = r13.w + -r12.w;
    r15.xyz = gLightColorDir[r11.z].xyz * r12.www;
    r15.xyz = r15.xyz * gVelvetyColor.xyz + r13.xyz;
    r12.w = saturate(dot(gLightDirection[r11.z].xyz, r2.xyz));
    r11.w = 1 + -r11.w;
    r11.w = saturate(0.5 * r11.w);
    r11.w = r12.w * r11.w;
    r11.w = r11.w * r8.z;
    r16.xyz = gLightColorDir[r11.z].xyz * r11.www;
    r13.xyz = r16.xyz * gRimColor.xyz + r15.xyz;
    r11.z = (int)r11.z + 1;
  }
  r6.x = gPointLightListIndices.Load(r8.x).x;
  r6.z = (int)r8.x + 2;
  r10.xyz = r13.xyz;
  r15.xyz = r14.xyz;
  r6.w = 0;
  while (true) {
    r8.z = cmp((uint)r6.w >= (uint)r6.x);
    if (r8.z != 0) break;
    r8.z = (int)r6.z + (int)r6.w;
    r8.z = gPointLightListIndices.Load(r8.z).x;
    r16.x = gPointLightList[r8.z].position.x;
    r16.y = gPointLightList[r8.z].position.y;
    r16.z = gPointLightList[r8.z].position.z;
    r16.w = gPointLightList[r8.z].position.w;
    r17.x = gPointLightList[r8.z].color.x;
    r17.y = gPointLightList[r8.z].color.y;
    r17.z = gPointLightList[r8.z].color.z;
    r17.w = gPointLightList[r8.z].color.w;
    r16.xyz = r16.xyz + -r1.xyz;
    r8.z = dot(r16.xyz, r16.xyz);
    r11.z = rsqrt(r8.z);
    r18.xyz = r16.xyz * r11.zzz;
    r8.z = -r8.z * r11.z + r16.w;
    r8.z = saturate(r8.z * r17.w);
    r8.z = r8.z * r8.z;
    r17.xyz = r17.xyz * r8.zzz;
    r8.z = dot(r18.xyz, r4.xyz);
    r11.w = saturate(r8.z);
    r8.z = cmp(0 < r8.z);
    r12.w = 0.318310142 * r11.w;
    r19.xyz = r12.www * r17.xyz + r10.xyz;
    r16.xyz = r16.xyz * r11.zzz + -r2.xyz;
    r11.z = dot(r16.xyz, r16.xyz);
    r11.z = rsqrt(r11.z);
    r16.xyz = r16.xyz * r11.zzz;
    r11.z = saturate(dot(r18.xyz, r16.xyz));
    r12.w = saturate(dot(r16.xyz, r4.xyz));
    r12.w = r12.w * r12.w;
    r12.w = r12.w * r11.x + 1;
    r12.w = r12.w * r12.w;
    r12.w = r12.w * 3.14159012 + 9.99999975e-06;
    r12.w = r10.w / r12.w;
    r13.w = 1 + -r11.z;
    r14.w = r13.w * r13.w;
    r14.w = r14.w * r14.w;
    r13.w = r14.w * r13.w;
    r11.z = r11.z * r11.z;
    r11.z = r11.z * r9.w + r11.y;
    r11.z = rcp(r11.z);
    r13.w = r13.w * r11.z;
    r16.xyz = r13.www * r12.xyz;
    r16.xyz = r9.xyz * r11.zzz + r16.xyz;
    r11.z = gSpecularColor.z * r11.w;
    r11.z = r11.z * r12.w;
    r16.xyz = r11.zzz * r16.xyz;
    r16.xyz = r16.xyz * r17.xyz + r15.xyz;
    r16.xyz = max(float3(0,0,0), r16.xyz);
    r10.xyz = r8.zzz ? r19.xyz : r10.xyz;
    r15.xyz = r8.zzz ? r16.xyz : r15.xyz;
    r6.w = (int)r6.w + 1;
  }
  r6.x = gSpotLightListIndices.Load(r8.x).x;
  r13.xyz = r10.xyz;
  r14.xyz = r15.xyz;
  r6.w = 0;
  while (true) {
    r8.x = cmp((uint)r6.w >= (uint)r6.x);
    if (r8.x != 0) break;
    r8.x = (int)r6.z + (int)r6.w;
    r8.x = gSpotLightListIndices.Load(r8.x).x;
    r16.x = gSpotLightList[r8.x].position.x;
    r16.y = gSpotLightList[r8.x].position.y;
    r16.z = gSpotLightList[r8.x].position.z;
    r16.w = gSpotLightList[r8.x].position.w;
    r17.x = gSpotLightList[r8.x].direction.x;
    r17.y = gSpotLightList[r8.x].direction.y;
    r17.z = gSpotLightList[r8.x].direction.z;
    r18.x = gSpotLightList[r8.x].color.x;
    r18.y = gSpotLightList[r8.x].color.y;
    r18.z = gSpotLightList[r8.x].color.z;
    r18.w = gSpotLightList[r8.x].color.w;
    r8.x = gSpotLightList[r8.x].attenuation.x;
    r8.z = gSpotLightList[r8.x].attenuation.y;
    r16.xyz = r16.xyz + -r1.xyz;
    r11.z = dot(r16.xyz, r16.xyz);
    r11.w = rsqrt(r11.z);
    r19.xyz = r16.xyz * r11.www;
    r12.w = dot(r19.xyz, r17.xyz);
    r8.x = r12.w + -r8.x;
    r8.x = saturate(r8.x * r8.z);
    r8.z = -r11.z * r11.w + r16.w;
    r8.z = saturate(r8.z * r18.w);
    r8.xz = r8.xz * r8.xz;
    r8.x = r8.z * r8.x;
    r17.xyz = r18.xyz * r8.xxx;
    r8.x = dot(r19.xyz, r4.xyz);
    r8.z = saturate(r8.x);
    r8.x = cmp(0 < r8.x);
    r11.z = 0.318310142 * r8.z;
    r18.xyz = r11.zzz * r17.xyz + r13.xyz;
    r16.xyz = r16.xyz * r11.www + -r2.xyz;
    r11.z = dot(r16.xyz, r16.xyz);
    r11.z = rsqrt(r11.z);
    r16.xyz = r16.xyz * r11.zzz;
    r11.z = saturate(dot(r19.xyz, r16.xyz));
    r11.w = saturate(dot(r16.xyz, r4.xyz));
    r11.w = r11.w * r11.w;
    r11.w = r11.w * r11.x + 1;
    r11.w = r11.w * r11.w;
    r11.w = r11.w * 3.14159012 + 9.99999975e-06;
    r11.w = r10.w / r11.w;
    r12.w = 1 + -r11.z;
    r13.w = r12.w * r12.w;
    r13.w = r13.w * r13.w;
    r12.w = r13.w * r12.w;
    r11.z = r11.z * r11.z;
    r11.z = r11.z * r9.w + r11.y;
    r11.z = rcp(r11.z);
    r12.w = r12.w * r11.z;
    r16.xyz = r12.xyz * r12.www;
    r16.xyz = r9.xyz * r11.zzz + r16.xyz;
    r8.z = gSpecularColor.z * r8.z;
    r8.z = r8.z * r11.w;
    r16.xyz = r8.zzz * r16.xyz;
    r16.xyz = r16.xyz * r17.xyz + r14.xyz;
    r16.xyz = max(float3(0,0,0), r16.xyz);
    r13.xyz = r8.xxx ? r18.xyz : r13.xyz;
    r14.xyz = r8.xxx ? r16.xyz : r14.xyz;
    r6.w = (int)r6.w + 1;
  }
  r6.z = cmp(0 < gIDandFresnel.w);
  if (r6.z != 0) {
    r0.w = mad((int)r0.w, 516, 3);
    r6.z = gSpotLightListIndices.Load(r0.w).x;
    r0.w = (int)r0.w + (int)r6.x;
    r0.w = (int)r0.w + 1;
    r10.xyz = r13.xyz;
    r15.xyz = r14.xyz;
    r6.x = 0;
    while (true) {
      r6.w = cmp((uint)r6.x >= (uint)r6.z);
      if (r6.w != 0) break;
      r6.w = (int)r0.w + (int)r6.x;
      r6.w = gSpotLightListIndices.Load(r6.w).x;
      r16.x = gSpotLightList[r6.w].position.x;
      r16.y = gSpotLightList[r6.w].position.y;
      r16.z = gSpotLightList[r6.w].position.z;
      r16.w = gSpotLightList[r6.w].position.w;
      r17.x = gSpotLightList[r6.w].direction.x;
      r17.y = gSpotLightList[r6.w].direction.y;
      r17.z = gSpotLightList[r6.w].direction.z;
      r18.x = gSpotLightList[r6.w].color.x;
      r18.y = gSpotLightList[r6.w].color.y;
      r18.z = gSpotLightList[r6.w].color.z;
      r18.w = gSpotLightList[r6.w].color.w;
      r8.x = gSpotLightList[r6.w].attenuation.x;
      r8.z = gSpotLightList[r6.w].attenuation.y;
      r16.xyz = r16.xyz + -r1.xyz;
      r6.w = dot(r16.xyz, r16.xyz);
      r11.z = rsqrt(r6.w);
      r19.xyz = r16.xyz * r11.zzz;
      r11.w = dot(r19.xyz, r17.xyz);
      r8.x = r11.w + -r8.x;
      r8.x = saturate(r8.x * r8.z);
      r8.x = r8.x * r8.x;
      r6.w = -r6.w * r11.z + r16.w;
      r6.w = saturate(r6.w * r18.w);
      r6.w = r6.w * r6.w;
      r6.w = r6.w * r8.x;
      r17.xyz = r18.xyz * r6.www;
      r6.w = dot(r19.xyz, r4.xyz);
      r8.x = saturate(r6.w);
      r6.w = cmp(0 < r6.w);
      r8.z = 0.318310142 * r8.x;
      r18.xyz = r8.zzz * r17.xyz + r10.xyz;
      r16.xyz = r16.xyz * r11.zzz + -r2.xyz;
      r8.z = dot(r16.xyz, r16.xyz);
      r8.z = rsqrt(r8.z);
      r16.xyz = r16.xyz * r8.zzz;
      r8.z = saturate(dot(r19.xyz, r16.xyz));
      r11.z = saturate(dot(r16.xyz, r4.xyz));
      r11.z = r11.z * r11.z;
      r11.z = r11.z * r11.x + 1;
      r11.z = r11.z * r11.z;
      r11.z = r11.z * 3.14159012 + 9.99999975e-06;
      r11.z = r10.w / r11.z;
      r11.w = 1 + -r8.z;
      r12.w = r11.w * r11.w;
      r12.w = r12.w * r12.w;
      r11.w = r12.w * r11.w;
      r8.z = r8.z * r8.z;
      r8.z = r8.z * r9.w + r11.y;
      r8.z = rcp(r8.z);
      r11.w = r11.w * r8.z;
      r16.xyz = r12.xyz * r11.www;
      r16.xyz = r9.xyz * r8.zzz + r16.xyz;
      r8.x = gSpecularColor.z * r8.x;
      r8.x = r8.x * r11.z;
      r16.xyz = r8.xxx * r16.xyz;
      r16.xyz = r16.xyz * r17.xyz + r15.xyz;
      r16.xyz = max(float3(0,0,0), r16.xyz);
      r10.xyz = r6.www ? r18.xyz : r10.xyz;
      r15.xyz = r6.www ? r16.xyz : r15.xyz;
      r6.x = (int)r6.x + 1;
    }
    r13.xyz = r10.xyz;
    r14.xyz = r15.xyz;
  }
  r4.w = -r4.z;
  r1.xyz = gIblDiffuseSampler_Texture.Sample(gIblDiffuseSampler_SamplerState_s, r4.xyw).xyz;
  r1.xyz = gIblDiffuseColor.xyz * r1.xyz;
  r0.w = saturate(gSpecularColor.w * r5.w + gSpecularColor.y);
  r8.y = saturate(r8.y);
  r4.x = 6 * r8.w;
  r7.w = -r7.z;
  r4.xyz = gIblSpecularLowSampler_Texture.SampleLevel(gIblSpecularLowSampler_SamplerState_s, r7.xyw, r4.x).xyz;
  r4.w = 1 + -r8.y;
  r5.w = r4.w * r4.w;
  r5.w = r5.w * r5.w;
  r4.w = r5.w * r4.w;
  r6.xzw = r0.www + -r9.xyz;
  r6.xzw = r4.www * r6.xzw + r9.xyz;
  r4.xyz = r6.xzw * r4.xyz;
  r4.xyz = r4.xyz * gIblSpecularColor.xyz + v1.xyz;
  r1.xyz = r1.xyz * r0.xyz + r13.xyz;
  r0.xyz = r4.xyz * r0.xyz + r14.xyz;
  r1.xyz = r1.xyz * r3.xyz;
  r0.xyz = r0.xyz * r5.xyz;
  r0.xyz = r1.xyz * v2.xyz + r0.xyz;
  r0.xyz = max(float3(0,0,0), r0.xyz);
  r0.w = gLScatterHighFreq.y + r2.w;
  r1.xyz = gLScatterOutTmp.xyz * r0.www;
  r1.xyz = exp2(r1.xyz);
  r3.xyz = float3(-1,-1,-1) + r1.xyz;
  r3.xyz = gLScatterHighFreq.xxx * r3.xyz + float3(1,1,1);
  r0.w = dot(gLScatterSunDir.xyz, r2.xyz);
  r2.x = r0.w * r0.w + 1;
  r0.w = gLScatterMieTmp.w * r0.w + gLScatterRayTmp.w;
  r2.y = r0.w * r0.w;
  r0.w = r2.y * r0.w;
  r0.w = sqrt(r0.w);
  r2.yzw = gLScatterMieTmp.xyz / r0.www;
  r2.xyz = gLScatterRayTmp.xyz * r2.xxx + r2.yzw;
  r1.xyz = float3(1,1,1) + -r1.xyz;
  r1.xyz = r2.xyz * r1.xyz;
  r1.xyz = gLScatterSunColor.xyz * r1.xyz;
  r1.xyz = gLightScatterEnable ? r1.xyz : float3(0,0,0);
  r2.xyz = gLightScatterEnable ? r3.xyz : float3(1,1,1);
  r3.xy = gFogEnable ? gFogDensity.xy : float2(0,0);
  r4.xy = -gFogDistance.xy + r1.ww;
  r4.xy = saturate(gFogDistance.zw * r4.xy);
  r0.w = dot(r4.xy, r3.xy);
  r3.xyz = gFogFarMiddle.xyz * r4.yyy + gFogMiddle.xyz;
  r1.w = 1 + -r0.w;
  r3.xyz = r3.xyz * r0.www;
  r4.xy = gFogEnable ? gHeightFogDensity.xy : float2(0,0);
  r4.zw = -gHeightFogDistance.xy + v7.ww;
  r4.zw = saturate(gHeightFogDistance.zw * r4.zw);
  r0.w = dot(r4.zw, r4.xy);
  r4.xyz = gHeightFogFarMiddle.xyz * r4.www + gHeightFogMiddle.xyz;
  r2.w = 1 + -r0.w;
  r4.xyz = r4.xyz * r0.www;
  r2.xyz = r2.xyz * r2.www;
  r2.xyz = r2.xyz * r1.www;
  r1.xyz = r1.xyz * r2.www + r4.xyz;
  r1.xyz = r1.xyz * r1.www + r3.xyz;
  r0.w = cmp(gMaterialMulColor.w != 0.000000);
  r0.xyz = r0.xyz * r2.xyz + r1.xyz;

  r1.x = dot(r0.xyz, float3(0.298909992,0.586610019,0.114480004));
  o0.xyz = r0.www ? r1.xxx : r0.xyz;

  r0.x = gHDRRate.w * r3.w + gHDRRate.y;
  o0.w = r6.y ? r3.w : r0.x;

// =========================================================
  // --- ps-t101 NylonDensity Single-Channel Mask (Facing & Grazing Alpha) ---
  
  // Debug Switch: 1 = enable density heatmap preview; 0 = normal rendering
  #define DEBUG_RIM 0 

  // 1. Sample grayscale density texture (0.0 = bare skin/cutout, 1.0 = dense fabric)
  float nylonDensity = gNylonDensityTexture.Sample(gTextureSampler0_SamplerState_s, v3.xy).x;

  // 2. View angle factor calculation (higher exponent = narrower rim edge)
  float NdotV = saturate(dot(myNormal, myViewDir));
  float viewTerm = pow(1.0 - NdotV, 3.0); 

  // 3. Facing base opacity with tunable weight and base offset
  // Base offset is scaled by nylonDensity to ensure bare skin (density = 0) remains fully transparent
  float facingWeight = 0.8; // Facing opacity multiplier (0.2 = thin, 0.6 = thick)
  float baseOffset = 0.4;   // Minimum opacity floor for fabric (0.1 ~ 0.3 works best)
  float baseAlpha = nylonDensity * (o0.w * facingWeight + baseOffset);

  // 4. Grazing edge opacity increment (scaled by nylonDensity)
  float rimMultiplier = 1.2; // Rim density accumulation strength
  float rimEffect = viewTerm * rimMultiplier * nylonDensity;

  #if DEBUG_RIM
      // ---------------- Debug Mode ----------------
      // Visualize calculated final alpha heatmap (red = opaque)
      float debugAlpha = saturate(baseAlpha + rimEffect);
      o0.xyz = float3(debugAlpha, 0.0, 0.0); 
      o0.w = 1.0; 
  #else
      // ---------------- Normal Render Mode ----------------
      // Final Alpha = Facing base opacity + Grazing angle accumulated thickness
      o0.w = saturate(baseAlpha + rimEffect);
  #endif
  // =========================================================

  return;
}

