CabinGame/Luxe/shaders/pixel_text_ui.emsl
2020-09-12 11:35:28 +02:00

104 lines
No EOL
2.8 KiB
Text

input View {
mat4 mvp,
mat4 proj,
mat4 proj_inverse,
mat4 view,
mat4 world, //geometry.world atm
float2 fov, //fov.x, fov.y
float2 resolution,
float4 target_region,
float4 target_region_size
}
input Font {
image2D pages[8]
}
input FUI {
float2 canvas_size,
#0 image2D tex_mask
}
stage vertex vert(
input { View view },
vertex in {
#0 float4 pos,
#1 float4 color,
#2 float2 uv,
#3 float4 data
},
fragment out {
float4 color,
float2 uv,
float2 mask_uv,
float clip
})
{
out.uv = in.uv;
out.color = in.color;
out.clip = in.data.x;
out.mask_uv = float2(in.data.y, 1.0 - in.data.z);
stage.pos = input.view.mvp * float4(in.pos.xyz, 1.0);
}
stage fragment frag(
input { FUI ui, Font font },
fragment in {
float4 color,
float2 uv,
float2 mask_uv,
float clip,
float page
})
{
//outside mask uvs?
bool outside_mask = in.mask_uv.x < 0.0 ||
in.mask_uv.x > 1.0 ||
in.mask_uv.y < 0.0 ||
in.mask_uv.y > 1.0;
if(outside_mask) {
discard;
// stage.color[0] = float4(1,0.2,0.3,1);
return;
}
float4 mask = texture(input.ui.tex_mask, in.mask_uv);
//16 bit mask
// float mask_clip = round(mask.r * 65535.0);
//8 bit mask
int lsb = int(round(mask.r * 255.0));
int msb = int(round(mask.g * 255.0)) * 256; //<< 8;
int mask_clip = lsb | msb;
// int mask_clip = lsb + msb; //webgl1
//outside our clipping bounds?
int my_clip = int(in.clip);
if(my_clip != 0 && mask_clip < my_clip) {
discard;
// stage.color[0] = float4(0,1,1,0.2);
return;
}
int page = int(in.page);
float4 msdf_sample = texture(input.font.pages[0], in.uv.xy);
if(page == 1) { msdf_sample = texture(input.font.pages[1], in.uv.xy); }
if(page == 2) { msdf_sample = texture(input.font.pages[2], in.uv.xy); }
if(page == 3) { msdf_sample = texture(input.font.pages[3], in.uv.xy); }
if(page == 4) { msdf_sample = texture(input.font.pages[4], in.uv.xy); }
if(page == 5) { msdf_sample = texture(input.font.pages[5], in.uv.xy); }
if(page == 6) { msdf_sample = texture(input.font.pages[6], in.uv.xy); }
if(page == 7) { msdf_sample = texture(input.font.pages[7], in.uv.xy); }
float r = msdf_sample.r;
float g = msdf_sample.g;
float b = msdf_sample.b;
float median = max(min(r, g), min(max(r, g), b));
float opacity = float(median > 0.5);
stage.color[0] = float4(in.color.rgb, in.color.a * opacity * mask.a);
}