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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    */
 | 
						|
} |