dunge 0.2.0

Simple and portable 3d render library
use {
    crate::{
        framebuffer::{depth_frame::DepthFrame, render_frame::RenderFrame},
        render::State,
    },
    wgpu::{TextureFormat, TextureView},
};

pub(crate) struct Framebuffer {
    depth: DepthFrame,
    render: RenderFrame,
    size: BufferSize,
}

impl Framebuffer {
    pub const DEPTH_FORMAT: TextureFormat = DepthFrame::FORMAT;
    pub const RENDER_FORMAT: TextureFormat = RenderFrame::FORMAT;

    pub fn new(state: &State) -> Self {
        const DEFAULT_SIZE: BufferSize = BufferSize::MIN;

        Self {
            depth: DepthFrame::new(DEFAULT_SIZE, state),
            render: RenderFrame::new(DEFAULT_SIZE, state),
            size: DEFAULT_SIZE,
        }
    }

    pub fn set_size(&mut self, size: BufferSize, state: &State) {
        if self.size == size {
            return;
        }

        self.depth = DepthFrame::new(size, state);
        self.render = RenderFrame::new(size, state);
        self.size = size;
    }

    pub fn render_view(&self) -> &TextureView {
        self.render.view()
    }

    pub fn depth_view(&self) -> &TextureView {
        self.depth.view()
    }
}

#[derive(Clone, Copy, PartialEq, Eq)]
pub(crate) struct BufferSize(pub u32, pub u32);

impl BufferSize {
    pub(crate) const MIN: Self = Self(1, 1);

    pub(crate) fn new(width: u32, height: u32, max_size: u32) -> Self {
        Self(width.clamp(1, max_size), height.clamp(1, max_size))
    }
}

impl Default for BufferSize {
    fn default() -> Self {
        Self::MIN
    }
}

impl From<BufferSize> for (f32, f32) {
    fn from(BufferSize(width, height): BufferSize) -> Self {
        (width as f32, height as f32)
    }
}