editor: filters
This commit is contained in:
parent
1e2ecd76c7
commit
9908406623
4 changed files with 207 additions and 14 deletions
5
Cargo.lock
generated
5
Cargo.lock
generated
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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
|
||||||
|
|
204
src/editor.rs
204
src/editor.rs
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue