-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move scaling calculation to vertex shader
- Loading branch information
Lauren Budorick
committed
Apr 6, 2018
1 parent
dfab029
commit 756041a
Showing
3 changed files
with
88 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
|
||
// the attribute conveying progress along a line is scaled to [0, 2^15) | ||
#define MAX_LINE_DISTANCE 32767.0 | ||
|
||
// the distance over which the line edge fades out. | ||
// Retina devices need a smaller distance to avoid aliasing. | ||
#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0 | ||
|
||
// floor(127 / 2) == 63.0 | ||
// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is | ||
// stored in a byte (-128..127). we scale regular normals up to length 63, but | ||
// there are also "special" normals that have a bigger length (of up to 126 in | ||
// this case). | ||
// #define scale 63.0 | ||
#define scale 0.015873016 | ||
|
||
attribute vec4 a_pos_normal; | ||
attribute vec4 a_data; | ||
|
||
uniform mat4 u_matrix; | ||
uniform mediump float u_ratio; | ||
uniform vec2 u_gl_units_to_pixels; | ||
|
||
varying vec2 v_normal; | ||
varying vec2 v_width2; | ||
varying float v_gamma_scale; | ||
varying highp float v_lineprogress; | ||
|
||
#pragma mapbox: define lowp float blur | ||
#pragma mapbox: define lowp float opacity | ||
#pragma mapbox: define mediump float gapwidth | ||
#pragma mapbox: define lowp float offset | ||
#pragma mapbox: define mediump float width | ||
|
||
void main() { | ||
#pragma mapbox: initialize lowp float blur | ||
#pragma mapbox: initialize lowp float opacity | ||
#pragma mapbox: initialize mediump float gapwidth | ||
#pragma mapbox: initialize lowp float offset | ||
#pragma mapbox: initialize mediump float width | ||
|
||
vec2 a_extrude = a_data.xy - 128.0; | ||
float a_direction = mod(a_data.z, 4.0) - 1.0; | ||
|
||
v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE; | ||
|
||
vec2 pos = a_pos_normal.xy; | ||
|
||
// x is 1 if it's a round cap, 0 otherwise | ||
// y is 1 if the normal points up, and -1 if it points down | ||
mediump vec2 normal = a_pos_normal.zw; | ||
v_normal = normal; | ||
|
||
// these transformations used to be applied in the JS and native code bases. | ||
// moved them into the shader for clarity and simplicity. | ||
gapwidth = gapwidth / 2.0; | ||
float halfwidth = width / 2.0; | ||
offset = -1.0 * offset; | ||
|
||
float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0); | ||
float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING; | ||
|
||
// Scale the extrusion vector down to a normal and then up by the line width | ||
// of this vertex. | ||
mediump vec2 dist = outset * a_extrude * scale; | ||
|
||
// Calculate the offset when drawing a line that is to the side of the actual line. | ||
// We do this by creating a vector that points towards the extrude, but rotate | ||
// it when we're drawing round end points (a_direction = -1 or 1) since their | ||
// extrude vector points in another direction. | ||
mediump float u = 0.5 * a_direction; | ||
mediump float t = 1.0 - abs(u); | ||
mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); | ||
|
||
vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0); | ||
gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude; | ||
|
||
// calculate how much the perspective view squishes or stretches the extrude | ||
float extrude_length_without_perspective = length(dist); | ||
float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels); | ||
v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective; | ||
|
||
v_width2 = vec2(outset, inset); | ||
} |