editor: filters

This commit is contained in:
Pascal Engélibert 2022-08-26 15:38:13 +02:00
parent 1e2ecd76c7
commit 9908406623
Signed by: tuxmain
GPG key ID: 3504BC6D362F7DCA
4 changed files with 207 additions and 14 deletions

5
Cargo.lock generated
View file

@ -590,9 +590,9 @@ dependencies = [
[[package]] [[package]]
name = "bevy_mod_picking" name = "bevy_mod_picking"
version = "0.8.2" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19f97d740fcd9d089a768399e902e741f45f8d671e756c939d2f1ce8ad14d63a" checksum = "db42ac84b1409452bbfa696d9071b9a7a2505c73620c939b758b5bf23573976a"
dependencies = [ dependencies = [
"bevy", "bevy",
"bevy_mod_raycast", "bevy_mod_raycast",
@ -1333,7 +1333,6 @@ dependencies = [
"parking_lot 0.12.1", "parking_lot 0.12.1",
"stdweb", "stdweb",
"thiserror", "thiserror",
"wasm-bindgen",
"web-sys", "web-sys",
"windows", "windows",
] ]

View file

@ -17,14 +17,13 @@ serde = { version = "1.0.144", features = ["derive"] }
[target."cfg(not(target_arch = \"wasm32\"))".dependencies] [target."cfg(not(target_arch = \"wasm32\"))".dependencies]
bevy-inspector-egui = "0.12.1" bevy-inspector-egui = "0.12.1"
bevy_mod_picking = "0.8.2" bevy_mod_picking = "0.9.0"
cpal = "0.14.0" cpal = "0.14.0"
hexodsp = { git = "https://github.com/WeirdConstructor/HexoDSP", default-features = false } hexodsp = { git = "https://github.com/WeirdConstructor/HexoDSP", default-features = false }
serde_json = "1.0.85" serde_json = "1.0.85"
ticktock = "0.8.0" ticktock = "0.8.0"
[target."cfg(target_arch = \"wasm32\")".dependencies] [target."cfg(target_arch = \"wasm32\")".dependencies]
cpal = { version = "0.14.0", features = ["wasm-bindgen"] }
[profile.dev.package."*"] [profile.dev.package."*"]
opt-level = 3 opt-level = 3

View file

@ -55,6 +55,12 @@ struct CharacterColor(Color);
#[derive(Component)] #[derive(Component)]
struct Size(Vec2); struct Size(Vec2);
#[derive(Component)]
struct RotatingFilterAngle(f32);
#[derive(Component)]
struct AbsorbingFilterColor(Color);
// Bundles // Bundles
#[derive(Bundle)] #[derive(Bundle)]
@ -66,7 +72,7 @@ struct PlatformBundle {
} }
#[derive(Bundle)] #[derive(Bundle)]
struct PlatformEndBundle { struct EndBundle {
#[bundle] #[bundle]
mesh: ColorMesh2dBundle, mesh: ColorMesh2dBundle,
#[bundle] #[bundle]
@ -85,6 +91,24 @@ struct CharacterBundle {
draggable: Draggable, draggable: Draggable,
} }
#[derive(Bundle)]
struct AbsorbingFilterBundle {
#[bundle]
mesh: ColorMesh2dBundle,
size: Size,
color: AbsorbingFilterColor,
}
#[derive(Bundle)]
struct RotatingFilterBundle {
#[bundle]
mesh: ColorMesh2dBundle,
angle: RotatingFilterAngle,
#[bundle]
pickable: PickableBundle,
draggable: Draggable,
}
// Functions // Functions
fn spawn_platform( fn spawn_platform(
@ -109,7 +133,7 @@ fn spawn_platform(
.id(); .id();
let ends = Ends( let ends = Ends(
commands commands
.spawn_bundle(PlatformEndBundle { .spawn_bundle(EndBundle {
mesh: ColorMesh2dBundle { mesh: ColorMesh2dBundle {
mesh: meshes mesh: meshes
.add(Mesh::from(Circle { .add(Mesh::from(Circle {
@ -131,7 +155,7 @@ fn spawn_platform(
}) })
.id(), .id(),
commands commands
.spawn_bundle(PlatformEndBundle { .spawn_bundle(EndBundle {
mesh: ColorMesh2dBundle { mesh: ColorMesh2dBundle {
mesh: meshes mesh: meshes
.add(Mesh::from(Circle { .add(Mesh::from(Circle {
@ -202,6 +226,121 @@ fn spawn_character(
.id() .id()
} }
fn spawn_absorbing_filter(
commands: &mut Commands,
meshes: &mut ResMut<Assets<Mesh>>,
materials: &mut ResMut<Assets<ColorMaterial>>,
transform: Transform,
size: Vec2,
color: Color,
) {
let absorbing_filter = commands
.spawn_bundle(AbsorbingFilterBundle {
mesh: ColorMesh2dBundle {
mesh: meshes.add(Mesh::from(Quad { size, flip: false })).into(),
material: materials.add(ColorMaterial::from(color)),
transform,
..default()
},
size: Size(size),
color: AbsorbingFilterColor(color),
})
.id();
let ends = Ends(
commands
.spawn_bundle(EndBundle {
mesh: ColorMesh2dBundle {
mesh: meshes
.add(Mesh::from(Circle {
radius: 8.,
vertices: 12,
}))
.into(),
material: materials.add(ColorMaterial::from(Color::rgba(1., 1., 0., 0.7))),
transform: Transform::from_xyz(
transform.translation.x - size.x / 2.,
transform.translation.y - size.y / 2.,
0.5,
),
..default()
},
pickable: PickableBundle::default(),
draggable: Draggable,
end: End(absorbing_filter),
})
.id(),
commands
.spawn_bundle(EndBundle {
mesh: ColorMesh2dBundle {
mesh: meshes
.add(Mesh::from(Circle {
radius: 8.,
vertices: 12,
}))
.into(),
material: materials.add(ColorMaterial::from(Color::rgba(1., 1., 0., 0.7))),
transform: Transform::from_xyz(
transform.translation.x + size.x / 2.,
transform.translation.y + size.y / 2.,
0.5,
),
..default()
},
pickable: PickableBundle::default(),
draggable: Draggable,
end: End(absorbing_filter),
})
.id(),
);
commands.entity(absorbing_filter).insert(ends);
}
fn spawn_rotating_filter(
commands: &mut Commands,
meshes: &mut ResMut<Assets<Mesh>>,
materials: &mut ResMut<Assets<ColorMaterial>>,
asset_server: &Res<AssetServer>,
transform: Transform,
angle: f32,
) -> Entity {
let font = asset_server.get_handle("UacariLegacy-Thin.ttf");
commands
.spawn_bundle(RotatingFilterBundle {
mesh: ColorMesh2dBundle {
mesh: meshes
.add(Mesh::from(Circle {
radius: 32.,
vertices: 36,
}))
.into(),
material: materials.add(ColorMaterial::from(Color::WHITE)),
transform,
..default()
},
angle: RotatingFilterAngle(angle),
pickable: PickableBundle::default(),
draggable: Draggable,
})
.with_children(|c| {
c.spawn_bundle(Text2dBundle {
text: Text::from_section(
&angle.to_string(),
TextStyle {
font: font.clone(),
font_size: 32.,
color: Color::RED,
},
)
.with_alignment(TextAlignment::CENTER),
transform: Transform::from_xyz(0., 0., 1.),
..Default::default()
});
})
.id()
}
fn spawn_stored_level( fn spawn_stored_level(
commands: &mut Commands, commands: &mut Commands,
meshes: &mut ResMut<Assets<Mesh>>, meshes: &mut ResMut<Assets<Mesh>>,
@ -233,6 +372,28 @@ fn spawn_stored_level(
)); ));
} }
commands.insert_resource(CharacterList(character_list)); commands.insert_resource(CharacterList(character_list));
for absorbing_filter in stored_level.absorbing_filters.iter() {
spawn_absorbing_filter(
commands,
meshes,
materials,
Transform::from_xyz(absorbing_filter.pos.x, absorbing_filter.pos.y, 0.),
absorbing_filter.size,
absorbing_filter.color.into(),
);
}
for rotating_filter in stored_level.rotating_filters.iter() {
spawn_rotating_filter(
commands,
meshes,
materials,
asset_server,
Transform::from_xyz(rotating_filter.pos.x, rotating_filter.pos.y, 0.),
rotating_filter.angle,
);
}
} }
fn save_level( fn save_level(
@ -242,6 +403,11 @@ fn save_level(
character_list: &Res<CharacterList>, character_list: &Res<CharacterList>,
character_query: &Query<(&Transform, &CharacterColor), Without<Platform>>, character_query: &Query<(&Transform, &CharacterColor), Without<Platform>>,
platform_query: &Query<(&Transform, &Size), With<Platform>>, platform_query: &Query<(&Transform, &Size), With<Platform>>,
absorbing_filter_query: &Query<(&Transform, &Size, &AbsorbingFilterColor), Without<Platform>>,
rotating_filter_query: &Query<
(&Transform, &RotatingFilterAngle),
(Without<Platform>, Without<CharacterColor>),
>,
) { ) {
let stored_levels = stored_levels_assets.get_mut(stored_levels_handle).unwrap(); let stored_levels = stored_levels_assets.get_mut(stored_levels_handle).unwrap();
if let Some(stored_level) = stored_levels.levels.get_mut(level_id.0 .0 as usize) { if let Some(stored_level) = stored_levels.levels.get_mut(level_id.0 .0 as usize) {
@ -264,10 +430,33 @@ fn save_level(
x: transform.translation.x, x: transform.translation.x,
y: transform.translation.y, y: transform.translation.y,
}, },
color: color.0.as_rgba_f32().into(), color: color.0.into(),
}) })
} }
} }
stored_level.absorbing_filters.clear();
for (transform, size, color) in absorbing_filter_query.iter() {
stored_level.absorbing_filters.push(StoredAbsorbingFilter {
pos: Vec2 {
x: transform.translation.x,
y: transform.translation.y,
},
size: size.0,
color: color.0.into(),
})
}
stored_level.rotating_filters.clear();
for (transform, angle) in rotating_filter_query.iter() {
stored_level.rotating_filters.push(StoredRotatingFilter {
pos: Vec2 {
x: transform.translation.x,
y: transform.translation.y,
},
angle: angle.0,
})
}
} else { } else {
return; return;
} }
@ -324,6 +513,11 @@ fn input_control_system(
character_list: Res<CharacterList>, character_list: Res<CharacterList>,
character_query: Query<(&Transform, &CharacterColor), Without<Platform>>, character_query: Query<(&Transform, &CharacterColor), Without<Platform>>,
platform_query: Query<(&Transform, &Size), With<Platform>>, platform_query: Query<(&Transform, &Size), With<Platform>>,
absorbing_filter_query: Query<(&Transform, &Size, &AbsorbingFilterColor), Without<Platform>>,
rotating_filter_query: Query<
(&Transform, &RotatingFilterAngle),
(Without<Platform>, Without<CharacterColor>),
>,
) { ) {
if keyboard_input.just_released(KeyCode::S) if keyboard_input.just_released(KeyCode::S)
&& (keyboard_input.pressed(KeyCode::LControl) || keyboard_input.pressed(KeyCode::RControl)) && (keyboard_input.pressed(KeyCode::LControl) || keyboard_input.pressed(KeyCode::RControl))
@ -335,6 +529,8 @@ fn input_control_system(
&character_list, &character_list,
&character_query, &character_query,
&platform_query, &platform_query,
&absorbing_filter_query,
&rotating_filter_query,
); );
} }
} }

View file

@ -471,14 +471,13 @@ fn move_camera(
let size: Vec2 = camera.logical_viewport_size().unwrap(); let size: Vec2 = camera.logical_viewport_size().unwrap();
let half_height: f32 = size.y * 0.5; let half_height: f32 = size.y * 0.5;
let mut target_translation = character_transform.translation; let mut target_translation = character_transform.translation;
// prevent camera from going too low // prevent camera from going too low
target_translation.y = target_translation.y.max(half_height - MARGIN); target_translation.y = target_translation.y.max(half_height - MARGIN);
camera_transform.translation = camera_transform.translation.lerp( camera_transform.translation = camera_transform
target_translation, .translation
time.delta_seconds() * FOLLOW_SPEED, .lerp(target_translation, time.delta_seconds() * FOLLOW_SPEED);
);
// always make sure that camera is away from the object in order to render them // always make sure that camera is away from the object in order to render them
camera_transform.translation.z = 999.0; camera_transform.translation.z = 999.0;