| 
									
										
										
										
											2018-08-29 22:38:13 +02:00
										 |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | /*  cpu_particles_3d_editor_plugin.cpp                                    */ | 
					
						
							| 
									
										
										
										
											2018-08-29 22:38:13 +02:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         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.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | #include "cpu_particles_3d_editor_plugin.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-04 11:30:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:46:22 +01:00
										 |  |  | #include "editor/editor_node.h"
 | 
					
						
							| 
									
										
										
										
											2024-05-20 00:04:48 +02:00
										 |  |  | #include "editor/editor_settings.h"
 | 
					
						
							| 
									
										
										
										
											2023-08-19 11:55:49 +03:00
										 |  |  | #include "editor/editor_undo_redo_manager.h"
 | 
					
						
							| 
									
										
										
										
											2023-04-07 18:59:49 +02:00
										 |  |  | #include "editor/gui/scene_tree_editor.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | #include "editor/plugins/node_3d_editor_plugin.h"
 | 
					
						
							| 
									
										
										
										
											2023-08-19 11:55:49 +03:00
										 |  |  | #include "editor/scene_tree_dock.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:46:22 +01:00
										 |  |  | #include "scene/gui/menu_button.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditor::_node_removed(Node *p_node) { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	if (p_node == node) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		node = nullptr; | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 		hide(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditor::_notification(int p_notification) { | 
					
						
							| 
									
										
										
										
											2022-02-15 21:44:22 -05:00
										 |  |  | 	switch (p_notification) { | 
					
						
							|  |  |  | 		case NOTIFICATION_ENTER_TREE: { | 
					
						
							| 
									
										
										
										
											2023-08-13 02:33:39 +02:00
										 |  |  | 			options->set_icon(get_editor_theme_icon(SNAME("CPUParticles3D"))); | 
					
						
							| 
									
										
										
										
											2022-02-15 21:44:22 -05:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditor::_menu_option(int p_option) { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	switch (p_option) { | 
					
						
							|  |  |  | 		case MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE: { | 
					
						
							| 
									
										
										
										
											2020-07-11 18:45:19 +02:00
										 |  |  | 			emission_tree_dialog->popup_scenetree_dialog(); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2019-06-21 22:33:11 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case MENU_OPTION_RESTART: { | 
					
						
							|  |  |  | 			node->restart(); | 
					
						
							| 
									
										
										
										
											2023-08-19 11:55:49 +03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case MENU_OPTION_CONVERT_TO_GPU_PARTICLES: { | 
					
						
							|  |  |  | 			GPUParticles3D *gpu_particles = memnew(GPUParticles3D); | 
					
						
							|  |  |  | 			gpu_particles->convert_from_particles(node); | 
					
						
							|  |  |  | 			gpu_particles->set_name(node->get_name()); | 
					
						
							|  |  |  | 			gpu_particles->set_transform(node->get_transform()); | 
					
						
							|  |  |  | 			gpu_particles->set_visible(node->is_visible()); | 
					
						
							|  |  |  | 			gpu_particles->set_process_mode(node->get_process_mode()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); | 
					
						
							| 
									
										
										
										
											2024-03-03 19:09:25 +01:00
										 |  |  | 			ur->create_action(TTR("Convert to GPUParticles3D"), UndoRedo::MERGE_DISABLE, node); | 
					
						
							| 
									
										
										
										
											2023-08-19 11:55:49 +03:00
										 |  |  | 			SceneTreeDock::get_singleton()->replace_node(node, gpu_particles); | 
					
						
							|  |  |  | 			ur->commit_action(false); | 
					
						
							| 
									
										
										
										
											2019-06-21 22:33:11 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2023-07-28 17:32:06 -07:00
										 |  |  | 		case MENU_OPTION_GENERATE_AABB: { | 
					
						
							|  |  |  | 			// Add one second to the default generation lifetime, since the progress is updated every second.
 | 
					
						
							|  |  |  | 			generate_seconds->set_value(MAX(1.0, trunc(node->get_lifetime()) + 1.0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (generate_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.
 | 
					
						
							|  |  |  | 				generate_aabb->popup_centered(); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				// Generate the visibility AABB immediately.
 | 
					
						
							|  |  |  | 				_generate_aabb(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CPUParticles3DEditor::_generate_aabb() { | 
					
						
							|  |  |  | 	double time = generate_seconds->get_value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	double running = 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	EditorProgress ep("gen_aabb", TTR("Generating Visibility AABB (Waiting for Particle Simulation)"), int(time)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool was_emitting = node->is_emitting(); | 
					
						
							|  |  |  | 	if (!was_emitting) { | 
					
						
							|  |  |  | 		node->set_emitting(true); | 
					
						
							|  |  |  | 		OS::get_singleton()->delay_usec(1000); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AABB rect; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (running < time) { | 
					
						
							|  |  |  | 		uint64_t ticks = OS::get_singleton()->get_ticks_usec(); | 
					
						
							| 
									
										
										
										
											2024-06-14 10:52:38 +03:00
										 |  |  | 		ep.step(TTR("Generating..."), int(running), true); | 
					
						
							| 
									
										
										
										
											2023-07-28 17:32:06 -07:00
										 |  |  | 		OS::get_singleton()->delay_usec(1000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		AABB capture = node->capture_aabb(); | 
					
						
							|  |  |  | 		if (rect == AABB()) { | 
					
						
							|  |  |  | 			rect = capture; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			rect.merge_with(capture); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!was_emitting) { | 
					
						
							|  |  |  | 		node->set_emitting(false); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-07-28 17:32:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); | 
					
						
							|  |  |  | 	ur->create_action(TTR("Generate Visibility AABB")); | 
					
						
							|  |  |  | 	ur->add_do_method(node, "set_visibility_aabb", rect); | 
					
						
							|  |  |  | 	ur->add_undo_method(node, "set_visibility_aabb", node->get_visibility_aabb()); | 
					
						
							|  |  |  | 	ur->commit_action(); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditor::edit(CPUParticles3D *p_particles) { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	base_node = p_particles; | 
					
						
							|  |  |  | 	node = p_particles; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditor::_generate_emission_points() { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	/// hacer codigo aca
 | 
					
						
							| 
									
										
										
										
											2020-02-17 18:06:54 -03:00
										 |  |  | 	Vector<Vector3> points; | 
					
						
							|  |  |  | 	Vector<Vector3> normals; | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!_generate(points, normals)) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (normals.size() == 0) { | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 		node->set_emission_shape(CPUParticles3D::EMISSION_SHAPE_POINTS); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 		node->set_emission_points(points); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 		node->set_emission_shape(CPUParticles3D::EMISSION_SHAPE_DIRECTED_POINTS); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 		node->set_emission_points(points); | 
					
						
							|  |  |  | 		node->set_emission_normals(normals); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | CPUParticles3DEditor::CPUParticles3DEditor() { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	particles_editor_hb = memnew(HBoxContainer); | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	Node3DEditor::get_singleton()->add_control_to_menu_panel(particles_editor_hb); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	options = memnew(MenuButton); | 
					
						
							| 
									
										
										
										
											2019-04-25 10:27:33 -03:00
										 |  |  | 	options->set_switch_on_hover(true); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	particles_editor_hb->add_child(options); | 
					
						
							|  |  |  | 	particles_editor_hb->hide(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | 	options->set_text(TTR("CPUParticles3D")); | 
					
						
							| 
									
										
										
										
											2024-05-20 00:04:48 +02:00
										 |  |  | 	options->get_popup()->add_shortcut(ED_GET_SHORTCUT("particles/restart_emission"), MENU_OPTION_RESTART); | 
					
						
							| 
									
										
										
										
											2023-07-28 17:32:06 -07:00
										 |  |  | 	options->get_popup()->add_item(TTR("Generate AABB"), MENU_OPTION_GENERATE_AABB); | 
					
						
							| 
									
										
										
										
											2020-04-12 21:45:01 -04:00
										 |  |  | 	options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE); | 
					
						
							| 
									
										
										
										
											2023-08-19 11:55:49 +03:00
										 |  |  | 	options->get_popup()->add_item(TTR("Convert to GPUParticles3D"), MENU_OPTION_CONVERT_TO_GPU_PARTICLES); | 
					
						
							| 
									
										
										
										
											2024-05-14 14:13:31 +02:00
										 |  |  | 	options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CPUParticles3DEditor::_menu_option)); | 
					
						
							| 
									
										
										
										
											2023-07-28 17:32:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	generate_aabb = memnew(ConfirmationDialog); | 
					
						
							|  |  |  | 	generate_aabb->set_title(TTR("Generate Visibility AABB")); | 
					
						
							|  |  |  | 	VBoxContainer *genvb = memnew(VBoxContainer); | 
					
						
							|  |  |  | 	generate_aabb->add_child(genvb); | 
					
						
							|  |  |  | 	generate_seconds = memnew(SpinBox); | 
					
						
							|  |  |  | 	genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds); | 
					
						
							|  |  |  | 	generate_seconds->set_min(0.1); | 
					
						
							|  |  |  | 	generate_seconds->set_max(25); | 
					
						
							|  |  |  | 	generate_seconds->set_value(2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	add_child(generate_aabb); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-14 14:28:18 +02:00
										 |  |  | 	generate_aabb->connect(SceneStringName(confirmed), callable_mp(this, &CPUParticles3DEditor::_generate_aabb)); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditorPlugin::edit(Object *p_object) { | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	particles_editor->edit(Object::cast_to<CPUParticles3D>(p_object)); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | bool CPUParticles3DEditorPlugin::handles(Object *p_object) const { | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	return p_object->is_class("CPUParticles3D"); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | void CPUParticles3DEditorPlugin::make_visible(bool p_visible) { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	if (p_visible) { | 
					
						
							|  |  |  | 		particles_editor->show(); | 
					
						
							|  |  |  | 		particles_editor->particles_editor_hb->show(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		particles_editor->particles_editor_hb->hide(); | 
					
						
							|  |  |  | 		particles_editor->hide(); | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		particles_editor->edit(nullptr); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 10:36:51 +01:00
										 |  |  | CPUParticles3DEditorPlugin::CPUParticles3DEditorPlugin() { | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | 	particles_editor = memnew(CPUParticles3DEditor); | 
					
						
							| 
									
										
										
										
											2022-09-07 02:30:54 +03:00
										 |  |  | 	EditorNode::get_singleton()->get_main_screen_control()->add_child(particles_editor); | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	particles_editor->hide(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 08:44:44 +01:00
										 |  |  | CPUParticles3DEditorPlugin::~CPUParticles3DEditorPlugin() { | 
					
						
							| 
									
										
										
										
											2018-07-06 20:21:13 -03:00
										 |  |  | } |