ranim_render/graph/view/
mesh_item_color.rs

1use crate::{
2    RenderContext, RenderTextures,
3    graph::{RenderPacketsQuery, view::ViewRenderNodeTrait},
4    pipelines::MeshItemColorPipeline,
5    primitives::viewport::ViewportGpuPacket,
6};
7
8pub struct MergedMeshItemColorNode;
9
10impl ViewRenderNodeTrait for MergedMeshItemColorNode {
11    type Query = ();
12
13    fn run(
14        &self,
15        #[cfg(not(feature = "profiling"))] encoder: &mut wgpu::CommandEncoder,
16        #[cfg(feature = "profiling")] encoder: &mut wgpu_profiler::Scope<'_, wgpu::CommandEncoder>,
17        _packets: <Self::Query as RenderPacketsQuery>::Output<'_>,
18        ctx: RenderContext,
19        viewport: &ViewportGpuPacket,
20    ) {
21        let Some(merged) = ctx.merged_mesh_buffer else {
22            return;
23        };
24        if merged.item_count() == 0 {
25            return;
26        }
27
28        let RenderTextures {
29            render_view,
30            depth_stencil_view,
31            ..
32        } = ctx.render_textures;
33        let rpass_desc = wgpu::RenderPassDescriptor {
34            label: Some("Merged MeshItem Color Render Pass"),
35            color_attachments: &[Some(wgpu::RenderPassColorAttachment {
36                view: render_view,
37                resolve_target: None,
38                depth_slice: None,
39                ops: wgpu::Operations {
40                    load: wgpu::LoadOp::Load,
41                    store: wgpu::StoreOp::Store,
42                },
43            })],
44            depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
45                view: depth_stencil_view,
46                depth_ops: Some(wgpu::Operations {
47                    load: wgpu::LoadOp::Load,
48                    store: wgpu::StoreOp::Store,
49                }),
50                stencil_ops: None,
51            }),
52            timestamp_writes: None,
53            occlusion_query_set: None,
54        };
55        #[cfg(feature = "profiling")]
56        let mut rpass = encoder.scoped_render_pass("Merged MeshItem Color Render Pass", rpass_desc);
57        #[cfg(not(feature = "profiling"))]
58        let mut rpass = encoder.begin_render_pass(&rpass_desc);
59        rpass.set_pipeline(
60            &ctx.pipelines
61                .get_or_init::<MeshItemColorPipeline>(ctx.wgpu_ctx),
62        );
63        rpass.set_bind_group(0, &ctx.resolution_info.bind_group, &[]);
64        rpass.set_bind_group(1, &viewport.uniforms_bind_group.bind_group, &[]);
65        rpass.set_bind_group(2, merged.render_bind_group.as_ref().unwrap(), &[]);
66        rpass.set_vertex_buffer(0, merged.vertices_buffer.buffer.slice(..));
67        rpass.set_vertex_buffer(1, merged.mesh_ids_buffer.buffer.slice(..));
68        rpass.set_vertex_buffer(2, merged.vertex_colors_buffer.buffer.slice(..));
69        rpass.set_vertex_buffer(3, merged.vertex_normals_buffer.buffer.slice(..));
70        rpass.set_index_buffer(
71            merged.indices_buffer.buffer.slice(..),
72            wgpu::IndexFormat::Uint32,
73        );
74        rpass.draw_indexed(0..merged.total_indices(), 0, 0..1);
75    }
76}