| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  mesh_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.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | #include "mesh_editor_plugin.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 16:20:24 -07:00
										 |  |  | #include "core/config/project_settings.h"
 | 
					
						
							| 
									
										
										
										
											2024-01-15 13:14:55 +01:00
										 |  |  | #include "editor/themes/editor_scale.h"
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | #include "scene/gui/button.h"
 | 
					
						
							| 
									
										
										
										
											2022-11-19 12:45:49 +01:00
										 |  |  | #include "scene/main/viewport.h"
 | 
					
						
							| 
									
										
										
										
											2019-12-24 15:17:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 12:37:22 -03:00
										 |  |  | void MeshEditor::gui_input(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2021-04-05 08:52:21 +02:00
										 |  |  | 	ERR_FAIL_COND(p_event.is_null()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	Ref<InputEventMouseMotion> mm = p_event; | 
					
						
							| 
									
										
										
										
											2023-01-08 00:55:54 +01:00
										 |  |  | 	if (mm.is_valid() && (mm->get_button_mask().has_flag(MouseButtonMask::LEFT))) { | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 		rot_x -= mm->get_relative().y * 0.01; | 
					
						
							|  |  |  | 		rot_y -= mm->get_relative().x * 0.01; | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		rot_x = CLAMP(rot_x, -Math_PI / 2, Math_PI / 2); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 		_update_rotation(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-01 18:52:49 +03:00
										 |  |  | void MeshEditor::_update_theme_item_cache() { | 
					
						
							|  |  |  | 	SubViewportContainer::_update_theme_item_cache(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-13 02:33:39 +02:00
										 |  |  | 	theme_cache.light_1_icon = get_editor_theme_icon(SNAME("MaterialPreviewLight1")); | 
					
						
							|  |  |  | 	theme_cache.light_2_icon = get_editor_theme_icon(SNAME("MaterialPreviewLight2")); | 
					
						
							| 
									
										
										
										
											2022-09-01 18:52:49 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | void MeshEditor::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2022-02-15 21:44:22 -05:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2022-09-01 18:52:49 +03:00
										 |  |  | 		case NOTIFICATION_THEME_CHANGED: { | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 			light_1_switch->set_icon(theme_cache.light_1_icon); | 
					
						
							|  |  |  | 			light_2_switch->set_icon(theme_cache.light_2_icon); | 
					
						
							| 
									
										
										
										
											2022-02-15 21:44:22 -05:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | void MeshEditor::_update_rotation() { | 
					
						
							| 
									
										
										
										
											2020-10-17 01:08:21 -04:00
										 |  |  | 	Transform3D t; | 
					
						
							| 
									
										
										
										
											2016-10-18 15:50:21 -05:00
										 |  |  | 	t.basis.rotate(Vector3(0, 1, 0), -rot_y); | 
					
						
							|  |  |  | 	t.basis.rotate(Vector3(1, 0, 0), -rot_x); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	rotation->set_transform(t); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | void MeshEditor::edit(Ref<Mesh> p_mesh) { | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	mesh = p_mesh; | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	mesh_instance->set_mesh(mesh); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 17:45:42 +02:00
										 |  |  | 	rot_x = Math::deg_to_rad(-15.0); | 
					
						
							|  |  |  | 	rot_y = Math::deg_to_rad(30.0); | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 	_update_rotation(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AABB aabb = mesh->get_aabb(); | 
					
						
							| 
									
										
										
										
											2021-09-21 00:33:52 +05:45
										 |  |  | 	Vector3 ofs = aabb.get_center(); | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 	float m = aabb.get_longest_axis_size(); | 
					
						
							|  |  |  | 	if (m != 0) { | 
					
						
							|  |  |  | 		m = 1.0 / m; | 
					
						
							|  |  |  | 		m *= 0.5; | 
					
						
							| 
									
										
										
										
											2020-10-17 01:08:21 -04:00
										 |  |  | 		Transform3D xform; | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 		xform.basis.scale(Vector3(m, m, m)); | 
					
						
							|  |  |  | 		xform.origin = -xform.basis.xform(ofs); //-ofs*m;
 | 
					
						
							|  |  |  | 		//xform.origin.z -= aabb.get_longest_axis_size() * 2;
 | 
					
						
							|  |  |  | 		mesh_instance->set_transform(xform); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | void MeshEditor::_on_light_1_switch_pressed() { | 
					
						
							|  |  |  | 	light1->set_visible(light_1_switch->is_pressed()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | void MeshEditor::_on_light_2_switch_pressed() { | 
					
						
							|  |  |  | 	light2->set_visible(light_2_switch->is_pressed()); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | MeshEditor::MeshEditor() { | 
					
						
							| 
									
										
										
										
											2020-03-03 22:51:12 -03:00
										 |  |  | 	viewport = memnew(SubViewport); | 
					
						
							| 
									
										
										
										
											2020-04-18 11:00:51 +02:00
										 |  |  | 	Ref<World3D> world_3d; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:03:09 -06:00
										 |  |  | 	world_3d.instantiate(); | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	viewport->set_world_3d(world_3d); // Use own world.
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	add_child(viewport); | 
					
						
							| 
									
										
										
										
											2016-08-16 12:10:44 -03:00
										 |  |  | 	viewport->set_disable_input(true); | 
					
						
							| 
									
										
										
										
											2022-08-13 01:02:32 +02:00
										 |  |  | 	viewport->set_msaa_3d(Viewport::MSAA_4X); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	set_stretch(true); | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	camera = memnew(Camera3D); | 
					
						
							| 
									
										
										
										
											2020-10-17 01:08:21 -04:00
										 |  |  | 	camera->set_transform(Transform3D(Basis(), Vector3(0, 0, 1.1))); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	camera->set_perspective(45, 0.1, 10); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	viewport->add_child(camera); | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 16:20:24 -07:00
										 |  |  | 	if (GLOBAL_GET("rendering/lights_and_shadows/use_physical_light_units")) { | 
					
						
							|  |  |  | 		camera_attributes.instantiate(); | 
					
						
							|  |  |  | 		camera->set_attributes(camera_attributes); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	light1 = memnew(DirectionalLight3D); | 
					
						
							| 
									
										
										
										
											2020-10-17 01:08:21 -04:00
										 |  |  | 	light1->set_transform(Transform3D().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0))); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	viewport->add_child(light1); | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	light2 = memnew(DirectionalLight3D); | 
					
						
							| 
									
										
										
										
											2020-10-17 01:08:21 -04:00
										 |  |  | 	light2->set_transform(Transform3D().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1))); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	light2->set_color(Color(0.7, 0.7, 0.7)); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	viewport->add_child(light2); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	rotation = memnew(Node3D); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	viewport->add_child(rotation); | 
					
						
							| 
									
										
										
										
											2020-03-26 18:49:16 -03:00
										 |  |  | 	mesh_instance = memnew(MeshInstance3D); | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	rotation->add_child(mesh_instance); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	set_custom_minimum_size(Size2(1, 150) * EDSCALE); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	HBoxContainer *hb = memnew(HBoxContainer); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	add_child(hb); | 
					
						
							| 
									
										
										
										
											2022-03-18 19:02:57 -05:00
										 |  |  | 	hb->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT, Control::PRESET_MODE_MINSIZE, 2); | 
					
						
							| 
									
										
										
										
											2015-08-29 17:16:11 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	hb->add_spacer(); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	VBoxContainer *vb_light = memnew(VBoxContainer); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	hb->add_child(vb_light); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_1_switch = memnew(Button); | 
					
						
							|  |  |  | 	light_1_switch->set_theme_type_variation("PreviewLightButton"); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	light_1_switch->set_toggle_mode(true); | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_1_switch->set_pressed(true); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	vb_light->add_child(light_1_switch); | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_1_switch->connect("pressed", callable_mp(this, &MeshEditor::_on_light_1_switch_pressed)); | 
					
						
							| 
									
										
										
										
											2015-10-18 13:31:44 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_2_switch = memnew(Button); | 
					
						
							|  |  |  | 	light_2_switch->set_theme_type_variation("PreviewLightButton"); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	light_2_switch->set_toggle_mode(true); | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_2_switch->set_pressed(true); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | 	vb_light->add_child(light_2_switch); | 
					
						
							| 
									
										
										
										
											2023-06-29 13:48:53 +02:00
										 |  |  | 	light_2_switch->connect("pressed", callable_mp(this, &MeshEditor::_on_light_2_switch_pressed)); | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-23 18:48:05 -03:00
										 |  |  | 	rot_x = 0; | 
					
						
							|  |  |  | 	rot_y = 0; | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | ///////////////////////
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | bool EditorInspectorPluginMesh::can_handle(Object *p_object) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	return Object::cast_to<Mesh>(p_object) != nullptr; | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | void EditorInspectorPluginMesh::parse_begin(Object *p_object) { | 
					
						
							|  |  |  | 	Mesh *mesh = Object::cast_to<Mesh>(p_object); | 
					
						
							|  |  |  | 	if (!mesh) { | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 	Ref<Mesh> m(mesh); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MeshEditor *editor = memnew(MeshEditor); | 
					
						
							|  |  |  | 	editor->edit(m); | 
					
						
							|  |  |  | 	add_custom_control(editor); | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 10:36:51 +01:00
										 |  |  | MeshEditorPlugin::MeshEditorPlugin() { | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 	Ref<EditorInspectorPluginMesh> plugin; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:03:09 -06:00
										 |  |  | 	plugin.instantiate(); | 
					
						
							| 
									
										
										
										
											2019-03-04 15:52:39 -03:00
										 |  |  | 	add_inspector_plugin(plugin); | 
					
						
							| 
									
										
										
										
											2016-05-23 17:10:26 -03:00
										 |  |  | } |