Shader "MixedReality/SelectivePassthroughSoft" {
  Properties{
	  _MainTex("Texture", 2D) = "white" {}
	  _SoftFade("Soft Fade Distance", Float) = 0.05
	 _Inflation("Inflation", float) = 0
  }
	  SubShader {
    Tags{"RenderType" = "Transparent"} LOD 100

        Pass {
			ZWrite Off
			BlendOp RevSub, Min 
			Blend Zero One, One OneMinusSrcAlpha

              CGPROGRAM
      // Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members
      // center)
      //#pragma exclude_renderers d3d11
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

      struct appdata {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
        float3 normal : NORMAL;
      };

      struct v2f {
        float2 uv : TEXCOORD0;
        float4 vertex : SV_POSITION;
        float2 projPos : TEXCOORD1;
        float depth : DEPTH;
      };

      sampler2D _MainTex;
      sampler2D _CameraDepthTexture;
      float4 _MainTex_ST;
      float _SoftFade;
      float _Inflation;

      v2f vert(appdata v) {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex + v.normal * _Inflation);
        float4 origin = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0));
        o.uv = TRANSFORM_TEX(v.uv, _MainTex);
        o.depth = -UnityObjectToViewPos(v.vertex).z * _ProjectionParams.w;
        o.projPos = (o.vertex.xy / o.vertex.w) * 0.5 + 0.5;
        return o;
      }

      fixed4 frag(v2f i) : SV_Target {
        // get a linear & normalized (0-1) depth value of the scene
        float frameDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.projPos.xy));
        // convert the normalized value to world units, with depth of 0 at this mesh
        frameDepth = (frameDepth - i.depth) * _ProjectionParams.z;
        // remap it to a fade distance
        frameDepth = saturate(frameDepth / _SoftFade);
        fixed4 col = tex2D(_MainTex, i.uv);
        return float4(0, 0, 0, 1-(col.r * frameDepth));
      }
      ENDCG
    }
  }
}
