radiant-rs 0.15.0

Thread-safe Rust sprite rendering engine with a friendly API and custom shader support
Documentation
// Sprite vertex shader - WGSL

@group(0) @binding(0)
var<uniform> sprite_uniforms: SpriteUniforms;

struct SpriteVertex {
    @location(0) position: vec2<f32>,
    @location(1) offset: vec2<f32>,
    @location(2) rotation: f32,
    @location(3) color: vec4<f32>,
    @location(4) bucket_id: u32,
    @location(5) texture_id: u32,
    @location(6) texture_uv: vec2<f32>,
    @location(7) components: u32,
}

struct SpriteVertexOutput {
    @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,
}

struct SpriteUniforms {
    u_view: mat4x4<f32>,
    u_model: mat4x4<f32>,
    _rd_color: vec4<f32>,
}

@vertex
fn main(input: SpriteVertex) -> SpriteVertexOutput {
    var output: SpriteVertexOutput;

    // compute vertex position
    let sin_rotation = sin(input.rotation);
    let cos_rotation = cos(input.rotation);
    var trans = vec2<f32>(
        input.offset.x * cos_rotation - input.offset.y * sin_rotation,
        input.offset.x * sin_rotation + input.offset.y * cos_rotation,
    );

    // apply global per sprite matrix (model)
    let model_transformation = sprite_uniforms.u_model * vec4<f32>(trans, 0.0, 1.0);

    output.position = sprite_uniforms.u_view * vec4<f32>(vec3<f32>(input.position, 0.0) + model_transformation.xyz, 1.0);

    // pass along to fragment shader
    output.v_color = input.color * sprite_uniforms._rd_color;
    output.v_tex_coords = input.texture_uv;
    output._rd_v_texture_id = input.texture_id;
    output._rd_v_bucket_id = input.bucket_id;
    output._rd_v_components = input.components;

    return output;
}