Documentation
use crate::render::WrcRender;
use crate::Device;
use wgpu::include_wgsl;

pub mod param;

pub struct CircleRender {
    pipeline: wgpu::RenderPipeline,
    bind_group_layout: wgpu::BindGroupLayout,
}

impl CircleRender {
    pub fn new(device: &Device) -> Self {
        let shader = device.device.create_shader_module(include_wgsl!("circle.wgsl"));
        let bind_group_layout_entry = wgpu::BindGroupLayoutEntry {
            binding: 0,
            visibility: wgpu::ShaderStages::FRAGMENT,
            ty: wgpu::BindingType::Buffer {
                ty: wgpu::BufferBindingType::Uniform,
                has_dynamic_offset: false,
                min_binding_size: None,
            },
            count: None,
        };

        let bind_group_layout_desc = wgpu::BindGroupLayoutDescriptor {
            label: None,
            entries: &[bind_group_layout_entry],
        };
        let bind_group_layout = device.device.create_bind_group_layout(&bind_group_layout_desc);
        let pipeline_layout = device.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
            label: None,
            bind_group_layouts: &[&bind_group_layout],
            push_constant_ranges: &[],
        });

        let render_pipeline = super::create_pipeline(device, shader, pipeline_layout, &[]);
        CircleRender {
            pipeline: render_pipeline,
            bind_group_layout,
        }
    }
}

impl WrcRender for CircleRender {
    fn pipeline(&self) -> &wgpu::RenderPipeline {
        &self.pipeline
    }

    fn bind_group_layout(&self) -> &wgpu::BindGroupLayout {
        &self.bind_group_layout
    }
}