From 98d21d244bb92a1a8d35b1dff35d9c10bdcab19a Mon Sep 17 00:00:00 2001 From: Silas Bartha Date: Wed, 24 Apr 2024 21:05:55 -0400 Subject: Render Texture Extraction --- src/nodes.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/nodes.rs (limited to 'src/nodes.rs') diff --git a/src/nodes.rs b/src/nodes.rs new file mode 100644 index 0000000..bccd861 --- /dev/null +++ b/src/nodes.rs @@ -0,0 +1,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::>().iter() { + let Some(gpu_image) = world.resource::>().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(()) + } +} -- cgit v1.2.3