radiant-rs 0.15.0

Thread-safe Rust sprite rendering engine with a friendly API and custom shader support
Documentation
// Sprite fragment preamble — automatically prepended to custom sprite fragment shaders.
// Provides bindings, SpriteFragmentInput, and sheet*() helpers.
// Custom shaders write: @fragment fn main(input: SpriteFragmentInput) -> @location(0) vec4<f32>
// Helpers take `input` explicitly: sheet(input, coords), sheetSize(input), sheetComponent(input, coords, component)

@group(0) @binding(1)
var _rd_tex: texture_2d<f32>;
@group(0) @binding(2)
var _rd_sampler: sampler;
@group(0) @binding(3)
var _rd_tex1: texture_2d_array<f32>;
@group(0) @binding(4)
var _rd_tex2: texture_2d_array<f32>;
@group(0) @binding(5)
var _rd_tex3: texture_2d_array<f32>;
@group(0) @binding(6)
var _rd_tex4: texture_2d_array<f32>;
@group(0) @binding(7)
var _rd_tex5: texture_2d_array<f32>;

@group(0) @binding(8)
var<uniform> _rd_comp: u32;

struct SpriteFragmentInput {
    @builtin(position) position: vec4<f32>,
    @location(0) v_color: vec4<f32>,
    @location(1) v_tex_coords: vec2<f32>,
    @location(2) _rd_v_texture_id: u32,
    @location(3) _rd_v_bucket_id: u32,
    @location(4) _rd_v_components: u32,
}

fn sheetSize(input: SpriteFragmentInput) -> vec2<i32> {
    if (input._rd_v_bucket_id == 0u) {
        return vec2<i32>(textureDimensions(_rd_tex));
    } else if (input._rd_v_bucket_id == 1u) {
        return vec2<i32>(textureDimensions(_rd_tex1).xy);
    } else if (input._rd_v_bucket_id == 2u) {
        return vec2<i32>(textureDimensions(_rd_tex2).xy);
    } else if (input._rd_v_bucket_id == 3u) {
        return vec2<i32>(textureDimensions(_rd_tex3).xy);
    } else if (input._rd_v_bucket_id == 4u) {
        return vec2<i32>(textureDimensions(_rd_tex4).xy);
    } else {
        return vec2<i32>(textureDimensions(_rd_tex5).xy);
    }
}

fn sheetComponent(input: SpriteFragmentInput, texture_coords: vec2<f32>, component: u32) -> vec4<f32> {
    if (input._rd_v_bucket_id == 0u) {
        return textureSample(_rd_tex, _rd_sampler, texture_coords).rrrr;
    } else if (component >= input._rd_v_components) {
        return vec4<f32>(0.0, 0.0, 0.0, 0.0);
    } else if (input._rd_v_bucket_id == 1u) {
        return textureSample(_rd_tex1, _rd_sampler, texture_coords, i32(input._rd_v_texture_id + component));
    } else if (input._rd_v_bucket_id == 2u) {
        return textureSample(_rd_tex2, _rd_sampler, texture_coords, i32(input._rd_v_texture_id + component));
    } else if (input._rd_v_bucket_id == 3u) {
        return textureSample(_rd_tex3, _rd_sampler, texture_coords, i32(input._rd_v_texture_id + component));
    } else if (input._rd_v_bucket_id == 4u) {
        return textureSample(_rd_tex4, _rd_sampler, texture_coords, i32(input._rd_v_texture_id + component));
    } else {
        return textureSample(_rd_tex5, _rd_sampler, texture_coords, i32(input._rd_v_texture_id + component));
    }
}

fn sheet(input: SpriteFragmentInput, texture_coords: vec2<f32>) -> vec4<f32> {
    return sheetComponent(input, texture_coords, _rd_comp);
}