ranim_render/graph/view/
mesh_item_depth.rs1use 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}