shady 7.0.0

A shadertoy-like library to be able to easily integrate shadertoy-like stuff in your applications.
Documentation
use std::fmt;

use crate::{template::TemplateGenerator, ShadyDescriptor};

use super::Resource;

pub struct Frame {
    value: u32,

    buffer: wgpu::Buffer,
}

impl Frame {
    pub fn inc(&mut self) {
        (self.value, _) = self.value.overflowing_add(1)
    }
}

impl Resource for Frame {
    fn new(desc: &ShadyDescriptor) -> Self {
        let buffer = Self::create_uniform_buffer(desc.device, std::mem::size_of::<u32>() as u64);

        Self { value: 0, buffer }
    }

    fn binding() -> u32 {
        super::BindingValue::Frame as u32
    }

    fn buffer_label() -> &'static str {
        "Shady iFrame buffer"
    }

    fn buffer_type() -> wgpu::BufferBindingType {
        wgpu::BufferBindingType::Uniform
    }

    fn update_buffer(&self, queue: &wgpu::Queue) {
        queue.write_buffer(self.buffer(), 0, &self.value.to_ne_bytes());
    }

    fn buffer(&self) -> &wgpu::Buffer {
        &self.buffer
    }
}

impl TemplateGenerator for Frame {
    fn write_wgsl_template(
        writer: &mut dyn std::fmt::Write,
        bind_group_index: u32,
    ) -> Result<(), fmt::Error> {
        writer.write_fmt(format_args!(
            "
@group({}) @binding({})
var<uniform> iFrame: u32;
",
            bind_group_index,
            Self::binding()
        ))
    }

    fn write_glsl_template(writer: &mut dyn fmt::Write) -> Result<(), fmt::Error> {
        writer.write_fmt(format_args!(
            "
layout(binding = {}) uniform uint iFrame;
",
            Self::binding()
        ))
    }
}