dunge 0.1.8

Simple and portable 3d render library
Documentation
use {
    crate::{layout::Plain, shader},
    std::cell::Cell,
    wgpu::{BindGroup, BindGroupLayout, Buffer, Device, Queue},
};

pub(crate) struct Ambient {
    col: Cell<[f32; 3]>,
    buffer: Buffer,
    bind_group: BindGroup,
}

impl Ambient {
    pub fn new(device: &Device, layout: &BindGroupLayout) -> Self {
        use wgpu::{
            util::{BufferInitDescriptor, DeviceExt},
            BindGroupDescriptor, BindGroupEntry, BufferUsages,
        };

        let col = [0.; 3];
        let buffer = {
            device.create_buffer_init(&BufferInitDescriptor {
                label: Some("ambient buffer"),
                contents: col.as_bytes(),
                usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST,
            })
        };

        let bind_group = device.create_bind_group(&BindGroupDescriptor {
            layout,
            entries: &[BindGroupEntry {
                binding: shader::AMBIENT_BINDING,
                resource: buffer.as_entire_binding(),
            }],
            label: Some("ambient bind group"),
        });

        Self {
            col: Cell::new(col),
            buffer,
            bind_group,
        }
    }

    pub fn set_ambient(&self, col: [f32; 3], queue: &Queue) {
        #[allow(clippy::float_cmp)]
        if self.col.get() == col {
            return;
        }

        queue.write_buffer(&self.buffer, 0, col.as_bytes());
    }

    pub fn bind_group(&self) -> &BindGroup {
        &self.bind_group
    }
}