aboutsummaryrefslogtreecommitdiff
path: root/src/nodes.rs
blob: bccd861694ca1568baa85d3500ad47f4c526ef01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use bevy::{prelude::*, render::{render_graph::{Node, RenderGraphContext, NodeRunError, RenderLabel}, renderer::RenderContext, render_asset::RenderAssets, render_resource::{ImageCopyBuffer, ImageDataLayout}}};

use crate::render_assets::FramebufferExtractSource;

#[derive(RenderLabel, Clone, PartialEq, Eq, Debug, Hash)]
pub struct FramebufferExtractLabel;

#[derive(Default)]
pub struct FramebufferExtractNode;

impl Node for FramebufferExtractNode {
    fn run(
        &self,
        graph: &mut RenderGraphContext,
        render_context: &mut RenderContext,
        world: &World,
    ) -> Result<(), NodeRunError> {
        for (_, source) in world.resource::<RenderAssets<FramebufferExtractSource>>().iter() {
            let Some(gpu_image) = world.resource::<RenderAssets<Image>>().get(&source.source_handle) else {
                return Ok(())
            };

            render_context.command_encoder().copy_texture_to_buffer(
                gpu_image.texture.as_image_copy(),
                ImageCopyBuffer {
                    buffer: &source.buffer,
                    layout: ImageDataLayout {
                        offset: 0,
                        bytes_per_row: Some(source.padded_bytes_per_row),
                        rows_per_image: None,
                    },
                },
                source.source_size,
            );
        }
        Ok(())
    }
}