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