From 646db8328611f21a5850cc9834b6c72bfdf0c829 Mon Sep 17 00:00:00 2001 From: Silas Bartha Date: Fri, 26 Apr 2024 01:27:13 -0400 Subject: Initial Commit --- src/components.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/components.rs (limited to 'src/components.rs') diff --git a/src/components.rs b/src/components.rs new file mode 100644 index 0000000..560ad89 --- /dev/null +++ b/src/components.rs @@ -0,0 +1,72 @@ +use bevy::{ + prelude::*, + render::render_resource::{ + Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, + }, +}; +use grex_dither_post_process::components::DitherPostProcessSettings; +use grex_framebuffer_extract::{ + components::{ExtractFramebufferBundle, FramebufferExtractDestination}, + render_assets::FramebufferExtractSource, +}; + +#[derive(Component)] +pub struct TerminalDisplay; + +#[derive(Bundle)] +pub struct TerminalDisplayBundle { + _terminal_display: TerminalDisplay, + extract_framebuffer_bundle: ExtractFramebufferBundle, + dither_post_process_settings: DitherPostProcessSettings, + image_handle: Handle, +} + +impl TerminalDisplayBundle { + pub fn new(dither_level: u32, asset_server: &AssetServer) -> Self { + let terminal_size = crossterm::terminal::size().unwrap(); + let size = Extent3d { + width: (terminal_size.0 as u32) * 2, + height: (terminal_size.1 as u32) * 4, + depth_or_array_layers: 1, + }; + + let mut image = Image { + texture_descriptor: TextureDescriptor { + label: None, + size, + dimension: TextureDimension::D2, + format: TextureFormat::R8Unorm, + mip_level_count: 1, + sample_count: 1, + usage: TextureUsages::TEXTURE_BINDING + | TextureUsages::COPY_SRC + | TextureUsages::RENDER_ATTACHMENT, + view_formats: &[], + }, + ..default() + }; + + image.resize(size); + let image_handle = asset_server.add(image); + + let framebuffer_extract_source = + asset_server.add(FramebufferExtractSource(image_handle.clone())); + + Self { + _terminal_display: TerminalDisplay, + extract_framebuffer_bundle: ExtractFramebufferBundle { + source: framebuffer_extract_source, + dest: FramebufferExtractDestination::default(), + }, + image_handle, + dither_post_process_settings: DitherPostProcessSettings::new( + dither_level, + asset_server, + ), + } + } + + pub fn image_handle(&self) -> Handle { + self.image_handle.clone() + } +} -- cgit v1.2.3