mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 15:45:38 +00:00
29d36e11ee
OpenGL supports casting from int to float during vertex array reading. Direct3D doesn't. Since we're transpiling from GLSL, we can't directly use the Direct3D builtin "asint". So that leaves using "ivec2" instead of vec2. Signed-off-by: Elias Naur <mail@eliasnaur.com>
54 lines
1.1 KiB
GLSL
54 lines
1.1 KiB
GLSL
#version 310 es
|
|
|
|
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
precision highp float;
|
|
|
|
layout(binding = 0) uniform Block {
|
|
vec2 scale;
|
|
vec2 offset;
|
|
vec2 pathOffset;
|
|
};
|
|
|
|
layout(location=0) in ivec2 corner;
|
|
layout(location=1) in float maxy;
|
|
layout(location=2) in vec2 from;
|
|
layout(location=3) in vec2 ctrl;
|
|
layout(location=4) in vec2 to;
|
|
|
|
layout(location=0) out vec2 vFrom;
|
|
layout(location=1) out vec2 vCtrl;
|
|
layout(location=2) out vec2 vTo;
|
|
|
|
void main() {
|
|
// Add a one pixel overlap so curve quads cover their
|
|
// entire curves. Could use conservative rasterization
|
|
// if available.
|
|
vec2 from = from + pathOffset;
|
|
vec2 ctrl = ctrl + pathOffset;
|
|
vec2 to = to + pathOffset;
|
|
float maxy = maxy + pathOffset.y;
|
|
vec2 pos;
|
|
if (corner.x > 0) {
|
|
// East.
|
|
pos.x = max(max(from.x, ctrl.x), to.x)+1.0;
|
|
} else {
|
|
// West.
|
|
pos.x = min(min(from.x, ctrl.x), to.x)-1.0;
|
|
}
|
|
if (corner.y > 0) {
|
|
// North.
|
|
pos.y = maxy + 1.0;
|
|
} else {
|
|
// South.
|
|
pos.y = min(min(from.y, ctrl.y), to.y) - 1.0;
|
|
}
|
|
vFrom = from-pos;
|
|
vCtrl = ctrl-pos;
|
|
vTo = to-pos;
|
|
pos *= scale;
|
|
pos += offset;
|
|
gl_Position = vec4(pos, 1, 1);
|
|
}
|
|
|