#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; 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[(0.0 /*_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[(0.0 /*_OutlineMaskUV*/)], _OutlineMask) + _Time.x * float4(0,0,0,0), 0, 0)).rgb); if ((0.0 /*_OutlineUseVertexColors*/) == 2) { outlineMask *= v.color.r; } if ((0.0 /*_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; if ((0.0 /*_OutlineFixedSize*/)) { distanceOffset *= min(distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, localPos).xyz), (9999.0 /*_OutlinesMaxDistance*/)); } float3 offset = o.normal * ((0.0 /*_LineWidth*/) * (0.0 /*_commentIfZero_EnableOutlinePass*/) / 100) * outlineMask * distanceOffset; if ((0.0 /*_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 ((0.0 /*_OutlineMode*/) == 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 ((0.0 /*_OutlineMode*/) == 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