shdrlib 0.2.0

High-level shader compilation and rendering library built on wgpu and naga
Documentation
// MINIMAL EXAMPLE: From shader to render in ~20 lines (excluding shader code)

use shdrlib::{AssetManager, RuntimeManager, Language};

fn main() {
    // Your shader code (WGSL, GLSL, or SPIR-V)
    let my_shader = r#"
        @vertex
        fn vs_main(@builtin(vertex_index) idx: u32) -> @builtin(position) vec4<f32> {
            var pos = array<vec2<f32>, 3>(
                vec2(0.0, 0.5), vec2(-0.5, -0.5), vec2(0.5, -0.5)
            );
            return vec4<f32>(pos[idx], 0.0, 1.0);
        }

        @fragment
        fn fs_main() -> @location(0) vec4<f32> {
            return vec4<f32>(1.0, 0.0, 0.5, 1.0);
        }
    "#;

    // ===== THAT'S IT - EVERYTHING BELOW IS shdrlib HANDLING THE COMPLEXITY =====

    // 1. Initialize (handles GPU, device, queue, adapter automatically)
    let mut assets = AssetManager::new();

    // 2. Add your shaders (handles parsing, validation, compilation)
    assets.add_shader("vert", my_shader, naga::ShaderStage::Vertex, Language::WGSL).unwrap();
    assets.add_shader("frag", my_shader, naga::ShaderStage::Fragment, Language::WGSL).unwrap();

    // 3. Create pipeline (handles shader modules, pipeline layout, all wgpu setup)
    assets.create_pipeline(
        "my_pipeline",
        "vert",
        Some("frag"),
        vec![],
        wgpu::TextureFormat::Rgba8UnormSrgb,
    ).unwrap();

    // 4. Render to texture (handles render passes, command encoding, submission)
    let runtime = RuntimeManager::new(&assets);
    let texture = runtime.render_to_texture(
        "my_pipeline",
        800, 600,
        wgpu::TextureFormat::Rgba8UnormSrgb,
        wgpu::Color::BLACK,
        3, // vertex count
    ).unwrap();

    println!("✅ Rendered! Texture: {}x{}", texture.width(), texture.height());
}