diff --git a/assets/bevy.png b/assets/bevy.png new file mode 100644 index 0000000..9cd3f1e Binary files /dev/null and b/assets/bevy.png differ diff --git a/src/filters.rs b/src/filters.rs index a4439c4..e34b458 100644 --- a/src/filters.rs +++ b/src/filters.rs @@ -1,20 +1,48 @@ use bevy::prelude::*; use bevy_rapier2d::prelude::*; -#[derive(Component, Default)] -pub struct FilterColor(pub Color); - #[derive(Component)] pub enum PassThroughFilter { - Absorbing, + /// Absorbs this color (ignoring alpha) + Absorbing(Color), + /// Rotates hue by this angle (in degrees) + Rotating(f32), +} + +impl PassThroughFilter { + pub fn apply(&self, color: Color) -> Color { + match self { + PassThroughFilter::Absorbing(filter_color) => Vec4::from(color) + .mul_add( + -Vec4::from(*filter_color) * Vec4::from([1., 1., 1., 0.]), + Vec4::from(color), + ) + .into(), + PassThroughFilter::Rotating(filter_angle) => { + let mut hsla = color.as_hsla_f32(); + hsla[0] = (hsla[0] + filter_angle) % 360.; + Color::hsla(hsla[0], hsla[1], hsla[2], hsla[3]) + } + } + } } #[derive(Bundle)] pub struct AbsorbingFilter { - pub color: FilterColor, #[bundle] pub mesh: ColorMesh2dBundle, pub collider: Collider, pub sensor: Sensor, - pub filter_type: PassThroughFilter, + pub filter: PassThroughFilter, +} + +#[derive(Bundle)] +pub struct RotatingFilter { + #[bundle] + pub sprite: SpriteBundle, + pub collider: Collider, + pub sensor: Sensor, + pub filter: PassThroughFilter, + pub velocity: Velocity, + pub rigid_body: RigidBody, } diff --git a/src/game.rs b/src/game.rs index f908016..484dd21 100644 --- a/src/game.rs +++ b/src/game.rs @@ -184,7 +184,7 @@ fn collision_event_system( &mut Handle, Option<&Player>, )>, - pass_through_filter_query: Query<(&PassThroughFilter, &FilterColor)>, + pass_through_filter_query: Query<&PassThroughFilter>, mut app_state: ResMut>, audio: Res>, ) { @@ -231,21 +231,11 @@ fn collision_event_system( audio.send(AudioMsg::Fusion).ok(); } } else if *flags == CollisionEventFlags::SENSOR { - if let ( - Ok((mut c_color, _c_transform, mut c_material, c_player)), - Ok((filter, filter_color)), - ) = ( + if let (Ok((mut c_color, _c_transform, mut c_material, c_player)), Ok(filter)) = ( character_query.get_mut(*e1), pass_through_filter_query.get(*e2), ) { - c_color.0 = match filter { - PassThroughFilter::Absorbing => Vec4::from(c_color.0) - .mul_add( - -Vec4::from(filter_color.0) * Vec4::from([1., 1., 1., 0.]), - Vec4::from(c_color.0), - ) - .into(), - }; + c_color.0 = filter.apply(c_color.0); *c_material = materials.add(ColorMaterial::from(c_color.0)); if c_player.is_some() { diff --git a/src/levels.rs b/src/levels.rs index a669d0f..ac00218 100644 --- a/src/levels.rs +++ b/src/levels.rs @@ -56,6 +56,7 @@ pub fn post_setup_level( &character_meshes, &mut materials, &audio, + &asset_server, ), _ => game_over::setup(&mut commands, &asset_server), } diff --git a/src/levels/level1.rs b/src/levels/level1.rs index f26df88..f2d7a73 100644 --- a/src/levels/level1.rs +++ b/src/levels/level1.rs @@ -9,6 +9,7 @@ pub fn setup( character_meshes: &Res, materials: &mut ResMut>, audio: &Res>, + asset_server: &Res, ) { commands .spawn_bundle(ColorMesh2dBundle { @@ -53,7 +54,6 @@ pub fn setup( commands .spawn_bundle(AbsorbingFilter { - color: FilterColor(Color::RED), mesh: ColorMesh2dBundle { mesh: meshes .add(Mesh::from(Quad { @@ -67,7 +67,22 @@ pub fn setup( }, collider: Collider::cuboid(64., 8.), sensor: Sensor, - filter_type: PassThroughFilter::Absorbing, + filter: PassThroughFilter::Absorbing(Color::RED), + }) + .insert(Level); + + commands + .spawn_bundle(RotatingFilter { + sprite: SpriteBundle { + texture: asset_server.get_handle("bevy.png"), + transform: Transform::from_xyz(256., -224., 2.), + ..Default::default() + }, + collider: Collider::ball(32.), + sensor: Sensor, + filter: PassThroughFilter::Rotating(45.), + velocity: Velocity::angular(1.), + rigid_body: RigidBody::KinematicVelocityBased, }) .insert(Level); } diff --git a/src/main.rs b/src/main.rs index 8f78e79..08b60fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,12 +49,12 @@ fn setup(mut commands: Commands, mut windows: ResMut, asset_server: Res .unwrap() .set_title(String::from("Bevyjam")); - #[cfg(not(target_arch = "wasm32"))] - let font: Handle = asset_server.load("UacariLegacy-Thin.ttf"); - #[cfg(target_arch = "wasm32")] let font: Handle = asset_server.load("UacariLegacy-Thin.ttf"); commands.insert_resource(font); + let bevy_icon: Handle = asset_server.load("bevy.png"); + commands.insert_resource(bevy_icon); + commands.spawn_bundle(Camera2dBundle::default()); commands.insert_resource(AmbientLight { color: Color::WHITE,