Skip to content

Commit 43758e2

Browse files
authored
Merge pull request #872 from b-guild/scene
Using a null `SceneController` to simplify the editor when no scene is open.
2 parents b94ec3b + 1d718bf commit 43758e2

File tree

13 files changed

+1012
-776
lines changed

13 files changed

+1012
-776
lines changed

editor/src/lib.rs

Lines changed: 438 additions & 488 deletions
Large diffs are not rendered by default.

editor/src/menu/mod.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub struct Panels<'b> {
8080

8181
pub struct MenuContext<'a, 'b> {
8282
pub engine: &'a mut Engine,
83-
pub game_scene: Option<&'b mut EditorSceneEntry>,
83+
pub game_scene: &'b mut EditorSceneEntry,
8484
pub panels: Panels<'b>,
8585
pub settings: &'b mut Settings,
8686
pub icon_request_sender: Sender<IconRequest>,
@@ -182,23 +182,22 @@ impl Menu {
182182
}
183183

184184
pub fn handle_ui_message(&mut self, message: &UiMessage, mut ctx: MenuContext) {
185-
if let Some(entry) = ctx.game_scene.as_mut() {
186-
self.edit_menu.handle_ui_message(
187-
message,
188-
&self.message_sender,
189-
&entry.selection,
190-
&mut *entry.controller,
191-
ctx.engine,
192-
);
193-
194-
self.create_entity_menu.handle_ui_message(
195-
message,
196-
&self.message_sender,
197-
&mut *entry.controller,
198-
&entry.selection,
199-
ctx.engine,
200-
);
201-
}
185+
let entry = ctx.game_scene;
186+
self.edit_menu.handle_ui_message(
187+
message,
188+
&self.message_sender,
189+
&entry.selection,
190+
&mut *entry.controller,
191+
ctx.engine,
192+
);
193+
194+
self.create_entity_menu.handle_ui_message(
195+
message,
196+
&self.message_sender,
197+
&mut *entry.controller,
198+
&entry.selection,
199+
ctx.engine,
200+
);
202201

203202
self.utils_menu.handle_ui_message(
204203
message,
@@ -208,7 +207,7 @@ impl Menu {
208207
self.file_menu.handle_ui_message(
209208
message,
210209
&self.message_sender,
211-
ctx.game_scene,
210+
Some(entry),
212211
ctx.engine,
213212
ctx.settings,
214213
&mut ctx.panels,

editor/src/plugins/absm/mod.rs

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ impl EditorPlugin for AbsmEditorPlugin {
743743
}
744744

745745
fn on_sync_to_model(&mut self, editor: &mut Editor) {
746-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
746+
let entry = editor.scenes.current_scene_entry_mut();
747747
let absm_editor = some_or_return!(self.absm_editor.as_mut());
748748
let ui = editor.engine.user_interfaces.first_mut();
749749
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
@@ -782,35 +782,34 @@ impl EditorPlugin for AbsmEditorPlugin {
782782
}
783783
}
784784

785-
if let Some(entry) = editor.scenes.current_scene_entry_mut() {
786-
let ui = editor.engine.user_interfaces.first_mut();
787-
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
788-
let graph = &mut editor.engine.scenes[game_scene.scene].graph;
789-
absm_editor.handle_ui_message(
790-
message,
791-
&editor.message_sender,
792-
&entry.selection,
793-
graph,
794-
ui,
795-
game_scene.graph_switches.node_overrides.as_mut().unwrap(),
796-
);
797-
} else if let Some(ui_scene) = entry.controller.downcast_mut::<UiScene>() {
798-
absm_editor.handle_ui_message(
799-
message,
800-
&editor.message_sender,
801-
&entry.selection,
802-
&mut ui_scene.ui,
803-
ui,
804-
ui_scene.ui_update_switches.node_overrides.as_mut().unwrap(),
805-
);
806-
}
785+
let entry = editor.scenes.current_scene_entry_mut();
786+
let ui = editor.engine.user_interfaces.first_mut();
787+
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
788+
let graph = &mut editor.engine.scenes[game_scene.scene].graph;
789+
absm_editor.handle_ui_message(
790+
message,
791+
&editor.message_sender,
792+
&entry.selection,
793+
graph,
794+
ui,
795+
game_scene.graph_switches.node_overrides.as_mut().unwrap(),
796+
);
797+
} else if let Some(ui_scene) = entry.controller.downcast_mut::<UiScene>() {
798+
absm_editor.handle_ui_message(
799+
message,
800+
&editor.message_sender,
801+
&entry.selection,
802+
&mut ui_scene.ui,
803+
ui,
804+
ui_scene.ui_update_switches.node_overrides.as_mut().unwrap(),
805+
);
807806
}
808807

809808
self.absm_editor = Some(absm_editor);
810809
}
811810

812811
fn on_leave_preview_mode(&mut self, editor: &mut Editor) {
813-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
812+
let entry = editor.scenes.current_scene_entry_mut();
814813
let absm_editor = some_or_return!(self.absm_editor.as_mut());
815814
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
816815
let engine = &mut editor.engine;
@@ -836,7 +835,7 @@ impl EditorPlugin for AbsmEditorPlugin {
836835
}
837836

838837
fn on_update(&mut self, editor: &mut Editor) {
839-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
838+
let entry = editor.scenes.current_scene_entry_mut();
840839
let absm_editor = some_or_return!(self.absm_editor.as_mut());
841840
if let Some(game_scene) = entry.controller.downcast_ref::<GameScene>() {
842841
absm_editor.update(
@@ -872,7 +871,7 @@ impl EditorPlugin for AbsmEditorPlugin {
872871
self.on_sync_to_model(editor);
873872
}
874873

875-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
874+
let entry = editor.scenes.current_scene_entry_mut();
876875
let absm_editor = some_or_return!(self.absm_editor.as_mut());
877876
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
878877
absm_editor.handle_message(

editor/src/plugins/animation/mod.rs

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ impl EditorPlugin for AnimationEditorPlugin {
888888
}
889889

890890
fn on_sync_to_model(&mut self, editor: &mut Editor) {
891-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
891+
let entry = editor.scenes.current_scene_entry_mut();
892892
let animation_editor = some_or_return!(self.animation_editor.as_mut());
893893
let ui = editor.engine.user_interfaces.first_mut();
894894
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
@@ -927,40 +927,39 @@ impl EditorPlugin for AnimationEditorPlugin {
927927
}
928928
}
929929

930-
if let Some(entry) = editor.scenes.current_scene_entry_mut() {
931-
let ui = editor.engine.user_interfaces.first_mut();
932-
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
933-
let graph = &mut editor.engine.scenes[game_scene.scene].graph;
934-
animation_editor.handle_ui_message(
935-
message,
936-
&entry.selection,
937-
graph,
938-
game_scene.scene_content_root,
939-
ui,
940-
&editor.engine.resource_manager,
941-
&editor.message_sender,
942-
game_scene.graph_switches.node_overrides.as_mut().unwrap(),
943-
);
944-
} else if let Some(ui_scene) = entry.controller.downcast_mut::<UiScene>() {
945-
let ui_root = ui_scene.ui.root();
946-
animation_editor.handle_ui_message(
947-
message,
948-
&entry.selection,
949-
&mut ui_scene.ui,
950-
ui_root,
951-
ui,
952-
&editor.engine.resource_manager,
953-
&editor.message_sender,
954-
ui_scene.ui_update_switches.node_overrides.as_mut().unwrap(),
955-
);
956-
}
930+
let entry = editor.scenes.current_scene_entry_mut();
931+
let ui = editor.engine.user_interfaces.first_mut();
932+
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
933+
let graph = &mut editor.engine.scenes[game_scene.scene].graph;
934+
animation_editor.handle_ui_message(
935+
message,
936+
&entry.selection,
937+
graph,
938+
game_scene.scene_content_root,
939+
ui,
940+
&editor.engine.resource_manager,
941+
&editor.message_sender,
942+
game_scene.graph_switches.node_overrides.as_mut().unwrap(),
943+
);
944+
} else if let Some(ui_scene) = entry.controller.downcast_mut::<UiScene>() {
945+
let ui_root = ui_scene.ui.root();
946+
animation_editor.handle_ui_message(
947+
message,
948+
&entry.selection,
949+
&mut ui_scene.ui,
950+
ui_root,
951+
ui,
952+
&editor.engine.resource_manager,
953+
&editor.message_sender,
954+
ui_scene.ui_update_switches.node_overrides.as_mut().unwrap(),
955+
);
957956
}
958957

959958
self.animation_editor = Some(animation_editor);
960959
}
961960

962961
fn on_leave_preview_mode(&mut self, editor: &mut Editor) {
963-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
962+
let entry = editor.scenes.current_scene_entry_mut();
964963
let animation_editor = some_or_return!(self.animation_editor.as_mut());
965964
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
966965
let engine = &mut editor.engine;
@@ -984,7 +983,7 @@ impl EditorPlugin for AnimationEditorPlugin {
984983
}
985984

986985
fn on_update(&mut self, editor: &mut Editor) {
987-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
986+
let entry = editor.scenes.current_scene_entry_mut();
988987
let animation_editor = some_or_return!(self.animation_editor.as_mut());
989988
if let Some(game_scene) = entry.controller.downcast_ref::<GameScene>() {
990989
animation_editor.update(
@@ -1016,7 +1015,7 @@ impl EditorPlugin for AnimationEditorPlugin {
10161015
self.on_sync_to_model(editor);
10171016
}
10181017

1019-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
1018+
let entry = editor.scenes.current_scene_entry_mut();
10201019
let animation_editor = some_or_return!(self.animation_editor.as_mut());
10211020
if let Some(game_scene) = entry.controller.downcast_mut::<GameScene>() {
10221021
animation_editor.handle_message(

editor/src/plugins/collider/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ pub struct ColliderPlugin {
686686
impl ColliderPlugin {
687687
fn on_selection(&mut self, editor: &mut Editor) -> bool {
688688
let mut needs_panel = false;
689-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut(), false);
689+
let entry = editor.scenes.current_scene_entry_mut();
690690
let game_scene = some_or_return!(entry.controller.downcast_mut::<GameScene>(), false);
691691
let scene = &mut editor.engine.scenes[game_scene.scene];
692692
if let Some(mode) = entry
@@ -729,7 +729,7 @@ impl ColliderPlugin {
729729

730730
impl EditorPlugin for ColliderPlugin {
731731
fn on_ui_message(&mut self, message: &mut UiMessage, editor: &mut Editor) {
732-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
732+
let entry = editor.scenes.current_scene_entry_mut();
733733
let game_scene = some_or_return!(entry.controller.downcast_mut::<GameScene>());
734734
let panel = some_or_return!(self.panel.as_mut());
735735
panel.handle_ui_message(

editor/src/plugins/inspector/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,7 @@ impl EditorPlugin for InspectorPlugin {
371371
fn on_sync_to_model(&mut self, editor: &mut Editor) {
372372
let ui = editor.engine.user_interfaces.first_mut();
373373

374-
let Some(entry) = editor.scenes.current_scene_entry_mut() else {
375-
self.clear(ui);
376-
return;
377-
};
374+
let entry = editor.scenes.current_scene_entry_mut();
378375

379376
let mut need_clear = true;
380377

@@ -434,9 +431,7 @@ impl EditorPlugin for InspectorPlugin {
434431
}
435432

436433
fn on_ui_message(&mut self, message: &mut UiMessage, editor: &mut Editor) {
437-
let Some(entry) = editor.scenes.current_scene_entry_mut() else {
438-
return;
439-
};
434+
let entry = editor.scenes.current_scene_entry_mut();
440435

441436
if (message.destination() == self.inspector
442437
|| editor

editor/src/plugins/probe.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ pub struct ReflectionProbePlugin {
321321

322322
impl EditorPlugin for ReflectionProbePlugin {
323323
fn on_ui_message(&mut self, message: &mut UiMessage, editor: &mut Editor) {
324-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
324+
let entry = editor.scenes.current_scene_entry_mut();
325325
let game_scene = some_or_return!(entry.controller.downcast_mut::<GameScene>());
326326
let panel = some_or_return!(self.panel.as_mut());
327327
panel.handle_ui_message(
@@ -334,7 +334,7 @@ impl EditorPlugin for ReflectionProbePlugin {
334334
}
335335

336336
fn on_message(&mut self, message: &Message, editor: &mut Editor) {
337-
let entry = some_or_return!(editor.scenes.current_scene_entry_mut());
337+
let entry = editor.scenes.current_scene_entry_mut();
338338
let game_scene = some_or_return!(entry.controller.downcast_mut::<GameScene>());
339339

340340
let scene = &mut editor.engine.scenes[game_scene.scene];

editor/src/plugins/ragdoll.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,7 @@ impl EditorPlugin for RagdollPlugin {
12691269

12701270
let ui = editor.engine.user_interfaces.first_mut();
12711271
let wizard = some_or_return!(self.ragdoll_wizard.as_mut());
1272-
let current_scene = some_or_return!(editor.scenes.current_scene_entry_mut());
1272+
let current_scene = editor.scenes.current_scene_entry_mut();
12731273
let game_scene = some_or_return!(current_scene.controller.downcast_mut::<GameScene>());
12741274
let graph = &mut editor.engine.scenes[game_scene.scene].graph;
12751275
wizard.handle_ui_message(message, ui, graph, game_scene, &editor.message_sender);

editor/src/plugins/tilemap/mod.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ pub enum SelectionSource {
581581

582582
impl TileMapEditorPlugin {
583583
fn get_tile_map_mut<'a>(&self, editor: &'a mut Editor) -> Option<&'a mut TileMap> {
584-
let entry = editor.scenes.current_scene_entry_mut()?;
584+
let entry = editor.scenes.current_scene_entry_mut();
585585
let game_scene = entry.controller.downcast_mut::<GameScene>()?;
586586
let scene = &mut editor.engine.scenes[game_scene.scene];
587587
let node = scene.graph.try_get_node_mut(self.tile_map)?;
@@ -685,16 +685,11 @@ impl TileMapEditorPlugin {
685685
sender,
686686
);
687687
interaction_mode.on_tile_map_selected(tile_map);
688-
// Prepare the tile map interaction mode.
689-
let Some(entry) = editor.scenes.current_scene_entry_mut() else {
690-
// We have somehow lost the scene entry, so remove the effects from the tile map.
691-
if let Some(tile_map) = self.get_tile_map_mut(editor) {
692-
tile_map.before_effects.clear();
693-
tile_map.after_effects.clear();
694-
}
695-
return;
696-
};
697-
entry.interaction_modes.add(interaction_mode);
688+
editor
689+
.scenes
690+
.current_scene_entry_mut()
691+
.interaction_modes
692+
.add(interaction_mode);
698693
}
699694
}
700695

@@ -788,7 +783,8 @@ impl EditorPlugin for TileMapEditorPlugin {
788783
if let Some(interaction_mode) = editor
789784
.scenes
790785
.current_scene_entry_mut()
791-
.and_then(|s| s.interaction_modes.of_type_mut::<TileMapInteractionMode>())
786+
.interaction_modes
787+
.of_type_mut::<TileMapInteractionMode>()
792788
{
793789
interaction_mode.sync_to_state();
794790
}
@@ -855,9 +851,7 @@ impl EditorPlugin for TileMapEditorPlugin {
855851
}
856852
}
857853

858-
let Some(entry) = editor.scenes.current_scene_entry_mut() else {
859-
return;
860-
};
854+
let entry = editor.scenes.current_scene_entry_mut();
861855

862856
let Some(selection) = entry.selection.as_graph() else {
863857
return;

0 commit comments

Comments
 (0)