summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/Avatars/Auri/materials/OptimizedShaders/body/Includes/CGI_PoiOutlineVert.cginc
blob: 637ec16dc1ee241ae02e519c371a8f14f76599c4 (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
#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;
    v2f vert(appdata v)
    {
        
        UNITY_SETUP_INSTANCE_ID(v);
        v2f o;
        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;
        
        #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[float(0)], _OutlineMask) + _Time.x * float4(0,0,0,0), 0, 0)).rgb);
        
        if (float(0) == 2)
        {
            outlineMask *= v.color.r;
        }
        
        
        if(float(0) != 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
        
        half offsetMultiplier = 1;
        half distanceOffset = 1;
        
        if(float(0))
        {
            distanceOffset *= min(distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, localPos).xyz), float(9999));
        }
        
        float3 offset = o.normal * (float(0) * float(0) / 100) * outlineMask * distanceOffset;
        
        
        if(float(0) == 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(float(0) == 3)
        {
            half3 viewNormal = mul((float3x3)UNITY_MATRIX_V, o.normal);
            offsetMultiplier = saturate(dot(viewNormal.xy, normalize(float4(1,0,0,0).xy)));
            
            offset *= offsetMultiplier;
            offset *= distanceOffset;
        }
        else if(float(0) == 4)
        {
            offset = mul((float3x3)transpose(UNITY_MATRIX_V), float4(1,0,0,0));
            offset *= distanceOffset;
        }
        
        o.worldPos = mul(unity_ObjectToWorld, localPos) + float4(offset, 0);
        o.modelPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
        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