Color filter

This commit is contained in:
Pascal Engélibert 2022-08-24 23:11:59 +02:00
commit 2a4625269f
Signed by: tuxmain
GPG key ID: 3504BC6D362F7DCA
4 changed files with 112 additions and 75 deletions

View file

@ -12,6 +12,7 @@ use bevy::{
sprite::Mesh2dHandle,
};
use bevy_rapier2d::prelude::*;
use rapier2d::geometry::CollisionEventFlags;
pub enum AudioMsg {
Color([f32; 3]),
@ -154,7 +155,6 @@ pub fn spawn_character(
.insert(CharacterColor(color))
.insert(RigidBody::Dynamic)
.insert(Collider::cuboid(32., 32.))
.insert(ExternalForce::default())
.insert(Velocity::default())
.insert(GravityScale(10.0))
.insert(LockedAxes::ROTATION_LOCKED)
@ -163,7 +163,6 @@ pub fn spawn_character(
linear_damping: 0.5,
angular_damping: 0.5,
})
.insert(ExternalImpulse::default())
.insert(ActiveEvents::COLLISION_EVENTS);
if is_player {
@ -179,7 +178,13 @@ fn collision_event_system(
character_meshes: Res<CharacterMeshes>,
mut materials: ResMut<Assets<ColorMaterial>>,
mut collision_events: EventReader<CollisionEvent>,
character_query: Query<(&CharacterColor, &Transform, Option<&Player>)>,
mut character_query: Query<(
&mut CharacterColor,
&Transform,
&mut Handle<ColorMaterial>,
Option<&Player>,
)>,
pass_through_filter_query: Query<(&PassThroughFilter, &FilterColor)>,
mut app_state: ResMut<State<AppState>>,
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
) {
@ -187,8 +192,8 @@ fn collision_event_system(
if let CollisionEvent::Started(e1, e2, flags) = collision_event {
if flags.is_empty() {
if let (
Ok((c1_color, c1_transform, c1_player)),
Ok((c2_color, c2_transform, c2_player)),
Ok((c1_color, c1_transform, _c1_material, c1_player)),
Ok((c2_color, c2_transform, _c2_material, c2_player)),
) = (character_query.get(*e1), character_query.get(*e2))
{
commands.entity(*e1).despawn_recursive();
@ -225,6 +230,34 @@ 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)),
) = (
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_material = materials.add(ColorMaterial::from(c_color.0));
if c_player.is_some() {
audio
.send(AudioMsg::Color([
c_color.0.r(),
c_color.0.g(),
c_color.0.b(),
]))
.ok();
}
}
}
}
}
@ -300,10 +333,10 @@ fn player_movement_system(
}
fn character_particle_effect_system(
characters: Query<(&Transform, &CharacterColor), With<Player>>,
player_character: Query<(&Transform, &CharacterColor), With<Player>>,
mut particle_effect: ResMut<crate::particle_effect::ParticleEffectResource>,
) {
for (transform, color) in characters.iter() {
if let Ok((transform, color)) = player_character.get_single() {
particle_effect.translation = transform.translation;
particle_effect.color = color.0;
}