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