| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2,8 +2,7 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			precision mediump float; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define     MAX_SPOTS			3 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define MAX_SPOTS   3 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			struct Spot { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    vec2 pos;		// window coords of spot | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -11,27 +10,27 @@ struct Spot { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float radius;	// alpha fades out to this radius | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			}; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform Spot spots[MAX_SPOTS];      // Spotlight positions array | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float screenWidth; // Width of the screen | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform Spot spots[MAX_SPOTS];  // Spotlight positions array | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			uniform float screenWidth;      // Width of the screen | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void main() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				float alpha = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				// get the position of the current fragment (screen coordinates!) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				// Get the position of the current fragment (screen coordinates!) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				// find out which spotlight is nearest | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				float d = 65000.0; // some high value | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				int fi = -1err">; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				// Find out which spotlight is nearest | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				float d = 65000.0;  // some high value | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				int fi = -1k">;        // found index | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    for (int i = 0; i < MAX_SPOTS; i++) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					for (int j = 0; j < MAX_SPOTS; j++) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						float dj = distance(pos, spots[j].pos) - spots[j].radius + spots[i].radius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d > dj )  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d > dj)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
							d = dj; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
							fi = i; | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -41,22 +40,31 @@ void main() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // d now equals distance to nearest spot... | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // allowing for the different radii of all spotlights | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (fi != -1) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					if (d > spots[fi].radius)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (fi == 0)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					if (d > spots[0].radius) alpha = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						alpha = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d < spots[0].inner) alpha = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						else alpha = (d - spots[0].inner)/(spots[0].radius - spots[0].inner); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else if (fi == 1)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					if (d > spots[1].radius) alpha = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d < spots[fi].inner)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
							alpha = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						else  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
							alpha = (d - spots[fi].inner) / (spots[fi].radius - spots[fi].inner); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d < spots[1].inner) alpha = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						else alpha = (d - spots[1].inner)/(spots[1].radius - spots[1].inner); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else if (fi == 2)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					if (d > spots[2].radius) alpha = 1.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						if (d < spots[2].inner) alpha = 0.0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
						else alpha = (d - spots[2].inner)/(spots[2].radius - spots[2].inner); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
					} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				 | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -65,5 +73,5 @@ void main() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				if ((pos.x > screenWidth/2.0) && (alpha > 0.9)) alpha = 0.9; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				// could make the black out colour user definable... | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    gl_FragColor = vec4( 0 class="k">, 0, 0, alpha); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    gl_FragColor = vec4(0, 0, 0, alpha); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} |