github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/gpu/shaders/stencil.vert (about) 1 #version 310 es 2 3 // SPDX-License-Identifier: Unlicense OR MIT 4 5 precision highp float; 6 7 layout(binding = 0) uniform Block { 8 vec4 transform; 9 vec2 pathOffset; 10 } _block; 11 12 layout(location=0) in float corner; 13 layout(location=1) in float maxy; 14 layout(location=2) in vec2 from; 15 layout(location=3) in vec2 ctrl; 16 layout(location=4) in vec2 to; 17 18 layout(location=0) out vec2 vFrom; 19 layout(location=1) out vec2 vCtrl; 20 layout(location=2) out vec2 vTo; 21 22 void main() { 23 // Add a one pixel overlap so curve quads cover their 24 // entire curves. Could use conservative rasterization 25 // if available. 26 vec2 from = from + _block.pathOffset; 27 vec2 ctrl = ctrl + _block.pathOffset; 28 vec2 to = to + _block.pathOffset; 29 float maxy = maxy + _block.pathOffset.y; 30 vec2 pos; 31 float c = corner; 32 if (c >= 0.375) { 33 // North. 34 c -= 0.5; 35 pos.y = maxy + 1.0; 36 } else { 37 // South. 38 pos.y = min(min(from.y, ctrl.y), to.y) - 1.0; 39 } 40 if (c >= 0.125) { 41 // East. 42 pos.x = max(max(from.x, ctrl.x), to.x)+1.0; 43 } else { 44 // West. 45 pos.x = min(min(from.x, ctrl.x), to.x)-1.0; 46 } 47 vFrom = from-pos; 48 vCtrl = ctrl-pos; 49 vTo = to-pos; 50 pos = pos*_block.transform.xy + _block.transform.zw; 51 gl_Position = vec4(pos, 1, 1); 52 } 53