@bokeh/bokehjs
Version:
Interactive, novel data visualization
91 lines (90 loc) • 4.51 kB
JavaScript
const shader = `
precision mediump float;attribute vec2 a_position;attribute vec2 a_center;attribute float a_width;attribute float a_height;attribute float a_angle;attribute float a_aux;attribute float a_linewidth;attribute vec4 a_line_color;attribute vec4 a_fill_color;attribute float a_line_cap;attribute float a_line_join;attribute float a_show;
attribute float a_hatch_pattern;attribute float a_hatch_scale;attribute float a_hatch_weight;attribute vec4 a_hatch_color;
uniform vec2 u_canvas_size;uniform float u_antialias;
uniform float u_size_hint;
uniform vec4 u_border_radius;varying vec4 v_border_radius;
varying float v_outer_radius;varying float v_inner_radius;varying float v_start_angle;varying float v_end_angle;
varying float v_outer_radius;varying float v_inner_radius;
varying float v_radius;varying float v_start_angle;varying float v_end_angle;
varying float v_radius;
varying float v_n;
varying float v_linewidth;varying vec2 v_size;varying vec4 v_line_color;varying vec4 v_fill_color;varying float v_line_cap;varying float v_line_join;varying vec2 v_coords;
varying float v_hatch_pattern;varying float v_hatch_scale;varying float v_hatch_weight;varying vec4 v_hatch_color;varying vec2 v_hatch_coords;
vec2 enclosing_size(){int size_hint=int(u_size_hint+0.5);if(size_hint==M_DASH)return vec2(v_size.x+v_linewidth+u_antialias,v_linewidth+u_antialias);else if(size_hint==M_DOT)return 0.25*v_size+u_antialias;else if(size_hint==M_DIAMOND)return vec2(v_size.x*(2./3.)+(v_linewidth+u_antialias)*1.20185,v_size.y+(v_linewidth+u_antialias)*1.80278);else if(size_hint==M_HEX)return v_size+(v_linewidth+u_antialias)*vec2(2./sqrt(3.),1.);else if(size_hint==M_SQUARE_PIN)return v_size+(v_linewidth+u_antialias)*3.1;else if(size_hint==M_TRIANGLE)return vec2(v_size.x+(v_linewidth+u_antialias)*sqrt(3.),v_size.y*(2./sqrt(3.))+(v_linewidth+u_antialias)*2.);else if(size_hint==M_TRIANGLE_PIN)return v_size+(v_linewidth+u_antialias)*vec2(4.8,6.);else if(size_hint==M_STAR)return vec2(v_size.x*0.95106+(v_linewidth+u_antialias)*3.,v_size.y+(v_linewidth+u_antialias)*3.2);else return v_size+v_linewidth+u_antialias;}
vec2 enclosing_size(){return v_size+v_linewidth+u_antialias;}
void main(){
v_size=vec2(a_width,a_height);
v_size=vec2(2.*a_width,2.*a_width);
v_size=vec2(a_width,a_width);
v_n=a_aux;
if(a_show<0.5||v_size.x<0.||v_size.y<0.||(v_size.x==0.&&v_size.y==0.)
||v_n<3.
){gl_Position=vec4(-2.,-2.,0.,1.);return;}
v_outer_radius=a_width;v_inner_radius=a_height;v_start_angle=a_angle;v_end_angle=a_aux;
v_outer_radius=a_width;v_inner_radius=a_height;
v_radius=a_width;v_start_angle=a_angle;v_end_angle=a_aux;
v_radius=0.5*a_width;
const vec2 unit2=vec2(1.,1.);float scale=min(v_size.x/max(dot(u_border_radius.xy,unit2),dot(u_border_radius.zw,unit2)),v_size.y/max(dot(u_border_radius.yz,unit2),dot(u_border_radius.wx,unit2)));v_border_radius=u_border_radius*min(scale,1.);
v_linewidth=a_linewidth;v_line_color=a_line_color;v_fill_color=a_fill_color;v_line_cap=a_line_cap;v_line_join=a_line_join;if(v_linewidth<1.){v_line_color.a*=v_linewidth;v_linewidth=1.;}
v_hatch_pattern=a_hatch_pattern;v_hatch_scale=a_hatch_scale;v_hatch_weight=a_hatch_weight;v_hatch_color=a_hatch_color;
v_coords=a_position*enclosing_size();
vec2 pos=a_center+v_coords;
float c=cos(-a_angle);float s=sin(-a_angle);mat2 rotation=mat2(c,-s,s,c);vec2 pos=a_center+rotation*v_coords;
v_hatch_coords=pos-0.5;
pos+=0.5;pos/=u_canvas_size;gl_Position=vec4(2.*pos.x-1.,1.-2.*pos.y,0.,1.);}`;
export default shader;