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; }