forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			32 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			32 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef _LIGHT_COMMON_GLSL_
							 | 
						||
| 
								 | 
							
								#define _LIGHT_COMMON_GLSL_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _Spot
							 | 
						||
| 
								 | 
							
								float spotlightMask(const vec3 dir, const vec3 spotDir, const vec3 right, const vec2 scale, const float spotSize, const float spotBlend) {
							 | 
						||
| 
								 | 
							
									// Project the fragment's light dir to the z axis in the light's local space
							 | 
						||
| 
								 | 
							
									float localZ = dot(spotDir, dir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (localZ < 0) {
							 | 
						||
| 
								 | 
							
										return 0.0; // Discard opposite cone
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									vec3 up = cross(spotDir, right);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Scale the incoming light direction to treat the spotlight's ellipse as if
							 | 
						||
| 
								 | 
							
									// it was 1 unit away from the light source, this way the smoothstep below
							 | 
						||
| 
								 | 
							
									// works independently of the distance
							 | 
						||
| 
								 | 
							
									vec3 scaledDir = dir.xyz / localZ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Project to right and up vectors to apply axis scale
							 | 
						||
| 
								 | 
							
									float localX = dot(scaledDir, right) / scale.x;
							 | 
						||
| 
								 | 
							
									float localY = dot(scaledDir, up) / scale.y;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Inverse of length of vector from ellipse to light (scaledDir.z == 1.0)
							 | 
						||
| 
								 | 
							
									float ellipse = inversesqrt(localX * localX + localY * localY + 1.0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return smoothstep(0.0, 1.0, (ellipse - spotSize) / spotBlend);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif // _Spot
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // _LIGHT_COMMON_GLSL_
							 |