Skip to main content

easy_gpu/
frame.rs

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