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: Handle<Buffer>,
14 pub range: Range<u32>
15}
16
17impl RenderItem {
18 fn new(mesh: Handle<Mesh>, material: Handle<Material>,instances: Handle<Buffer>,range: 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>,
32 }
34
35impl Frame {
36 pub(crate) fn new() -> Self {
37 Self {
38 render_tasks: Vec::new(),
39 compute_tasks: Vec::new(),
40 }
41 }
42
43 pub(crate) fn clear(&mut self) {
44 self.render_tasks.clear();
45 self.compute_tasks.clear();
46 }
47
48 pub fn draw(&mut self,instances: Handle<Buffer>,material: Handle<Material>,mesh: Handle<Mesh>,range: Range<u32>) {
49 let item = RenderItem::new(mesh, material, instances, range);
50 self.render_tasks.push(item);
51 }
52
53 pub fn compute(&mut self,bind_group: Handle<ComputeBindGroup>, pipeline: Handle<ComputePipeline>, dispatch: (u32,u32,u32)){
54 let task = ComputeTask::new(pipeline,bind_group,dispatch);
55 self.compute_tasks.push(task);
56 }
57
58 pub fn sort(&mut self) {
59 self.render_tasks.sort_by_key(|item| {
60 (
61 item.material.index,
63 item.mesh.index,
64 )
65 });
66 }
67}