add renderer abstraction

This commit is contained in:
Sven Balzer
2026-07-03 10:14:10 +02:00
parent f8f82bc653
commit aaa5b2078b
118 changed files with 1852545 additions and 1052 deletions
+57
View File
@@ -0,0 +1,57 @@
#language 2026
struct VertexShaderInput {
uint32_t vertex_index : SV_VertexID;
[vk::location(0)] float3 pos;
[vk::location(1)] float2 uv;
// Per Instance
[vk::location(2)] float2 world_pos;
};
struct VertexShaderOutput {
float4 pos : SV_Position;
float2 uv;
};
struct FragmentShaderOutput {
float4 color : SV_Target;
};
[vk::binding(0, 1)] ConstantBuffer<float4x4> view_projection_matrix : register(b0, space1);
[shader("vertex")]
VertexShaderOutput main_vertex(VertexShaderInput input) {
var output: VertexShaderOutput;
output.pos = mul(float4(input.world_pos + input.pos.xy, 0, 1), view_projection_matrix);
output.uv = input.uv;
return output;
}
[vk::binding(0, 2)] Sampler2D<float4> texture1 : register(t0, space2);
[vk::binding(0, 3)] ConstantBuffer<float3> tint : register(b0, space3);
[shader("pixel")]
FragmentShaderOutput main_fragment(VertexShaderOutput input) {
var output: FragmentShaderOutput;
output.color = pixel_art_sample(texture1, input.uv);
output.color = float4(output.color.rgb * tint.rgb, output.color.a);
return output;
}
float4 pixel_art_sample(Sampler2D<float4> input_texture, float2 input_uv) {
var dimensions: float2;
input_texture.__getTexture().GetDimensions(dimensions.x, dimensions.y);
let texture_uv = input_uv * dimensions.xy;
let sample_uv = (floor(texture_uv) + min(fract(texture_uv) / fwidth(texture_uv), float2(1.0, 1.0)) - 0.5) / dimensions.xy;
return input_texture.Sample(sample_uv);
}
+56
View File
@@ -0,0 +1,56 @@
#language 2026
struct VertexShaderInput {
uint32_t vertex_index : SV_VertexID;
uint32_t instance_index : SV_InstanceID;
[vk::location(0)] float3 pos;
};
struct VertexShaderOutput {
float4 pos : SV_Position;
int selected;
};
struct FragmentShaderOutput {
float4 color : SV_Target;
};
struct Per_Frame_Data {
int2 drag_start;
int2 mouse;
float2 grid_offset;
uint32_t grid_width;
uint32_t map_width;
};
[vk::binding(0, 1)] ConstantBuffer<float4x4> view_projection_matrix : register(b0, space1);
[vk::binding(1, 1)] ConstantBuffer<Per_Frame_Data> per_frame : register(b1, space1);
[shader("vertex")]
VertexShaderOutput main_vertex(VertexShaderInput input) {
var output: VertexShaderOutput;
let tile_pos = float2(float(input.instance_index % per_frame.grid_width), float(input.instance_index / per_frame.grid_width));
output.pos = mul(float4(tile_pos + per_frame.grid_offset + input.pos.xy, 0, 1), view_projection_matrix);
let pos = int2(tile_pos + round(per_frame.grid_offset));
let selection_min = min(per_frame.drag_start, per_frame.mouse);
let selection_max = max(per_frame.drag_start, per_frame.mouse);
output.selected = select(all(pos >= selection_min) && all(pos <= selection_max), 1, 0);
return output;
}
static const float4 color = float4(1.0, 1.0, 1.0, 0.1);
static const float4 selected_color = float4(1.0, 0.0, 1.0, 1.0);
[shader("pixel")]
FragmentShaderOutput main_fragment(VertexShaderOutput input) {
var output: FragmentShaderOutput;
output.color = select(input.selected != 0, selected_color, color);
return output;
}
+79
View File
@@ -0,0 +1,79 @@
#language 2026
struct VertexShaderInput {
uint32_t vertex_index : SV_VertexID;
uint32_t instance_index : SV_InstanceID;
};
struct VertexShaderOutput {
float4 pos : SV_Position;
float2 uv;
uint32_t tile;
};
struct FragmentShaderOutput {
float4 color : SV_Target;
};
struct Per_Frame_Data {
int2 drag_start;
int2 mouse;
float2 grid_offset;
uint32_t grid_width;
uint32_t map_width;
};
[vk::binding(0, 1)] ConstantBuffer<float4x4> view_projection_matrix : register(b0, space1);
[vk::binding(1, 1)] ConstantBuffer<Per_Frame_Data> per_frame : register(b1, space1);
[vk::binding(0, 0)] Texture2D<uint32_t> map_texture : register(t0, space0);
[shader("vertex")]
VertexShaderOutput main_vertex(VertexShaderInput input) {
var output: VertexShaderOutput;
let tile_pos = uint32_t2(input.instance_index % per_frame.map_width, input.instance_index / per_frame.map_width);
output.tile = map_texture.Load(uint32_t3(tile_pos, 0));
switch (input.vertex_index) {
case 0: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2(-0.5, 0.5), 0, 1), view_projection_matrix); output.uv = float2(0, 0); } break;
case 1: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2(-0.5, -0.5), 0, 1), view_projection_matrix); output.uv = float2(0, 1); } break;
case 2: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2( 0.5, -0.5), 0, 1), view_projection_matrix); output.uv = float2(1, 1); } break;
case 3: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2(-0.5, 0.5), 0, 1), view_projection_matrix); output.uv = float2(0, 0); } break;
case 4: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2( 0.5, -0.5), 0, 1), view_projection_matrix); output.uv = float2(1, 1); } break;
case 5: { output.pos = mul(float4(float2(tile_pos) - float2(0.5, 0.5) + float2( 0.5, 0.5), 0, 1), view_projection_matrix); output.uv = float2(1, 0); } break;
default: {}
}
return output;
}
[vk::binding(0, 2)] Sampler2D<float4> tile_atlas : register(t0, space2);
[vk::binding(2, 2)] StructuredBuffer<float4> tile_uvs : register(t1, space2);
[vk::binding(0, 3)] ConstantBuffer<float3> tint : register(b0, space3);
[shader("pixel")]
FragmentShaderOutput main_fragment(VertexShaderOutput input) {
var output: FragmentShaderOutput;
output.color = pixel_art_sample(tile_atlas, input.uv, input.tile);
output.color = float4(output.color.rgb * tint.rgb, output.color.a);
return output;
}
float4 pixel_art_sample(Sampler2D<float4> input_texture, float2 input_uv, uint32_t tile) {
var dimensions: float2;
input_texture.__getTexture().GetDimensions(dimensions.x, dimensions.y);
let tile_uv = tile_uvs[tile];
let texture_uv = lerp(tile_uv.xy, tile_uv.zw, input_uv);
let sample_uv = (floor(texture_uv) + saturate(fract(texture_uv) / fwidth(texture_uv)) - 0.5) / dimensions;
let uv = clamp(sample_uv, (tile_uv.xy + 0.5) / dimensions, (tile_uv.zw - 0.5) / dimensions);
return input_texture.Sample(uv);
}
+66
View File
@@ -0,0 +1,66 @@
struct _MatrixStorage_float4x4_ColMajorstd140_0
{
@align(16) data_0 : array<vec4<f32>, i32(4)>,
};
@binding(0) @group(1) var<uniform> view_projection_matrix_0 : _MatrixStorage_float4x4_ColMajorstd140_0;
@binding(0) @group(2) var texture1_texture_0 : texture_2d<f32>;
@binding(1) @group(2) var texture1_sampler_0 : sampler;
@binding(0) @group(3) var<uniform> tint_0 : vec3<f32>;
struct VertexShaderOutput_0
{
@builtin(position) pos_0 : vec4<f32>,
@location(0) uv_0 : vec2<f32>,
};
struct vertexInput_0
{
@location(0) pos_1 : vec3<f32>,
@location(1) uv_1 : vec2<f32>,
@location(2) world_pos_0 : vec2<f32>,
};
@vertex
fn main_vertex( _S1 : vertexInput_0, @builtin(vertex_index) vertex_index_0 : u32) -> VertexShaderOutput_0
{
var output_0 : VertexShaderOutput_0;
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(_S1.world_pos_0 + _S1.pos_1.xy, 0.0f, 1.0f))));
output_0.uv_0 = _S1.uv_1;
return output_0;
}
fn pixel_art_sample_0( input_texture_texture_0 : texture_2d<f32>, input_texture_sampler_0 : sampler, input_uv_0 : vec2<f32>) -> vec4<f32>
{
var dimensions_0 : vec2<f32>;
var _S2 : f32 = dimensions_0[i32(0)];
var _S3 : f32 = dimensions_0[i32(1)];
{var dim = textureDimensions((input_texture_texture_0));((_S2)) = f32(dim.x);((_S3)) = f32(dim.y);};
dimensions_0[i32(0)] = _S2;
dimensions_0[i32(1)] = _S3;
var _S4 : vec2<f32> = input_uv_0 * dimensions_0.xy;
var _S5 : vec2<f32> = (floor(_S4) + min(fract(_S4) / (fwidth((_S4))), vec2<f32>(1.0f, 1.0f)) - vec2<f32>(0.5f)) / dimensions_0.xy;
;
return (textureSample((input_texture_texture_0), (input_texture_sampler_0), (_S5)));
}
struct FragmentShaderOutput_0
{
@location(0) color_0 : vec4<f32>,
};
struct pixelInput_0
{
@location(0) uv_2 : vec2<f32>,
};
@fragment
fn main_fragment( _S6 : pixelInput_0, @builtin(position) pos_2 : vec4<f32>) -> FragmentShaderOutput_0
{
var output_1 : FragmentShaderOutput_0;
var _S7 : vec4<f32> = pixel_art_sample_0(texture1_texture_0, texture1_sampler_0, _S6.uv_2);
output_1.color_0 = vec4<f32>(_S7.xyz * tint_0.xyz, _S7.w);
return output_1;
}
+69
View File
@@ -0,0 +1,69 @@
struct Per_Frame_Data_std140_0
{
@align(16) drag_start_0 : vec2<i32>,
@align(8) mouse_0 : vec2<i32>,
@align(16) grid_offset_0 : vec2<f32>,
@align(8) grid_width_0 : u32,
@align(4) map_width_0 : u32,
};
@binding(1) @group(1) var<uniform> per_frame_0 : Per_Frame_Data_std140_0;
struct _MatrixStorage_float4x4_ColMajorstd140_0
{
@align(16) data_0 : array<vec4<f32>, i32(4)>,
};
@binding(0) @group(1) var<uniform> view_projection_matrix_0 : _MatrixStorage_float4x4_ColMajorstd140_0;
struct VertexShaderOutput_0
{
@builtin(position) pos_0 : vec4<f32>,
@location(0) selected_0 : i32,
};
struct vertexInput_0
{
@location(0) pos_1 : vec3<f32>,
};
@vertex
fn main_vertex( _S1 : vertexInput_0, @builtin(vertex_index) vertex_index_0 : u32, @builtin(instance_index) instance_index_0 : u32) -> VertexShaderOutput_0
{
var _S2 : u32 = instance_index_0 % per_frame_0.grid_width_0;
var _S3 : f32 = f32(_S2);
var _S4 : u32 = instance_index_0 / per_frame_0.grid_width_0;
var _S5 : vec2<f32> = vec2<f32>(_S3, f32(_S4));
var output_0 : VertexShaderOutput_0;
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(_S5 + per_frame_0.grid_offset_0 + _S1.pos_1.xy, 0.0f, 1.0f))));
var _S6 : vec2<i32> = vec2<i32>(_S5 + round(per_frame_0.grid_offset_0));
var _S7 : vec2<i32> = max(per_frame_0.drag_start_0, per_frame_0.mouse_0);
var _S8 : bool;
if((all((_S6 >= (min(per_frame_0.drag_start_0, per_frame_0.mouse_0))))))
{
_S8 = (all((_S6 <= _S7)));
}
else
{
_S8 = false;
}
output_0.selected_0 = select(i32(0), i32(1), _S8);
return output_0;
}
struct FragmentShaderOutput_0
{
@location(0) color_0 : vec4<f32>,
};
struct pixelInput_0
{
@location(0) selected_1 : i32,
};
@fragment
fn main_fragment( _S9 : pixelInput_0, @builtin(position) pos_2 : vec4<f32>) -> FragmentShaderOutput_0
{
var output_1 : FragmentShaderOutput_0;
output_1.color_0 = select(vec4<f32>(1.0f, 1.0f, 1.0f, 0.10000000149011612f), vec4<f32>(1.0f, 0.0f, 1.0f, 1.0f), (_S9.selected_1) != i32(0));
return output_1;
}
+126
View File
@@ -0,0 +1,126 @@
struct Per_Frame_Data_std140_0
{
@align(16) drag_start_0 : vec2<i32>,
@align(8) mouse_0 : vec2<i32>,
@align(16) grid_offset_0 : vec2<f32>,
@align(8) grid_width_0 : u32,
@align(4) map_width_0 : u32,
};
@binding(1) @group(1) var<uniform> per_frame_0 : Per_Frame_Data_std140_0;
@binding(0) @group(0) var map_texture_0 : texture_2d<u32>;
struct _MatrixStorage_float4x4_ColMajorstd140_0
{
@align(16) data_0 : array<vec4<f32>, i32(4)>,
};
@binding(0) @group(1) var<uniform> view_projection_matrix_0 : _MatrixStorage_float4x4_ColMajorstd140_0;
@binding(2) @group(2) var<storage, read> tile_uvs_0 : array<vec4<f32>>;
@binding(0) @group(2) var tile_atlas_texture_0 : texture_2d<f32>;
@binding(1) @group(2) var tile_atlas_sampler_0 : sampler;
@binding(0) @group(3) var<uniform> tint_0 : vec3<f32>;
struct VertexShaderOutput_0
{
@builtin(position) pos_0 : vec4<f32>,
@location(0) uv_0 : vec2<f32>,
@location(1) tile_0 : u32,
};
@vertex
fn main_vertex(@builtin(vertex_index) vertex_index_0 : u32, @builtin(instance_index) instance_index_0 : u32) -> VertexShaderOutput_0
{
var _S1 : u32 = instance_index_0 % per_frame_0.map_width_0;
var _S2 : u32 = instance_index_0 / per_frame_0.map_width_0;
var _S3 : vec2<u32> = vec2<u32>(_S1, _S2);
var output_0 : VertexShaderOutput_0;
var _S4 : vec3<i32> = vec3<i32>(vec3<u32>(_S3, u32(0)));
output_0.tile_0 = (textureLoad((map_texture_0), ((_S4)).xy, ((_S4)).z).x);
switch(vertex_index_0)
{
case u32(0):
{
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - vec2<f32>(0.5f, 0.5f) + vec2<f32>(-0.5f, 0.5f), 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(0.0f, 0.0f);
break;
}
case u32(1):
{
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - vec2<f32>(0.5f, 0.5f) + vec2<f32>(-0.5f, -0.5f), 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(0.0f, 1.0f);
break;
}
case u32(2):
{
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - vec2<f32>(0.5f, 0.5f) + vec2<f32>(0.5f, -0.5f), 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(1.0f, 1.0f);
break;
}
case u32(3):
{
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - vec2<f32>(0.5f, 0.5f) + vec2<f32>(-0.5f, 0.5f), 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(0.0f, 0.0f);
break;
}
case u32(4):
{
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - vec2<f32>(0.5f, 0.5f) + vec2<f32>(0.5f, -0.5f), 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(1.0f, 1.0f);
break;
}
case u32(5):
{
const _S5 : vec2<f32> = vec2<f32>(0.5f, 0.5f);
output_0.pos_0 = (((mat4x4<f32>(view_projection_matrix_0.data_0[i32(0)][i32(0)], view_projection_matrix_0.data_0[i32(1)][i32(0)], view_projection_matrix_0.data_0[i32(2)][i32(0)], view_projection_matrix_0.data_0[i32(3)][i32(0)], view_projection_matrix_0.data_0[i32(0)][i32(1)], view_projection_matrix_0.data_0[i32(1)][i32(1)], view_projection_matrix_0.data_0[i32(2)][i32(1)], view_projection_matrix_0.data_0[i32(3)][i32(1)], view_projection_matrix_0.data_0[i32(0)][i32(2)], view_projection_matrix_0.data_0[i32(1)][i32(2)], view_projection_matrix_0.data_0[i32(2)][i32(2)], view_projection_matrix_0.data_0[i32(3)][i32(2)], view_projection_matrix_0.data_0[i32(0)][i32(3)], view_projection_matrix_0.data_0[i32(1)][i32(3)], view_projection_matrix_0.data_0[i32(2)][i32(3)], view_projection_matrix_0.data_0[i32(3)][i32(3)])) * (vec4<f32>(vec2<f32>(_S3) - _S5 + _S5, 0.0f, 1.0f))));
output_0.uv_0 = vec2<f32>(1.0f, 0.0f);
break;
}
default :
{
break;
}
}
return output_0;
}
fn pixel_art_sample_0( input_texture_texture_0 : texture_2d<f32>, input_texture_sampler_0 : sampler, input_uv_0 : vec2<f32>, tile_1 : u32) -> vec4<f32>
{
var dimensions_0 : vec2<f32>;
var _S6 : f32 = dimensions_0[i32(0)];
var _S7 : f32 = dimensions_0[i32(1)];
{var dim = textureDimensions((input_texture_texture_0));((_S6)) = f32(dim.x);((_S7)) = f32(dim.y);};
dimensions_0[i32(0)] = _S6;
dimensions_0[i32(1)] = _S7;
var _S8 : vec4<f32> = tile_uvs_0[tile_1];
var _S9 : vec2<f32> = _S8.xy;
var _S10 : vec2<f32> = _S8.zw;
var _S11 : vec2<f32> = mix(_S9, _S10, input_uv_0);
var _S12 : vec2<f32> = vec2<f32>(0.5f);
var _S13 : vec2<f32> = clamp((floor(_S11) + saturate(fract(_S11) / (fwidth((_S11)))) - _S12) / dimensions_0, (_S9 + _S12) / dimensions_0, (_S10 - _S12) / dimensions_0);
;
return (textureSample((input_texture_texture_0), (input_texture_sampler_0), (_S13)));
}
struct FragmentShaderOutput_0
{
@location(0) color_0 : vec4<f32>,
};
struct pixelInput_0
{
@location(0) uv_1 : vec2<f32>,
@location(1) tile_2 : u32,
};
@fragment
fn main_fragment( _S14 : pixelInput_0, @builtin(position) pos_1 : vec4<f32>) -> FragmentShaderOutput_0
{
var output_1 : FragmentShaderOutput_0;
var _S15 : vec4<f32> = pixel_art_sample_0(tile_atlas_texture_0, tile_atlas_sampler_0, _S14.uv_1, _S14.tile_2);
output_1.color_0 = vec4<f32>(_S15.xyz * tint_0.xyz, _S15.w);
return output_1;
}