mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-30 06:50:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #version 330 core
 | |
| 
 | |
| #define DEGREES_MAX   360.0f
 | |
| #define LATITUDE_MAX  85.051128779806604f
 | |
| #define LONGITUDE_MAX 180.0f
 | |
| #define PI            3.1415926535897932384626433f
 | |
| #define RAD2DEG       57.295779513082320876798156332941f
 | |
| #define DEG2RAD       0.0174532925199432957692369055556f
 | |
| 
 | |
| layout (location = 0) in vec2  aLatLong;
 | |
| layout (location = 1) in vec2  aXYOffset;
 | |
| layout (location = 2) in vec3  aTexCoord;
 | |
| layout (location = 3) in vec4  aModulate;
 | |
| layout (location = 4) in float aAngleDeg;
 | |
| layout (location = 5) in int   aThreshold;
 | |
| layout (location = 6) in ivec2 aTimeRange;
 | |
| layout (location = 7) in int   aDisplayed;
 | |
| 
 | |
| uniform mat4 uMVPMatrix;
 | |
| uniform mat4 uMapMatrix;
 | |
| uniform vec2 uMapScreenCoord;
 | |
| 
 | |
| out VertexData
 | |
| {
 | |
|    int   threshold;
 | |
|    vec3  texCoord;
 | |
|    vec4  color;
 | |
|    ivec2 timeRange;
 | |
|    int   displayed;
 | |
| } vsOut;
 | |
| 
 | |
| smooth out vec3 texCoord;
 | |
| smooth out vec4 color;
 | |
| 
 | |
| vec2 latLngToScreenCoordinate(in vec2 latLng)
 | |
| {
 | |
|    vec2 p;
 | |
|    latLng.x = clamp(latLng.x, -LATITUDE_MAX, LATITUDE_MAX);
 | |
|    p.xy     = vec2(LONGITUDE_MAX + latLng.y,
 | |
|                    -(LONGITUDE_MAX - RAD2DEG * log(tan(PI / 4 + latLng.x * PI / DEGREES_MAX))));
 | |
|    return p;
 | |
| }
 | |
| 
 | |
| void main()
 | |
| {
 | |
|    // Pass displayed to the geometry shader
 | |
|    vsOut.displayed = aDisplayed;
 | |
| 
 | |
|    // Pass the threshold and time range to the geometry shader
 | |
|    vsOut.threshold = aThreshold;
 | |
|    vsOut.timeRange = aTimeRange;
 | |
| 
 | |
|    // Pass the texture coordinate and color modulate to the geometry and
 | |
|    // fragment shaders
 | |
|    vsOut.texCoord = aTexCoord;
 | |
|    vsOut.color    = aModulate;
 | |
|    texCoord       = aTexCoord;
 | |
|    color          = aModulate;
 | |
| 
 | |
|    vec2 p = latLngToScreenCoordinate(aLatLong) - uMapScreenCoord;
 | |
| 
 | |
|    // Rotate clockwise
 | |
|    float angle  = aAngleDeg * DEG2RAD;
 | |
|    mat2  rotate = mat2(cos(angle), -sin(angle),
 | |
|                        sin(angle), cos(angle));
 | |
| 
 | |
|    // Transform the position to screen coordinates
 | |
|    gl_Position = uMapMatrix * vec4(p, 0.0f, 1.0f) +
 | |
|                  uMVPMatrix * vec4(rotate * aXYOffset, 0.0f, 0.0f);
 | |
| }
 | 
