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()