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}