1 | uniform mat4 u_matrix;
|
2 | uniform vec2 u_pixel_coord_upper;
|
3 | uniform vec2 u_pixel_coord_lower;
|
4 | uniform float u_height_factor;
|
5 | uniform vec3 u_scale;
|
6 | uniform float u_vertical_gradient;
|
7 | uniform lowp float u_opacity;
|
8 |
|
9 | uniform vec3 u_lightcolor;
|
10 | uniform lowp vec3 u_lightpos;
|
11 | uniform lowp float u_lightintensity;
|
12 |
|
13 | attribute vec2 a_pos;
|
14 | attribute vec4 a_normal_ed;
|
15 |
|
16 | varying vec2 v_pos_a;
|
17 | varying vec2 v_pos_b;
|
18 | varying vec4 v_lighting;
|
19 |
|
20 | #pragma mapbox: define lowp float base
|
21 | #pragma mapbox: define lowp float height
|
22 | #pragma mapbox: define lowp vec4 pattern_from
|
23 | #pragma mapbox: define lowp vec4 pattern_to
|
24 | #pragma mapbox: define lowp float pixel_ratio_from
|
25 | #pragma mapbox: define lowp float pixel_ratio_to
|
26 |
|
27 | void main() {
|
28 | #pragma mapbox: initialize lowp float base
|
29 | #pragma mapbox: initialize lowp float height
|
30 | #pragma mapbox: initialize mediump vec4 pattern_from
|
31 | #pragma mapbox: initialize mediump vec4 pattern_to
|
32 | #pragma mapbox: initialize lowp float pixel_ratio_from
|
33 | #pragma mapbox: initialize lowp float pixel_ratio_to
|
34 |
|
35 | vec2 pattern_tl_a = pattern_from.xy;
|
36 | vec2 pattern_br_a = pattern_from.zw;
|
37 | vec2 pattern_tl_b = pattern_to.xy;
|
38 | vec2 pattern_br_b = pattern_to.zw;
|
39 |
|
40 | float tileRatio = u_scale.x;
|
41 | float fromScale = u_scale.y;
|
42 | float toScale = u_scale.z;
|
43 |
|
44 | vec3 normal = a_normal_ed.xyz;
|
45 | float edgedistance = a_normal_ed.w;
|
46 |
|
47 | vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;
|
48 | vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;
|
49 |
|
50 | base = max(0.0, base);
|
51 | height = max(0.0, height);
|
52 |
|
53 | float t = mod(normal.x, 2.0);
|
54 | float z = t > 0.0 ? height : base;
|
55 |
|
56 | gl_Position = u_matrix * vec4(a_pos, z, 1);
|
57 |
|
58 | vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0
|
59 | ? a_pos
|
60 | : vec2(edgedistance, z * u_height_factor);
|
61 |
|
62 | v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, pos);
|
63 | v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos);
|
64 |
|
65 | v_lighting = vec4(0.0, 0.0, 0.0, 1.0);
|
66 | float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0);
|
67 | directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);
|
68 |
|
69 | if (normal.y != 0.0) {
|
70 |
|
71 |
|
72 | directional *= (
|
73 | (1.0 - u_vertical_gradient) +
|
74 | (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0)));
|
75 | }
|
76 |
|
77 | v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));
|
78 | v_lighting *= u_opacity;
|
79 | }
|