#T#PoiSubsurfaceScatteringProperties
//ifex _SubsurfaceScattering==0
[HideInInspector] m_start_subsurfaceScattering ("Subsurface Scattering--{reference_property:_SubsurfaceScattering,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/subsurface-scattering},hover:Documentation}}}", Float) = 0
[HideInInspector][ThryToggle(POI_SUBSURFACESCATTERING)]_SubsurfaceScattering ("Enable", Float) = 0

_SSSColor ("Subsurface Color", Color) = (1, 0, 0, 1)
[sRGBWarning(true)][ThryRGBAPacker(RGB Color, A Thickness, linear, false)]_SSSThicknessMap ("Color & Thickness--{reference_properties:[_SSSThicknessMapPan, _SSSThicknessMapUV, _SSSThicknessMapChannel]}", 2D) = "white" { }
[HideInInspector][Vector2]_SSSThicknessMapPan ("Panning", Vector) = (0, 0, 0, 0)
[HideInInspector][Enum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, DistortedUV1, 4)] _SSSThicknessMapUV ("UV", Int) = 0
[HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)] _SSSThicknessMapChannel ("Channel", Int) = 0
_SSSThicknessMod ("Thickness mod", Range(-1, 1)) = -1
_SSSStrength ("Light Strength", Range(0, 1)) = 0.25
_SSSSpread ("Light Spread", Range(1, 100)) = 5
_SSSDistortion ("Light Distortion", Range(0, 1)) = 1
_SSSBaseColorMix ("Base Color Mix", Range(0, 1)) = 0

[HideInInspector] m_end_subsurfaceScattering ("", Float) = 0
//endex

#T#PoiSubsurfaceScatteringKeywords
//ifex _SubsurfaceScattering==0
#pragma shader_feature_local POI_SUBSURFACESCATTERING
//endex

#T#PoiSubsurfaceScatteringVariables
//ifex _SubsurfaceScattering==0
#ifdef POI_SUBSURFACESCATTERING
    float4 _SSSColor;
    #if defined(PROP_SSSTHICKNESSMAP) || !defined(OPTIMIZER_ENABLED)
        Texture2D _SSSThicknessMap;
    #endif
    float4 _SSSThicknessMap_ST;
    float2 _SSSThicknessMapPan;
    float _SSSThicknessMapUV;
    float _SSSThicknessMapChannel;

    float _SSSThicknessMod;
    float _SSSStrength;
    float _SSSSpread;
    float _SSSDistortion;
    float _SSSBaseColorMix;
#endif
//endex

#T#PoiSubsurfaceScatteringFunctions
//ifex _SubsurfaceScattering==0
#ifdef POI_SUBSURFACESCATTERING
    void applySubsurfaceScattering(in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiFragData poiFragData)
    {
        float4 SSS = 1;
        #if defined(PROP_SSSTHICKNESSMAP) || !defined(OPTIMIZER_ENABLED)
            SSS = POI2D_SAMPLER_PAN(_SSSThicknessMap, _MainTex, poiUV(poiMesh.uv[_SSSThicknessMapUV], _SSSThicknessMap_ST), _SSSThicknessMapPan);
            SSS.a = 1 - SSS.a;
        #endif
        
        float3 vLTLight = poiLight.direction + poiMesh.normals[0] * _SSSDistortion;
        float flTDot = pow(saturate(dot(poiCam.viewDir, -vLTLight)), _SSSSpread) * _SSSStrength;
        #ifdef UNITY_PASS_FORWARDBASE
            float3 fLT = (flTDot) * saturate(SSS.a + - 1 * _SSSThicknessMod);
        #else
            float3 fLT = poiLight.additiveShadow * (flTDot) * saturate(SSS.a + - 1 * _SSSThicknessMod);
        #endif
        
        #if defined(POINT) || defined(SPOT)
            poiLight.finalLightAdd += fLT * poiLight.directColor * _SSSColor * SSS.rgb * lerp(1, poiFragData.baseColor, _SSSBaseColorMix);
        #endif
        poiLight.finalLightAdd += fLT * poiLight.directColor * _SSSColor * SSS.rgb * poiLight.attenuation * lerp(1, poiFragData.baseColor, _SSSBaseColorMix);
    }
#endif
//endex

#T#PoiSubsurfaceScatteringFunctionCalls
//ifex _SubsurfaceScattering==0
#ifdef POI_SUBSURFACESCATTERING
    applySubsurfaceScattering(poiCam, poiLight, poiMesh, poiFragData);
#endif
//endex