ranim_render/graph/view/
mesh_item_depth.rs

1use crate::{
2    RenderContext, RenderTextures,
3    graph::{RenderPacketsQuery, view::ViewRenderNodeTrait},
4    pipelines::MeshItemDepthPipeline,
5    primitives::viewport::ViewportGpuPacket,
6};
7
8pub struct MergedMeshItemDepthNode;
9
10impl ViewRenderNodeTrait for MergedMeshItemDepthNode {
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            depth_stencil_view, ..
30        } = ctx.render_textures;
31        let rpass_desc = wgpu::RenderPassDescriptor {
32            label: Some("Merged MeshItem Depth Render Pass"),
33            color_attachments: &[],
34            depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
35                view: depth_stencil_view,
36                depth_ops: Some(wgpu::Operations {
37                    load: wgpu::LoadOp::Load,
38                    store: wgpu::StoreOp::Store,
39                }),
40                stencil_ops: None,
41            }),
42            timestamp_writes: None,
43            occlusion_query_set: None,
44        };
45        #[cfg(feature = "profiling")]
46        let mut rpass = encoder.scoped_render_pass("Merged MeshItem Depth Render Pass", rpass_desc);
47        #[cfg(not(feature = "profiling"))]
48        let mut rpass = encoder.begin_render_pass(&rpass_desc);
49        rpass.set_pipeline(
50            &ctx.pipelines
51                .get_or_init::<MeshItemDepthPipeline>(ctx.wgpu_ctx),
52        );
53        rpass.set_bind_group(0, &ctx.resolution_info.bind_group, &[]);
54        rpass.set_bind_group(1, &viewport.uniforms_bind_group.bind_group, &[]);
55        rpass.set_bind_group(2, merged.render_bind_group.as_ref().unwrap(), &[]);
56        rpass.set_vertex_buffer(0, merged.vertices_buffer.buffer.slice(..));
57        rpass.set_vertex_buffer(1, merged.mesh_ids_buffer.buffer.slice(..));
58        rpass.set_vertex_buffer(2, merged.vertex_colors_buffer.buffer.slice(..));
59        rpass.set_vertex_buffer(3, merged.vertex_normals_buffer.buffer.slice(..));
60        rpass.set_index_buffer(
61            merged.indices_buffer.buffer.slice(..),
62            wgpu::IndexFormat::Uint32,
63        );
64        rpass.draw_indexed(0..merged.total_indices(), 0, 0..1);
65    }
66}