summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Pro/Includes/CGI_PoiPathing.cginc
blob: b35f402e3697258cff5811bf115fc4b7df18b50e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#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