Rotating filter
This commit is contained in:
parent
05ecbbbbec
commit
5ac4b4711c
6 changed files with 58 additions and 24 deletions
BIN
assets/bevy.png
Normal file
BIN
assets/bevy.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.7 KiB |
|
@ -1,20 +1,48 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_rapier2d::prelude::*;
|
use bevy_rapier2d::prelude::*;
|
||||||
|
|
||||||
#[derive(Component, Default)]
|
|
||||||
pub struct FilterColor(pub Color);
|
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub enum PassThroughFilter {
|
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)]
|
#[derive(Bundle)]
|
||||||
pub struct AbsorbingFilter {
|
pub struct AbsorbingFilter {
|
||||||
pub color: FilterColor,
|
|
||||||
#[bundle]
|
#[bundle]
|
||||||
pub mesh: ColorMesh2dBundle,
|
pub mesh: ColorMesh2dBundle,
|
||||||
pub collider: Collider,
|
pub collider: Collider,
|
||||||
pub sensor: Sensor,
|
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,
|
||||||
}
|
}
|
||||||
|
|
16
src/game.rs
16
src/game.rs
|
@ -184,7 +184,7 @@ fn collision_event_system(
|
||||||
&mut Handle<ColorMaterial>,
|
&mut Handle<ColorMaterial>,
|
||||||
Option<&Player>,
|
Option<&Player>,
|
||||||
)>,
|
)>,
|
||||||
pass_through_filter_query: Query<(&PassThroughFilter, &FilterColor)>,
|
pass_through_filter_query: Query<&PassThroughFilter>,
|
||||||
mut app_state: ResMut<State<AppState>>,
|
mut app_state: ResMut<State<AppState>>,
|
||||||
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
|
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
|
||||||
) {
|
) {
|
||||||
|
@ -231,21 +231,11 @@ fn collision_event_system(
|
||||||
audio.send(AudioMsg::Fusion).ok();
|
audio.send(AudioMsg::Fusion).ok();
|
||||||
}
|
}
|
||||||
} else if *flags == CollisionEventFlags::SENSOR {
|
} else if *flags == CollisionEventFlags::SENSOR {
|
||||||
if let (
|
if let (Ok((mut c_color, _c_transform, mut c_material, c_player)), Ok(filter)) = (
|
||||||
Ok((mut c_color, _c_transform, mut c_material, c_player)),
|
|
||||||
Ok((filter, filter_color)),
|
|
||||||
) = (
|
|
||||||
character_query.get_mut(*e1),
|
character_query.get_mut(*e1),
|
||||||
pass_through_filter_query.get(*e2),
|
pass_through_filter_query.get(*e2),
|
||||||
) {
|
) {
|
||||||
c_color.0 = match filter {
|
c_color.0 = filter.apply(c_color.0);
|
||||||
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));
|
*c_material = materials.add(ColorMaterial::from(c_color.0));
|
||||||
|
|
||||||
if c_player.is_some() {
|
if c_player.is_some() {
|
||||||
|
|
|
@ -56,6 +56,7 @@ pub fn post_setup_level(
|
||||||
&character_meshes,
|
&character_meshes,
|
||||||
&mut materials,
|
&mut materials,
|
||||||
&audio,
|
&audio,
|
||||||
|
&asset_server,
|
||||||
),
|
),
|
||||||
_ => game_over::setup(&mut commands, &asset_server),
|
_ => game_over::setup(&mut commands, &asset_server),
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ pub fn setup(
|
||||||
character_meshes: &Res<CharacterMeshes>,
|
character_meshes: &Res<CharacterMeshes>,
|
||||||
materials: &mut ResMut<Assets<ColorMaterial>>,
|
materials: &mut ResMut<Assets<ColorMaterial>>,
|
||||||
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
|
audio: &Res<crossbeam_channel::Sender<AudioMsg>>,
|
||||||
|
asset_server: &Res<AssetServer>,
|
||||||
) {
|
) {
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(ColorMesh2dBundle {
|
.spawn_bundle(ColorMesh2dBundle {
|
||||||
|
@ -53,7 +54,6 @@ pub fn setup(
|
||||||
|
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(AbsorbingFilter {
|
.spawn_bundle(AbsorbingFilter {
|
||||||
color: FilterColor(Color::RED),
|
|
||||||
mesh: ColorMesh2dBundle {
|
mesh: ColorMesh2dBundle {
|
||||||
mesh: meshes
|
mesh: meshes
|
||||||
.add(Mesh::from(Quad {
|
.add(Mesh::from(Quad {
|
||||||
|
@ -67,7 +67,22 @@ pub fn setup(
|
||||||
},
|
},
|
||||||
collider: Collider::cuboid(64., 8.),
|
collider: Collider::cuboid(64., 8.),
|
||||||
sensor: Sensor,
|
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);
|
.insert(Level);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,12 +49,12 @@ fn setup(mut commands: Commands, mut windows: ResMut<Windows>, asset_server: Res
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.set_title(String::from("Bevyjam"));
|
.set_title(String::from("Bevyjam"));
|
||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
|
||||||
let font: Handle<Font> = asset_server.load("UacariLegacy-Thin.ttf");
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
|
||||||
let font: Handle<Font> = asset_server.load("UacariLegacy-Thin.ttf");
|
let font: Handle<Font> = asset_server.load("UacariLegacy-Thin.ttf");
|
||||||
commands.insert_resource(font);
|
commands.insert_resource(font);
|
||||||
|
|
||||||
|
let bevy_icon: Handle<Image> = asset_server.load("bevy.png");
|
||||||
|
commands.insert_resource(bevy_icon);
|
||||||
|
|
||||||
commands.spawn_bundle(Camera2dBundle::default());
|
commands.spawn_bundle(Camera2dBundle::default());
|
||||||
commands.insert_resource(AmbientLight {
|
commands.insert_resource(AmbientLight {
|
||||||
color: Color::WHITE,
|
color: Color::WHITE,
|
||||||
|
|
Loading…
Reference in a new issue