From 516ca4c68488ac1a9017aa2a7131d21b35fc1a6a Mon Sep 17 00:00:00 2001 From: cxreiff Date: Thu, 15 Aug 2024 18:19:12 -0700 Subject: [PATCH] added dvd and tty logo savers --- .github/workflows/release.yml | 2 +- assets/dvd_logo.png | Bin 0 -> 10262 bytes assets/tty_logo.png | Bin 0 -> 8507 bytes src/assets.rs | 2 + src/bubbles.rs | 10 --- src/lib.rs | 24 ++++--- src/logo.rs | 123 ++++++++++++++++++++++++++++++++++ src/main.rs | 42 ++++++++++-- src/pipes.rs | 28 -------- 9 files changed, 176 insertions(+), 55 deletions(-) create mode 100644 assets/dvd_logo.png create mode 100644 assets/tty_logo.png create mode 100644 src/logo.rs delete mode 100644 src/pipes.rs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4021e76..3b3304f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -278,7 +278,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - repository: "cxreiff/tap" + repository: "cxreiff/homebrew-tap" token: ${{ secrets.HOMEBREW_TAP_TOKEN }} # So we have access to the formula - name: Fetch homebrew formulae diff --git a/assets/dvd_logo.png b/assets/dvd_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf5843ffc4a2393adf94f6fcbbd6075019f8051 GIT binary patch literal 10262 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, ScheduleRunnerPlugin::run_loop(Duration::from_secs_f64(1. / 60.)), RatatuiPlugins::default(), - RatatuiRenderPlugin::new("main", (1, 1)).autoresize(), + RatatuiRenderPlugin::new("main", (256, 256)).autoresize(), )) .insert_resource(Msaa::Off) .init_resource::(); app.add_plugins((assets::plugin, common::plugin)); + if let SaverVariant::Logo(ref logo_path) = self.0 { + app.insert_resource(LogoPath(logo_path.into())); + } + app.add_plugins(match self.0 { - SaverVariant::Maze => maze::plugin, - SaverVariant::Pipes => pipes::plugin, SaverVariant::Bubbles => bubbles::plugin, + SaverVariant::Logo(_) => logo::plugin, + SaverVariant::Maze => maze::plugin, }); } } @@ -48,17 +54,17 @@ pub struct Flags { } pub enum SaverVariant { - Maze, - Pipes, Bubbles, + Logo(String), + Maze, } impl Distribution for Standard { fn sample(&self, rng: &mut R) -> SaverVariant { match rng.gen_range(0..=2) { - 0 => SaverVariant::Maze, - 1 => SaverVariant::Pipes, - _ => SaverVariant::Bubbles, + 0 => SaverVariant::Bubbles, + 1 => SaverVariant::Logo(LOGO_PATH_TTY.into()), + _ => SaverVariant::Maze, } } } diff --git a/src/logo.rs b/src/logo.rs new file mode 100644 index 0000000..37f7fa5 --- /dev/null +++ b/src/logo.rs @@ -0,0 +1,123 @@ +use bevy::prelude::*; +use bevy_ratatui::event::ResizeEvent; +use bevy_ratatui_render::RatatuiRenderContext; +use rand::SeedableRng; +use rand_chacha::ChaCha8Rng; + +pub const LOGO_PATH_DVD: &str = "embedded://ttysvr/../assets/dvd_logo.png"; +pub const LOGO_PATH_TTY: &str = "embedded://ttysvr/../assets/tty_logo.png"; + +const ORTHO_SCALING: f32 = 0.5; +const LOGO_RADIUS: f32 = 32.; +const LOGO_SPEED: f32 = 24.; + +pub(super) fn plugin(app: &mut App) { + app.init_resource::() + .add_systems(Startup, logo_setup_system) + .add_systems(Update, (handle_resize_system, logo_movement_system)); +} + +#[derive(Component, Deref, DerefMut)] +pub struct Logo { + #[deref] + velocity: Vec2, +} + +#[derive(Resource, Deref)] +pub struct LogoPath(pub String); + +#[derive(Resource, Deref, DerefMut, Default)] +pub struct LogoVisibleRegion(Vec2); + +#[derive(Bundle)] +pub struct LogoBundle { + logo: Logo, + sprite: SpriteBundle, +} + +impl LogoBundle { + fn new(rng: &mut ChaCha8Rng, texture: Handle, region: Rectangle) -> Self { + Self { + logo: Logo { + velocity: Vec2::new(LOGO_SPEED, -LOGO_SPEED), + }, + sprite: SpriteBundle { + transform: Transform::from_translation(region.sample_interior(rng).extend(0.)), + texture, + sprite: Sprite { + color: Color::hsl(0., 1.0, 0.6), + custom_size: Some(Vec2::splat(LOGO_RADIUS * 2.)), + ..default() + }, + ..default() + }, + } + } +} + +fn logo_setup_system( + mut commands: Commands, + ratatui_render: Res, + asset_server: Res, + mut visible_region: ResMut, + logo_path: Res, +) { + let mut camera = Camera2dBundle::default(); + camera.projection.scale = ORTHO_SCALING; + camera.camera.target = ratatui_render.target("main").unwrap_or_default(); + commands.spawn(camera); + + **visible_region = get_visible_region(&ratatui_render); + let texture = asset_server.load(&**logo_path); + let mut rng = ChaCha8Rng::seed_from_u64(19878367467712); + commands.spawn(LogoBundle::new( + &mut rng, + texture, + Rectangle::from_size(**visible_region * 0.5 - LOGO_RADIUS * 2.), + )); +} + +fn handle_resize_system( + mut resize_events: EventReader, + mut visible_region: ResMut, + ratatui_render: Res, +) { + for _ in resize_events.read() { + **visible_region = get_visible_region(&ratatui_render); + } +} + +fn logo_movement_system( + time: Res