StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.6 KiB
64 lines
2.6 KiB
uniform mat4 u_matrix;
|
|
uniform bool u_scale_with_map;
|
|
uniform bool u_pitch_with_map;
|
|
uniform vec2 u_extrude_scale;
|
|
uniform lowp float u_device_pixel_ratio;
|
|
uniform highp float u_camera_to_center_distance;
|
|
|
|
attribute vec2 a_pos;
|
|
|
|
varying vec3 v_data;
|
|
|
|
#pragma mapbox: define highp vec4 color
|
|
#pragma mapbox: define mediump float radius
|
|
#pragma mapbox: define lowp float blur
|
|
#pragma mapbox: define lowp float opacity
|
|
#pragma mapbox: define highp vec4 stroke_color
|
|
#pragma mapbox: define mediump float stroke_width
|
|
#pragma mapbox: define lowp float stroke_opacity
|
|
|
|
void main(void) {
|
|
#pragma mapbox: initialize highp vec4 color
|
|
#pragma mapbox: initialize mediump float radius
|
|
#pragma mapbox: initialize lowp float blur
|
|
#pragma mapbox: initialize lowp float opacity
|
|
#pragma mapbox: initialize highp vec4 stroke_color
|
|
#pragma mapbox: initialize mediump float stroke_width
|
|
#pragma mapbox: initialize lowp float stroke_opacity
|
|
|
|
// unencode the extrusion vector that we snuck into the a_pos vector
|
|
vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);
|
|
|
|
// multiply a_pos by 0.5, since we had it * 2 in order to sneak
|
|
// in extrusion data
|
|
vec2 circle_center = floor(a_pos * 0.5);
|
|
if (u_pitch_with_map) {
|
|
vec2 corner_position = circle_center;
|
|
if (u_scale_with_map) {
|
|
corner_position += extrude * (radius + stroke_width) * u_extrude_scale;
|
|
} else {
|
|
// Pitching the circle with the map effectively scales it with the map
|
|
// To counteract the effect for pitch-scale: viewport, we rescale the
|
|
// whole circle based on the pitch scaling effect at its central point
|
|
vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);
|
|
corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);
|
|
}
|
|
|
|
gl_Position = u_matrix * vec4(corner_position, 0, 1);
|
|
} else {
|
|
gl_Position = u_matrix * vec4(circle_center, 0, 1);
|
|
|
|
if (u_scale_with_map) {
|
|
gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;
|
|
} else {
|
|
gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;
|
|
}
|
|
}
|
|
|
|
// This is a minimum blur distance that serves as a faux-antialiasing for
|
|
// the circle. since blur is a ratio of the circle's size and the intent is
|
|
// to keep the blur at roughly 1px, the two are inversely related.
|
|
lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width);
|
|
|
|
v_data = vec3(extrude.x, extrude.y, antialiasblur);
|
|
}
|
|
|