mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-17 00:11:25 -07:00
123 lines
3.1 KiB
GLSL
123 lines
3.1 KiB
GLSL
#ifdef GL_ES
|
|
#if defined(GL_FRAGMENT_PRECISION_HIGH) || defined(NANOVG_GL3)
|
|
precision highp float;
|
|
#else
|
|
precision mediump float;
|
|
#endif
|
|
#endif
|
|
#ifdef NANOVG_GL3
|
|
#ifdef USE_UNIFORMBUFFER
|
|
layout(std140) uniform frag {
|
|
mat3 scissorMat;
|
|
mat3 paintMat;
|
|
vec4 innerCol;
|
|
vec4 outerCol;
|
|
vec2 scissorExt;
|
|
vec2 scissorScale;
|
|
vec2 extent;
|
|
float radius;
|
|
float feather;
|
|
float strokeMult;
|
|
float strokeThr;
|
|
int texType;
|
|
int type;
|
|
};
|
|
#else // NANOVG_GL3 && !USE_UNIFORMBUFFER
|
|
uniform vec4 frag[UNIFORMARRAY_SIZE];
|
|
#endif
|
|
uniform sampler2D tex;
|
|
in vec2 ftcoord;
|
|
in vec2 fpos;
|
|
out vec4 outColor;
|
|
#else // !NANOVG_GL3
|
|
uniform vec4 frag[UNIFORMARRAY_SIZE];
|
|
uniform sampler2D tex;
|
|
varying vec2 ftcoord;
|
|
varying vec2 fpos;
|
|
#endif
|
|
#ifndef USE_UNIFORMBUFFER
|
|
#define scissorMat mat3(frag[0].xyz, frag[1].xyz, frag[2].xyz)
|
|
#define paintMat mat3(frag[3].xyz, frag[4].xyz, frag[5].xyz)
|
|
#define innerCol frag[6]
|
|
#define outerCol frag[7]
|
|
#define scissorExt frag[8].xy
|
|
#define scissorScale frag[8].zw
|
|
#define extent frag[9].xy
|
|
#define radius frag[9].z
|
|
#define feather frag[9].w
|
|
#define strokeMult frag[10].x
|
|
#define strokeThr frag[10].y
|
|
#define texType int(frag[10].z)
|
|
#define type int(frag[10].w)
|
|
#endif
|
|
|
|
float sdroundrect(vec2 pt, vec2 ext, float rad) {
|
|
vec2 ext2 = ext - vec2(rad,rad);
|
|
vec2 d = abs(pt) - ext2;
|
|
return min(max(d.x,d.y),0.0) + length(max(d,0.0)) - rad;
|
|
}
|
|
|
|
// Scissoring
|
|
float scissorMask(vec2 p) {
|
|
vec2 sc = (abs((scissorMat * vec3(p,1.0)).xy) - scissorExt);
|
|
sc = vec2(0.5,0.5) - sc * scissorScale;
|
|
return clamp(sc.x,0.0,1.0) * clamp(sc.y,0.0,1.0);
|
|
}
|
|
#ifdef EDGE_AA
|
|
// Stroke - from [0..1] to clipped pyramid, where the slope is 1px.
|
|
float strokeMask() {
|
|
return min(1.0, (1.0-abs(ftcoord.x*2.0-1.0))*strokeMult) * min(1.0, ftcoord.y);
|
|
}
|
|
#endif
|
|
|
|
void main(void) {
|
|
vec4 result;
|
|
float scissor = scissorMask(fpos);
|
|
#ifdef EDGE_AA
|
|
float strokeAlpha = strokeMask();
|
|
if (strokeAlpha < strokeThr) discard;
|
|
#else
|
|
float strokeAlpha = 1.0;
|
|
#endif
|
|
if (type == 0) { // Gradient
|
|
// Calculate gradient color using box gradient
|
|
vec2 pt = (paintMat * vec3(fpos,1.0)).xy;
|
|
float d = clamp((sdroundrect(pt, extent, radius) + feather*0.5) / feather, 0.0, 1.0);
|
|
vec4 color = mix(innerCol,outerCol,d);
|
|
// Combine alpha
|
|
color *= strokeAlpha * scissor;
|
|
result = color;
|
|
} else if (type == 1) { // Image
|
|
// Calculate color fron texture
|
|
vec2 pt = (paintMat * vec3(fpos,1.0)).xy / extent;
|
|
#ifdef NANOVG_GL3
|
|
vec4 color = texture(tex, pt);
|
|
#else
|
|
vec4 color = texture2D(tex, pt);
|
|
#endif
|
|
if (texType == 1) color = vec4(color.xyz*color.w,color.w);
|
|
if (texType == 2) color = vec4(color.x);
|
|
// Apply color tint and alpha.
|
|
color *= innerCol;
|
|
// Combine alpha
|
|
color *= strokeAlpha * scissor;
|
|
result = color;
|
|
} else if (type == 2) { // Stencil fill
|
|
result = vec4(1,1,1,1);
|
|
} else if (type == 3) { // Textured tris
|
|
#ifdef NANOVG_GL3
|
|
vec4 color = texture(tex, ftcoord);
|
|
#else
|
|
vec4 color = texture2D(tex, ftcoord);
|
|
#endif
|
|
if (texType == 1) color = vec4(color.xyz*color.w,color.w);
|
|
if (texType == 2) color = vec4(color.x);
|
|
color *= scissor;
|
|
result = color * innerCol;
|
|
}
|
|
#ifdef NANOVG_GL3
|
|
outColor = result;
|
|
#else
|
|
gl_FragColor = result;
|
|
#endif
|
|
} |