66 lines
No EOL
1.4 KiB
Text
66 lines
No EOL
1.4 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 MaskedSprite {
|
|
float4 uv,
|
|
float4 color,
|
|
float2 skew,
|
|
bool2 uv_flip,
|
|
#0 image2D image,
|
|
#1 image2D mask
|
|
// bool flipy
|
|
}
|
|
|
|
stage vertex vert(
|
|
input { View view, MaskedSprite sprite },
|
|
vertex in { #0 float4 pos, #1 float4 color, #2 float2 uv },
|
|
fragment out { float4 color, float2 uv})
|
|
{
|
|
out.color = in.color;
|
|
out.uv = in.uv;
|
|
|
|
mat4 skew = mat4(
|
|
float4(1,input.sprite.skew.x,0,0),
|
|
float4(input.sprite.skew.y,1,0,0),
|
|
float4(0,0,1,0),
|
|
float4(0,0,0,1)
|
|
);
|
|
|
|
stage.pos = input.view.mvp * (skew * float4(in.pos.xyz, 1.0));
|
|
}
|
|
|
|
stage fragment frag(
|
|
input { MaskedSprite sprite },
|
|
fragment in { float4 color, float2 uv })
|
|
{
|
|
float4 uv = input.sprite.uv;
|
|
|
|
if(input.sprite.uv_flip.x) {
|
|
uv.x = input.sprite.uv.z; //left
|
|
uv.z = input.sprite.uv.x; //right
|
|
}
|
|
|
|
if(input.sprite.uv_flip.y) {
|
|
uv.y = input.sprite.uv.w; //top
|
|
uv.w = input.sprite.uv.y; //bottom
|
|
}
|
|
|
|
float4 color = texture(input.sprite.image, uv.xy + (in.uv.xy * (uv.zw - uv.xy)));
|
|
color.a *= texture(input.sprite.mask, in.uv.xy).a;
|
|
|
|
if(color.a <= 0.0) {
|
|
discard;
|
|
return;
|
|
}
|
|
|
|
stage.color[0] = color * in.color * input.sprite.color;
|
|
} |