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}