#version 430

layout(binding=0) uniform sampler2D s_projection;
layout(binding=1) uniform sampler2D s_falloff;
layout(binding=2) uniform sampler2D s_depth;

layout (location = 0) uniform mat4 u_MVP;
//layout (location = 1) uniform vec3 u_lightOrigin;
layout (location = 2) uniform vec3 u_viewOrigin;
layout (location = 3) uniform mat4 u_lightProject;
layout (location = 4) uniform vec4 u_lightFrustum[6];

in vec4 csLight;
in vec4 csThis;
in vec4 lightProject;
in vec4 worldPosition;

void main() {
	vec2 wrCoord = csThis.xy/csThis.w * .5 + .5;
	float depth = texture2D(s_depth, wrCoord ).r;
/*	if(depth < gl_FragCoord.z)
		discard;*/
	
	vec3 dirToViewer = normalize(u_viewOrigin - worldPosition.xyz);
	// where does the fragment-viewer ray leave the light frustum?

	float minRayCoord = -1e11; 
	vec3 rayPlaneIntersection[6]; 
	for(int i=0; i<6; i++) {  // https://stackoverflow.com/questions/23975555/how-to-do-ray-plane-intersection
		if(i!=2)
			;//continue;
		float top = dot(u_lightFrustum[i], worldPosition);
		float bottom = dot(u_lightFrustum[i].xyz, dirToViewer);
		if(abs(bottom) < 1e-3) { // special case, ray parallel to plane
			continue; 
		}
		float rayCoord = top / bottom;
		if(rayCoord > -1e-1) { // tested plane is the rendered plane
			continue;          // at least one of these must be zero (the plane being rendered now)
		}
		if(rayCoord < minRayCoord)
			continue;
		minRayCoord = rayCoord;
	}
	vec3 exitPoint = worldPosition.xyz - minRayCoord * dirToViewer;
	
	vec4 samplePos = worldPosition;
	vec3 color = vec3(0);
	color = vec3(distance(exitPoint, worldPosition.xyz)*1e-2);
	if(minRayCoord > 0)
		minRayCoord *= sin(gl_FragCoord.x*1e-1);
	color = vec3(abs(minRayCoord))*vec3(1e-2, 1e-3, 1e-4)*1e0;
	for(int i=0; i<20; i++) {
		vec4 sampleClip = u_MVP * samplePos;
		if(sampleClip.z <= 0)
			break;
		float sampleDepth = sampleClip.z/sampleClip.w * .5 + .5;
		if(sampleDepth < depth) {
			vec4 lightProject = samplePos * u_lightProject;
			vec4 t0 = texture2DProj(s_projection, lightProject.xyz );
			//color += t0.rgb * 0.05;
			//color += .05;
		}
		samplePos.xyz += dirToViewer * 3e0;
		//color += vec3(1e-2);
	}

	gl_FragColor.rgb = color.rgb * 1e0;
	//gl_FragColor.rg = wrCoord;
	//gl_FragColor.b = .1;
}