|
|
|
@ -5,25 +5,41 @@ pub struct EditorScenePlugin;
|
|
|
|
|
|
|
|
|
|
|
|
impl Plugin for EditorScenePlugin {
|
|
|
|
impl Plugin for EditorScenePlugin {
|
|
|
|
fn build(&self, app: &mut App) {
|
|
|
|
fn build(&self, app: &mut App) {
|
|
|
|
app.add_systems(Update, remove_scenes_ui)
|
|
|
|
app.add_event::<ControlScene>()
|
|
|
|
.add_systems(Update, add_scenes_ui)
|
|
|
|
|
|
|
|
.add_systems(Update, control_active_scenes)
|
|
|
|
|
|
|
|
.add_systems(Update, sync_asset_buttons::<Scene>)
|
|
|
|
.add_systems(Update, sync_asset_buttons::<Scene>)
|
|
|
|
.add_systems(Update, sync_remove_asset_buttons::<Scene>);
|
|
|
|
.add_systems(Update, sync_remove_asset_buttons::<Scene>)
|
|
|
|
|
|
|
|
.add_systems(Update, add_scenes_ui)
|
|
|
|
|
|
|
|
.add_systems(Update, remove_scenes_ui)
|
|
|
|
|
|
|
|
.add_systems(Update, sync_asset_buttons::<AudioSource>)
|
|
|
|
|
|
|
|
.add_systems(Update, sync_remove_asset_buttons::<AudioSource>)
|
|
|
|
|
|
|
|
.add_systems(Update, control_scene)
|
|
|
|
|
|
|
|
.add_systems(Update, ui_control_scene);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Event)]
|
|
|
|
|
|
|
|
pub enum ControlScene {
|
|
|
|
|
|
|
|
Spawn(Handle<Scene>),
|
|
|
|
|
|
|
|
Despawn(Handle<Scene>),
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Component, Default)]
|
|
|
|
#[derive(Debug, Component, Default)]
|
|
|
|
pub struct SceneWidget;
|
|
|
|
pub struct SceneWidget;
|
|
|
|
|
|
|
|
|
|
|
|
pub fn add_scenes_ui(
|
|
|
|
pub fn add_scenes_ui(
|
|
|
|
gltf_selected: Query<&ui::TargetAsset<Gltf>, Added<ui::TargetAsset<Gltf>>>,
|
|
|
|
mut events: EventReader<AssetEvent<Gltf>>,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
gltfs: Res<Assets<Gltf>>,
|
|
|
|
widget: Query<Entity, With<SceneWidget>>,
|
|
|
|
widget: Query<Entity, With<SceneWidget>>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
gltf_selected.iter().for_each(|ui::TargetAsset { handle }| {
|
|
|
|
events
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.filter_map(|event| match event {
|
|
|
|
|
|
|
|
AssetEvent::Created { handle } => Some(handle),
|
|
|
|
|
|
|
|
_ => None,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.for_each(|handle| {
|
|
|
|
let gltf_name = get_asset_name(&server, handle.clone());
|
|
|
|
let gltf_name = get_asset_name(&server, handle.clone());
|
|
|
|
if let Some(gltf) = gltfs.get(&handle.clone()) {
|
|
|
|
if let Some(gltf) = gltfs.get(&handle.clone()) {
|
|
|
|
gltf.named_scenes.iter().for_each(|(name, handle)| {
|
|
|
|
gltf.named_scenes.iter().for_each(|(name, handle)| {
|
|
|
|
@ -65,44 +81,48 @@ pub fn remove_scenes_ui(
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn control_active_scenes(
|
|
|
|
pub fn control_scene(
|
|
|
|
added: Query<Entity, (With<Button>, Added<ui::Active>)>,
|
|
|
|
mut events: EventReader<ControlScene>,
|
|
|
|
mut removed: RemovedComponents<ui::Active>,
|
|
|
|
root: Query<Entity, With<LevelRoot>>,
|
|
|
|
scene_refs: Query<&ui::TargetAsset<Scene>>,
|
|
|
|
|
|
|
|
scenes: Query<(Entity, &Handle<Scene>)>,
|
|
|
|
scenes: Query<(Entity, &Handle<Scene>)>,
|
|
|
|
level_root: Query<Entity, With<LevelRoot>>,
|
|
|
|
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
// A scene button was marked inactive
|
|
|
|
events.iter().for_each(|event| match event {
|
|
|
|
removed.iter().for_each(|entity| {
|
|
|
|
ControlScene::Spawn(handle) => {
|
|
|
|
// Get the handle associated with that button
|
|
|
|
commands.entity(root.single()).with_children(|parent| {
|
|
|
|
scene_refs
|
|
|
|
|
|
|
|
.get(entity)
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.for_each(|ui::TargetAsset { handle }| {
|
|
|
|
|
|
|
|
scenes
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.find_map(|(entity, this_handle)| (this_handle == handle).then_some(entity))
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.for_each(|&entity| {
|
|
|
|
|
|
|
|
commands.entity(entity).despawn_recursive();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
added.iter().for_each(|entity| {
|
|
|
|
|
|
|
|
scene_refs
|
|
|
|
|
|
|
|
.get(entity)
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.for_each(|ui::TargetAsset { handle }| {
|
|
|
|
|
|
|
|
info!("Spawning Scene {:?}", handle);
|
|
|
|
|
|
|
|
commands
|
|
|
|
|
|
|
|
.entity(level_root.single())
|
|
|
|
|
|
|
|
.with_children(|parent| {
|
|
|
|
|
|
|
|
parent.spawn(SceneBundle {
|
|
|
|
parent.spawn(SceneBundle {
|
|
|
|
scene: handle.clone(),
|
|
|
|
scene: handle.clone(),
|
|
|
|
..default()
|
|
|
|
..default()
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ControlScene::Despawn(handle) => {
|
|
|
|
|
|
|
|
scenes
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.find_map(|(entity, this_handle)| (handle == this_handle).then_some(entity))
|
|
|
|
|
|
|
|
.into_iter()
|
|
|
|
|
|
|
|
.for_each(|entity| commands.entity(entity).despawn_recursive());
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn ui_control_scene(
|
|
|
|
|
|
|
|
events: Query<
|
|
|
|
|
|
|
|
(&Interaction, &ui::TargetAsset<Scene>, Option<&ui::Active>),
|
|
|
|
|
|
|
|
(With<Button>, Changed<Interaction>),
|
|
|
|
|
|
|
|
>,
|
|
|
|
|
|
|
|
mut writer: EventWriter<ControlScene>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
events
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.filter_map(
|
|
|
|
|
|
|
|
|(interaction, ui::TargetAsset { handle }, active)| match interaction {
|
|
|
|
|
|
|
|
Interaction::Pressed => Some((handle, active)),
|
|
|
|
|
|
|
|
_ => None,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
.for_each(|(handle, active)| match active {
|
|
|
|
|
|
|
|
Some(_) => writer.send(ControlScene::Despawn(handle.clone())),
|
|
|
|
|
|
|
|
None => writer.send(ControlScene::Spawn(handle.clone())),
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|