Skip to main content

easy_gpu/
frame.rs

1use std::ops::Range;
2use wgpu::{Device, Queue};
3use crate::assets::buffer::Buffer;
4use crate::assets::compute::bind_group::ComputeBindGroup;
5use crate::assets::compute::pipeline::ComputePipeline;
6use crate::assets::compute::task::ComputeTask;
7use crate::assets_manager::handle::Handle;
8use crate::assets::render::material::Material;
9use crate::assets::render::mesh::Mesh;
10
11pub(crate) struct RenderItem {
12    pub mesh: Handle<Mesh>,
13    pub material: Handle<Material>,
14    pub instances: Handle<Buffer>,
15    pub range: Range<u32>
16}
17
18impl RenderItem {
19    fn new(mesh: Handle<Mesh>, material: Handle<Material>,instances: Handle<Buffer>,range: Range<u32>) -> Self {
20        Self{
21            mesh,
22            material,
23            instances,
24            range,
25        }
26    }
27}
28
29pub struct Frame {
30    pub(crate) render_tasks: Vec<RenderItem>,
31  //  pub(crate) instance_buffer: InstanceBuffer,
32    pub(crate) compute_tasks: Vec<ComputeTask>,
33  //  instances: Vec<Instance>
34}
35
36impl Frame {
37    pub(crate) fn new() -> Self {
38        Self {
39            render_tasks: Vec::new(),
40            compute_tasks: Vec::new(),
41        }
42    }
43
44    pub(crate) fn clear(&mut self) {
45        self.render_tasks.clear();
46        self.compute_tasks.clear();
47    }
48
49    pub fn draw(&mut self,instances: Handle<Buffer>,material: Handle<Material>,mesh: Handle<Mesh>,range: Range<u32>) {
50        let item = RenderItem::new(mesh, material, instances, range);
51        self.render_tasks.push(item);
52    }
53
54    pub fn compute(&mut self,bind_group: Handle<ComputeBindGroup>, pipeline: Handle<ComputePipeline>, dispatch: (u32,u32,u32)){
55        let task = ComputeTask::new(pipeline,bind_group,dispatch);
56        self.compute_tasks.push(task);
57    }
58
59    pub fn sort(&mut self) {
60        self.render_tasks.sort_by_key(|item| {
61            (
62               // item.pipeline.index,
63                item.material.index,
64                item.mesh.index,
65            )
66        });
67    }
68}