UNPKG

2.89 kBPlain TextView Raw
1uniform mat4 u_matrix;
2uniform vec2 u_pixel_coord_upper;
3uniform vec2 u_pixel_coord_lower;
4uniform float u_height_factor;
5uniform vec3 u_scale;
6uniform float u_vertical_gradient;
7uniform lowp float u_opacity;
8
9uniform vec3 u_lightcolor;
10uniform lowp vec3 u_lightpos;
11uniform lowp float u_lightintensity;
12
13attribute vec2 a_pos;
14attribute vec4 a_normal_ed;
15
16varying vec2 v_pos_a;
17varying vec2 v_pos_b;
18varying 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
27void 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 // extrusion top
60 : vec2(edgedistance, z * u_height_factor); // extrusion side
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 // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,
71 // and otherwise calculates the gradient based on base + height
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}