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
|
#ifndef OutlineVert
#define OutlineVert
#include "CGI_PoiV2F.cginc"
float _OutlineMode;
float4 _OutlinePersonaDirection;
float4 _OutlineDropShadowOffset;
float _OutlineUseVertexColors;
float _OutlineFixedSize;
float _commentIfZero_EnableOutlinePass;
float _OutlinesMaxDistance;
sampler2D _OutlineMask; float4 _OutlineMask_ST; float2 _OutlineMaskPan; float _OutlineMaskUV;
float _VertexManipulationHeightUV;
float3 CreateBinormal(half3 normal, half3 tangent, half tangentSign)
{
half sign = tangentSign * unity_WorldTransformParams.w;
return cross(normal, tangent) * sign;
}
v2f vert(appdata v)
{
UNITY_SETUP_INSTANCE_ID(v);
v2f o;
#ifdef AUTO_EXPOSURE
applyLocalVertexTransformation(v.normal, v.tangent, v.vertex);
#endif
UNITY_INITIALIZE_OUTPUT(v2f, o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
#ifdef RALIV_PENETRATION
applyRalivDynamicOrifaceSystem(v);
#endif
o.uv0.xy = v.uv0.xy;
o.uv0.zw = v.uv1.xy;
o.uv1.xy = v.uv2.xy;
o.uv1.zw = v.uv3.xy;
float2 uvArray[4];
uvArray[0] = o.uv0.xy;
uvArray[1] = o.uv0.zw;
uvArray[2] = o.uv1.xy;
uvArray[3] = o.uv1.zw;
float2 uvToUse = uvArray[_VertexManipulationHeightUV];
#ifdef POI_MIRROR
applyMirrorRenderVert(v.vertex);
#endif
o.uv0.xy = v.uv0 + _OutlineGlobalPan.xy * _Time.y;
float outlineMask = 1;
outlineMask = poiMax(tex2Dlod(_OutlineMask, float4(TRANSFORM_TEX(uvArray[_OutlineMaskUV], _OutlineMask) + _Time.x * _OutlineMaskPan, 0, 0)).rgb);
UNITY_BRANCH
if (_OutlineUseVertexColors == 2)
{
outlineMask *= v.color.r;
}
UNITY_BRANCH
if (_OutlineUseVertexColors != 1)
{
o.normal = UnityObjectToWorldNormal(v.normal);
}
else
{
o.normal = UnityObjectToWorldNormal(v.color);
}
float4 localPos = v.vertex;
#ifdef RALIV_PENETRATION
applyRalivDynamicPenetrationSystem(localPos.rgb, o.normal.rgb, v);
#endif
o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
o.binormal.rgb = CreateBinormal(o.normal.xyz, o.tangent.xyz, o.tangent.w);
half offsetMultiplier = 1;
half distanceOffset = 1;
UNITY_BRANCH
if (_OutlineFixedSize)
{
distanceOffset *= min(distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, localPos).xyz), _OutlinesMaxDistance);
}
float3 offset = o.normal * (_LineWidth * _commentIfZero_EnableOutlinePass / 100) * outlineMask * distanceOffset;
UNITY_BRANCH
if (_OutlineMode == 2)
{
float3 lightDirection = poiLight.direction = normalize(_WorldSpaceLightPos0 + unity_SHAr.xyz + unity_SHAg.xyz + unity_SHAb.xyz);
offsetMultiplier = saturate(dot(lightDirection, o.normal));
offset *= offsetMultiplier;
offset *= distanceOffset;
}
else if (_OutlineMode == 3)
{
half3 viewNormal = mul((float3x3)UNITY_MATRIX_V, o.normal);
offsetMultiplier = saturate(dot(viewNormal.xy, normalize(_OutlinePersonaDirection.xy)));
offset *= offsetMultiplier;
offset *= distanceOffset;
}
else if (_OutlineMode == 4)
{
offset = mul((float3x3)transpose(UNITY_MATRIX_V), _OutlineDropShadowOffset);
offset *= distanceOffset;
}
o.worldPos = mul(unity_ObjectToWorld, localPos) + float4(offset, 0);
o.modelPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
#ifdef AUTO_EXPOSURE
applyWorldVertexTransformation(o.worldPos, o.localPos, o.normal, uvToUse);
#endif
#ifdef AUTO_EXPOSURE
applyVertexRounding(o.worldPos, o.localPos);
#endif
o.pos = UnityWorldToClipPos(o.worldPos);
o.grabPos = ComputeGrabScreenPos(o.pos);
o.angleAlpha = 1;
#ifdef POI_RANDOM
o.angleAlpha = ApplyAngleBasedRendering(o.modelPos, o.worldPos);
#endif
UNITY_TRANSFER_SHADOW(o, o.uv0);
UNITY_TRANSFER_FOG(o, o.pos);
return o;
}
#endif
|