/**************************************************************************/ /* particles_editor_plugin.cpp */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /**************************************************************************/ /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ #include "particles_editor_plugin.h" #include "editor/docks/scene_tree_dock.h" #include "editor/editor_undo_redo_manager.h" #include "editor/settings/editor_settings.h" #include "scene/gui/box_container.h" #include "scene/gui/menu_button.h" #include "scene/gui/spin_box.h" void ParticlesEditorPlugin::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { if (handled_type.ends_with("2D")) { add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar); } else if (handled_type.ends_with("3D")) { add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, toolbar); } else { DEV_ASSERT(false); } menu->set_button_icon(menu->get_editor_theme_icon(handled_type)); menu->set_text(handled_type); PopupMenu *popup = menu->get_popup(); popup->add_shortcut(ED_SHORTCUT("particles/restart_emission", TTRC("Restart Emission"), KeyModifierMask::CTRL | Key::R), MENU_RESTART); _add_menu_options(popup); popup->add_item(conversion_option_name, MENU_OPTION_CONVERT); } break; } } bool ParticlesEditorPlugin::need_show_lifetime_dialog(SpinBox *p_seconds) { // Add one second to the default generation lifetime, since the progress is updated every second. p_seconds->set_value(MAX(1.0, std::trunc(edited_node->get("lifetime").operator double()) + 1.0)); if (p_seconds->get_value() >= 11.0 + CMP_EPSILON) { // Only pop up the time dialog if the particle's lifetime is long enough to warrant shortening it. return true; } else { // Generate the visibility rect/AABB immediately. return false; } } void ParticlesEditorPlugin::_menu_callback(int p_idx) { switch (p_idx) { case MENU_OPTION_CONVERT: { Node *converted_node = _convert_particles(); EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); ur->create_action(conversion_option_name, UndoRedo::MERGE_DISABLE, edited_node); SceneTreeDock::get_singleton()->replace_node(edited_node, converted_node); ur->commit_action(false); } break; case MENU_RESTART: { edited_node->call("restart"); } } } void ParticlesEditorPlugin::edit(Object *p_object) { edited_node = Object::cast_to(p_object); } bool ParticlesEditorPlugin::handles(Object *p_object) const { return p_object->is_class(handled_type); } void ParticlesEditorPlugin::make_visible(bool p_visible) { toolbar->set_visible(p_visible); } ParticlesEditorPlugin::ParticlesEditorPlugin() { toolbar = memnew(HBoxContainer); toolbar->hide(); menu = memnew(MenuButton); menu->set_switch_on_hover(true); menu->set_flat(false); menu->set_theme_type_variation("FlatMenuButton"); toolbar->add_child(menu); menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ParticlesEditorPlugin::_menu_callback)); }