@tool extends MenuButton enum Operation {BAKE} enum Placement {SIBLING, CHILD} var path_scene: Node var ur: EditorUndoRedoManager @onready var _err_dialog: AcceptDialog = $ErrDialog @onready var _bake_dialog: ConfirmationDialog = $BakeDialog @onready var _bake_placement: OptionButton = $BakeDialog/VBoxContainer/OptionButton func _ready() -> void: get_popup().index_pressed.connect(_on_menu_pressed) _bake_dialog.confirmed.connect(_on_bake_confirmed) func _on_menu_pressed(id: int) -> void: match id: Operation.BAKE: _bake_dialog.popup_centered() func _on_bake_confirmed() -> void: if not (path_scene is PathScene3D): return if not ur: return var placement := _bake_placement.selected var p_owner := EditorInterface.get_edited_scene_root() if p_owner == path_scene and placement == Placement.SIBLING: _err_dialog.dialog_text = "Can't add instances as siblings of scene root." _err_dialog.popup_centered() return var instances: Array[Node3D] = path_scene.bake_instances() for i: Node3D in instances: if placement == Placement.SIBLING: ur.add_do_method(path_scene, "add_sibling", i, true) ur.add_do_method(i, "set_owner", p_owner) ur.add_do_reference(i) ur.add_undo_method(path_scene.get_parent(), "remove_child", i) else: ur.add_do_method(path_scene, "add_child", i, true) ur.add_do_method(i, "set_owner", p_owner) ur.add_do_reference(i) ur.add_undo_method(path_scene, "remove_child", i) ur.commit_action()