From b8aee4788d636e1bae49244ea6e326bf6a8b8015 Mon Sep 17 00:00:00 2001 From: Matthew Deville Date: Sun, 31 Aug 2025 13:47:28 +0200 Subject: [PATCH] wip --- src/main.rs | 138 ++++-------------------------------------------- src/material.rs | 61 +++++++++++++++++++++ src/systems.rs | 64 ++++++++++++++++++++++ 3 files changed, 135 insertions(+), 128 deletions(-) create mode 100644 src/material.rs create mode 100644 src/systems.rs diff --git a/src/main.rs b/src/main.rs index 5c08a0c..b171128 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,10 @@ //! A shader that uses the WGSL shading language. +mod material; +mod systems; -use bevy::{ - asset::AssetEvent, - input::common_conditions::*, - prelude::*, - reflect::TypePath, - render::render_resource::{AsBindGroup, Shader, ShaderRef}, - sprite::{AlphaMode2d, Material2d, Material2dPlugin}, - window::{PrimaryWindow, WindowMode}, -}; +use bevy::{input::common_conditions::input_just_pressed, prelude::*, sprite::Material2dPlugin}; -const SHADER_ASSET_PATH: &str = "shaders/default.wgsl"; +use material::CustomMaterial; fn main() { App::new() @@ -18,128 +12,16 @@ fn main() { DefaultPlugins, Material2dPlugin::::default(), )) - .add_systems(Startup, setup) + .add_systems(Startup, systems::setup) .add_systems( Update, ( - update_material_time, - resize_fullscreen_quad, - shader_hot_reload, - exit_app.run_if(input_just_pressed(KeyCode::Escape)), - toggle_fullscreen.run_if(input_just_pressed(KeyCode::F11)), + material::update_material_time, + material::shader_hot_reload, + systems::resize_fullscreen_quad, + systems::exit_app.run_if(input_just_pressed(KeyCode::Escape)), + systems::toggle_fullscreen.run_if(input_just_pressed(KeyCode::F11)), ), ) .run(); } - -/// set up a simple 2D-screen-like surface -fn setup( - mut meshes: ResMut>, - mut materials: ResMut>, - mut primary_window: Single<&mut Window, With>, - mut commands: Commands, -) { - primary_window.decorations = false; - - commands.spawn(Camera2d); - - // quad that fills the whole window - let screen_size = Vec2::new( - primary_window.resolution.width(), - primary_window.resolution.height(), - ); - // create material with initial time = 0.0 - let material_handle = materials.add(CustomMaterial { - time: 0.0, - resolution: screen_size, - }); - - commands.spawn(( - Mesh2d(meshes.add(Rectangle::default())), - MeshMaterial2d(material_handle), - Transform::from_scale(Vec3::new(screen_size.x, screen_size.y, 1.0)), - FullscreenQuad, - )); -} - -/// Marker component for the fullscreen quad so we can update it on window resize -#[derive(Component)] -struct FullscreenQuad; - -/// Update fullscreen quad transforms when the primary window is resized. -fn resize_fullscreen_quad( - primary_window: Single<&Window, With>, - mut transform: Single<&mut Transform, With>, -) { - let size = Vec2::new( - primary_window.resolution.width(), - primary_window.resolution.height(), - ); - transform.scale = Vec3::new(size.x, size.y, 1.0); -} - -fn exit_app(mut exit: EventWriter) { - exit.write(AppExit::Success); -} - -fn toggle_fullscreen(mut primary_window: Single<&mut Window, With>) { - primary_window.mode = match primary_window.mode { - WindowMode::BorderlessFullscreen(_) => WindowMode::Windowed, - WindowMode::Windowed => WindowMode::BorderlessFullscreen(MonitorSelection::Current), - WindowMode::Fullscreen(_, _) => WindowMode::BorderlessFullscreen(MonitorSelection::Current), - }; -} - -/// Listen for shader asset changes and force materials to update so the new shader is used. -fn shader_hot_reload( - mut shader_events: EventReader>, - mut materials: ResMut>, -) { - let mut reload_needed = false; - for event in shader_events.read() { - match event { - AssetEvent::Modified { .. } => { - info!("shader changed: {event:?}"); - reload_needed = true; - } - _ => {} - } - } - - if reload_needed { - // iterate all materials and 'touch' them so Bevy updates bindings using the recompiled shader - for (_handle, material) in materials.iter_mut() { - // assign to itself to mark changed - let cloned = material.clone(); - *material = cloned; - } - } -} - -// This is the struct that will be passed to your shader -#[derive(Asset, TypePath, AsBindGroup, Clone)] -struct CustomMaterial { - #[uniform(0)] - time: f32, - #[uniform(1)] - resolution: Vec2, -} - -fn update_material_time(mut materials: ResMut>, time: Res