| 12345678910111213141516171819202122232425262728293031323334353637 | #ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED	struct IndirectShaderData	{		float4x4 PositionMatrix;		float4x4 InversePositionMatrix;		float4 ControlData;	};	#if defined(SHADER_API_GLCORE) || defined(SHADER_API_D3D11) || defined(SHADER_API_GLES3) || defined(SHADER_API_METAL) || defined(SHADER_API_VULKAN) || defined(SHADER_API_PS4) || defined(SHADER_API_XBOXONE)		StructuredBuffer<IndirectShaderData> IndirectShaderDataBuffer;		StructuredBuffer<IndirectShaderData> VisibleShaderDataBuffer;	#endif	#endifvoid setup(){#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED	#ifdef GPU_FRUSTUM_ON		unity_ObjectToWorld = VisibleShaderDataBuffer[unity_InstanceID].PositionMatrix;		unity_WorldToObject = VisibleShaderDataBuffer[unity_InstanceID].InversePositionMatrix;	#else		unity_ObjectToWorld = IndirectShaderDataBuffer[unity_InstanceID].PositionMatrix;		unity_WorldToObject = IndirectShaderDataBuffer[unity_InstanceID].InversePositionMatrix;	#endif	#ifdef FAR_CULL_ON_PROCEDURAL_INSTANCING		#define transformPosition mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz			#define distanceToCamera length(transformPosition - _WorldSpaceCameraPos.xyz)				float cull = 1.0 - saturate((distanceToCamera - _CullFarStart) / _CullFarDistance);				unity_ObjectToWorld = mul(unity_ObjectToWorld, float4x4(cull, 0, 0, 0, 0, cull, 0, 0, 0, 0, cull, 0, 0, 0, 0, 1));			#undef transformPosition		#undef distanceToCamera	#endif#endif}
 |