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
|