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