From 8d88a5467568506fd9ebe3ae8676b93e5bec2081 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Mon, 5 Feb 2024 21:09:02 -0800 Subject: [PATCH] make the shader example closer to reality... With Backup and all that jazz... I wonder if it will work in the real game! --- examples/shaders.rs | 75 +++++++++++++++++++++++++++++++++++++++------ src/debug.rs | 1 - src/main.rs | 2 +- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/examples/shaders.rs b/examples/shaders.rs index cfde391..0e857d4 100644 --- a/examples/shaders.rs +++ b/examples/shaders.rs @@ -1,6 +1,5 @@ use bevy::pbr::ExtendedMaterial; use bevy::pbr::MaterialExtension; -use bevy::pbr::MaterialMeshBundle; use bevy::pbr::OpaqueRendererMethod; use bevy::prelude::*; use bevy::render::render_resource::*; @@ -15,7 +14,14 @@ fn main() { )) .add_systems(Startup, setup) .add_systems(Update, rotate) - .add_systems(Update, setup_material) + .add_systems(Update, toggle_material.run_if( + |keys: Res>| -> bool { + keys.just_pressed(KeyCode::Space) + }) + ) + .add_systems(Update, init_materials.run_if(|events: Query>| -> bool { + !events.is_empty() + })) .run(); } @@ -52,29 +58,80 @@ impl MaterialExtension for MatExt { } } -fn setup_material( + +#[derive(Debug, Component)] +struct Backup(T); + +fn init_materials( events: Query<(Entity, &Handle), Added>>, standard_materials: Res>, mut materials: ResMut>, mut commands: Commands, ) { - events.iter().for_each(|(entity, handle)| { + info!("initializing materials"); + + events.iter().for_each(|(entity, std_handle)| { // Extension we will add to existing gltf-sourced materials let extension = MatExt { cutoff: 1.0 }; // Base material we will extend for the duration of the dissolve effect let mut base = standard_materials - .get(handle) + .get(std_handle) .expect("Resolve material data") .clone(); base.opaque_render_method = OpaqueRendererMethod::Auto; base.alpha_mode = AlphaMode::Mask(0.5); + let ext_handle = materials.add(ExtendedMaterial { base, extension }); + commands .entity(entity) - .insert(materials.add(ExtendedMaterial { base, extension })) - .remove::>(); - }) + .insert(Backup(ext_handle.clone())); + }); +} + +fn toggle_material( + query: Query>, With>)>>, + std_mat: Query<(&Handle, Option<&Backup>>)>, + ext_mat: Query<(&Handle, Option<&Backup>>)>, + mut commands: Commands, +) { + query.iter().for_each(|entity| { + // Entity has standard material, and had extended material + // Swap these materials + if let Ok( + (std_handle, Some(Backup(ext_handle))) + ) = std_mat.get(entity) { + info!("Swapping standard material for extended material"); + commands + .entity(entity) + .insert(ext_handle.clone()) + .insert(Backup(std_handle.clone())) + .remove::>>() + .remove::>(); + + return + } + + // In this branch we have the extended material assigned to the object + if let Ok( + (ext_handle, Some(Backup(std_handle))) + ) = ext_mat.get(entity) { + // Entity has standard material, and had extended material // Swap these materials + info!("Swapping extended material for standard material"); + + commands + .entity(entity) + .insert(std_handle.clone()) + .insert(Backup(ext_handle.clone())) + .remove::>>() + .remove::>(); + + return + } + + panic!("What is happening?") + }); } fn rotate( @@ -84,8 +141,6 @@ fn rotate( ) { query.iter_mut().for_each(|mut t| { t.rotate_local_y(time.delta_seconds() / 2.0); - // t.rotate_local_z(time.delta_seconds() / 2.0); - // t.rotate_local_x(time.delta_seconds() / 2.0); }); materials.iter_mut().for_each(|(_id, m)| { m.extension.cutoff = time.elapsed_seconds().sin().abs(); diff --git a/src/debug.rs b/src/debug.rs index 3eb4cd8..3b64896 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -41,7 +41,6 @@ impl Plugin for DebugPlugin { display_diagnostics.run_if(resource_exists::()), toggle_debug_ui.run_if(resource_changed_or_removed::()), camera_info.run_if(resource_exists::()), - // gltf_info.run_if(on_event::>()), ), ); } diff --git a/src/main.rs b/src/main.rs index 8b53d44..21e1753 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,7 +49,7 @@ fn main() { .set(WindowPlugin { primary_window: Some(Window { title: "Martian Chess".into(), - resolution: (640., 480.).into(), + resolution: (1280.0, 720.0).into(), ..default() }), ..default()