res-avatar-unity/Assets/_PoiyomiShaders/Shaders/7.3/Pro/Includes/CGI_PoiPathing.cginc

150 lines
5.8 KiB
HLSL
Raw Permalink Normal View History

2023-07-16 02:51:23 +00:00
#ifndef POI_PATHING
#define POI_PATHING
// Fill, 0, Path, 1, Loop, 2
half _PathTypeR;
half _PathTypeG;
half _PathTypeB;
half3 _PathWidth;
float3 _PathTime;
float3 _PathOffset;
float3 _PathSpeed;
float4 _PathColorR;
float4 _PathColorG;
float4 _PathColorB;
float3 _PathEmissionStrength;
float3 _PathSoftness;
float3 _PathSegments;
float3 _PathAlpha;
#ifdef POI_AUDIOLINK
// Time Offset
half _AudioLinkPathTimeOffsetBandR;
half2 _AudioLinkPathTimeOffsetR;
half _AudioLinkPathTimeOffsetBandG;
half2 _AudioLinkPathTimeOffsetG;
half _AudioLinkPathTimeOffsetBandB;
half2 _AudioLinkPathTimeOffsetB;
// Emission Offset
half _AudioLinkPathEmissionAddBandR;
half2 _AudioLinkPathEmissionAddR;
half _AudioLinkPathEmissionAddBandG;
half2 _AudioLinkPathEmissionAddG;
half _AudioLinkPathEmissionAddBandB;
half2 _AudioLinkPathEmissionAddB;
// Length Offset
half _AudioLinkPathWidthOffsetBandR;
half2 _AudioLinkPathWidthOffsetR;
half _AudioLinkPathWidthOffsetBandG;
half2 _AudioLinkPathWidthOffsetG;
half _AudioLinkPathWidthOffsetBandB;
half2 _AudioLinkPathWidthOffsetB;
#endif
#if defined(PROP_PATHINGMAP) || !defined(OPTIMIZER_ENABLED)
POI_TEXTURE_NOSAMPLER(_PathingMap);
#endif
#if defined(PROP_PATHINGCOLORMAP) || !defined(OPTIMIZER_ENABLED)
POI_TEXTURE_NOSAMPLER(_PathingColorMap);
#endif
void applyPathing(inout float4 albedo, inout float3 pathEmission)
{
#if defined(PROP_PATHINGMAP) || !defined(OPTIMIZER_ENABLED)
float4 path = POI2D_SAMPLER_PAN(_PathingMap, _MainTex, poiMesh.uv[_PathingMapUV], _PathingMapPan);
#else
float4 path = float4(0,0,0,0);
return;
#endif
#if defined(PROP_PATHINGCOLORMAP) || !defined(OPTIMIZER_ENABLED)
float4 pathColorMap = POI2D_SAMPLER_PAN(_PathingColorMap, _MainTex, poiMesh.uv[_PathingColorMapUV], _PathingColorMapPan);
#else
float4 pathColorMap = float4(1, 1, 1, 1);
#endif
float3 pathAudioLinkEmission = 0;
float3 pathTime = 0;
float3 pathAlpha[3] = {
float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)
};
#ifdef POI_AUDIOLINK
half pathAudioLinkPathTimeOffsetBand[3] = {_AudioLinkPathTimeOffsetBandR, _AudioLinkPathTimeOffsetBandG, _AudioLinkPathTimeOffsetBandB};
half2 pathAudioLinkTimeOffset[3] = {_AudioLinkPathTimeOffsetR.xy, _AudioLinkPathTimeOffsetG.xy, _AudioLinkPathTimeOffsetB.xy};
half pathAudioLinkPathWidthOffsetBand[3] = {_AudioLinkPathWidthOffsetBandR, _AudioLinkPathWidthOffsetBandG, _AudioLinkPathWidthOffsetBandB};
half2 pathAudioLinkWidthOffset[3] = {_AudioLinkPathWidthOffsetR.xy, _AudioLinkPathWidthOffsetG.xy, _AudioLinkPathWidthOffsetB.xy};
UNITY_BRANCH
if (poiMods.audioLinkTextureExists)
{
// Emission
pathAudioLinkEmission.r = lerp(_AudioLinkPathEmissionAddR.x, _AudioLinkPathEmissionAddR.y, poiMods.audioLink[_AudioLinkPathEmissionAddBandR]);
pathAudioLinkEmission.g = lerp(_AudioLinkPathEmissionAddG.x, _AudioLinkPathEmissionAddG.y, poiMods.audioLink[_AudioLinkPathEmissionAddBandG]);
pathAudioLinkEmission.b = lerp(_AudioLinkPathEmissionAddB.x, _AudioLinkPathEmissionAddB.y, poiMods.audioLink[_AudioLinkPathEmissionAddBandB]);
}
#endif
[unroll]
for (int index = 0; index < 3; index++)
{
pathTime[index] = _PathTime[index] != -999.0f ? frac(_PathTime[index] + _PathOffset[index]): frac(_Time.x * _PathSpeed[index] + _PathOffset[index]);
#ifdef POI_AUDIOLINK
UNITY_BRANCH
if (poiMods.audioLinkTextureExists)
{
pathTime[index] += lerp(pathAudioLinkTimeOffset[index].x, pathAudioLinkTimeOffset[index].y, poiMods.audioLink[pathAudioLinkPathTimeOffsetBand[index]]);
}
#endif
if (_PathSegments[index])
{
float pathSegments = abs(_PathSegments[index]);
pathTime = (ceil(pathTime * pathSegments) - .5) / pathSegments;
}
if (path[index])
{
// Cutting it in half because it goes out in both directions for now
half pathWidth = _PathWidth[index] * .5;
#ifdef POI_AUDIOLINK
UNITY_BRANCH
if (poiMods.audioLinkTextureExists)
{
pathWidth += lerp(pathAudioLinkWidthOffset[index].x, pathAudioLinkWidthOffset[index].y, poiMods.audioLink[pathAudioLinkPathWidthOffsetBand[index]]);
}
#endif
//fill
pathAlpha[index].x = pathTime[index] > path[index];
//path
pathAlpha[index].y = saturate((1 - abs(lerp(-pathWidth, 1 + pathWidth, pathTime[index]) - path[index])) - (1 - pathWidth)) * (1 / pathWidth);
//loop
pathAlpha[index].z = saturate((1 - distance(pathTime[index], path[index])) - (1 - pathWidth)) * (1 / pathWidth);
pathAlpha[index].z += saturate(distance(pathTime[index], path[index]) - (1 - pathWidth)) * (1 / pathWidth);
pathAlpha[index] = smoothstep(0, _PathSoftness[index] + .00001, pathAlpha[index]);
}
}
// Emission
pathEmission = 0;
pathEmission += pathAlpha[0][_PathTypeR] * _PathColorR.rgb * (_PathEmissionStrength[0] + pathAudioLinkEmission.r);
pathEmission += pathAlpha[1][_PathTypeG] * _PathColorG.rgb * (_PathEmissionStrength[1] + pathAudioLinkEmission.g);
pathEmission += pathAlpha[2][_PathTypeB] * _PathColorB.rgb * (_PathEmissionStrength[2] + pathAudioLinkEmission.b);
pathEmission *= pathColorMap.rgb * pathColorMap.a * path.a;
float3 colorReplace = 0;
colorReplace = pathAlpha[0][_PathTypeR] * _PathColorR.rgb * pathColorMap.rgb;
albedo.rgb = lerp(albedo.rgb, colorReplace + albedo.rgb * 0.00001, pathColorMap.a * path.a * _PathColorR.a * pathAlpha[0][_PathTypeR]);
colorReplace = pathAlpha[1][_PathTypeG] * _PathColorG.rgb * pathColorMap.rgb;
albedo.rgb = lerp(albedo.rgb, colorReplace + albedo.rgb * 0.00001, pathColorMap.a * path.a * _PathColorG.a * pathAlpha[1][_PathTypeG]);
colorReplace = pathAlpha[2][_PathTypeB] * _PathColorB.rgb * pathColorMap.rgb;
albedo.rgb = lerp(albedo.rgb, colorReplace + albedo.rgb * 0.00001, pathColorMap.a * path.a * _PathColorB.a * pathAlpha[2][_PathTypeB]);
}
#endif