77 lines
2.6 KiB
GLSL
77 lines
2.6 KiB
GLSL
precision mediump float;
|
|
|
|
uniform vec4 u_BackgroundColor;
|
|
uniform vec4 u_BorderColor;
|
|
uniform float u_BorderWidth;
|
|
uniform float u_BorderRadius;
|
|
uniform vec2 u_MaxSize;
|
|
|
|
varying vec4 v_Position;
|
|
|
|
void main(){
|
|
vec2 adj_MaxSize = u_MaxSize - u_BorderWidth;
|
|
vec2 rad_MaxSize = u_MaxSize - u_BorderRadius;
|
|
vec2 rad2_MaxSize = u_MaxSize - 2.0*u_BorderRadius;
|
|
|
|
bool inX = (v_Position.x < adj_MaxSize.x) && (v_Position.x > -adj_MaxSize.x);
|
|
bool inY = (v_Position.y < adj_MaxSize.y) && (v_Position.y > -adj_MaxSize.y);
|
|
|
|
bool inRadiusRangeX = (v_Position.x < rad_MaxSize.x) && (v_Position.x > -rad_MaxSize.x);
|
|
bool inRadiusRangeY = (v_Position.y < rad_MaxSize.y) && (v_Position.y > -rad_MaxSize.y);
|
|
|
|
bool inRadius2RangeX = (v_Position.x < rad2_MaxSize.x) && (v_Position.x > -rad2_MaxSize.x);
|
|
bool inRadius2RangeY = (v_Position.y < rad2_MaxSize.y) && (v_Position.y > -rad2_MaxSize.y);
|
|
|
|
if(inX && inY){
|
|
// Inside bounds, draw background color
|
|
gl_FragColor = u_BackgroundColor;
|
|
} else {
|
|
// In boundary, draw border color
|
|
gl_FragColor = u_BorderColor;
|
|
}
|
|
|
|
// This isn't working well right now
|
|
/*
|
|
if(inRadius2RangeX || inRadius2RangeY){
|
|
// Draw normally
|
|
if(inX && inY){
|
|
// Inside bounds, draw background color
|
|
gl_FragColor = u_BackgroundColor;
|
|
} else {
|
|
// In boundary, draw border color
|
|
gl_FragColor = u_BorderColor;
|
|
}
|
|
} else if(inRadiusRangeX || inRadiusRangeY){
|
|
// Draw a rounded boundary for the inner part
|
|
float x = v_Position.x - sign(v_Position.x)*rad2_MaxSize.x;
|
|
float y = v_Position.y - sign(v_Position.y)*rad2_MaxSize.y;
|
|
|
|
float radSq = x*x + y*y;
|
|
float bRadSq = u_BorderRadius*u_BorderRadius;
|
|
|
|
if(radSq > bRadSq){
|
|
// Outside of radius - draw as transparent
|
|
gl_FragColor = u_BorderColor;
|
|
} else {
|
|
gl_FragColor = u_BackgroundColor;
|
|
}
|
|
} else {
|
|
// Both coordinates are in the circular section
|
|
float x = v_Position.x - sign(v_Position.x)*rad_MaxSize.x;
|
|
float y = v_Position.y - sign(v_Position.y)*rad_MaxSize.y;
|
|
|
|
float radSq = x*x + y*y;
|
|
float bRadSq = u_BorderRadius*u_BorderRadius;
|
|
|
|
if(radSq > bRadSq){
|
|
// Outside of radius - draw as transparent
|
|
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
|
} else if(sqrt(bRadSq) - sqrt(radSq) < u_BorderWidth) {
|
|
// In border
|
|
gl_FragColor = u_BorderColor;
|
|
} else {
|
|
gl_FragColor = u_BackgroundColor;
|
|
}
|
|
}
|
|
*/
|
|
} |