From 0425f14df0caa1306784b88d8d5bddde7e26e66f Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 14 Apr 2022 14:12:11 +0200 Subject: [PATCH] Updated the engine, and removed the mesh data resource addon, as the engine now has it built in. --- HEADS | 2 +- .../addons/mesh_data_resource_editor/MDIEd.gd | 255 --- .../mesh_data_resource_editor/MDIEd.tscn | 769 ------- .../MDIGizmoPlugin.gd | 33 - .../mesh_data_resource_editor/MIDGizmo.gd | 1816 ----------------- .../mesh_data_resource_editor/UVEditor.gd | 63 - .../button_groups/edit_mode_button_group.tres | 3 - .../handle_selection_typen_group.tres | 3 - .../button_groups/pivot_button_group.tres | 3 - .../vertex_position_operation_bg.tres | 3 - .../icons/icon_h_mirror.png | Bin 262 -> 0 bytes .../icons/icon_h_mirror.png.import | 35 - .../icons/icon_rot_left.png | Bin 647 -> 0 bytes .../icons/icon_rot_left.png.import | 35 - .../icons/icon_rot_right.png | Bin 5528 -> 0 bytes .../icons/icon_rot_right.png.import | 35 - .../icons/icon_v_mirror.png | Bin 305 -> 0 bytes .../icons/icon_v_mirror.png.import | 35 - .../mesh_data_resource_editor/plugin.cfg | 7 - .../mesh_data_resource_editor/plugin.gd | 289 --- .../utilities/mdred_mesh_utils.gd | 1643 --------------- .../utilities/mesh_decompose.gd | 263 --- .../utilities/mesh_outline.gd | 167 -- .../uv_editor/RectEditor.gd | 18 - .../uv_editor/RectView.gd | 250 --- .../uv_editor/RectViewNode.gd | 418 ---- .../uv_editor/RectViewNode.tscn | 11 - .../uv_editor/UVEditor.tscn | 121 -- .../uv_editor/UVEditorPopup.gd | 15 - .../widgets/EditorZoomWidget.gd | 218 -- .../widgets/EditorZoomWidget.tscn | 8 - .../widgets/flex_grid_container.gd | 207 -- game/project.pandemonium | 78 +- 33 files changed, 40 insertions(+), 6763 deletions(-) delete mode 100644 game/addons/mesh_data_resource_editor/MDIEd.gd delete mode 100644 game/addons/mesh_data_resource_editor/MDIEd.tscn delete mode 100644 game/addons/mesh_data_resource_editor/MDIGizmoPlugin.gd delete mode 100644 game/addons/mesh_data_resource_editor/MIDGizmo.gd delete mode 100644 game/addons/mesh_data_resource_editor/UVEditor.gd delete mode 100644 game/addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres delete mode 100644 game/addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres delete mode 100644 game/addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres delete mode 100644 game/addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png.import delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_rot_left.png delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_rot_left.png.import delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_rot_right.png delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_rot_right.png.import delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_v_mirror.png delete mode 100644 game/addons/mesh_data_resource_editor/icons/icon_v_mirror.png.import delete mode 100644 game/addons/mesh_data_resource_editor/plugin.cfg delete mode 100644 game/addons/mesh_data_resource_editor/plugin.gd delete mode 100644 game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd delete mode 100644 game/addons/mesh_data_resource_editor/utilities/mesh_decompose.gd delete mode 100644 game/addons/mesh_data_resource_editor/utilities/mesh_outline.gd delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/RectEditor.gd delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/RectView.gd delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn delete mode 100644 game/addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd delete mode 100644 game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.gd delete mode 100644 game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn delete mode 100644 game/addons/mesh_data_resource_editor/widgets/flex_grid_container.gd diff --git a/HEADS b/HEADS index d5bbb656..0998afda 100644 --- a/HEADS +++ b/HEADS @@ -1 +1 @@ -{"engine": {"3.2": "94a0fc47f7b4e90f8973f9adbfd3312579ed2825", "master": "8c73e813134001e575b6f59e3b0100471c007410", "3.x": "c4864a0e5f73a375259503ea1485794a6aad6df7"}, "world_generator": {"master": "260c430f11b0b591eaf4714516419aa327d2842c"}, "entity_spell_system": {"master": "3536f01bacf5f54cefb32b768cd020a1f94d0ade"}, "ui_extensions": {"master": "80a3b96fc56991a0f88a1d441ed1e3cebaf3307a"}, "voxelman": {"master": "65485930a20f65844d496b4ba47dec5b6ed70b91"}, "texture_packer": {"master": "ae4d222fbaade063ed6f0bc9f3aaa53df68a7fed"}, "fastnoise": {"master": "46bb1f610bfb7171613b5c708d312bcf94e89356"}, "mesh_data_resource": {"master": "a062d871d49d954c5466b9de54b4075cb61cbef4"}, "procedural_animations": {"master": "f8aae42bf06b3936cc6bd24cb18e1c3ec9f78f4f"}, "ess_data": {"master": "3bd637fdd3304b64a18287a49a6b7387acf2f5de"}, "props": {"master": "983090d21a08ebed30a5ce06681269819ab12e48"}, "mesh_utils": {"master": "b52a261c31f04fad624e5cfbcdcc4a45d61136da"}, "broken_seals_module": {"master": "52c5a81350db1c29d375c63d95010260911ec034"}, "thread_pool": {"master": "0917511d04bb1aa308385b63ec88d3c182990628"}, "terraman": {"master": "c72d8fc03295588fc18c5168ce351bd0c321ec5f"}, "pandemonium_engine": {"master": "d4c57cf537fc8f92d0f9ab7df1ed9dcf7a432de0"}} \ No newline at end of file +{"engine": {"3.2": "94a0fc47f7b4e90f8973f9adbfd3312579ed2825", "master": "8c73e813134001e575b6f59e3b0100471c007410", "3.x": "c4864a0e5f73a375259503ea1485794a6aad6df7"}, "world_generator": {"master": "260c430f11b0b591eaf4714516419aa327d2842c"}, "entity_spell_system": {"master": "3536f01bacf5f54cefb32b768cd020a1f94d0ade"}, "ui_extensions": {"master": "80a3b96fc56991a0f88a1d441ed1e3cebaf3307a"}, "voxelman": {"master": "65485930a20f65844d496b4ba47dec5b6ed70b91"}, "texture_packer": {"master": "ae4d222fbaade063ed6f0bc9f3aaa53df68a7fed"}, "fastnoise": {"master": "46bb1f610bfb7171613b5c708d312bcf94e89356"}, "mesh_data_resource": {"master": "a062d871d49d954c5466b9de54b4075cb61cbef4"}, "procedural_animations": {"master": "f8aae42bf06b3936cc6bd24cb18e1c3ec9f78f4f"}, "ess_data": {"master": "3bd637fdd3304b64a18287a49a6b7387acf2f5de"}, "props": {"master": "983090d21a08ebed30a5ce06681269819ab12e48"}, "mesh_utils": {"master": "b52a261c31f04fad624e5cfbcdcc4a45d61136da"}, "broken_seals_module": {"master": "52c5a81350db1c29d375c63d95010260911ec034"}, "thread_pool": {"master": "0917511d04bb1aa308385b63ec88d3c182990628"}, "terraman": {"master": "c72d8fc03295588fc18c5168ce351bd0c321ec5f"}, "pandemonium_engine": {"master": "3406a11f5c9860176b6cf10b20b4ad9aa20a4c5f"}} \ No newline at end of file diff --git a/game/addons/mesh_data_resource_editor/MDIEd.gd b/game/addons/mesh_data_resource_editor/MDIEd.gd deleted file mode 100644 index 60d8b2e2..00000000 --- a/game/addons/mesh_data_resource_editor/MDIEd.gd +++ /dev/null @@ -1,255 +0,0 @@ -tool -extends Control - -var _plugin : EditorPlugin - -export var uv_preview_path : NodePath -export var uv_editor_path : NodePath - -var uv_preview : Node -var uv_editor : Node - -func _enter_tree(): - uv_preview = get_node(uv_preview_path) - uv_editor = get_node(uv_editor_path) - - if _plugin && uv_editor: - uv_editor.set_plugin(_plugin) - -func set_plugin(plugin : EditorPlugin) -> void: - _plugin = plugin - - if uv_editor: - uv_editor.set_plugin(plugin) - -func set_mesh_data_resource(a : MeshDataResource) -> void: - if uv_preview: - uv_preview.set_mesh_data_resource(a) - - if uv_editor: - uv_editor.set_mesh_data_resource(a) - -func set_mesh_data_instance(a : MeshDataInstance) -> void: - if uv_preview: - uv_preview.set_mesh_data_instance(a) - - if uv_editor: - uv_editor.set_mesh_data_instance(a) - -func _unhandled_key_input(event : InputEventKey) -> void: - if event.echo: - return - - if event.alt || event.shift || event.control || event.meta || event.command: - return - - if event.scancode == KEY_G: - set_edit_mode_translate() - elif event.scancode == KEY_H: - set_edit_mode_rotate() - elif event.scancode == KEY_J: - set_edit_mode_scale() - - elif event.scancode == KEY_V: - set_axis_x(!get_axis_x()) - elif event.scancode == KEY_B: - set_axis_y(!get_axis_y()) - elif event.scancode == KEY_N: - set_axis_z(!get_axis_z()) - - elif event.scancode == KEY_K: - set_selection_mode_vertex() - elif event.scancode == KEY_L: - set_selection_mode_edge() - elif event.scancode == KEY_SEMICOLON: - set_selection_mode_face() - -#Edit modes -func set_edit_mode_translate() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Translate.pressed = true - -func set_edit_mode_rotate() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Rotate.pressed = true - -func set_edit_mode_scale() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Scale.pressed = true - -func on_edit_mode_translate_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_translate() - -func on_edit_mode_rotate_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_rotate() - -func on_edit_mode_scale_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_scale() - -#axis locks -func get_axis_x() -> bool: - return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed - -func get_axis_y() -> bool: - return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed - -func get_axis_z() -> bool: - return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed - -func set_axis_x(on : bool) -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed = on - -func set_axis_y(on : bool) -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed = on - -func set_axis_z(on : bool) -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed = on - -func on_axis_x_toggled(on : bool) -> void: - if _plugin: - _plugin.set_axis_x(on) - -func on_axis_y_toggled(on : bool) -> void: - if _plugin: - _plugin.set_axis_y(on) - -func on_axis_z_toggled(on : bool) -> void: - if _plugin: - _plugin.set_axis_z(on) - -#selection modes -func on_selection_mode_vertex_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_selection_mode_vertex() - -func on_selection_mode_edge_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_selection_mode_edge() - -func on_selection_mode_face_toggled(on : bool) -> void: - if on: - if _plugin: - _plugin.set_selection_mode_face() - -func set_selection_mode_vertex() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex.pressed = true - -func set_selection_mode_edge() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge.pressed = true - -func set_selection_mode_face() -> void: - $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face.pressed = true - - -func _on_Extrude_pressed(): - _plugin.extrude() - -func _on_AddBox_pressed(): - _plugin.add_box() - -func _on_UnwrapButton_pressed(): - _plugin.uv_unwrap() - -func _on_add_triangle_pressed(): - _plugin.add_triangle() - -func _on_add_quad_pressed(): - _plugin.add_quad() - -func _on_split_pressed(): - _plugin.split() - -func _on_connect_to_first_selected_pressed(): - _plugin.connect_to_first_selected() - -func _on_connect_to_avg_pressed(): - _plugin.connect_to_avg() - -func _on_connect_to_last_selected_pressed(): - _plugin.connect_to_last_selected() - -func _on_disconnect_pressed(): - _plugin.disconnect_action() - -func _on_add_triangle_at_pressed(): - _plugin.add_triangle_at() - -func _on_add_auad_at_pressed(): - _plugin.add_quad_at() - -func _oncreate_face_pressed(): - _plugin.create_face() - -func _on_delete_pressed(): - _plugin.delete_selected() - -func _on_GenNormals_pressed(): - _plugin.generate_normals() - -func _on_RemDoubles_pressed(): - _plugin.remove_doubles() - -func _on_MergeOptimize_pressed(): - _plugin.merge_optimize() - -func _on_GenTangents_pressed(): - _plugin.generate_tangents() - -func _on_mark_seam_pressed(): - _plugin.mark_seam() - -func _on_unmark_seam_pressed(): - _plugin.unmark_seam() - -func _on_apply_seams_pressed(): - _plugin.apply_seam() - -func _on_uv_edit_pressed(): - $Popups/UVEditorPopup.popup_centered() - -func on_pivot_average_toggled(on : bool): - if on: - _plugin.set_pivot_averaged() - -func on_pivot_mdi_origin_toggled(on : bool): - if on: - _plugin.set_pivot_mdi_origin() - -func on_pivot_world_origin_toggled(on : bool): - if on: - _plugin.set_pivot_world_origin() - -func on_visual_indicator_outline_toggled(on : bool): - _plugin.visual_indicator_outline_set(on) - -func on_visual_indicator_seam_toggled(on : bool): - _plugin.visual_indicator_seam_set(on) - -func on_visual_indicator_handle_toggled(on : bool): - _plugin.visual_indicator_handle_set(on) - -func _on_select_all_pressed(): - _plugin.select_all() - -func onhandle_selection_type_front_toggled(on : bool): - if on: - _plugin.handle_selection_type_front() - -func onhandle_selection_type_back_toggled(on : bool): - if on: - _plugin.handle_selection_type_back() - -func onhandle_selection_type_all_toggled(on : bool): - if on: - _plugin.handle_selection_type_all() - -func _on_clean_mesh_pressed(): - _plugin.clean_mesh() - -func _on_flip_face_pressed(): - _plugin.flip_selected_faces() diff --git a/game/addons/mesh_data_resource_editor/MDIEd.tscn b/game/addons/mesh_data_resource_editor/MDIEd.tscn deleted file mode 100644 index ad31b92a..00000000 --- a/game/addons/mesh_data_resource_editor/MDIEd.tscn +++ /dev/null @@ -1,769 +0,0 @@ -[gd_scene load_steps=9 format=2] - -[ext_resource path="res://addons/mesh_data_resource_editor/MDIEd.gd" type="Script" id=1] -[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres" type="ButtonGroup" id=2] -[ext_resource path="res://addons/mesh_data_resource_editor/UVEditor.gd" type="Script" id=3] -[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn" type="PackedScene" id=4] -[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres" type="ButtonGroup" id=5] -[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd" type="Script" id=6] -[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres" type="ButtonGroup" id=7] -[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres" type="ButtonGroup" id=8] - -[node name="MDIEd" type="PanelContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} -uv_preview_path = NodePath("VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UVDisplay") -uv_editor_path = NodePath("Popups/UVEditorPopup/UVEditor") - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -margin_left = 7.0 -margin_top = 7.0 -margin_right = 1017.0 -margin_bottom = 593.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Actions" type="VBoxContainer" parent="VBoxContainer"] -margin_right = 1010.0 -margin_bottom = 68.0 - -[node name="Actions" type="HBoxContainer" parent="VBoxContainer/Actions"] -margin_right = 1010.0 -margin_bottom = 68.0 -alignment = 1 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/Actions/Actions"] -margin_left = 457.0 -margin_right = 466.0 -margin_bottom = 68.0 - -[node name="Label" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"] -margin_right = 9.0 -margin_bottom = 20.0 -hint_tooltip = "Edit Mode" -mouse_filter = 0 -size_flags_vertical = 7 -text = "E" -align = 1 -valign = 1 - -[node name="Label2" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"] -margin_top = 24.0 -margin_right = 9.0 -margin_bottom = 44.0 -hint_tooltip = "Active Axis" -mouse_filter = 0 -size_flags_vertical = 7 -text = "A" -align = 1 -valign = 1 - -[node name="Label3" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"] -margin_top = 48.0 -margin_right = 9.0 -margin_bottom = 68.0 -hint_tooltip = "Selection Mode" -mouse_filter = 0 -size_flags_vertical = 7 -text = "S" -align = 1 -valign = 1 - -[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/Actions/Actions"] -margin_left = 470.0 -margin_right = 553.0 -margin_bottom = 68.0 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"] -margin_right = 83.0 -margin_bottom = 20.0 - -[node name="Translate" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"] -margin_right = 25.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Translate" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -group = ExtResource( 2 ) -text = "T" - -[node name="Rotate" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"] -margin_left = 29.0 -margin_right = 54.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Rotate" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 2 ) -text = "R" - -[node name="Scale" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"] -margin_left = 58.0 -margin_right = 83.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Scale" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 2 ) -text = "S" - -[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"] -margin_top = 24.0 -margin_right = 83.0 -margin_bottom = 44.0 - -[node name="AxisX" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"] -margin_right = 25.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "X" - -[node name="AxisY" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"] -margin_left = 29.0 -margin_right = 54.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "Y" - -[node name="AxisZ" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"] -margin_left = 58.0 -margin_right = 83.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "Z" - -[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"] -margin_top = 48.0 -margin_right = 83.0 -margin_bottom = 68.0 - -[node name="Vertex" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"] -margin_right = 25.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Vertex" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -group = ExtResource( 5 ) -text = "V" - -[node name="Edge" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"] -margin_left = 29.0 -margin_right = 54.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Edge" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 5 ) -text = "E" - -[node name="Face" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"] -margin_left = 58.0 -margin_right = 83.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Face" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 5 ) -text = "F" - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] -margin_top = 72.0 -margin_right = 1010.0 -margin_bottom = 76.0 - -[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] -margin_top = 80.0 -margin_right = 1010.0 -margin_bottom = 586.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -scroll_horizontal_enabled = false - -[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] -margin_right = 998.0 -margin_bottom = 674.0 -size_flags_horizontal = 3 - -[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_right = 998.0 -margin_bottom = 20.0 - -[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"] -margin_right = 10.0 -margin_bottom = 20.0 -hint_tooltip = "Handle Selection type." -mouse_filter = 0 -size_flags_vertical = 7 -text = "H" -align = 1 -valign = 1 - -[node name="Front" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"] -margin_left = 14.0 -margin_right = 339.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = " -" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -group = ExtResource( 8 ) -text = "F" - -[node name="Back" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"] -margin_left = 343.0 -margin_right = 668.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Only select handles that face away -the camera." -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 8 ) -text = "B" - -[node name="All" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"] -margin_left = 672.0 -margin_right = 998.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Ignore camera facing when selecting handles. -" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 8 ) -text = "A" - -[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 24.0 -margin_right = 998.0 -margin_bottom = 44.0 - -[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"] -margin_right = 8.0 -margin_bottom = 20.0 -hint_tooltip = "Pivot" -mouse_filter = 0 -size_flags_vertical = 7 -text = "P" -align = 1 -valign = 1 - -[node name="Average" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"] -margin_left = 12.0 -margin_right = 338.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Average" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -group = ExtResource( 7 ) -text = "A" - -[node name="MDIOrigin" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"] -margin_left = 342.0 -margin_right = 668.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Mesh Data Instance Origin" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 7 ) -text = "M" - -[node name="WorldOrigin" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"] -margin_left = 672.0 -margin_right = 998.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "World Origin" -size_flags_horizontal = 3 -toggle_mode = true -group = ExtResource( 7 ) -text = "w" - -[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 48.0 -margin_right = 998.0 -margin_bottom = 68.0 - -[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"] -margin_right = 8.0 -margin_bottom = 20.0 -hint_tooltip = "Visual indicators" -mouse_filter = 0 -size_flags_vertical = 7 -text = "V" -align = 1 -valign = 1 - -[node name="Outline" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"] -margin_left = 12.0 -margin_right = 338.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Outline" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "O" - -[node name="Seam" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"] -margin_left = 342.0 -margin_right = 668.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Seam" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "S" - -[node name="Handle" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"] -margin_left = 672.0 -margin_right = 998.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 25, 20 ) -hint_tooltip = "Handle" -size_flags_horizontal = 3 -toggle_mode = true -pressed = true -text = "H" - -[node name="HSeparator" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 72.0 -margin_right = 998.0 -margin_bottom = 76.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Select All" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 80.0 -margin_right = 998.0 -margin_bottom = 100.0 -text = "Select All" - -[node name="HSeparator5" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 104.0 -margin_right = 998.0 -margin_bottom = 108.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VertexOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 112.0 -margin_right = 998.0 -margin_bottom = 192.0 - -[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "= Vertex =" -align = 1 -valign = 1 - -[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 80.0 - -[node name="AddFace" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"] -margin_right = 998.0 -margin_bottom = 20.0 -text = "Create Face" - -[node name="Split" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"] -visible = false -margin_top = 24.0 -margin_right = 998.0 -margin_bottom = 44.0 -text = "Split" - -[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"] -margin_top = 24.0 -margin_right = 998.0 -margin_bottom = 38.0 -text = "Connect" -align = 1 -valign = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"] -margin_top = 42.0 -margin_right = 998.0 -margin_bottom = 62.0 -size_flags_horizontal = 3 - -[node name="ConnectToFirst" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"] -margin_right = 330.0 -margin_bottom = 20.0 -hint_tooltip = "Move all vertices to the first one that was selected." -size_flags_horizontal = 3 -text = "x<" - -[node name="ConnectMed" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"] -margin_left = 334.0 -margin_right = 664.0 -margin_bottom = 20.0 -hint_tooltip = "Move all selected vertices to their average." -size_flags_horizontal = 3 -text = ">x<" - -[node name="ConnectToLast" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"] -margin_left = 668.0 -margin_right = 998.0 -margin_bottom = 20.0 -hint_tooltip = "Move all selected vertices to the last that was selected." -size_flags_horizontal = 3 -text = ">x" - -[node name="EdgeOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -visible = false -margin_top = 108.0 -margin_right = 998.0 -margin_bottom = 206.0 - -[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "= Edge =" -align = 1 -valign = 1 - -[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 98.0 - -[node name="Extrude" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"] -margin_right = 1010.0 -margin_bottom = 20.0 -text = "Extrude" - -[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "Append" -align = 1 -valign = 1 - -[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 38.0 - -[node name="TriAt" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2"] -margin_right = 497.0 -margin_bottom = 20.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Tri" - -[node name="QuadAt" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2"] -margin_left = 501.0 -margin_right = 998.0 -margin_bottom = 20.0 -size_flags_horizontal = 3 -text = "Quad" - -[node name="SeamLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"] -margin_top = 42.0 -margin_right = 998.0 -margin_bottom = 56.0 -text = "Seam" -align = 1 -valign = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"] -margin_top = 60.0 -margin_right = 998.0 -margin_bottom = 80.0 -size_flags_horizontal = 3 - -[node name="Mark" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer"] -margin_right = 497.0 -margin_bottom = 20.0 -size_flags_horizontal = 3 -text = "Mark" - -[node name="Unmark" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer"] -margin_left = 501.0 -margin_right = 998.0 -margin_bottom = 20.0 -size_flags_horizontal = 3 -text = "Unmark" - -[node name="FaceOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -visible = false -margin_right = 55.0 -margin_bottom = 38.0 - -[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps"] -margin_right = 1010.0 -margin_bottom = 14.0 -text = "= Face =" -align = 1 -valign = 1 - -[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps"] -margin_top = 18.0 -margin_right = 1010.0 -margin_bottom = 110.0 - -[node name="Delete" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations"] -margin_right = 1010.0 -margin_bottom = 20.0 -text = "Delete" - -[node name="Flip" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations"] -margin_right = 1010.0 -margin_bottom = 20.0 -text = "Flip" - -[node name="HSeparator4" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 196.0 -margin_right = 998.0 -margin_bottom = 200.0 - -[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 204.0 -margin_right = 998.0 -margin_bottom = 568.0 - -[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "= Operations =" -align = 1 -valign = 1 - -[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 364.0 - -[node name="Label2" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "Generate" -align = 1 -valign = 1 - -[node name="GenNormals" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 38.0 -text = "Normals" - -[node name="GenTangents" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 42.0 -margin_right = 998.0 -margin_bottom = 62.0 -text = "Tangents" - -[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 66.0 -margin_right = 998.0 -margin_bottom = 80.0 -text = "Optimizations" -align = 1 -valign = 1 - -[node name="RemDoubles" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 84.0 -margin_right = 998.0 -margin_bottom = 104.0 -text = "Rem Doubles" - -[node name="MergeOptimize" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 108.0 -margin_right = 998.0 -margin_bottom = 128.0 -text = "Full Merge" - -[node name="Clean" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 132.0 -margin_right = 998.0 -margin_bottom = 152.0 -hint_tooltip = "Clean mesh for example for unused verts." -text = "Clean" - -[node name="Label3" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 156.0 -margin_right = 998.0 -margin_bottom = 170.0 -text = "UV" -align = 1 -valign = 1 - -[node name="UVDisplay" type="Control" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 174.0 -margin_right = 998.0 -margin_bottom = 274.0 -rect_min_size = Vector2( 100, 100 ) -script = ExtResource( 3 ) - -[node name="UVEditButton" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 278.0 -margin_right = 998.0 -margin_bottom = 298.0 -text = "Edit" - -[node name="ApplySeams" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 302.0 -margin_right = 998.0 -margin_bottom = 322.0 -text = "Apply seams" - -[node name="UnwrapButton2" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"] -margin_top = 326.0 -margin_right = 998.0 -margin_bottom = 346.0 -text = "Unwrap" - -[node name="HSeparator3" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 572.0 -margin_right = 998.0 -margin_bottom = 576.0 - -[node name="Add" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 580.0 -margin_right = 998.0 -margin_bottom = 666.0 - -[node name="AddLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add"] -margin_right = 998.0 -margin_bottom = 14.0 -text = "= Add =" -align = 1 -valign = 1 - -[node name="Add" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add"] -margin_top = 18.0 -margin_right = 998.0 -margin_bottom = 86.0 - -[node name="AddBox" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"] -margin_right = 998.0 -margin_bottom = 20.0 -text = "Box" - -[node name="AddTriangle" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"] -margin_top = 24.0 -margin_right = 998.0 -margin_bottom = 44.0 -size_flags_horizontal = 3 -text = "Tri" - -[node name="AddQuad" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"] -margin_top = 48.0 -margin_right = 998.0 -margin_bottom = 68.0 -size_flags_horizontal = 3 -text = "Quad" - -[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"] -margin_top = 670.0 -margin_right = 998.0 -margin_bottom = 674.0 - -[node name="Popups" type="Control" parent="."] -margin_left = 7.0 -margin_top = 7.0 -margin_right = 1017.0 -margin_bottom = 593.0 -mouse_filter = 2 -__meta__ = { -"_edit_lock_": true -} - -[node name="UVEditorPopup" type="ConfirmationDialog" parent="Popups"] -margin_left = 149.0 -margin_top = 35.0 -margin_right = 901.0 -margin_bottom = 803.0 -window_title = "UV Editor" -resizable = true -script = ExtResource( 6 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="UVEditor" parent="Popups/UVEditorPopup" instance=ExtResource( 4 )] -margin_left = 8.0 -margin_top = 8.0 -margin_right = -8.0 -margin_bottom = -36.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Translate" to="." method="on_edit_mode_translate_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Rotate" to="." method="on_edit_mode_rotate_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Scale" to="." method="on_edit_mode_scale_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX" to="." method="on_axis_x_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY" to="." method="on_axis_y_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ" to="." method="on_axis_z_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex" to="." method="on_selection_mode_vertex_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex" to="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps" method="set_visible"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge" to="." method="on_selection_mode_edge_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge" to="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps" method="set_visible"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face" to="." method="on_selection_mode_face_toggled"] -[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face" to="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps" method="set_visible"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/Front" to="." method="onhandle_selection_type_front_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/Back" to="." method="onhandle_selection_type_back_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/All" to="." method="onhandle_selection_type_all_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/Average" to="." method="on_pivot_average_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/MDIOrigin" to="." method="on_pivot_mdi_origin_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/WorldOrigin" to="." method="on_pivot_world_origin_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Outline" to="." method="on_visual_indicator_outline_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Seam" to="." method="on_visual_indicator_seam_toggled"] -[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Handle" to="." method="on_visual_indicator_handle_toggled"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Select All" to="." method="_on_select_all_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/AddFace" to="." method="_oncreate_face_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/Split" to="." method="_on_split_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectToFirst" to="." method="_on_connect_to_first_selected_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectMed" to="." method="_on_connect_to_avg_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectToLast" to="." method="_on_connect_to_last_selected_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/Extrude" to="." method="_on_Extrude_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2/TriAt" to="." method="_on_add_triangle_at_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2/QuadAt" to="." method="_on_add_auad_at_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer/Mark" to="." method="_on_mark_seam_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer/Unmark" to="." method="_on_unmark_seam_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations/Delete" to="." method="_on_delete_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations/Flip" to="." method="_on_flip_face_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/GenNormals" to="." method="_on_GenNormals_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/GenTangents" to="." method="_on_GenTangents_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/RemDoubles" to="." method="_on_RemDoubles_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/MergeOptimize" to="." method="_on_MergeOptimize_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/Clean" to="." method="_on_clean_mesh_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UVEditButton" to="." method="_on_uv_edit_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/ApplySeams" to="." method="_on_apply_seams_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UnwrapButton2" to="." method="_on_UnwrapButton_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddBox" to="." method="_on_AddBox_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddTriangle" to="." method="_on_add_triangle_pressed"] -[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddQuad" to="." method="_on_add_quad_pressed"] diff --git a/game/addons/mesh_data_resource_editor/MDIGizmoPlugin.gd b/game/addons/mesh_data_resource_editor/MDIGizmoPlugin.gd deleted file mode 100644 index 771e22db..00000000 --- a/game/addons/mesh_data_resource_editor/MDIGizmoPlugin.gd +++ /dev/null @@ -1,33 +0,0 @@ -tool -extends EditorSpatialGizmoPlugin - -const MDIGizmo = preload("res://addons/mesh_data_resource_editor/MIDGizmo.gd") - -var plugin - -func _init(): - create_material("main", Color(0.7, 0.7, 0.7)) - create_material("seam", Color(1, 0, 0), false, true) - create_handle_material("handles") - -func get_name(): - return "MDIGizmo" - -func get_priority(): - return 100 - -func create_gizmo(spatial): - if spatial is MeshDataInstance: - var gizmo = MDIGizmo.new() - - gizmo.set_editor_plugin(plugin) - gizmo.set_spatial_node(spatial) - gizmo.setup() - plugin.register_gizmo(gizmo) - - return gizmo - else: - return null - -func is_handle_highlighted(gizmo, index): - pass diff --git a/game/addons/mesh_data_resource_editor/MIDGizmo.gd b/game/addons/mesh_data_resource_editor/MIDGizmo.gd deleted file mode 100644 index ac229ef9..00000000 --- a/game/addons/mesh_data_resource_editor/MIDGizmo.gd +++ /dev/null @@ -1,1816 +0,0 @@ -tool -extends EditorSpatialGizmo - -var MeshOutline = preload("res://addons/mesh_data_resource_editor/utilities/mesh_outline.gd") -var MeshDecompose = preload("res://addons/mesh_data_resource_editor/utilities/mesh_decompose.gd") -var MDRMeshUtils = preload("res://addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd") - -enum EditMode { - EDIT_MODE_NONE = 0, - EDIT_MODE_TRANSLATE = 1, - EDIT_MODE_SCALE = 2, - EDIT_MODE_ROTATE = 3 -} - -enum AxisConstraint { - X = 1 << 0, - Y = 1 << 1, - Z = 1 << 2, -} - -enum SelectionMode { - SELECTION_MODE_VERTEX = 0, - SELECTION_MODE_EDGE = 1, - SELECTION_MODE_FACE = 2, -} - -enum PivotTypes { - PIVOT_TYPE_AVERAGED = 0, - PIVOT_TYPE_MDI_ORIGIN = 1, - PIVOT_TYPE_WORLD_ORIGIN = 2, -} - -enum HandleSelectionType { - HANDLE_SELECTION_TYPE_FRONT = 0, - HANDLE_SELECTION_TYPE_BACK = 1, - HANDLE_SELECTION_TYPE_ALL = 2, -} - -var gizmo_size = 3.0 - -var edit_mode : int = EditMode.EDIT_MODE_TRANSLATE -var pivot_type : int = PivotTypes.PIVOT_TYPE_AVERAGED -var axis_constraint : int = AxisConstraint.X | AxisConstraint.Y | AxisConstraint.Z -var selection_mode : int = SelectionMode.SELECTION_MODE_VERTEX -var handle_selection_type : int = HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT -var visual_indicator_outline : bool = true -var visual_indicator_seam : bool= true -var visual_indicator_handle : bool = true - -var previous_point : Vector2 -var _last_known_camera_facing : Vector3 = Vector3(0, 0, -1) - -var _rect_drag : bool = false -var _rect_drag_start_point : Vector2 = Vector2() -var _rect_drag_min_ofset : float = 10 - -var _mdr : MeshDataResource = null - -var _vertices : PoolVector3Array -var _indices : PoolIntArray -var _handle_points : PoolVector3Array -var _handle_to_vertex_map : Array -var _selected_points : PoolIntArray - -var _mesh_outline_generator - -var _handle_drag_op : bool = false -var _drag_op_orig_verices : PoolVector3Array = PoolVector3Array() -var _drag_op_indices : PoolIntArray = PoolIntArray() -var _drag_op_accumulator : Vector3 = Vector3() -var _drag_op_accumulator_quat : Quat = Quat() -var _drag_op_pivot : Vector3 = Vector3() - -var _editor_plugin : EditorPlugin = null -var _undo_redo : UndoRedo = null - -func _init(): - _mesh_outline_generator = MeshOutline.new() - -func setup() -> void: - get_spatial_node().connect("mesh_data_resource_changed", self, "on_mesh_data_resource_changed") - on_mesh_data_resource_changed(get_spatial_node().mesh_data) - -func set_editor_plugin(editor_plugin : EditorPlugin) -> void: - _editor_plugin = editor_plugin - - _undo_redo = _editor_plugin.get_undo_redo() - -func set_handle(index: int, camera: Camera, point: Vector2): - var relative : Vector2 = point - previous_point - - if !_handle_drag_op: - relative = Vector2() - _handle_drag_op = true - - if edit_mode == EditMode.EDIT_MODE_SCALE: - _drag_op_accumulator = Vector3(1, 1, 1) - else: - _drag_op_accumulator = Vector3() - - _drag_op_accumulator_quat = Quat() - - _drag_op_orig_verices = copy_mdr_verts_array() - setup_op_drag_indices() - _drag_op_pivot = get_drag_op_pivot() - - if edit_mode == EditMode.EDIT_MODE_NONE: - return - elif edit_mode == EditMode.EDIT_MODE_TRANSLATE: - var ofs : Vector3 = Vector3() - - ofs = camera.get_global_transform().basis.x - - if (axis_constraint & AxisConstraint.X) != 0: - ofs.x *= relative.x * 0.01 - else: - ofs.x = 0 - - if (axis_constraint & AxisConstraint.Y) != 0: - ofs.y = relative.y * -0.01 - else: - ofs.y = 0 - - if (axis_constraint & AxisConstraint.Z) != 0: - ofs.z *= relative.x * 0.01 - else: - ofs.z = 0 - - _drag_op_accumulator += ofs - - add_to_all_selected(_drag_op_accumulator) - - apply() - redraw() - elif edit_mode == EditMode.EDIT_MODE_SCALE: - var r : float = ((relative.x + relative.y) * 0.05) - - var vs : Vector3 = Vector3() - - if (axis_constraint & AxisConstraint.X) != 0: - vs.x = r - - if (axis_constraint & AxisConstraint.Y) != 0: - vs.y = r - - if (axis_constraint & AxisConstraint.Z) != 0: - vs.z = r - - _drag_op_accumulator += vs - - var b : Basis = Basis().scaled(_drag_op_accumulator) - var t : Transform = Transform(Basis(), _drag_op_pivot) - t *= Transform(b, Vector3()) - t *= Transform(Basis(), _drag_op_pivot).inverse() - - mul_all_selected_with_transform(t) - - apply() - redraw() - elif edit_mode == EditMode.EDIT_MODE_ROTATE: - var yrot : Quat = Quat(Vector3(0, 1, 0), relative.x * 0.01) - var xrot : Quat = Quat(camera.get_global_transform().basis.x, relative.y * 0.01) - - _drag_op_accumulator_quat *= yrot - _drag_op_accumulator_quat *= xrot - _drag_op_accumulator_quat = _drag_op_accumulator_quat.normalized() - - var b : Basis = Basis(_drag_op_accumulator_quat) - var t : Transform = Transform(Basis(), _drag_op_pivot) - t *= Transform(b, Vector3()) - t *= Transform(Basis(), _drag_op_pivot).inverse() - - mul_all_selected_with_transform(t) - - apply() - redraw() - - previous_point = point - -#func commit_handle(index: int, restore, cancel: bool = false) -> void: -# previous_point = Vector2() -# -# print("MDR Editor: commit_handle test") - -func redraw(): - clear() - - if !_mdr: - return - - if _mdr.array.size() != ArrayMesh.ARRAY_MAX: - return - - if !get_plugin(): - return - - var handles_material : SpatialMaterial = get_plugin().get_material("handles", self) - var material = get_plugin().get_material("main", self) - var seam_material = get_plugin().get_material("seam", self) - - _mesh_outline_generator.setup(_mdr) - - if selection_mode == SelectionMode.SELECTION_MODE_EDGE: - _mesh_outline_generator.generate_mark_edges(visual_indicator_outline, visual_indicator_handle) - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - _mesh_outline_generator.generate_mark_faces(visual_indicator_outline, visual_indicator_handle) - else: - _mesh_outline_generator.generate(visual_indicator_outline, visual_indicator_handle) - - if visual_indicator_outline || visual_indicator_handle: - add_lines(_mesh_outline_generator.lines, material, false) - - if visual_indicator_seam: - add_lines(_mesh_outline_generator.seam_lines, seam_material, false) - - if _selected_points.size() > 0: - var vs : PoolVector3Array = PoolVector3Array() - - for i in _selected_points: - vs.append(_handle_points[i]) - - add_handles(vs, handles_material) - -func apply() -> void: - if !_mdr: - return - - disable_change_event() - - var arrs : Array = _mdr.array - arrs[ArrayMesh.ARRAY_VERTEX] = _vertices - arrs[ArrayMesh.ARRAY_INDEX] = _indices - _mdr.array = arrs - - enable_change_event() - -func select_all() -> void: - if _selected_points.size() == _handle_points.size(): - return - - _selected_points.resize(_handle_points.size()) - - for i in range(_selected_points.size()): - _selected_points[i] = i - - redraw() - - -func selection_click(index, camera, event) -> bool: - if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT: - return selection_click_select_front_or_back(index, camera, event) - elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK: - return selection_click_select_front_or_back(index, camera, event) - else: - return selection_click_select_through(index, camera, event) - - return false - -func is_point_visible(point_orig : Vector3, camera_pos : Vector3, gt : Transform) -> bool: - var point : Vector3 = gt.xform(point_orig) - - # go from the given point to the origin (camera_pos -> camera) - var dir : Vector3 = camera_pos - point - dir = dir.normalized() - # Might need to reduce z fighting - #point += dir * 0.5 - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - var v0 : Vector3 = _vertices[i0] - var v1 : Vector3 = _vertices[i1] - var v2 : Vector3 = _vertices[i2] - - v0 = gt.xform(v0) - v1 = gt.xform(v1) - v2 = gt.xform(v2) - - var res = Geometry.ray_intersects_triangle(point, dir, v0, v1, v2) - - if res is Vector3: - return false - - return true - - -func selection_click_select_front_or_back(index, camera, event): - var gt : Transform = get_spatial_node().global_transform - var ray_from : Vector3 = camera.global_transform.origin - var gpoint : Vector2 = event.get_position() - var grab_threshold : float = 8 - - # select vertex - var closest_idx : int = -1 - var closest_dist : float = 1e10 - - for i in range(_handle_points.size()): - var vert_pos_3d : Vector3 = gt.xform(_handle_points[i]) - var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d) - var dist_3d : float = ray_from.distance_to(vert_pos_3d) - var dist_2d : float = gpoint.distance_to(vert_pos_2d) - - if (dist_2d < grab_threshold && dist_3d < closest_dist): - var point_visible : bool = is_point_visible(_handle_points[i], ray_from, gt) - - if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT: - if !point_visible: - continue - elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK: - if point_visible: - continue - - closest_dist = dist_3d - closest_idx = i - - if (closest_idx >= 0): - for si in range(_selected_points.size()): - if _selected_points[si] == closest_idx: - if event.alt || event.control: - _selected_points.remove(si) - return true - - return false - - if event.alt || event.control: - return false - - if event.shift: - _selected_points.append(closest_idx) - else: - # Select new point only - _selected_points.resize(0) - _selected_points.append(closest_idx) - - apply() - redraw() - else: - # Don't unselect all if either control or shift is held down - if event.shift || event.control || event.alt: - return false - - if _selected_points.size() == 0: - return false - - #Unselect all - _selected_points.resize(0) - - redraw() - -func selection_click_select_through(index, camera, event): - var gt : Transform = get_spatial_node().global_transform - var ray_from : Vector3 = camera.global_transform.origin - var gpoint : Vector2 = event.get_position() - var grab_threshold : float = 8 - - # select vertex - var closest_idx : int = -1 - var closest_dist : float = 1e10 - - for i in range(_handle_points.size()): - var vert_pos_3d : Vector3 = gt.xform(_handle_points[i]) - var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d) - var dist_3d : float = ray_from.distance_to(vert_pos_3d) - var dist_2d : float = gpoint.distance_to(vert_pos_2d) - - if (dist_2d < grab_threshold && dist_3d < closest_dist): - closest_dist = dist_3d - closest_idx = i - - if (closest_idx >= 0): - for si in range(_selected_points.size()): - - if _selected_points[si] == closest_idx: - if event.alt || event.control: - _selected_points.remove(si) - return true - - return false - - if event.alt || event.control: - return false - - if event.shift: - _selected_points.append(closest_idx) - else: - # Select new point only - _selected_points.resize(0) - _selected_points.append(closest_idx) - - apply() - redraw() - else: - # Don't unselect all if either control or shift is held down - if event.shift || event.control || event.alt: - return false - - if _selected_points.size() == 0: - return false - - #Unselect all - _selected_points.resize(0) - - redraw() - -func selection_drag(index, camera, event) -> void: - if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT: - selection_drag_rect_select_front_back(index, camera, event) - elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK: - selection_drag_rect_select_front_back(index, camera, event) - else: - selection_drag_rect_select_through(index, camera, event) - -func selection_drag_rect_select_front_back(index, camera, event): - var gt : Transform = get_spatial_node().global_transform - var ray_from : Vector3 = camera.global_transform.origin - - var mouse_pos : Vector2 = event.get_position() - var rect_size : Vector2 = _rect_drag_start_point - mouse_pos - rect_size.x = abs(rect_size.x) - rect_size.y = abs(rect_size.y) - - var rect : Rect2 = Rect2(_rect_drag_start_point, rect_size) - - # This is needed so selection works even when you drag from bottom to top, and from right to left - var rect_ofs : Vector2 = _rect_drag_start_point - mouse_pos - - if rect_ofs.x > 0: - rect.position.x -= rect_ofs.x - - if rect_ofs.y > 0: - rect.position.y -= rect_ofs.y - - var selected : PoolIntArray = PoolIntArray() - - for i in range(_handle_points.size()): - var vert_pos_3d : Vector3 = gt.xform(_handle_points[i]) - var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d) - - if rect.has_point(vert_pos_2d): - var point_visible : bool = is_point_visible(_handle_points[i], ray_from, gt) - - if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT: - if !point_visible: - continue - elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK: - if point_visible: - continue - - selected.push_back(i) - - if event.alt || event.control: - for isel in selected: - for i in range(_selected_points.size()): - if _selected_points[i] == isel: - _selected_points.remove(i) - break - redraw() - - return - - if event.shift: - for isel in selected: - if !pool_int_arr_contains(_selected_points, isel): - _selected_points.push_back(isel) - - redraw() - return - - _selected_points.resize(0) - _selected_points.append_array(selected) - - redraw() - -func selection_drag_rect_select_through(index, camera, event): - var gt : Transform = get_spatial_node().global_transform - - var mouse_pos : Vector2 = event.get_position() - var rect_size : Vector2 = _rect_drag_start_point - mouse_pos - rect_size.x = abs(rect_size.x) - rect_size.y = abs(rect_size.y) - - var rect : Rect2 = Rect2(_rect_drag_start_point, rect_size) - - # This is needed so selection works even when you drag from bottom to top, and from right to left - var rect_ofs : Vector2 = _rect_drag_start_point - mouse_pos - - if rect_ofs.x > 0: - rect.position.x -= rect_ofs.x - - if rect_ofs.y > 0: - rect.position.y -= rect_ofs.y - - var selected : PoolIntArray = PoolIntArray() - - for i in range(_handle_points.size()): - var vert_pos_3d : Vector3 = gt.xform(_handle_points[i]) - var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d) - - if rect.has_point(vert_pos_2d): - selected.push_back(i) - - if event.alt || event.control: - for isel in selected: - for i in range(_selected_points.size()): - if _selected_points[i] == isel: - _selected_points.remove(i) - break - redraw() - - return - - if event.shift: - for isel in selected: - if !pool_int_arr_contains(_selected_points, isel): - _selected_points.push_back(isel) - - redraw() - return - - _selected_points.resize(0) - _selected_points.append_array(selected) - - redraw() - -func forward_spatial_gui_input(index, camera, event): - _last_known_camera_facing = camera.transform.basis.xform(Vector3(0, 0, -1)) - - if event is InputEventMouseButton: - if event.get_button_index() == BUTTON_LEFT: - if _handle_drag_op: - if !event.is_pressed(): - _handle_drag_op = false - - # If a handle was being dragged only run these - if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null && _mdr.array[ArrayMesh.ARRAY_VERTEX].size() == _drag_op_orig_verices.size(): - _undo_redo.create_action("Drag") - _undo_redo.add_do_method(self, "apply_vertex_array", _mdr, _mdr.array[ArrayMesh.ARRAY_VERTEX]) - _undo_redo.add_undo_method(self, "apply_vertex_array", _mdr, _drag_op_orig_verices) - _undo_redo.commit_action() - - # Dont consume the event here, because the handles will get stuck - # to the mouse pointer if we return true - return false - - if !event.is_pressed(): - # See whether we should check for a click or a selection box - var mouse_pos : Vector2 = event.get_position() - var rect_size : Vector2 = _rect_drag_start_point - mouse_pos - rect_size.x = abs(rect_size.x) - rect_size.y = abs(rect_size.y) - var had_rect_drag : bool = false - - if rect_size.x > _rect_drag_min_ofset || rect_size.y > _rect_drag_min_ofset: - had_rect_drag = true - - if !had_rect_drag: - return selection_click(index, camera, event) - else: - selection_drag(index, camera, event) - # Always return false here, so the drag rect thing disappears in the editor - return false - else: - # event is pressed - _rect_drag = true - _rect_drag_start_point = event.get_position() - - return false - -func add_to_all_selected(ofs : Vector3) -> void: - for i in _selected_points: - var v : Vector3 = _handle_points[i] - v += ofs - _handle_points.set(i, v) - - for indx in _drag_op_indices: - var v : Vector3 = _drag_op_orig_verices[indx] - v += ofs - _vertices.set(indx, v) - -func mul_all_selected_with_basis(b : Basis) -> void: - for i in _selected_points: - var v : Vector3 = _handle_points[i] - v = b * v - _handle_points.set(i, v) - - for indx in _drag_op_indices: - var v : Vector3 = _drag_op_orig_verices[indx] - v = b * v - _vertices.set(indx, v) - -func mul_all_selected_with_transform(t : Transform) -> void: - for i in _selected_points: - var v : Vector3 = _handle_points[i] - v = t * v - _handle_points.set(i, v) - - for indx in _drag_op_indices: - var v : Vector3 = _drag_op_orig_verices[indx] - v = t * v - _vertices.set(indx, v) - -func mul_all_selected_with_transform_acc(t : Transform) -> void: - for i in _selected_points: - var v : Vector3 = _handle_points[i] - v = t * v - _handle_points.set(i, v) - - for indx in _drag_op_indices: - var v : Vector3 = _vertices[indx] - v = t * v - _vertices.set(indx, v) - -func set_translate() -> void: - edit_mode = EditMode.EDIT_MODE_TRANSLATE - -func set_scale() -> void: - edit_mode = EditMode.EDIT_MODE_SCALE - -func set_rotate() -> void: - edit_mode = EditMode.EDIT_MODE_ROTATE - -func set_edit_mode(em : int) -> void: - edit_mode = em - -func set_axis_x(on : bool) -> void: - if on: - axis_constraint |= AxisConstraint.X - else: - if (axis_constraint & AxisConstraint.X) != 0: - axis_constraint ^= AxisConstraint.X - -func set_axis_y(on : bool) -> void: - if on: - axis_constraint |= AxisConstraint.Y - else: - if (axis_constraint & AxisConstraint.Y) != 0: - axis_constraint ^= AxisConstraint.Y - -func set_axis_z(on : bool) -> void: - if on: - axis_constraint |= AxisConstraint.Z - else: - if (axis_constraint & AxisConstraint.Z) != 0: - axis_constraint ^= AxisConstraint.Z - -func set_selection_mode_vertex() -> void: - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - return - - selection_mode = SelectionMode.SELECTION_MODE_VERTEX - _selected_points.resize(0) - recalculate_handle_points() - redraw() - -func set_selection_mode_edge() -> void: - if selection_mode == SelectionMode.SELECTION_MODE_EDGE: - return - - selection_mode = SelectionMode.SELECTION_MODE_EDGE - _selected_points.resize(0) - recalculate_handle_points() - redraw() - -func set_selection_mode_face() -> void: - if selection_mode == SelectionMode.SELECTION_MODE_FACE: - return - - selection_mode = SelectionMode.SELECTION_MODE_FACE - _selected_points.resize(0) - recalculate_handle_points() - redraw() - -func _notification(what): - if what == NOTIFICATION_PREDELETE: - if self != null && get_plugin(): - get_plugin().unregister_gizmo(self) - -func recalculate_handle_points() -> void: - if !_mdr: - _handle_points.resize(0) - _handle_to_vertex_map.resize(0) - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - _handle_points.resize(0) - _handle_to_vertex_map.resize(0) - return - - var arr : Array = Array() - arr.resize(ArrayMesh.ARRAY_MAX) - arr[ArrayMesh.ARRAY_VERTEX] = mdr_arr[ArrayMesh.ARRAY_VERTEX] - arr[ArrayMesh.ARRAY_INDEX] = mdr_arr[ArrayMesh.ARRAY_INDEX] - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - var merged_arrays : Array = MeshUtils.merge_mesh_array(arr) - _handle_points = merged_arrays[ArrayMesh.ARRAY_VERTEX] - _handle_to_vertex_map = MeshDecompose.get_handle_vertex_to_vertex_map(mdr_arr, _handle_points) - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - var result : Array = MeshDecompose.get_handle_edge_to_vertex_map(arr) - - _handle_points = result[0] - _handle_to_vertex_map = result[1] - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - var result : Array = MeshDecompose.get_handle_face_to_vertex_map(arr) - - _handle_points = result[0] - _handle_to_vertex_map = result[1] - -func on_mesh_data_resource_changed(mdr : MeshDataResource) -> void: - if _mdr: - _mdr.disconnect("changed", self, "on_mdr_changed") - - _mdr = mdr - - if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null: - _vertices = _mdr.array[ArrayMesh.ARRAY_VERTEX] - _indices = _mdr.array[ArrayMesh.ARRAY_INDEX] - else: - _vertices.resize(0) - _indices.resize(0) - - if _mdr: - _mdr.connect("changed", self, "on_mdr_changed") - - recalculate_handle_points() - redraw() - -func on_mdr_changed() -> void: - if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null: - _vertices = _mdr.array[ArrayMesh.ARRAY_VERTEX] - _indices = _mdr.array[ArrayMesh.ARRAY_INDEX] - else: - _vertices.resize(0) - _indices.resize(0) - - recalculate_handle_points() - redraw() - -func disable_change_event() -> void: - _mdr.disconnect("changed", self, "on_mdr_changed") - -func enable_change_event(update : bool = true) -> void: - _mdr.connect("changed", self, "on_mdr_changed") - - if update: - on_mdr_changed() - -func add_triangle() -> void: - if _mdr: - var orig_arr = copy_arrays(_mdr.array) - MDRMeshUtils.add_triangle(_mdr) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Triangle") - -func add_quad() -> void: - if _mdr: - var orig_arr = copy_arrays(_mdr.array) - MDRMeshUtils.add_quad(_mdr) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Quad") - -func is_verts_equal(v0 : Vector3, v1 : Vector3) -> bool: - return is_equal_approx(v0.x, v1.x) && is_equal_approx(v0.y, v1.y) && is_equal_approx(v0.z, v1.z) - -func find_other_vertex_for_edge(edge : int, v0 : Vector3) -> Vector3: - var ps : PoolIntArray = _handle_to_vertex_map[edge] - - var vert : Vector3 = Vector3() - - for i in range(ps.size()): - vert = _vertices[ps[i]] - - if !is_verts_equal(v0, vert): - return vert - - return v0 - -func split_edge_indices(edge : int) -> Array: - var ps : PoolIntArray = _handle_to_vertex_map[edge] - - if ps.size() == 0: - return [ ] - - var v0 : Vector3 = _vertices[ps[0]] - - var v0ei : PoolIntArray = PoolIntArray() - v0ei.append(ps[0]) - var v1ei : PoolIntArray = PoolIntArray() - - for i in range(1, ps.size()): - var vert : Vector3 = _vertices[ps[i]] - - if is_verts_equal(v0, vert): - v0ei.append(ps[i]) - else: - v1ei.append(ps[i]) - - return [ v0ei, v1ei ] - -func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool: - for a in arr: - if a == val: - return true - - return false - - -func find_triangles_for_edge(edge : int) -> PoolIntArray: - var eisarr : Array = split_edge_indices(edge) - - if eisarr.size() == 0: - return PoolIntArray() - - # these should have the same size - var v0ei : PoolIntArray = eisarr[0] - var v1ei : PoolIntArray = eisarr[1] - - var res : PoolIntArray = PoolIntArray() - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2): - if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2): - res.append(i / 3) - - return res - -func find_first_triangle_for_edge(edge : int) -> int: - var eisarr : Array = split_edge_indices(edge) - - if eisarr.size() == 0: - return -1 - - # these should have the same size - var v0ei : PoolIntArray = eisarr[0] - var v1ei : PoolIntArray = eisarr[1] - - var res : PoolIntArray = PoolIntArray() - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2): - if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2): - return i / 3 - - return -1 - -func add_triangle_to_edge(edge : int) -> void: - var triangle_index : int = find_first_triangle_for_edge(edge) - - var inds : int = triangle_index * 3 - - var ti0 : int = _indices[inds] - var ti1 : int = _indices[inds + 1] - var ti2 : int = _indices[inds + 2] - - var ps : PoolIntArray = _handle_to_vertex_map[edge] - - if ps.size() == 0: - return - - var ei0 : int = 0 - var ei1 : int = 0 - var erefind : int = 0 - - if !pool_int_arr_contains(ps, ti0): - ei0 = ti1 - ei1 = ti2 - erefind = ti0 - elif !pool_int_arr_contains(ps, ti1): - ei0 = ti0 - ei1 = ti2 - erefind = ti1 - elif !pool_int_arr_contains(ps, ti2): - ei0 = ti0 - ei1 = ti1 - erefind = ti2 - - var fo : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ti0], _vertices[ti1], _vertices[ti2]) - var fn : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ei0], _vertices[ei1], _vertices[erefind]) - - if fo.dot(fn) < 0: - var t : int = ei0 - ei0 = ei1 - ei1 = t - - MDRMeshUtils.append_triangle_to_tri_edge(_mdr, _vertices[ei0], _vertices[ei1], _vertices[erefind]) - -func add_quad_to_edge(edge : int) -> void: - var triangle_index : int = find_first_triangle_for_edge(edge) - - var inds : int = triangle_index * 3 - - var ti0 : int = _indices[inds] - var ti1 : int = _indices[inds + 1] - var ti2 : int = _indices[inds + 2] - - var ps : PoolIntArray = _handle_to_vertex_map[edge] - - if ps.size() == 0: - return - - var ei0 : int = 0 - var ei1 : int = 0 - var erefind : int = 0 - - if !pool_int_arr_contains(ps, ti0): - ei0 = ti1 - ei1 = ti2 - erefind = ti0 - elif !pool_int_arr_contains(ps, ti1): - ei0 = ti0 - ei1 = ti2 - erefind = ti1 - elif !pool_int_arr_contains(ps, ti2): - ei0 = ti0 - ei1 = ti1 - erefind = ti2 - - var fo : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ti0], _vertices[ti1], _vertices[ti2]) - var fn : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ei0], _vertices[ei1], _vertices[erefind]) - - if fo.dot(fn) < 0: - var t : int = ei0 - ei0 = ei1 - ei1 = t - - MDRMeshUtils.append_quad_to_tri_edge(_mdr, _vertices[ei0], _vertices[ei1], _vertices[erefind]) - -func add_triangle_at() -> void: - if !_mdr: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - #todo - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - - for sp in _selected_points: - add_triangle_to_edge(sp) - - _selected_points.resize(0) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Triangle At") - enable_change_event() - else: - add_triangle() - -func add_quad_at() -> void: - if !_mdr: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - #todo - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - - for sp in _selected_points: - add_quad_to_edge(sp) - - _selected_points.resize(0) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Quad At") - enable_change_event() - else: - add_quad() - -func extrude() -> void: - if !_mdr: - return - - if _mdr.array.size() != ArrayMesh.ARRAY_MAX || _mdr.array[ArrayMesh.ARRAY_VERTEX] == null: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - var original_size : int = orig_arr[ArrayMesh.ARRAY_VERTEX].size() - - for sp in _selected_points: - add_quad_to_edge(sp) - - var arr : Array = _mdr.array - - # Note: This algorithm depends heavily depends on the inner workings of add_quad_to_edge! - var new_verts : PoolVector3Array = arr[ArrayMesh.ARRAY_VERTEX] - - # every 4 vertex is a quad - # 1 ---- 2 - # | | - # | | - # 0 ---- 3 - # vertex 1, and 2 are the created new ones, 0, and 3 are duplicated from the original edge - - # Don't reallocate it every time - var found_verts : PoolIntArray = PoolIntArray() - - # Go through every new created 0th vertex - for i in range(original_size, new_verts.size(), 4): - var v0 : Vector3 = new_verts[i] - - found_verts.resize(0) - - # Find a pair for it (has to be the 3th). - for j in range(original_size, new_verts.size(), 4): - if i == j: - continue - - # +3 offset to 3rd vert - var v3 : Vector3 = new_verts[j + 3] - - if is_verts_equal(v0, v3): - # +2 offset to 2rd vert - found_verts.append(j + 2) - - if found_verts.size() == 0: - continue - - # Also append the first vertex index to simplify logic - found_verts.append(i + 1) - - # Calculate avg - var vavg : Vector3 = Vector3() - for ind in found_verts: - vavg += new_verts[ind] - - vavg /= found_verts.size() - - # set back - for ind in found_verts: - new_verts[ind] = vavg - - arr[ArrayMesh.ARRAY_VERTEX] = new_verts - _mdr.array = arr - - _selected_points.resize(0) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Extrude") - enable_change_event() - - # The selection alo will take care of the duplicates - var new_handle_points : PoolVector3Array = PoolVector3Array() - for i in range(original_size, new_verts.size(), 4): - var vavg : Vector3 = new_verts[i + 1] - vavg += new_verts[i + 2] - vavg /= 2 - - new_handle_points.append(vavg) - - select_handle_points(new_handle_points) - else: - add_quad() - -func add_box() -> void: - if _mdr: - var orig_arr = copy_arrays(_mdr.array) - MDRMeshUtils.add_box(_mdr) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Box") - -func split(): - pass - -func disconnect_action(): - pass - -func get_first_triangle_index_for_vertex(indx : int) -> int: - for i in range(_indices.size()): - if _indices[i] == indx: - return i / 3 - - return -1 - -func create_face(): - if !_mdr: - return - - if _selected_points.size() <= 2: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - disable_change_event() - - var orig_arr = copy_arrays(_mdr.array) - - var points : PoolVector3Array = PoolVector3Array() - - for sp in _selected_points: - points.push_back(_handle_points[sp]) - - if points.size() == 3: - var i0 : int = _handle_to_vertex_map[_selected_points[0]][0] - var i1 : int = _handle_to_vertex_map[_selected_points[1]][0] - var i2 : int = _handle_to_vertex_map[_selected_points[2]][0] - - var v0 : Vector3 = points[0] - var v1 : Vector3 = points[1] - var v2 : Vector3 = points[2] - - var tfn : Vector3 = Vector3() - - if orig_arr[ArrayMesh.ARRAY_NORMAL] != null && orig_arr[ArrayMesh.ARRAY_NORMAL].size() == orig_arr[ArrayMesh.ARRAY_VERTEX].size(): - var normals : PoolVector3Array = orig_arr[ArrayMesh.ARRAY_NORMAL] - - tfn += normals[i0] - tfn += normals[i1] - tfn += normals[i2] - tfn /= 3 - tfn = tfn.normalized() - else: - tfn = MDRMeshUtils.get_face_normal(_vertices[i0], _vertices[i1], _vertices[i2]) - - var flip : bool = !MDRMeshUtils.should_triangle_flip(v0, v1, v2, tfn) - - MDRMeshUtils.add_triangle_at(_mdr, v0, v1, v2, flip) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Create Face") - enable_change_event() - return - - if !MDRMeshUtils.add_triangulated_mesh_from_points_delaunay(_mdr, points, _last_known_camera_facing): - enable_change_event() - return - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Create Face") - - #_selected_points.resize(0) - enable_change_event() - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func split_face_indices(face : int) -> Array: - var ps : PoolIntArray = _handle_to_vertex_map[face] - - if ps.size() == 0: - return [ ] - - var v0 : Vector3 = _vertices[ps[0]] - var v1 : Vector3 = Vector3() - var v1found : bool = false - - var v0ei : PoolIntArray = PoolIntArray() - v0ei.append(ps[0]) - var v1ei : PoolIntArray = PoolIntArray() - var v2ei : PoolIntArray = PoolIntArray() - - for i in range(1, ps.size()): - var vert : Vector3 = _vertices[ps[i]] - - if is_verts_equal(v0, vert): - v0ei.append(ps[i]) - else: - if v1found: - if is_verts_equal(v1, vert): - v1ei.append(ps[i]) - else: - v2ei.append(ps[i]) - else: - v1found = true - v1 = _vertices[ps[i]] - v1ei.append(ps[i]) - - return [ v0ei, v1ei, v2ei ] - -func find_first_triangle_index_for_face(face : int) -> int: - var split_indices_arr : Array = split_face_indices(face) - - if split_indices_arr.size() == 0: - return -1 - - var v0ei : PoolIntArray = split_indices_arr[0] - var v1ei : PoolIntArray = split_indices_arr[1] - var v2ei : PoolIntArray = split_indices_arr[2] - var tri_index : int = -1 - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2): - if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2): - if pool_int_arr_contains(v2ei, i0) || pool_int_arr_contains(v2ei, i1) || pool_int_arr_contains(v2ei, i2): - return i / 3 - - return -1 - -func delete_selected() -> void: - if !_mdr: - return - - if _selected_points.size() == 0: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - #todo - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - #todo - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - disable_change_event() - - var orig_arr = copy_arrays(_mdr.array) - - var triangle_indexes : Array = Array() - for sp in _selected_points: - var triangle_index : int = find_first_triangle_index_for_face(sp) - triangle_indexes.append(triangle_index) - - #delete in reverse triangle index order - triangle_indexes.sort() - - for i in range(triangle_indexes.size() - 1, -1, -1): - var triangle_index : int = triangle_indexes[i] - MDRMeshUtils.remove_triangle(_mdr, triangle_index) - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Delete") - - _selected_points.resize(0) - enable_change_event() - -func generate_normals(): - if !_mdr: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - var orig_seams = copy_pool_int_array(_mdr.seams) - - var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr) - MDRMeshUtils.generate_normals_mdr(_mdr) - MDRMeshUtils.points_to_seams(_mdr, seam_points) - - add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Generate Normals") - enable_change_event() - -func generate_tangents(): - if !_mdr: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - var orig_seams = copy_pool_int_array(_mdr.seams) - - var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr) - MDRMeshUtils.generate_tangents(_mdr) - MDRMeshUtils.points_to_seams(_mdr, seam_points) - - add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Generate Tangents") - enable_change_event() - -func remove_doubles(): - if !_mdr: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - var orig_seams = copy_pool_int_array(_mdr.seams) - - var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr) - - var merged_arrays : Array = MeshUtils.remove_doubles(mdr_arr) - _mdr.array = merged_arrays - MDRMeshUtils.points_to_seams(_mdr, seam_points) - - add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Remove Doubles") - enable_change_event() - -func merge_optimize(): - if !_mdr: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - var orig_seams = copy_pool_int_array(_mdr.seams) - - var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr) - - var merged_arrays : Array = MeshUtils.merge_mesh_array(mdr_arr) - _mdr.array = merged_arrays - MDRMeshUtils.points_to_seams(_mdr, seam_points) - - add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Merge Optimize") - enable_change_event() - -func connect_to_first_selected(): - if !_mdr: - return - - if _selected_points.size() < 2: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - - var orig_arr = copy_arrays(_mdr.array) - - var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX] - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - var mpos : Vector3 = _handle_points[_selected_points[0]] - - for i in range(1, _selected_points.size()): - var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]] - - for indx in ps: - vertices[indx] = mpos - - _selected_points.resize(0) - - mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices - _mdr.array = mdr_arr - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to first selected") - enable_change_event() - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func connect_to_avg(): - if !_mdr: - return - - if _selected_points.size() < 2: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - var orig_arr = copy_arrays(_mdr.array) - - var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX] - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - var mpos : Vector3 = Vector3() - - for sp in _selected_points: - mpos += _handle_points[sp] - - mpos /= _selected_points.size() - - for i in range(_selected_points.size()): - var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]] - - for indx in ps: - vertices[indx] = mpos - - _selected_points.resize(0) - - mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices - _mdr.array = mdr_arr - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to average") - enable_change_event() - - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func connect_to_last_selected(): - if !_mdr: - return - - if _selected_points.size() < 2: - return - - var orig_arr = copy_arrays(_mdr.array) - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - - var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX] - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - var mpos : Vector3 = _handle_points[_selected_points[_selected_points.size() - 1]] - - for i in range(0, _selected_points.size() - 1): - var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]] - - for indx in ps: - vertices[indx] = mpos - - _selected_points.resize(0) - - mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices - _mdr.array = mdr_arr - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to last selected") - enable_change_event() - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func get_first_index_pair_for_edge(edge : int) -> PoolIntArray: - var ret : PoolIntArray = PoolIntArray() - - var eisarr : Array = split_edge_indices(edge) - - if eisarr.size() == 0: - return ret - - # these should have the same size - var v0ei : PoolIntArray = eisarr[0] - var v1ei : PoolIntArray = eisarr[1] - - var res : PoolIntArray = PoolIntArray() - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2): - if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2): - - if pool_int_arr_contains(v0ei, i0): - ret.push_back(i0) - elif pool_int_arr_contains(v0ei, i1): - ret.push_back(i1) - elif pool_int_arr_contains(v0ei, i2): - ret.push_back(i2) - - if pool_int_arr_contains(v1ei, i0): - ret.push_back(i0) - elif pool_int_arr_contains(v1ei, i1): - ret.push_back(i1) - elif pool_int_arr_contains(v1ei, i2): - ret.push_back(i2) - - return ret - - return ret - -func get_all_index_pairs_for_edge(edge : int) -> PoolIntArray: - var ret : PoolIntArray = PoolIntArray() - - var eisarr : Array = split_edge_indices(edge) - - if eisarr.size() == 0: - return ret - - # these should have the same size - var v0ei : PoolIntArray = eisarr[0] - var v1ei : PoolIntArray = eisarr[1] - - var res : PoolIntArray = PoolIntArray() - - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2): - if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2): - - if pool_int_arr_contains(v0ei, i0): - ret.push_back(i0) - elif pool_int_arr_contains(v0ei, i1): - ret.push_back(i1) - elif pool_int_arr_contains(v0ei, i2): - ret.push_back(i2) - - if pool_int_arr_contains(v1ei, i0): - ret.push_back(i0) - elif pool_int_arr_contains(v1ei, i1): - ret.push_back(i1) - elif pool_int_arr_contains(v1ei, i2): - ret.push_back(i2) - - return ret - - -func mark_seam(): - if !_mdr: - return - - if _selected_points.size() == 0: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - disable_change_event() - - var prev_seams : PoolIntArray = copy_pool_int_array(_mdr.seams) - - for se in _selected_points: - var eis : PoolIntArray = MDRMeshUtils.order_seam_indices(get_first_index_pair_for_edge(se)) - - if eis.size() == 0: - continue - - MDRMeshUtils.add_seam(_mdr, eis[0], eis[1]) - - _undo_redo.create_action("mark_seam") - _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(_mdr.seams)) - _undo_redo.add_undo_method(self, "set_seam", _mdr, prev_seams) - _undo_redo.commit_action() - - enable_change_event() - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func unmark_seam(): - if !_mdr: - return - - if _selected_points.size() == 0: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - disable_change_event() - - var prev_seams : PoolIntArray = copy_pool_int_array(_mdr.seams) - - for se in _selected_points: - var eis : PoolIntArray = MDRMeshUtils.order_seam_indices(get_all_index_pairs_for_edge(se)) - - if eis.size() == 0: - continue - - MDRMeshUtils.remove_seam(_mdr, eis[0], eis[1]) - - _undo_redo.create_action("unmark_seam") - _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(_mdr.seams)) - _undo_redo.add_undo_method(self, "set_seam", _mdr, prev_seams) - _undo_redo.commit_action() - - enable_change_event() - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - pass - -func set_seam(mdr : MeshDataResource, arr : PoolIntArray) -> void: - mdr.seams = arr - -func apply_seam(): - if !_mdr: - return - - disable_change_event() - - var orig_arr : Array = copy_arrays(_mdr.array) - MDRMeshUtils.apply_seam(_mdr) - add_mesh_change_undo_redo(orig_arr, _mdr.array, "apply_seam") - - enable_change_event() - -func clean_mesh(): - if !_mdr: - return - - var arrays : Array = _mdr.array - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return arrays - - if arrays[ArrayMesh.ARRAY_VERTEX] == null || arrays[ArrayMesh.ARRAY_INDEX] == null: - return arrays - - var old_vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size() - - disable_change_event() - - var orig_arr : Array = copy_arrays(arrays) - arrays = MDRMeshUtils.remove_used_vertices(arrays) - var new_vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size() - add_mesh_change_undo_redo(orig_arr, arrays, "clean_mesh") - - enable_change_event() - - var d : int = old_vert_size - new_vert_size - - print("MDRED: Removed " + str(d) + " unused vertices.") - -func uv_unwrap() -> void: - if !_mdr: - return - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return - - disable_change_event() - - var uvs : PoolVector2Array = MeshUtils.uv_unwrap(mdr_arr) - - if uvs.size() != mdr_arr[ArrayMesh.ARRAY_VERTEX].size(): - print("Error: Could not unwrap mesh!") - enable_change_event(false) - return - - var orig_arr : Array = copy_arrays(mdr_arr) - - mdr_arr[ArrayMesh.ARRAY_TEX_UV] = uvs - - add_mesh_change_undo_redo(orig_arr, mdr_arr, "uv_unwrap") - enable_change_event() - -func flip_selected_faces() -> void: - if !_mdr: - return - - if _selected_points.size() == 0: - return - - if selection_mode == SelectionMode.SELECTION_MODE_VERTEX: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_EDGE: - pass - elif selection_mode == SelectionMode.SELECTION_MODE_FACE: - disable_change_event() - - var orig_arr = copy_arrays(_mdr.array) - - for sp in _selected_points: - var triangle_index : int = find_first_triangle_index_for_face(sp) - - MDRMeshUtils.flip_triangle_ti(_mdr, triangle_index) - - add_mesh_change_undo_redo(orig_arr, _mdr.array, "Flip Faces") - - enable_change_event() - -func add_mesh_change_undo_redo(orig_arr : Array, new_arr : Array, action_name : String) -> void: - _undo_redo.create_action(action_name) - var nac : Array = copy_arrays(new_arr) - _undo_redo.add_do_method(self, "apply_mesh_change", _mdr, nac) - _undo_redo.add_undo_method(self, "apply_mesh_change", _mdr, orig_arr) - _undo_redo.commit_action() - -func add_mesh_seam_change_undo_redo(orig_arr : Array, orig_seams : PoolIntArray, new_arr : Array, new_seams : PoolIntArray, action_name : String) -> void: - _undo_redo.create_action(action_name) - var nac : Array = copy_arrays(new_arr) - - _undo_redo.add_do_method(self, "apply_mesh_change", _mdr, nac) - _undo_redo.add_undo_method(self, "apply_mesh_change", _mdr, orig_arr) - - _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(new_seams)) - _undo_redo.add_undo_method(self, "set_seam", _mdr, orig_seams) - - _undo_redo.commit_action() - -func apply_mesh_change(mdr : MeshDataResource, arr : Array) -> void: - if !mdr: - return - - mdr.array = copy_arrays(arr) - -func apply_vertex_array(mdr : MeshDataResource, verts : PoolVector3Array) -> void: - if !mdr: - return - - var mdr_arr : Array = mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX: - return - - mdr_arr[ArrayMesh.ARRAY_VERTEX] = verts - mdr.array = mdr_arr - -func copy_arrays(arr : Array) -> Array: - return arr.duplicate(true) - -func copy_pool_int_array(pia : PoolIntArray) -> PoolIntArray: - var ret : PoolIntArray = PoolIntArray() - ret.resize(pia.size()) - - for i in range(pia.size()): - ret[i] = pia[i] - - return ret - -func copy_mdr_verts_array() -> PoolVector3Array: - var ret : PoolVector3Array = PoolVector3Array() - - if !_mdr: - return ret - - var mdr_arr : Array = _mdr.array - - if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: - return ret - - var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX] - ret.append_array(vertices) - - return ret - -func setup_op_drag_indices() -> void: - _drag_op_indices.resize(0) - - for sp in _selected_points: - var pi : PoolIntArray = _handle_to_vertex_map[sp] - - for indx in pi: - if !pool_int_arr_contains(_drag_op_indices, indx): - _drag_op_indices.append(indx) - -func get_drag_op_pivot() -> Vector3: - if pivot_type == PivotTypes.PIVOT_TYPE_AVERAGED: - var avg : Vector3 = Vector3() - - for indx in _drag_op_indices: - avg += _vertices[indx] - - avg /= _drag_op_indices.size() - - return avg - elif pivot_type == PivotTypes.PIVOT_TYPE_MDI_ORIGIN: - return Vector3() - elif pivot_type == PivotTypes.PIVOT_TYPE_WORLD_ORIGIN: - return get_spatial_node().to_local(Vector3()) - - return Vector3() - -func select_handle_points(points : PoolVector3Array) -> void: - _selected_points.resize(0) - - for p in points: - for i in range(_handle_points.size()): - if is_verts_equal(p, _handle_points[i]): - if !pool_int_arr_contains(_selected_points, i): - _selected_points.push_back(i) - - redraw() - -func set_pivot_averaged(): - pivot_type = PivotTypes.PIVOT_TYPE_AVERAGED - -func set_pivot_mdi_origin(): - pivot_type = PivotTypes.PIVOT_TYPE_MDI_ORIGIN - -func set_pivot_world_origin(): - pivot_type = PivotTypes.PIVOT_TYPE_WORLD_ORIGIN - -func transfer_state_from(other) -> void: - edit_mode = other.edit_mode - pivot_type = other.pivot_type - axis_constraint = other.axis_constraint - selection_mode = other.selection_mode - handle_selection_type = other.handle_selection_type - - visual_indicator_outline = other.visual_indicator_outline - visual_indicator_seam = other.visual_indicator_seam - visual_indicator_handle = other.visual_indicator_handle - -func visual_indicator_outline_set(on : bool): - visual_indicator_outline = on - redraw() - -func visual_indicator_seam_set(on : bool): - visual_indicator_seam = on - redraw() - -func visual_indicator_handle_set(on : bool): - visual_indicator_handle = on - redraw() - -func handle_selection_type_front(): - handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT - -func handle_selection_type_back(): - handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_BACK - -func handle_selection_type_all(): - handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_ALL - diff --git a/game/addons/mesh_data_resource_editor/UVEditor.gd b/game/addons/mesh_data_resource_editor/UVEditor.gd deleted file mode 100644 index b04cef43..00000000 --- a/game/addons/mesh_data_resource_editor/UVEditor.gd +++ /dev/null @@ -1,63 +0,0 @@ -tool -extends Control - -var mesh_data_resource : MeshDataResource = null setget set_mesh_data_resource -var background_texture : Texture = null - -func set_mesh_data_resource(a : MeshDataResource): - if mesh_data_resource: - mesh_data_resource.disconnect("changed", self, "on_mdr_changed") - - mesh_data_resource = a - - if mesh_data_resource: - mesh_data_resource.connect("changed", self, "on_mdr_changed") - - update() - -func set_mesh_data_instance(a : MeshDataInstance): - if !a: - background_texture = null - - background_texture = a.texture - -func on_mdr_changed(): - update() - -func _draw(): - if background_texture: - draw_texture_rect_region(background_texture, Rect2(Vector2(), get_size()), Rect2(Vector2(), background_texture.get_size())) - - if !mesh_data_resource: - return - - if mesh_data_resource.array.size() != ArrayMesh.ARRAY_MAX: - return - - var uvs : PoolVector2Array = mesh_data_resource.array[ArrayMesh.ARRAY_TEX_UV] - var indices : PoolIntArray = mesh_data_resource.array[ArrayMesh.ARRAY_INDEX] - - if indices.size() % 3 == 0: - for i in range(0, len(indices), 3): - var c : Color = Color(1, 1, 1, 1) - - if uvs[indices[i]].is_equal_approx(Vector2()) || uvs[indices[i + 1]].is_equal_approx(Vector2()): - c = Color(1, 0, 0, 1) - else: - c = Color(1, 1, 1, 1) - - draw_line(uvs[indices[i]] * get_size(), uvs[indices[i + 1]] * get_size(), c, 1, false) - - if uvs[indices[i + 1]].is_equal_approx(Vector2()) || uvs[indices[i + 2]].is_equal_approx(Vector2()): - c = Color(1, 0, 0, 1) - else: - c = Color(1, 1, 1, 1) - - draw_line(uvs[indices[i + 1]] * get_size(), uvs[indices[i + 2]] * get_size(), c, 1, false) - - if uvs[indices[i + 2]].is_equal_approx(Vector2()) || uvs[indices[i]].is_equal_approx(Vector2()): - c = Color(1, 0, 0, 1) - else: - c = Color(1, 1, 1, 1) - - draw_line(uvs[indices[i + 2]] * get_size(), uvs[indices[i]] * get_size(), c, 1, false) diff --git a/game/addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres b/game/addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres deleted file mode 100644 index 0e55d740..00000000 --- a/game/addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="ButtonGroup" format=2] - -[resource] diff --git a/game/addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres b/game/addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres deleted file mode 100644 index 0e55d740..00000000 --- a/game/addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="ButtonGroup" format=2] - -[resource] diff --git a/game/addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres b/game/addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres deleted file mode 100644 index 0e55d740..00000000 --- a/game/addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="ButtonGroup" format=2] - -[resource] diff --git a/game/addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres b/game/addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres deleted file mode 100644 index 0e55d740..00000000 --- a/game/addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="ButtonGroup" format=2] - -[resource] diff --git a/game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png b/game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png deleted file mode 100644 index 0b2cc352d19cd9e49ffb87c542d03ea6b0272426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|4tTmahFJ8z zow%3xkONQad_iG_R?P+bb~6QjP&Rbh)Uw%Y+K06cEFv9h*Msl#PEhn=_7D^dTF|n7 z^WPlX+Xv?Jo#9FQw?V9>Z#-TTDC5d^ex^yr-7SCB^DN$K|-__`M(7cQXEnO=R>I@a+crg~8L+ K&t;ucLK6TAX=a81 diff --git a/game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png.import b/game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png.import deleted file mode 100644 index 5b8d9e12..00000000 --- a/game/addons/mesh_data_resource_editor/icons/icon_h_mirror.png.import +++ /dev/null @@ -1,35 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/icon_h_mirror.png-c9b5d56c2156f7acd5e386f16839fcf5.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/mesh_data_resource_editor/icons/icon_h_mirror.png" -dest_files=[ "res://.import/icon_h_mirror.png-c9b5d56c2156f7acd5e386f16839fcf5.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=1 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=false -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/game/addons/mesh_data_resource_editor/icons/icon_rot_left.png b/game/addons/mesh_data_resource_editor/icons/icon_rot_left.png deleted file mode 100644 index b14e665b60da777f542c1dd62b6183f6e2a16ea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmV;20(kw2P)Px%K}keGR5*=&lEF(9aTLctzj0>+gDnujg9vu1Q-@$?XO{@EgHX^p7lRIg9b{&f zE_U+JA0Xo;p-!^6rw*bWx=QSfdM_5;c_1DtiO5Uj>bwr_+HOkk^nU!l@AJOD_kM;; zqF5~Ac^&}97*v%cN!Z%jx}Y_^2gh-!R;xpv=RGsVJOo_e7w}0{-^X$MdTD9tM=$6c z;CUV^D=QCd+kOj-T;>e;d2({{cxGniLltC#n$WfVG;QzBAJNH`@VmnweS0g$b3ihrCzTO)9t>uw-<^? z)@rrZy2Y;R5{4l`5a7D*Ii%HUt%*psySw|saU2MO01-(7*(D4_dirBm5;zeyWM`e zxVU%-kOL@{N(>APtoMqIG50LX>H{Q6!u0g?D^+D@=WH3dOQze6R%gH$AbpLxNf?HG h7ph7WMgQTS#UH+96IlcJPl5md002ovPDHLkV1g^oA+Z1e diff --git a/game/addons/mesh_data_resource_editor/icons/icon_rot_left.png.import b/game/addons/mesh_data_resource_editor/icons/icon_rot_left.png.import deleted file mode 100644 index 0f72a9de..00000000 --- a/game/addons/mesh_data_resource_editor/icons/icon_rot_left.png.import +++ /dev/null @@ -1,35 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/icon_rot_left.png-2ed07f01ee122a21258a76ad461d5351.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/mesh_data_resource_editor/icons/icon_rot_left.png" -dest_files=[ "res://.import/icon_rot_left.png-2ed07f01ee122a21258a76ad461d5351.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=1 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=false -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/game/addons/mesh_data_resource_editor/icons/icon_rot_right.png b/game/addons/mesh_data_resource_editor/icons/icon_rot_right.png deleted file mode 100644 index 00bbcba6aee1d40728b25d8c31cd9f7481e3b401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5528 zcmeHKdpJ~U7ax~{#79LgIZUIA%AWhZnI!iz?s7?&nLXPW%%z#ZPzvD)Q8|)O=TMP~ z5T|pbs8n*PQz+MzDCv|g(kbfOgKp1v{^@zX^I!8kd-mSzUF)~j`n~I2?|yf>xj1NR z8fzjD2yG`vTMziItGG1O;D581AJ_$cFE;OSSWt~q;2B0or2zJK6)J^4&(&ydW+#YkUcD1X_`wBipFU9DDcutO}P z;rbsQlD9fzW6f1N(pjNi>kJKH1v}da~^Hsx$8Es)$NT`Arp_Y* z(7a(1N`J6>(-YTP^Q(_jy)4%C&OYcI8?}&#_p^uDYNhjw@O6fNIgMO&n2_0o)aWIVv&)pxgQlUi zkD5j)t+g7Jgrabr5qZ1oL+>4=u7d703y`OVuzM`m=dFBZ8)D&~>Y%+BQ>YZLQ3BNN zR#Vxu>-0j09NueNjl(g&XgoThy%@W)U83Yj_FpbG?_Lk46t2$%K!3JrvzD`OYnD32 z+F>`8YWH4le)ZR+d_ucFuSS1fsI1e7mnZEVJ!)9<+CFkPZ*0TX5%<%EW%n*z5d3- z@w1nCANC-%t@Vk{G!71RtUT&XXeQs@nlaZu_e9?56$i~u*)I+`OE@x?Z*qd&{*E0N zwY)5kpnLh6uHjf-TyF=Rm$Mt!ojsf@h;`TBr*t#CMKkPj?JvhJRsGrL^1LpH_q0^* z+1oAew}M>49&fwao$(u`ef9ao7cF<(6PQIg_M_~Y)!dyEz;AHfPf~E=_H%j=SKVYdXokW8%1w zEFaV8o0CxOruE1S**bBfi*fb@p#eh}a}2j_*;{9&$9yPB?#R7KHaKaTvastN%0A5U zUe&Pj`?o8hpMPra;R2pC7E~ELFl6xNGI!^|1=6C(P~iF1C)#bKxWpi2WX_V6w zwFxsLzngtcI-iZtbwPXx4A|==qW7i?b4){XJB! zw&v^eb@vLY&-|`2FXMD-GP<*n%$frkSLqlU*hPCS_x&yS`RPt^myUW^6l)u+%E5I0 zojLu)KLfHmJbNh?Px^SON2B)7zgRCx7A^{}1EfjznG1u?#Q%r=`k4LrUdpn}V9Buo zb3r2YVhL}~ujxV8$I z5joW60@AqXl}~e6l4osV*AIogbz5ceXM2ARiML2)yr5~fygO9ztnxw60nkUMJKUzU z`IS%o$co~z{5OHO8;eYLO>{8MRg~MfZ%-dEY-@yG7IkCx+-MtA%TKf_i+gJ};@k7a z-DC)jKq$rYZEW0}Y-~QZFSu#tM(<%dUR-HXztQsuN?(0h5|vxzGIxBHNu{P;k#2Cp z+8>?K6LE{Qosv@u`uxQsVAV7G72MapKg8h0fn@9)wyM=Gf;Y7?yHQ*quy~Y$q9OY zU5OswQL+)0wW?&cA#JW(tXjwDjt_OugeS)z#AoTHspMhOUgEUk!(;86H=j%Yv2e4p z>Y>X(?O8{ z&E|?Y5Lzw}!`lr4!LX8x*ni^C|{Nv(nchKkVG^Q zjRoxF{BS&Kg(i|A;Rez@Z0)BZ;5Q~JNG220F_?&m2y_GiEt2psI2w(H!QwG^JOFC| z(nz6l3_CI?V#i2S&~o zV{m9JMj*g^X(5%_g~K4z0sW(e)C=B~F&>aq6ea;7yKqP-Gyf8T3x2W}he<*w)8T>` zC=?RFs#4f1?kkrLPAs=i777Y@e1Uk<3MTt2O&LG%Gg)87rWlz_=gUA~^G~>6X@AUp zQW@4_vFNrUFia7ilPwda@K5K8Kt7i~`A7<+(bzaH6`+A65FirCM1Ten@c^F8VG}td zJOxW7d;#Sol*-sb5K=(F;AlRKLncy4R1QP~2zW9KLE+#54voeECW=E0f5*}w%fnGMonlFB7tYexh@3ZAg=+Q#Am9Nr6$rxVF^5@i_{N5^7O znCXNuidFqFV+Q7bIAKgGe9;DAyD1smUf^zp`P8naIaAR1FaD+}`4>IF(BGYW6Tjc- z`cBt3G4M^w->d68UEjpOHz|LwuKycdnx79mkP!X~ihz$Zu^vlB@KH#Ov&O*|aUao$ zNNQ_YFNGyD#EyROedZj+rGz+;YX}R~Wlk(R^+9DVeKbvi-QWwKcTYLlT6<9&D>KSc z=D6!#-kuXZ4|~CMu6o>+y48-gt5xe`P~G}VY)ji(<2sj+Z@*K&vw^)ZzOqasV)4H4 zj+E^&q2<-)5A_R?j@K+Z$~xAQ>vpfo4cIOVD%w)hTbikw(Qr5jB$4AR7T9;;-8G~st+TKjBwmhUp zH&P?OyT`rFrmwu8y2Bzl+#o3W?p?h-(pe3*-0hhgW_4W0S;3MMY42CtmQ&Nzhn-XU zy;`hRHA=D+Rme6BUvo>6D(FftHa)F$^wv<8vTx~aofu%# zvg>{q0#456h8#RYto}17z%uG*_2Q+7lHp#M`^LmnhVKoUX?k^9fAPx#>q$gGR5*>zQ$b1uF%YaCFMD@!PV);T@gMV#&R6CI-jYu!ir|ugg%$MN^^tY- zGRi75A$zl+A!({B)pQ3aKvkitCCWNtj9W8%B>9w5+MZi{N%BB)n&UObxF~Y5WV`SC z2NAhGNw;0s-2%89$MF}xDHu5b_?*xCHIghPRTbWQc<+w@nw)c!bH*?Xh4=m-gaDF9 zl2Zs_l~-z^3jb6^O!}%i^!(V z0)Uj#70I`gRenz?wbcT%NK5j?%yu!x^NPPw^PRr{I9qrpqLr>_00000NkvXXu0mjf D-fV)* diff --git a/game/addons/mesh_data_resource_editor/icons/icon_v_mirror.png.import b/game/addons/mesh_data_resource_editor/icons/icon_v_mirror.png.import deleted file mode 100644 index d1151aa5..00000000 --- a/game/addons/mesh_data_resource_editor/icons/icon_v_mirror.png.import +++ /dev/null @@ -1,35 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/icon_v_mirror.png-e41ddad69d06b4e32f9d50b970311be7.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/mesh_data_resource_editor/icons/icon_v_mirror.png" -dest_files=[ "res://.import/icon_v_mirror.png-e41ddad69d06b4e32f9d50b970311be7.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=1 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=false -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/game/addons/mesh_data_resource_editor/plugin.cfg b/game/addons/mesh_data_resource_editor/plugin.cfg deleted file mode 100644 index 8522bd0f..00000000 --- a/game/addons/mesh_data_resource_editor/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="mesh_data_resource_editor" -description="" -author="Relintai" -version="1.0" -script="plugin.gd" diff --git a/game/addons/mesh_data_resource_editor/plugin.gd b/game/addons/mesh_data_resource_editor/plugin.gd deleted file mode 100644 index ebfa3ac1..00000000 --- a/game/addons/mesh_data_resource_editor/plugin.gd +++ /dev/null @@ -1,289 +0,0 @@ -tool -extends EditorPlugin - -const MDRMeshUtils = preload("res://addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd") - -const MdiGizmoPlugin = preload("res://addons/mesh_data_resource_editor/MDIGizmoPlugin.gd") -const MDIEdGui = preload("res://addons/mesh_data_resource_editor/MDIEd.tscn") - -var gizmo_plugin = MdiGizmoPlugin.new() -var mdi_ed_gui : Control - -var active_gizmos : Array - -var current_mesh_data_instance : MeshDataInstance = null - -func _enter_tree(): - gizmo_plugin = MdiGizmoPlugin.new() - mdi_ed_gui = MDIEdGui.instance() - mdi_ed_gui.set_plugin(self) - active_gizmos = [] - - gizmo_plugin.plugin = self - - add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui) - mdi_ed_gui.hide() - - add_spatial_gizmo_plugin(gizmo_plugin) - - set_input_event_forwarding_always_enabled() - -func _exit_tree(): - #print("_exit_tree") - - remove_spatial_gizmo_plugin(gizmo_plugin) - #remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui) - mdi_ed_gui.queue_free() - pass - -#func enable_plugin(): -# print("enable_plugin") -# pass -# -#func disable_plugin(): -# print("disable_plugin") -# remove_spatial_gizmo_plugin(gizmo_plugin) -# remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui) -# mdi_ed_gui.queue_free() - -func handles(object): - #print("disable_plugin") - - if object is MeshDataInstance: - return true - - return false - -func edit(object): - var mdi : MeshDataInstance = object as MeshDataInstance - - if mdi: - if current_mesh_data_instance && mdi.gizmo && current_mesh_data_instance.gizmo: - mdi.gizmo.transfer_state_from(current_mesh_data_instance.gizmo) - - mdi_ed_gui.set_mesh_data_resource(mdi.mesh_data) - mdi_ed_gui.set_mesh_data_instance(mdi) - - current_mesh_data_instance = mdi - -func make_visible(visible): - #print("make_visible") - - if visible: - mdi_ed_gui.show() - else: - #mdi_ed_gui.hide() - #figure out how to hide it when something else gets selected, don't hide on unselect - pass - -func get_plugin_name(): - return "mesh_data_resource_editor" - - -#func forward_spatial_gui_input(camera, event): -# return forward_spatial_gui_input(0, camera, event) - -func register_gizmo(gizmo): - active_gizmos.append(gizmo) - -func unregister_gizmo(gizmo): - for i in range(active_gizmos.size()): - if active_gizmos[i] == gizmo: - active_gizmos.remove(i) - return - -func set_translate() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_translate() - -func set_scale() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_scale() - -func set_rotate() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_rotate() - -func set_axis_x(on : bool) -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_axis_x(on) - -func set_axis_y(on : bool) -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_axis_y(on) - -func set_axis_z(on : bool) -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_axis_z(on) - -func set_selection_mode_vertex() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_selection_mode_vertex() - -func set_selection_mode_edge() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_selection_mode_edge() - -func set_selection_mode_face() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_selection_mode_face() - -func get_mdr() -> MeshDataResource: - if current_mesh_data_instance: - return current_mesh_data_instance.mesh_data - - return null - - -#func forward_spatial_gui_input(camera, event): -# for g in active_gizmos: -# if g.forward_spatial_gui_input(0, camera, event): -# return true -# -# return false - -func forward_spatial_gui_input(index, camera, event): - if (!is_instance_valid(current_mesh_data_instance)): - current_mesh_data_instance = null - - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - if current_mesh_data_instance.gizmo.forward_spatial_gui_input(index, camera, event): - return true - - return false - -func add_box() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.add_box() - -func add_triangle() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.add_triangle() - -func add_quad() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.add_quad() - -func add_triangle_at() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.add_triangle_at() - -func add_quad_at() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.add_quad_at() - -func split(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.split() - -func connect_action(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.connect_action() - -func disconnect_action(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.disconnect_action() - -func create_face(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.create_face() - -func delete_selected(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.delete_selected() - -func generate_normals(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.generate_normals() - -func remove_doubles(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.remove_doubles() - -func merge_optimize(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.merge_optimize() - -func generate_tangents(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.generate_tangents() - -func connect_to_first_selected(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.connect_to_first_selected() - -func connect_to_avg(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.connect_to_avg() - -func connect_to_last_selected(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.connect_to_last_selected() - -func mark_seam(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.mark_seam() - -func unmark_seam(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.unmark_seam() - -func apply_seam(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.apply_seam() - -func uv_unwrap() -> void: - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.uv_unwrap() - -func set_pivot_averaged(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_pivot_averaged() - -func set_pivot_mdi_origin(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_pivot_mdi_origin() - -func set_pivot_world_origin(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.set_pivot_world_origin() - -func visual_indicator_outline_set(on : bool): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.visual_indicator_outline_set(on) - -func visual_indicator_seam_set(on : bool): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.visual_indicator_seam_set(on) - -func visual_indicator_handle_set(on : bool): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.visual_indicator_handle_set(on) - -func select_all(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.select_all() - -func handle_selection_type_front(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.handle_selection_type_front() - -func handle_selection_type_back(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.handle_selection_type_back() - -func handle_selection_type_all(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.handle_selection_type_all() - -func extrude(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.extrude() - -func clean_mesh(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.clean_mesh() - -func flip_selected_faces(): - if current_mesh_data_instance && current_mesh_data_instance.gizmo: - current_mesh_data_instance.gizmo.flip_selected_faces() diff --git a/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd b/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd deleted file mode 100644 index bd2fcd0f..00000000 --- a/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd +++ /dev/null @@ -1,1643 +0,0 @@ -tool -extends Object - -static func remove_triangle(mdr : MeshDataResource, triangle_index : int) -> void: - if triangle_index < 0: - return - - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return - - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - - # Just remove that triangle - var i : int = triangle_index * 3 - - var i0 : int = indices[i] - var i1 : int = indices[i + 1] - var i2 : int = indices[i + 2] - - remove_seam_not_ordered(mdr, i0, i1) - remove_seam_not_ordered(mdr, i1, i2) - remove_seam_not_ordered(mdr, i2, i0) - - indices.remove(i) - indices.remove(i) - indices.remove(i) - - arrays[ArrayMesh.ARRAY_INDEX] = indices - - mdr.set_array(arrays) - -static func add_triangulated_mesh_from_points_delaunay(mdr : MeshDataResource, selected_points : PoolVector3Array, last_known_camera_facing : Vector3) -> bool: - if selected_points.size() < 3: - return false - - var tetrahedrons : PoolIntArray = MeshUtils.delaunay3d_tetrahedralize(selected_points) - - if tetrahedrons.size() == 0: - # try randomly displacing the points a bit, it can help - var rnd_selected_points : PoolVector3Array = PoolVector3Array() - rnd_selected_points.append_array(selected_points) - - for i in range(rnd_selected_points.size()): - rnd_selected_points[i] = rnd_selected_points[i] + (Vector3(randf(),randf(), randf()) * 0.1) - - tetrahedrons = MeshUtils.delaunay3d_tetrahedralize(rnd_selected_points) - - if tetrahedrons.size() == 0: - print("add_triangulated_mesh_from_points_delaunay: tetrahedrons.size() == 0!") - return false - - var st : SurfaceTool = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - for i in range(0, tetrahedrons.size(), 4): - var i0 : int = tetrahedrons[i] - var i1 : int = tetrahedrons[i + 1] - var i2 : int = tetrahedrons[i + 2] - var i3 : int = tetrahedrons[i + 3] - - var v0 : Vector3 = selected_points[i0] - var v1 : Vector3 = selected_points[i1] - var v2 : Vector3 = selected_points[i2] - var v3 : Vector3 = selected_points[i3] - - var flip : bool = is_normal_similar(v0, v1, v2, last_known_camera_facing) - - var normal : Vector3 = get_face_normal(v0, v1, v2, flip) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(v0) - st.add_uv(Vector2(0.5, 0)) - st.add_normal(normal) - st.add_vertex(v1) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(v2) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(v3) - - var im3 : int = i - - if !flip: - st.add_index(im3 + 0) - st.add_index(im3 + 1) - st.add_index(im3 + 2) - - st.add_index(im3 + 0) - st.add_index(im3 + 2) - st.add_index(im3 + 3) - else: - st.add_index(im3 + 3) - st.add_index(im3 + 2) - st.add_index(im3 + 0) - - st.add_index(im3 + 2) - st.add_index(im3 + 1) - st.add_index(im3 + 0) - - merge_in_surface_tool(mdr, st) - - return true - -static func add_triangulated_mesh_from_points(mdr : MeshDataResource, selected_points : PoolVector3Array, last_known_camera_facing : Vector3) -> void: - if selected_points.size() < 3: - return - - var st : SurfaceTool = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - var v0 : Vector3 = selected_points[0] - var v1 : Vector3 = selected_points[1] - - for i in range(2, selected_points.size()): - var v2 : Vector3 = selected_points[i] - - var flip : bool = is_normal_similar(v0, v1, v2, last_known_camera_facing) - - var normal : Vector3 = get_face_normal(v0, v1, v2, flip) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(v0) - st.add_uv(Vector2(0.5, 0)) - st.add_normal(normal) - st.add_vertex(v1) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(v2) - - var im3 : int = (i - 2) * 3 - - if !flip: - st.add_index(im3) - st.add_index(im3 + 1) - st.add_index(im3 + 2) - else: - st.add_index(im3 + 2) - st.add_index(im3 + 1) - st.add_index(im3) - - merge_in_surface_tool(mdr, st) - -# Appends a triangle to the mesh. It's created from miroring v2 to the ev0, and ev1 edge -static func append_triangle_to_tri_edge(mdr : MeshDataResource, ev0 : Vector3, ev1 : Vector3, v2 : Vector3) -> void: - var vref : Vector3 = reflect_vertex(ev0, ev1, v2) - - add_triangle_at(mdr, ev1, ev0, vref, false) - -static func add_triangle_at(mdr : MeshDataResource, v0 : Vector3, v1 : Vector3, v2 : Vector3, flip : bool = false) -> void: - var st : SurfaceTool = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - var normal : Vector3 = get_face_normal(v0, v1, v2, flip) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(v0) - st.add_uv(Vector2(0.5, 0)) - st.add_normal(normal) - st.add_vertex(v1) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(v2) - - if !flip: - st.add_index(0) - st.add_index(1) - st.add_index(2) - else: - st.add_index(2) - st.add_index(1) - st.add_index(0) - - merge_in_surface_tool(mdr, st) - -static func add_triangle(mdr : MeshDataResource) -> void: - var st : SurfaceTool = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - var normal : Vector3 = get_face_normal(Vector3(-0.5, -0.5, 0), Vector3(0, 0.5, 0), Vector3(0.5, -0.5, 0)) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, -0.5, 0)) - st.add_uv(Vector2(0.5, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(0, 0.5, 0)) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, -0.5, 0)) - - st.add_index(0) - st.add_index(1) - st.add_index(2) - - merge_in_surface_tool(mdr, st) - -# Appends a quad to the mesh. It's created to the opposite side of v2 to the ev0, and ev1 edge -static func append_quad_to_tri_edge(mdr : MeshDataResource, ev0 : Vector3, ev1 : Vector3, v2 : Vector3) -> void: - var vref : Vector3 = reflect_vertex(ev0, ev1, v2) - var vproj : Vector3 = (vref - ev0).project(ev1 - ev0) - var eoffs : Vector3 = (vref - ev0) - vproj - - var qv0 : Vector3 = ev0 - var qv1 : Vector3 = ev0 + eoffs - var qv2 : Vector3 = ev1 + eoffs - var qv3 : Vector3 = ev1 - - add_quad_at(mdr, qv0, qv1, qv2, qv3, false) - -static func add_quad_at(mdr : MeshDataResource, v0 : Vector3, v1 : Vector3, v2 : Vector3, v3 : Vector3, flip : bool = false) -> void: - var st : SurfaceTool = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - var normal : Vector3 = get_face_normal(v0, v1, v2, flip) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(v0) - st.add_uv(Vector2(0, 0)) - st.add_normal(normal) - st.add_vertex(v1) - st.add_uv(Vector2(1, 0)) - st.add_normal(normal) - st.add_vertex(v2) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(v3) - - - if !flip: - st.add_index(0) - st.add_index(1) - st.add_index(2) - - st.add_index(0) - st.add_index(2) - st.add_index(3) - else: - st.add_index(2) - st.add_index(1) - st.add_index(0) - - st.add_index(3) - st.add_index(2) - st.add_index(0) - - merge_in_surface_tool(mdr, st) - -static func add_quad(mdr : MeshDataResource) -> void: - var st : SurfaceTool = SurfaceTool.new() - - var normal : Vector3 = get_face_normal(Vector3(-0.5, -0.5, 0), Vector3(-0.5, 0.5, 0), Vector3(0.5, 0.5, 0)) - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, -0.5, 0)) - st.add_uv(Vector2(0, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, 0.5, 0)) - st.add_uv(Vector2(1, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, 0.5, 0)) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, -0.5, 0)) - - st.add_index(0) - st.add_index(1) - st.add_index(2) - st.add_index(2) - st.add_index(3) - st.add_index(0) - - merge_in_surface_tool(mdr, st) - -static func add_box(mdr : MeshDataResource) -> void: - var st : SurfaceTool = SurfaceTool.new() - - var normal : Vector3 = Vector3() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - var sgn : float = 1 - - #z - for i in range(2): - normal = get_face_normal(Vector3(-0.5, -0.5, sgn * 0.5), Vector3(-0.5, 0.5, sgn * 0.5), Vector3(0.5, 0.5, sgn * 0.5), sgn < 0) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, -0.5, sgn * 0.5)) - st.add_uv(Vector2(0, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, 0.5, sgn * 0.5)) - st.add_uv(Vector2(1, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, 0.5, sgn * 0.5)) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, -0.5, sgn * 0.5)) - - sgn *= -1 - - #x - for i in range(2): - normal = get_face_normal(Vector3(sgn * 0.5, -0.5, 0.5), Vector3(sgn * 0.5, 0.5, 0.5), Vector3(sgn * 0.5, 0.5, -0.5), sgn < 0) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(sgn * 0.5, -0.5, 0.5)) - st.add_uv(Vector2(0, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(sgn * 0.5, 0.5, 0.5)) - st.add_uv(Vector2(1, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(sgn * 0.5, 0.5, -0.5)) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(sgn * 0.5, -0.5, -0.5)) - - sgn *= -1 - - #y - for i in range(2): - normal = get_face_normal(Vector3(-0.5, sgn * 0.5, 0.5), Vector3(-0.5, sgn * 0.5, -0.5), Vector3(0.5, sgn * 0.5, -0.5), sgn < 0) - - st.add_uv(Vector2(0, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, sgn * 0.5, 0.5)) - st.add_uv(Vector2(0, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(-0.5, sgn * 0.5, -0.5)) - st.add_uv(Vector2(1, 0)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, sgn * 0.5, -0.5)) - st.add_uv(Vector2(1, 1)) - st.add_normal(normal) - st.add_vertex(Vector3(0.5, sgn * 0.5, 0.5)) - - - sgn *= -1 - - var ind : int = 0 - - for i in range(3): - st.add_index(ind + 0) - st.add_index(ind + 1) - st.add_index(ind + 2) - st.add_index(ind + 2) - st.add_index(ind + 3) - st.add_index(ind + 0) - - ind += 4 - - st.add_index(ind + 0) - st.add_index(ind + 2) - st.add_index(ind + 1) - st.add_index(ind + 0) - st.add_index(ind + 3) - st.add_index(ind + 2) - - ind += 4 - - merge_in_surface_tool(mdr, st) - -static func merge_in_surface_tool(mdr : MeshDataResource, st : SurfaceTool, generate_normals_if_needed : bool = true, generate_tangents_if_needed : bool = true) -> void: - var arrays : Array = get_arrays_prepared(mdr) - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if generate_normals_if_needed && arrays[ArrayMesh.ARRAY_NORMAL] == null: - #st.generate_normals() - generate_normals_mdr(mdr) - - if generate_tangents_if_needed && arrays[ArrayMesh.ARRAY_TANGENT] == null: - st.generate_tangents() - - merge_in_arrays(mdr, st.commit_to_arrays()) - -static func merge_in_arrays(mdr : MeshDataResource, merge : Array) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - var vertices : PoolVector3Array - var normals : PoolVector3Array - var tangents : PoolRealArray - var colors : PoolColorArray - var uv : PoolVector2Array - var uv2 : PoolVector2Array - var bones : PoolRealArray - var weights : PoolRealArray - var indices : PoolIntArray - - if arrays[ArrayMesh.ARRAY_VERTEX] != null: - vertices = arrays[ArrayMesh.ARRAY_VERTEX] - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals = arrays[ArrayMesh.ARRAY_NORMAL] - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - tangents = arrays[ArrayMesh.ARRAY_TANGENT] - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors = arrays[ArrayMesh.ARRAY_COLOR] - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv = arrays[ArrayMesh.ARRAY_TEX_UV] - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2] - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones = arrays[ArrayMesh.ARRAY_BONES] - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights = arrays[ArrayMesh.ARRAY_WEIGHTS] - - if arrays[ArrayMesh.ARRAY_INDEX] != null: - indices = arrays[ArrayMesh.ARRAY_INDEX] - - var merge_vertices : PoolVector3Array - var merge_normals : PoolVector3Array - var merge_tangents : PoolRealArray - var merge_colors : PoolColorArray - var merge_uv : PoolVector2Array - var merge_uv2 : PoolVector2Array - var merge_bones : PoolRealArray - var merge_weights : PoolRealArray - var merge_indices : PoolIntArray - - if merge[ArrayMesh.ARRAY_VERTEX] != null: - merge_vertices = merge[ArrayMesh.ARRAY_VERTEX] - - if merge[ArrayMesh.ARRAY_NORMAL] != null: - merge_normals = merge[ArrayMesh.ARRAY_NORMAL] - - if merge[ArrayMesh.ARRAY_TANGENT] != null: - merge_tangents = merge[ArrayMesh.ARRAY_TANGENT] - - if merge[ArrayMesh.ARRAY_COLOR] != null: - merge_colors = merge[ArrayMesh.ARRAY_COLOR] - - if merge[ArrayMesh.ARRAY_TEX_UV] != null: - merge_uv = merge[ArrayMesh.ARRAY_TEX_UV] - - if merge[ArrayMesh.ARRAY_TEX_UV2] != null: - merge_uv2 = merge[ArrayMesh.ARRAY_TEX_UV2] - - if merge[ArrayMesh.ARRAY_BONES] != null: - merge_bones = merge[ArrayMesh.ARRAY_BONES] - - if merge[ArrayMesh.ARRAY_WEIGHTS] != null: - merge_weights = merge[ArrayMesh.ARRAY_WEIGHTS] - - if merge[ArrayMesh.ARRAY_INDEX] != null: - merge_indices = merge[ArrayMesh.ARRAY_INDEX] - - #merge - var ovc : int = vertices.size() - vertices.append_array(merge_vertices) - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - if merge_vertices.size() != merge_normals.size(): - for i in range(merge_vertices.size()): - normals.append(Vector3()) - else: - normals.append_array(merge_normals) - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - if merge_vertices.size() != merge_tangents.size() * 4: - for i in range(merge_vertices.size()): - merge_tangents.append(0) - merge_tangents.append(0) - merge_tangents.append(0) - merge_tangents.append(0) - else: - tangents.append_array(merge_tangents) - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - if merge_vertices.size() != merge_colors.size(): - for i in range(merge_vertices.size()): - colors.append(Color()) - else: - colors.append_array(merge_colors) - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - if merge_vertices.size() != merge_uv.size(): - for i in range(merge_vertices.size()): - uv.append(Vector2()) - else: - uv.append_array(merge_uv) - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - if merge_vertices.size() != merge_uv2.size(): - for i in range(merge_vertices.size()): - uv2.append(Vector2()) - else: - uv2.append_array(merge_uv2) - - if arrays[ArrayMesh.ARRAY_BONES] != null: - if merge_vertices.size() != merge_bones.size() * 4: - for i in range(merge_vertices.size()): - bones.append(0) - bones.append(0) - bones.append(0) - bones.append(0) - else: - bones.append_array(merge_bones) - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - if merge_vertices.size() != merge_weights.size() * 4: - for i in range(merge_vertices.size()): - weights.append(0) - weights.append(0) - weights.append(0) - weights.append(0) - else: - weights.append_array(merge_weights) - - for i in range(merge_indices.size()): - merge_indices[i] += ovc - - indices.append_array(merge_indices) - - #write back - - arrays[ArrayMesh.ARRAY_VERTEX] = vertices - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - arrays[ArrayMesh.ARRAY_NORMAL] = normals - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - arrays[ArrayMesh.ARRAY_TANGENT] = tangents - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - arrays[ArrayMesh.ARRAY_COLOR] = colors - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - arrays[ArrayMesh.ARRAY_TEX_UV] = uv - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2 - - if arrays[ArrayMesh.ARRAY_BONES] != null: - arrays[ArrayMesh.ARRAY_BONES] = bones - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - arrays[ArrayMesh.ARRAY_WEIGHTS] = weights - - arrays[ArrayMesh.ARRAY_INDEX] = indices - - mdr.set_array(arrays) - -static func get_arrays_prepared(mdr : MeshDataResource) -> Array: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - arrays[ArrayMesh.ARRAY_VERTEX] = PoolVector3Array() - arrays[ArrayMesh.ARRAY_NORMAL] = PoolVector3Array() - arrays[ArrayMesh.ARRAY_TEX_UV] = PoolVector2Array() - arrays[ArrayMesh.ARRAY_INDEX] = PoolIntArray() - - return arrays - -# There are probably better ways to do this -static func should_flip_reflected_triangle(v0 : Vector3, v1 : Vector3, v2 : Vector3) -> bool: - var reflected : Vector3 = reflect_vertex(v0, v1, v2) - var nn : Vector3 = get_face_normal(v0, v1, v2) - - return should_triangle_flip(v0, v1, reflected, nn) - -static func reflect_vertex(v0 : Vector3, v1 : Vector3, v2 : Vector3) -> Vector3: - return (v2 - v0).reflect((v1 - v0).normalized()) + v0 - -static func get_face_normal_arr_ti(verts : PoolVector3Array, indices : PoolIntArray, triangle_index : int, flipped : bool = false) -> Vector3: - return get_face_normal_arr(verts, indices, triangle_index * 3, flipped) - -static func get_face_normal_arr(verts : PoolVector3Array, indices : PoolIntArray, index : int, flipped : bool = false) -> Vector3: - var v0 : Vector3 = verts[indices[index]] - var v1 : Vector3 = verts[indices[index + 1]] - var v2 : Vector3 = verts[indices[index + 2]] - - return get_face_normal(v0, v1, v2, flipped) - -static func get_face_normal(v0 : Vector3, v1 : Vector3, v2 : Vector3, flipped : bool = false) -> Vector3: - if !flipped: - return Plane(v0, v1, v2).normal - else: - return Plane(v2, v1, v0).normal - -static func should_triangle_flip(v0 : Vector3, v1 : Vector3, v2 : Vector3, similar_dir_normal : Vector3) -> bool: - var normal : Vector3 = get_face_normal(v0, v1, v2) - - var ndns : float = normal.dot(similar_dir_normal) - - return ndns < 0 - -static func is_normal_similar(v0 : Vector3, v1 : Vector3, v2 : Vector3, similar_dir_normal : Vector3) -> bool: - var normal : Vector3 = get_face_normal(v0, v1, v2) - - var ndns : float = normal.dot(similar_dir_normal) - - return ndns >= 0 - -static func is_direction_similar(d0 : Vector3, d1 : Vector3) -> bool: - var ndns : float = d0.dot(d1) - return ndns >= 0 - -static func flip_triangle_ti(mdr : MeshDataResource, triangle_index : int) -> void: - flip_triangle(mdr, triangle_index * 3) - -static func flip_triangle(mdr : MeshDataResource, index : int) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return - - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - - var i0 : int = indices[index] - var i2 : int = indices[index + 2] - - indices[index] = i2 - indices[index + 2] = i0 - - arrays[ArrayMesh.ARRAY_INDEX] = indices - - mdr.set_array(arrays) - -static func add_into_surface_tool(mdr : MeshDataResource, st : SurfaceTool) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - var vertices : PoolVector3Array - var normals : PoolVector3Array - var tangents : PoolRealArray - var colors : PoolColorArray - var uv : PoolVector2Array - var uv2 : PoolVector2Array - var bones : PoolRealArray - var weights : PoolRealArray - var indices : PoolIntArray - - if arrays[ArrayMesh.ARRAY_VERTEX] != null: - vertices = arrays[ArrayMesh.ARRAY_VERTEX] - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals = arrays[ArrayMesh.ARRAY_NORMAL] - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - tangents = arrays[ArrayMesh.ARRAY_TANGENT] - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors = arrays[ArrayMesh.ARRAY_COLOR] - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv = arrays[ArrayMesh.ARRAY_TEX_UV] - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2] - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones = arrays[ArrayMesh.ARRAY_BONES] - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights = arrays[ArrayMesh.ARRAY_WEIGHTS] - - if arrays[ArrayMesh.ARRAY_INDEX] != null: - indices = arrays[ArrayMesh.ARRAY_INDEX] - - for i in range(vertices.size()): - if normals.size() > 0: - st.add_normal(normals[i]) - - if tangents.size() > 0: - var ti : int = i * 4 - st.add_tangent(Plane(tangents[ti], tangents[ti + 1], tangents[ti + 2], tangents[ti + 3])) - - if colors.size() > 0: - st.add_color(colors[i]) - - if uv.size() > 0: - st.add_uv(uv[i]) - - if uv2.size() > 0: - st.add_uv2(uv2[i]) - - if bones.size() > 0: - var bi : int = i * 4 - - var pia : PoolIntArray = PoolIntArray() - - pia.append(bones[bi]) - pia.append(bones[bi + 1]) - pia.append(bones[bi + 1]) - pia.append(bones[bi + 1]) - - st.add_bones(pia) - - if weights.size() > 0: - var bi : int = i * 4 - - var pia : PoolIntArray = PoolIntArray() - - pia.append(bones[bi]) - pia.append(bones[bi + 1]) - pia.append(bones[bi + 2]) - pia.append(bones[bi + 3]) - - st.add_weight(pia) - - st.add_vertex(vertices[i]) - - for ind in indices: - st.add_index(ind) - -static func generate_normals_arrs(arrays : Array) -> Array: - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return arrays - - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - var normals : PoolVector3Array = PoolVector3Array() - normals.resize(vertices.size()) - var nc : PoolIntArray = PoolIntArray() - nc.resize(vertices.size()) - - for i in range(vertices.size()): - nc[i] = 0 - - for i in range(0, indices.size(), 3): - var i0 : int = indices[i] - var i1 : int = indices[i + 1] - var i2 : int = indices[i + 2] - - var v0 : Vector3 = vertices[i0] - var v1 : Vector3 = vertices[i1] - var v2 : Vector3 = vertices[i2] - - var n = Plane(v0, v1, v2).normal - - if n.is_equal_approx(Vector3()): - print("Warning face's normal is zero! " + str(Vector3(i0, i1, i2))) - n = Vector3(0, 0, 1) - - if nc[i0] == 0: - nc[i0] = 1 - normals[i0] = n - else: - normals[i0] = lerp(normals[i0], n, 0.5).normalized() - - if nc[i1] == 0: - nc[i1] = 1 - normals[i1] = n - else: - normals[i1] = lerp(normals[i1], n, 0.5).normalized() - - if nc[i2] == 0: - nc[i2] = 1 - normals[i2] = n - else: - normals[i2] = lerp(normals[i2], n, 0.5).normalized() - - arrays[ArrayMesh.ARRAY_NORMAL] = normals - - return arrays - - -static func generate_normals_mdr(mdr : MeshDataResource) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - var normals : PoolVector3Array = PoolVector3Array() - normals.resize(vertices.size()) - var nc : PoolIntArray = PoolIntArray() - nc.resize(vertices.size()) - - for i in range(vertices.size()): - nc[i] = 0 - - for i in range(0, indices.size(), 3): - var i0 : int = indices[i] - var i1 : int = indices[i + 1] - var i2 : int = indices[i + 2] - - var v0 : Vector3 = vertices[i0] - var v1 : Vector3 = vertices[i1] - var v2 : Vector3 = vertices[i2] - - var n = Plane(v0, v1, v2).normal - - if n.is_equal_approx(Vector3()): - print("Warning face's normal is zero! " + str(Vector3(i0, i1, i2))) - n = Vector3(0, 0, 1) - - if nc[i0] == 0: - nc[i0] = 1 - normals[i0] = n - else: - normals[i0] = lerp(normals[i0], n, 0.5).normalized() - - if nc[i1] == 0: - nc[i1] = 1 - normals[i1] = n - else: - normals[i1] = lerp(normals[i1], n, 0.5).normalized() - - if nc[i2] == 0: - nc[i2] = 1 - normals[i2] = n - else: - normals[i2] = lerp(normals[i2], n, 0.5).normalized() - - arrays[ArrayMesh.ARRAY_NORMAL] = normals - mdr.array = arrays - -# Apparently surfacetool adds more verts during normal generation -# Keeping this here for now -static func generate_normals_surface_tool(mdr : MeshDataResource) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return - - var st : SurfaceTool = SurfaceTool.new() - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - add_into_surface_tool(mdr, st) - - st.generate_normals() - - mdr.array = st.commit_to_arrays() - -static func generate_tangents(mdr : MeshDataResource) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - arrays.resize(ArrayMesh.ARRAY_MAX) - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return - - var st : SurfaceTool = SurfaceTool.new() - st.begin(Mesh.PRIMITIVE_TRIANGLES) - - add_into_surface_tool(mdr, st) - - st.generate_tangents() - - mdr.array = st.commit_to_arrays() - -static func remove_used_vertices(arrays : Array) -> Array: - if arrays.size() != ArrayMesh.ARRAY_MAX: - return arrays - - if arrays[ArrayMesh.ARRAY_VERTEX] == null || arrays[ArrayMesh.ARRAY_INDEX] == null: - return arrays - - var vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size() - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - var unused_indices : PoolIntArray = PoolIntArray() - - for i in range(vert_size): - if !pool_int_arr_contains(indices, i): - unused_indices.append(i) - - remove_vertices(arrays, unused_indices) - - return arrays - - -static func remove_vertices(arrays : Array, indices : PoolIntArray) -> Array: - if indices.size() == 0: - return arrays - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - - var normals : PoolVector3Array - var tangents : PoolRealArray - var colors : PoolColorArray - var uv : PoolVector2Array - var uv2 : PoolVector2Array - var bones : PoolRealArray - var weights : PoolRealArray - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals = arrays[ArrayMesh.ARRAY_NORMAL] - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - tangents = arrays[ArrayMesh.ARRAY_TANGENT] - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors = arrays[ArrayMesh.ARRAY_COLOR] - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv = arrays[ArrayMesh.ARRAY_TEX_UV] - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2] - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones = arrays[ArrayMesh.ARRAY_BONES] - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights = arrays[ArrayMesh.ARRAY_WEIGHTS] - - for index in indices: - vertices.remove(index) - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals.remove(index) - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - var tindex : int = index * 4 - - tangents.remove(tindex) - tangents.remove(tindex) - tangents.remove(tindex) - tangents.remove(tindex) - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors.remove(index) - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv.remove(index) - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2.remove(index) - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones.remove(index) - bones.remove(index) - bones.remove(index) - bones.remove(index) - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights.remove(index) - weights.remove(index) - weights.remove(index) - weights.remove(index) - - #write back - arrays[ArrayMesh.ARRAY_VERTEX] = vertices - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - arrays[ArrayMesh.ARRAY_NORMAL] = normals - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - arrays[ArrayMesh.ARRAY_TANGENT] = tangents - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - arrays[ArrayMesh.ARRAY_COLOR] = colors - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - arrays[ArrayMesh.ARRAY_TEX_UV] = uv - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2 - - if arrays[ArrayMesh.ARRAY_BONES] != null: - arrays[ArrayMesh.ARRAY_BONES] = bones - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - arrays[ArrayMesh.ARRAY_WEIGHTS] = weights - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return arrays - - #udpate indices - var arr_indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - - var max_index : int = find_max(indices) - - for k in range(indices.size()): - for i in range(arr_indices.size()): - var ai : int = arr_indices[i] - - if ai >= max_index: - arr_indices[i] = ai - 1 - - max_index = find_max_capped(indices, max_index) - - arrays[ArrayMesh.ARRAY_INDEX] = arr_indices - - return arrays - -static func find_max(arr : PoolIntArray) -> int: - var m : int = arr[0] - - for v in arr: - if v > m: - m = v - - return m - -static func find_max_capped(arr : PoolIntArray, last : int) -> int: - var m : int = 0 - - for v in arr: - if v < last: - m = v - break - - for v in arr: - if v > m && v < last: - m = v - - return m - -static func order_seam_indices(arr : PoolIntArray) -> PoolIntArray: - var ret : PoolIntArray = PoolIntArray() - - if arr.size() == 0: - return ret - - for i in range(0, arr.size(), 2): - var index0 : int = arr[i] - var index1 : int = arr[i + 1] - - if index0 > index1: - var t : int = index1 - index1 = index0 - index0 = t - - ret.push_back(index0) - ret.push_back(index1) - - return ret - -static func add_seam_not_ordered(mdr : MeshDataResource, index0 : int, index1 : int) -> void: - if index0 > index1: - add_seam(mdr, index1, index0) - else: - add_seam(mdr, index0, index1) - -static func remove_seam_not_ordered(mdr : MeshDataResource, index0 : int, index1 : int) -> void: - if index0 > index1: - remove_seam(mdr, index1, index0) - else: - remove_seam(mdr, index0, index1) - -static func has_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> bool: - var seams : PoolIntArray = mdr.seams - - for i in range(0, seams.size(), 2): - if seams[i] == index0 && seams[i + 1] == index1: - return true - - return false - -static func add_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> void: - if has_seam(mdr, index0, index1): - return - - var seams : PoolIntArray = mdr.seams - seams.push_back(index0) - seams.push_back(index1) - mdr.seams = seams - -static func remove_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> void: - if !has_seam(mdr, index0, index1): - return - - var seams : PoolIntArray = mdr.seams - - for i in range(0, seams.size(), 2): - if seams[i] == index0 && seams[i + 1] == index1: - seams.remove(i) - seams.remove(i) - mdr.seams = seams - return - -static func is_verts_equal(v0 : Vector3, v1 : Vector3) -> bool: - return is_equal_approx(v0.x, v1.x) && is_equal_approx(v0.y, v1.y) && is_equal_approx(v0.z, v1.z) - - -static func points_to_seams(mdr : MeshDataResource, points : PoolVector3Array) -> void: - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_VERTEX] == null: - return - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - var seams : PoolIntArray = PoolIntArray() - - for i in range(0, points.size(), 2): - var p0 : Vector3 = points[i] - var p1 : Vector3 = points[i + 1] - - for j in range(0, indices.size(), 3): - var v0 : Vector3 = vertices[indices[j]] - var v1 : Vector3 = vertices[indices[j + 1]] - var v2 : Vector3 = vertices[indices[j + 2]] - - var p0_index : int = -1 - - if is_verts_equal(p0, v0): - p0_index = indices[j] - elif is_verts_equal(p0, v1): - p0_index = indices[j + 1] - elif is_verts_equal(p0, v2): - p0_index = indices[j + 2] - - if p0_index == -1: - continue - - var p1_index : int = -1 - - if is_verts_equal(p1, v0): - p1_index = indices[j] - elif is_verts_equal(p1, v1): - p1_index = indices[j + 1] - elif is_verts_equal(p1, v2): - p1_index = indices[j + 2] - - if p1_index == -1: - continue - - if p0_index == p1_index: - continue - - if p0_index > p1_index: - var t : int = p0_index - p0_index = p1_index - p1_index = t - - seams.push_back(p0_index) - seams.push_back(p1_index) - break - - mdr.seams = seams - -static func seams_to_points(mdr : MeshDataResource) -> PoolVector3Array: - var points : PoolVector3Array = PoolVector3Array() - - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return points - - if arrays[ArrayMesh.ARRAY_VERTEX] == null: - return points - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var seams : PoolIntArray = mdr.seams - - for s in seams: - points.push_back(vertices[s]) - - return points - -static func is_matching_seam(i0 : int, i1: int, si0 : int, si1: int) -> bool: - if i0 > i1: - var t : int = i0 - i0 = i1 - i1 = t - - return (i0 == si0) && (i1 == si1) - -static func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool: - for a in arr: - if a == val: - return true - - return false - - -class SeamTriangleHelper: - var i0 : int = 0 - var i1 : int = 0 - var i2 : int = 0 - var orig_index : int = 0 - var index_index : int = 0 - - var side_index_1 : int = 0 - var side_index_2 : int = 0 - var side_index_1_cut : bool = false - var side_index_2_cut : bool = false - - var processed : bool = false - - func get_other_side_index(index : int) -> int: - if side_index_1 == index: - return side_index_2 - else: - return side_index_1 - - func get_side_index(i : int) -> int: - if i == 1: - return side_index_1 - else: - return side_index_2 - - func get_side_index_cut() -> int: - if side_index_1_cut && side_index_2_cut: - return 3 - elif side_index_1_cut: - return 1 - elif side_index_2_cut: - return 2 - else: - return 0 - - func get_opposite_side_index_cut() -> int: - if side_index_1_cut && side_index_2_cut: - return 3 - elif side_index_1_cut: - return 2 - elif side_index_2_cut: - return 1 - else: - return 0 - - func is_side_index_cut(i : int) -> bool: - if i == 1: - return side_index_1_cut - else: - return side_index_2_cut - - func is_the_same(h : SeamTriangleHelper) -> bool: - return is_triangle(h.i0, h.i1, h.i2) - - func is_triangle(pi0 : int, pi1 : int, pi2 : int) -> bool: - if pi0 == i0 || pi0 == i1 || pi0 == i2: - if pi1 == i0 || pi1 == i1 || pi1 == i2: - if pi2 == i0 || pi2 == i1 || pi2 == i2: - return true - - return false - - func is_neighbour_to(index : int) -> bool: - return (side_index_1 == index) || (side_index_2 == index) - - func needs_to_be_cut_near(index : int) -> bool: - if (side_index_1 == index): - return side_index_1_cut - - if (side_index_2 == index): - return side_index_2_cut - - return false - - func has_cut() -> bool: - return side_index_1_cut || side_index_2_cut - - func both_sides_need_cut() -> bool: - return side_index_1_cut && side_index_2_cut - - func setup(pi0 : int, pi1 : int, pi2 : int, porig_ind : int, pindex_index : int, seams : PoolIntArray) -> void: - processed = false - i0 = pi0 - i1 = pi1 - i2 = pi2 - orig_index = porig_ind - index_index = pindex_index - - if porig_ind == pi0: - side_index_1 = pi1 - side_index_2 = pi2 - elif porig_ind == pi1: - side_index_1 = pi0 - side_index_2 = pi2 - elif porig_ind == pi2: - side_index_1 = pi1 - side_index_2 = pi0 - - determine_cuts(seams) - - func determine_cuts(seams : PoolIntArray) -> void: - if orig_index < side_index_1: - side_index_1_cut = check_cut(orig_index, side_index_1, seams) - else: - side_index_1_cut = check_cut(side_index_1, orig_index, seams) - - if orig_index < side_index_2: - side_index_2_cut = check_cut(orig_index, side_index_2, seams) - else: - side_index_2_cut = check_cut(side_index_2, orig_index, seams) - - func check_cut(ind0 : int, ind1 : int, seams : PoolIntArray) -> bool: - for stind in range(0, seams.size(), 2): - var si0 : int = seams[stind] - var si1 : int = seams[stind + 1] - - if (si0 == ind0) && (si1 == ind1): - return true - - return false - - func _to_string(): - return "[ TRI: " + str(i0) + ", " + str(i1) + ", " + str(i2) + " ]" - -static func apply_seam(mdr : MeshDataResource) -> void: - var points : PoolVector3Array = PoolVector3Array() - - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_VERTEX] == null: - return - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - var new_indices : PoolIntArray = PoolIntArray() - new_indices.append_array(indices) - - var seams : PoolIntArray = mdr.seams - - # Duplication happens later, as it requires lots of logic - var duplicate_verts_indices : PoolIntArray = PoolIntArray() - var new_vert_size : int = vertices.size() - - for i in range(vertices.size()): - # first check if vertex is a part of at least 2 edge seams - var test_seam_count : int = 0 - for s in seams: - if s == i: - test_seam_count += 1 - - if test_seam_count >= 2: - break - - if test_seam_count < 2: - continue - - # Collect all triangles that use this vertex as SeamTriangleHelpers - var triangles : Array = Array() - for j in range(indices.size()): - var i0 : int = indices[j] - - if i0 != i: - continue - - var tri_j_offset : int = j % 3 - var tri_start_index : int = j - tri_j_offset - - var i1 : int = indices[tri_start_index + ((tri_j_offset + 1) % 3)] - var i2 : int = indices[tri_start_index + ((tri_j_offset + 2) % 3)] - - var s : SeamTriangleHelper = SeamTriangleHelper.new() - s.setup(i0, i1, i2, i0, j, seams) - triangles.push_back(s) - - var triangle_arrays : Array = Array() - while true: - # First find a triangle that needs to be cut - var tri : SeamTriangleHelper = null - var tri_index : int = -1 - for it in range(triangles.size()): - tri = triangles[it] - - if tri.has_cut() && !tri.processed: - tri_index = it - break - - if tri_index == -1: - #done - break - - tri.processed = true - - if tri.both_sides_need_cut(): - triangle_arrays.push_back([ tri ]) - continue - - var collected_triangles : Array = Array() - collected_triangles.push_back(tri) - - # Find all neighbours and set them to processed + update the index for them - #var side_index : int = tri.get_side_index_cut() - var neighbour_tri : SeamTriangleHelper = tri - var find_neighbour_for_edge_index : int = tri.get_opposite_side_index_cut() - var find_neighbour_for_edge : int = neighbour_tri.get_side_index(find_neighbour_for_edge_index) - var tri_found : bool = true - while tri_found: - tri_found = false - - for ntri in triangles: - if ntri.processed: - continue - - if ntri.is_the_same(neighbour_tri): - continue - - if ntri.is_neighbour_to(find_neighbour_for_edge): - neighbour_tri = ntri - find_neighbour_for_edge = neighbour_tri.get_other_side_index(find_neighbour_for_edge) - - neighbour_tri.processed = true - tri_found = true - collected_triangles.push_back(neighbour_tri) - - if neighbour_tri.has_cut(): - # Done with this "strip" - tri_found = false - - break - - triangle_arrays.push_back(collected_triangles) - - # triangle_arrays is guaranteed to have at least 2 entries - # Skip processing the first strip, so we don't create unused verts - for tind in range(1, triangle_arrays.size()): - var tris : Array = triangle_arrays[tind] - - duplicate_verts_indices.push_back(tris[0].orig_index) - - for tri in tris: - new_indices[tri.index_index] = new_vert_size - - new_vert_size += 1 - - arrays[ArrayMesh.ARRAY_INDEX] = new_indices - - mdr.array = seam_apply_duplicate_vertices(arrays, duplicate_verts_indices) - - -static func apply_seam_old(mdr : MeshDataResource) -> void: - var points : PoolVector3Array = PoolVector3Array() - - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_VERTEX] == null: - return - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - - var seams : PoolIntArray = mdr.seams - - # Duplication happens later, as it requires lots of logic - var duplicate_verts_indices : PoolIntArray = PoolIntArray() - var new_vert_size : int = vertices.size() - - for i in range(0, seams.size(), 2): - var si0 : int = seams[i] - var si1 : int = seams[i + 1] - - var first : bool = true - for j in range(0, indices.size(), 3): - var i0 : int = indices[j] - var i1 : int = indices[j + 1] - var i2 : int = indices[j + 2] - - var edge_int_tri_index : int = -1 - - if is_matching_seam(i0, i1, si0, si1): - edge_int_tri_index = 0 - elif is_matching_seam(i1, i2, si0, si1): - edge_int_tri_index = 1 - elif is_matching_seam(i2, i0, si0, si1): - edge_int_tri_index = 2 - - if edge_int_tri_index == -1: - continue - - if first: - # Only split away the subsequent tris - first = false - continue - - if edge_int_tri_index == 0: - duplicate_verts_indices.push_back(i0) - duplicate_verts_indices.push_back(i1) - - indices.push_back(new_vert_size) - indices.push_back(new_vert_size + 1) - indices.push_back(i2) - elif edge_int_tri_index == 1: - duplicate_verts_indices.push_back(i1) - duplicate_verts_indices.push_back(i2) - - indices.push_back(i0) - indices.push_back(new_vert_size) - indices.push_back(new_vert_size + 1) - elif edge_int_tri_index == 2: - duplicate_verts_indices.push_back(i0) - duplicate_verts_indices.push_back(i2) - - indices.push_back(new_vert_size) - indices.push_back(i1) - indices.push_back(new_vert_size + 1) - - indices.remove(j) - indices.remove(j) - indices.remove(j) - j -= 3 - - new_vert_size += 2 - - arrays[ArrayMesh.ARRAY_INDEX] = indices - #mdr.array = arrays - - mdr.array = seam_apply_duplicate_vertices(arrays, duplicate_verts_indices) - -# This will not touch the indices! -static func seam_apply_duplicate_vertices(arrays : Array, duplicate_verts_indices : PoolIntArray) -> Array: - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - - var normals : PoolVector3Array - var tangents : PoolRealArray - var colors : PoolColorArray - var uv : PoolVector2Array - var uv2 : PoolVector2Array - var bones : PoolRealArray - var weights : PoolRealArray - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals = arrays[ArrayMesh.ARRAY_NORMAL] - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - tangents = arrays[ArrayMesh.ARRAY_TANGENT] - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors = arrays[ArrayMesh.ARRAY_COLOR] - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv = arrays[ArrayMesh.ARRAY_TEX_UV] - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2] - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones = arrays[ArrayMesh.ARRAY_BONES] - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights = arrays[ArrayMesh.ARRAY_WEIGHTS] - - - for index in duplicate_verts_indices: - vertices.push_back(vertices[index]) - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - normals.push_back(normals[index]) - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - tangents.push_back(tangents[index]) - tangents.push_back(tangents[index + 1]) - tangents.push_back(tangents[index + 2]) - tangents.push_back(tangents[index + 3]) - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - colors.push_back(colors[index]) - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - uv.push_back(uv[index]) - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - uv2.push_back(uv2[index]) - - if arrays[ArrayMesh.ARRAY_BONES] != null: - bones.push_back(bones[index]) - bones.push_back(bones[index + 1]) - bones.push_back(bones[index + 2]) - bones.push_back(bones[index + 3]) - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - weights.push_back(weights[index]) - weights.push_back(weights[index + 1]) - weights.push_back(weights[index + 2]) - weights.push_back(weights[index + 3]) - - #write back - - arrays[ArrayMesh.ARRAY_VERTEX] = vertices - - if arrays[ArrayMesh.ARRAY_NORMAL] != null: - arrays[ArrayMesh.ARRAY_NORMAL] = normals - - if arrays[ArrayMesh.ARRAY_TANGENT] != null: - arrays[ArrayMesh.ARRAY_TANGENT] = tangents - - if arrays[ArrayMesh.ARRAY_COLOR] != null: - arrays[ArrayMesh.ARRAY_COLOR] = colors - - if arrays[ArrayMesh.ARRAY_TEX_UV] != null: - arrays[ArrayMesh.ARRAY_TEX_UV] = uv - - if arrays[ArrayMesh.ARRAY_TEX_UV2] != null: - arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2 - - if arrays[ArrayMesh.ARRAY_BONES] != null: - arrays[ArrayMesh.ARRAY_BONES] = bones - - if arrays[ArrayMesh.ARRAY_WEIGHTS] != null: - arrays[ArrayMesh.ARRAY_WEIGHTS] = weights - - return arrays diff --git a/game/addons/mesh_data_resource_editor/utilities/mesh_decompose.gd b/game/addons/mesh_data_resource_editor/utilities/mesh_decompose.gd deleted file mode 100644 index f7d08c66..00000000 --- a/game/addons/mesh_data_resource_editor/utilities/mesh_decompose.gd +++ /dev/null @@ -1,263 +0,0 @@ -tool -extends Object - -#you can use MeshUtils.merge_mesh_array(arr) to get optimalized handle points. Just get the vertices from it. - -static func get_handle_vertex_to_vertex_map(arrays : Array, handle_points : PoolVector3Array) -> Array: - var handle_to_vertex_map : Array - handle_to_vertex_map.resize(handle_points.size()) - - if handle_points.size() == 0: - return handle_to_vertex_map - - if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null: - return handle_to_vertex_map - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - - if vertices.size() == 0: - return handle_to_vertex_map - - for i in range(handle_points.size()): - var hv : Vector3 = handle_points[i] - var iarr : PoolIntArray = PoolIntArray() - - #find all verts that have the same position as the handle - for j in range(vertices.size()): - var vn : Vector3 = vertices[j] - - if is_equal_approx(hv.x, vn.x) && is_equal_approx(hv.y, vn.y) && is_equal_approx(hv.z, vn.z): - iarr.append(j) - - handle_to_vertex_map[i] = iarr - - return handle_to_vertex_map - -#returns an array: -#index 0 is the handle_points -#index 1 is the handle_to_vertex_map -static func get_handle_edge_to_vertex_map(arrays : Array) -> Array: - var handle_to_vertex_map : Array - var handle_points : PoolVector3Array - - if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null: - return [ handle_points, handle_to_vertex_map ] - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - - if vertices.size() == 0: - return [ handle_points, handle_to_vertex_map ] - - var arr : Array = Array() - arr.resize(ArrayMesh.ARRAY_MAX) - arr[ArrayMesh.ARRAY_VERTEX] = arrays[ArrayMesh.ARRAY_VERTEX] - arr[ArrayMesh.ARRAY_INDEX] = arrays[ArrayMesh.ARRAY_INDEX] - - var optimized_arrays : Array = MeshUtils.merge_mesh_array(arr) - var optimized_verts : PoolVector3Array = optimized_arrays[ArrayMesh.ARRAY_VERTEX] - var optimized_indices : PoolIntArray = optimized_arrays[ArrayMesh.ARRAY_INDEX] - - var vert_to_optimized_vert_map : Array = get_handle_vertex_to_vertex_map(arrays, optimized_verts) - - var edge_map : Dictionary = Dictionary() - - for i in range(0, optimized_indices.size(), 3): - for j in range(3): - var i0 : int = optimized_indices[i + j] - var i1 : int = optimized_indices[i + ((j + 1) % 3)] - - var ei0 : int = min(i0, i1) - var ei1 : int = max(i0, i1) - - if !edge_map.has(ei0): - edge_map[ei0] = PoolIntArray() - - var etm : PoolIntArray = edge_map[ei0] - - var found : bool = false - for e in etm: - if e == ei1: - found = true - break - - if !found: - etm.append(ei1) - edge_map[ei0] = etm - - for key in edge_map.keys(): - var indices : PoolIntArray = edge_map[key] - - for indx in indices: - var ei0 : int = key - var ei1 : int = indx - - var v0 : Vector3 = optimized_verts[ei0] - var v1 : Vector3 = optimized_verts[ei1] - - var emid : Vector3 = lerp(v0, v1, 0.5) - handle_points.append(emid) - var hindx : int = handle_points.size() - 1 - - var vm0 : PoolIntArray = vert_to_optimized_vert_map[ei0] - var vm1 : PoolIntArray = vert_to_optimized_vert_map[ei1] - - var vm : PoolIntArray = PoolIntArray() - vm.append_array(vm0) - - for vi in vm1: - var found : bool = false - for vit in vm: - if vi == vit: - found = true - break - - if !found: - vm.append(vi) - - handle_to_vertex_map.append(vm) - - return [ handle_points, handle_to_vertex_map ] - -#returns an array: -#index 0 is the handle_points -#index 1 is the handle_to_vertex_map -static func get_handle_face_to_vertex_map(arrays : Array) -> Array: - var handle_to_vertex_map : Array - var handle_points : PoolVector3Array - - if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null: - return [ handle_points, handle_to_vertex_map ] - - var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] - - if vertices.size() == 0: - return [ handle_points, handle_to_vertex_map ] - - var arr : Array = Array() - arr.resize(ArrayMesh.ARRAY_MAX) - arr[ArrayMesh.ARRAY_VERTEX] = arrays[ArrayMesh.ARRAY_VERTEX] - arr[ArrayMesh.ARRAY_INDEX] = arrays[ArrayMesh.ARRAY_INDEX] - - var optimized_arrays : Array = MeshUtils.merge_mesh_array(arr) - var optimized_verts : PoolVector3Array = optimized_arrays[ArrayMesh.ARRAY_VERTEX] - var optimized_indices : PoolIntArray = optimized_arrays[ArrayMesh.ARRAY_INDEX] - - var vert_to_optimized_vert_map : Array = get_handle_vertex_to_vertex_map(arrays, optimized_verts) - - for i in range(0, optimized_indices.size(), 3): - var i0 : int = optimized_indices[i + 0] - var i1 : int = optimized_indices[i + 1] - var i2 : int = optimized_indices[i + 2] - - var v0 : Vector3 = optimized_verts[i0] - var v1 : Vector3 = optimized_verts[i1] - var v2 : Vector3 = optimized_verts[i2] - - var pmid : Vector3 = v0 + v1 + v2 - pmid /= 3 - handle_points.append(pmid) - - var vm0 : PoolIntArray = vert_to_optimized_vert_map[i0] - var vm1 : PoolIntArray = vert_to_optimized_vert_map[i1] - var vm2 : PoolIntArray = vert_to_optimized_vert_map[i2] - - var vm : PoolIntArray = PoolIntArray() - vm.append_array(vm0) - - for vi in vm1: - var found : bool = false - for vit in vm: - if vi == vit: - found = true - break - - if !found: - vm.append(vi) - - for vi in vm2: - var found : bool = false - for vit in vm: - if vi == vit: - found = true - break - - if !found: - vm.append(vi) - - handle_to_vertex_map.append(vm) - - return [ handle_points, handle_to_vertex_map ] - -static func calculate_map_midpoints(mesh : Array, vertex_map : Array) -> PoolVector3Array: - return PoolVector3Array() - -static func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool: - for a in arr: - if a == val: - return true - - return false - -static func partition_mesh(mdr : MeshDataResource) -> Array: - var partitions : Array = Array() - - var arrays : Array = mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return partitions - - if arrays[ArrayMesh.ARRAY_INDEX] == null: - return partitions - - var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] - - var triangle_count : int = indices.size() / 3 - var processed_triangles : PoolIntArray = PoolIntArray() - - while triangle_count != processed_triangles.size(): - var partition : PoolIntArray = PoolIntArray() - - var first : bool = true - var triangle_added : bool = true - while triangle_added: - triangle_added = false - for i in range(indices.size()): - var triangle_index : int = i / 3 - - if pool_int_arr_contains(processed_triangles, triangle_index): - continue - - if first: - first = false - - # We have to be at the 0th index of a triangle - partition.append(indices[i]) - partition.append(indices[i + 1]) - partition.append(indices[i + 2]) - - triangle_added = true - break - - var index : int = indices[i] - - if pool_int_arr_contains(partition, index): - processed_triangles.append(triangle_index) - - var tri_start_index : int = i - (i % 3) - - var i0 : int = indices[tri_start_index] - var i1 : int = indices[tri_start_index + 1] - var i2 : int = indices[tri_start_index + 2] - - partition.append(i0) - partition.append(i1) - partition.append(i2) - - triangle_added = true - break - - - partitions.append(partition) - - - return partitions diff --git a/game/addons/mesh_data_resource_editor/utilities/mesh_outline.gd b/game/addons/mesh_data_resource_editor/utilities/mesh_outline.gd deleted file mode 100644 index a32ddf79..00000000 --- a/game/addons/mesh_data_resource_editor/utilities/mesh_outline.gd +++ /dev/null @@ -1,167 +0,0 @@ -tool -extends Reference - -var marker_size : float = 0.05 - -var _mdr : MeshDataResource - -var lines : PoolVector3Array -var seam_lines : PoolVector3Array - -var _vertices : PoolVector3Array = PoolVector3Array() -var _normals : PoolVector3Array = PoolVector3Array() -var _indices : PoolIntArray = PoolIntArray() - -func setup(mdr : MeshDataResource) -> void: - _mdr = mdr - -func reset() -> void: - lines.resize(0) - seam_lines.resize(0) - _normals.resize(0) - _vertices.resize(0) - _indices.resize(0) - -func initialize() -> bool: - if !_mdr: - return false - - if _mdr.array.size() != ArrayMesh.ARRAY_MAX: - return false - - if _mdr.array[ArrayMesh.ARRAY_VERTEX] == null || _mdr.array[ArrayMesh.ARRAY_INDEX] == null: - return false - - var arr : Array = _mdr.array - - _vertices = arr[ArrayMesh.ARRAY_VERTEX] - - if _mdr.array[ArrayMesh.ARRAY_NORMAL] != null: - _normals = arr[ArrayMesh.ARRAY_NORMAL] - - _indices = arr[ArrayMesh.ARRAY_INDEX] - - if _vertices.size() == 0: - return false - - return true - -func get_vertex(index : int) -> Vector3: - if index > _vertices.size(): - return Vector3() - - var v : Vector3 = _vertices[index] - - # This should reduce z fighting - if _normals.size() > 0: - var n : Vector3 = _normals[index] - - v += n * 0.001 - - return v - -func generate(mark_outline : bool, mark_handles : bool): - reset() - - if !initialize(): - return - - if mark_outline: - for i in range(0, _indices.size(), 3): - for j in range(3): - lines.append(get_vertex(_indices[i + j])) - lines.append(get_vertex(_indices[i + ((j + 1) % 3)])) - - if mark_handles: - for i in range(_vertices.size()): - var v : Vector3 = get_vertex(i) - - var l : float = marker_size - - lines.append(v + Vector3(l, 0, 0)) - lines.append(v + Vector3(-l, 0, 0)) - lines.append(v + Vector3(0, 0, l)) - lines.append(v + Vector3(0, 0, -l)) - lines.append(v + Vector3(0, l, 0)) - lines.append(v + Vector3(0, -l, 0)) - - var seams : PoolIntArray = _mdr.seams - - for i in range(0, seams.size(), 2): - seam_lines.append(get_vertex(seams[i])) - seam_lines.append(get_vertex(seams[i + 1])) - -func generate_mark_edges(mark_outline : bool, mark_handles : bool): - reset() - - if !initialize(): - return - - for i in range(0, _indices.size(), 3): - for j in range(3): - var i0 : int = _indices[i + j] - var i1 : int = _indices[i + ((j + 1) % 3)] - - var v0 : Vector3 = get_vertex(i0) - var v1 : Vector3 = get_vertex(i1) - - if mark_outline: - lines.append(v0) - lines.append(v1) - - if mark_handles: - var pmid : Vector3 = lerp(v0, v1, 0.5) - var l : float = marker_size - - lines.append(pmid + Vector3(l, 0, 0)) - lines.append(pmid + Vector3(-l, 0, 0)) - lines.append(pmid + Vector3(0, 0, l)) - lines.append(pmid + Vector3(0, 0, -l)) - lines.append(pmid + Vector3(0, l, 0)) - lines.append(pmid + Vector3(0, -l, 0)) - - - var seams : PoolIntArray = _mdr.seams - - for i in range(0, seams.size(), 2): - seam_lines.append(get_vertex(seams[i])) - seam_lines.append(get_vertex(seams[i + 1])) - -func generate_mark_faces(mark_outline : bool, mark_handles : bool): - reset() - - if !initialize(): - return - - if mark_outline: - for i in range(0, _indices.size(), 3): - for j in range(3): - lines.append(get_vertex(_indices[i + j])) - lines.append(get_vertex(_indices[i + ((j + 1) % 3)])) - - if mark_handles: - for i in range(0, _indices.size(), 3): - var i0 : int = _indices[i + 0] - var i1 : int = _indices[i + 1] - var i2 : int = _indices[i + 2] - - var v0 : Vector3 = get_vertex(i0) - var v1 : Vector3 = get_vertex(i1) - var v2 : Vector3 = get_vertex(i2) - - var pmid : Vector3 = v0 + v1 + v2 - pmid /= 3 - var l : float = marker_size - - lines.append(pmid + Vector3(l, 0, 0)) - lines.append(pmid + Vector3(-l, 0, 0)) - lines.append(pmid + Vector3(0, 0, l)) - lines.append(pmid + Vector3(0, 0, -l)) - lines.append(pmid + Vector3(0, l, 0)) - lines.append(pmid + Vector3(0, -l, 0)) - - var seams : PoolIntArray = _mdr.seams - - for i in range(0, seams.size(), 2): - seam_lines.append(get_vertex(seams[i])) - seam_lines.append(get_vertex(seams[i + 1])) diff --git a/game/addons/mesh_data_resource_editor/uv_editor/RectEditor.gd b/game/addons/mesh_data_resource_editor/uv_editor/RectEditor.gd deleted file mode 100644 index b48f31f0..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/RectEditor.gd +++ /dev/null @@ -1,18 +0,0 @@ -tool -extends PanelContainer - -func set_plugin(plugin : EditorPlugin) -> void: - $ScrollContainer/MarginContainer/RectView.set_plugin(plugin) - -func set_mesh_data_resource(a : MeshDataResource) -> void: - $ScrollContainer/MarginContainer/RectView.set_mesh_data_resource(a) - -func set_mesh_data_instance(a : MeshDataInstance) -> void: - $ScrollContainer/MarginContainer/RectView.set_mesh_data_instance(a) - -func ok_pressed() -> void: - $ScrollContainer/MarginContainer/RectView.ok_pressed() - -func cancel_pressed() -> void: - $ScrollContainer/MarginContainer/RectView.cancel_pressed() - diff --git a/game/addons/mesh_data_resource_editor/uv_editor/RectView.gd b/game/addons/mesh_data_resource_editor/uv_editor/RectView.gd deleted file mode 100644 index a4877ee2..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/RectView.gd +++ /dev/null @@ -1,250 +0,0 @@ -tool -extends Control - -var MeshDecompose = preload("res://addons/mesh_data_resource_editor/utilities/mesh_decompose.gd") - -var rect_editor_node_scene : PackedScene = preload("res://addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn") - -export(NodePath) var zoom_widget_path : NodePath = "" - -export(NodePath) var mirror_horizontal_button_path : NodePath = "" -export(NodePath) var mirror_vertical_button_path : NodePath = "" - -export(NodePath) var rotate_left_button_path : NodePath = "" -export(NodePath) var rotate_amount_spinbox_path : NodePath = "" -export(NodePath) var rotate_right_button_path : NodePath = "" - -var _rect_scale : float = 1 - -var _mdr : MeshDataResource = null -var _background_texture : Texture = null - -var base_rect : Rect2 = Rect2(0, 0, 600, 600) -var edited_resource_current_size : Vector2 = Vector2() - -var _stored_uvs : PoolVector2Array = PoolVector2Array() - -var _plugin : EditorPlugin = null -var _undo_redo : UndoRedo = null - -var selected_rect : Control = null - -var rotation_amount : float = 45 - -func _enter_tree(): - var zoom_widget : Node = get_node_or_null(zoom_widget_path) - - if zoom_widget && !zoom_widget.is_connected("zoom_changed", self, "on_zoom_changed"): - zoom_widget.connect("zoom_changed", self, "on_zoom_changed") - - var mirror_horizontal_button : Button = get_node_or_null(mirror_horizontal_button_path) - if mirror_horizontal_button && !mirror_horizontal_button.is_connected("pressed", self, "on_mirror_horizontal_button_pressed"): - mirror_horizontal_button.connect("pressed", self, "on_mirror_horizontal_button_pressed") - - var mirror_vertical_button : Button = get_node_or_null(mirror_vertical_button_path) - if mirror_vertical_button && !mirror_vertical_button.is_connected("pressed", self, "on_mirror_vertical_button_pressed"): - mirror_vertical_button.connect("pressed", self, "on_mirror_vertical_button_pressed") - - var rotate_left_button : Button = get_node_or_null(rotate_left_button_path) - if rotate_left_button && !rotate_left_button.is_connected("pressed", self, "on_rotate_left_button_button_pressed"): - rotate_left_button.connect("pressed", self, "on_rotate_left_button_button_pressed") - - var rotate_amount_spinbox : SpinBox = get_node_or_null(rotate_amount_spinbox_path) - if rotate_amount_spinbox: - rotation_amount = rotate_amount_spinbox.value - if !rotate_amount_spinbox.is_connected("value_changed", self, "on_rotate_amount_spinbox_changed"): - rotate_amount_spinbox.connect("value_changed", self, "on_rotate_amount_spinbox_changed") - - var rotate_right_button : Button = get_node_or_null(rotate_right_button_path) - if rotate_right_button && !rotate_right_button.is_connected("pressed", self, "on_rotate_right_button_button_pressed"): - rotate_right_button.connect("pressed", self, "on_rotate_right_button_button_pressed") - - if !is_connected("visibility_changed", self, "on_visibility_changed"): - connect("visibility_changed", self, "on_visibility_changed") - -func on_mirror_horizontal_button_pressed() -> void: - if selected_rect && is_instance_valid(selected_rect): - selected_rect.mirror_horizontal() - -func on_mirror_vertical_button_pressed() -> void: - if selected_rect && is_instance_valid(selected_rect): - selected_rect.mirror_vertical() - -func on_rotate_left_button_button_pressed() -> void: - if selected_rect && is_instance_valid(selected_rect): - selected_rect.rotate_uvs(-rotation_amount) - -func on_rotate_amount_spinbox_changed(val : float) -> void: - rotation_amount = val - -func on_rotate_right_button_button_pressed() -> void: - if selected_rect && is_instance_valid(selected_rect): - selected_rect.rotate_uvs(rotation_amount) - -func set_plugin(plugin : EditorPlugin) -> void: - _plugin = plugin - - _undo_redo = _plugin.get_undo_redo() - -func on_visibility_changed() -> void: - if is_visible_in_tree(): - store_uvs() - call_deferred("refresh") - -func apply_zoom() -> void: - var rect : Rect2 = base_rect - edited_resource_current_size = rect.size - rect.position = rect.position * _rect_scale - rect.size = rect.size * _rect_scale - set_custom_minimum_size(rect.size) - - var p : MarginContainer = get_parent() as MarginContainer - - p.add_constant_override("margin_left", min(rect.size.x / 4.0, 50 * _rect_scale)) - p.add_constant_override("margin_right", min(rect.size.x / 4.0, 50 * _rect_scale)) - p.add_constant_override("margin_top", min(rect.size.y / 4.0, 50 * _rect_scale)) - p.add_constant_override("margin_bottom", min(rect.size.y / 4.0, 50 * _rect_scale)) - - for c in get_children(): - c.set_editor_rect_scale(_rect_scale) - -func on_zoom_changed(zoom : float) -> void: - _rect_scale = zoom - apply_zoom() - -func _draw(): - draw_rect(Rect2(Vector2(), get_size()), Color(0.2, 0.2, 0.2, 1)) - - if _background_texture: - draw_texture_rect_region(_background_texture, Rect2(Vector2(), get_size()), Rect2(Vector2(), _background_texture.get_size())) - -func refresh() -> void: - clear() - - var rect : Rect2 = base_rect - edited_resource_current_size = rect.size - rect.position = rect.position * _rect_scale - rect.size = rect.size * _rect_scale - set_custom_minimum_size(rect.size) - - apply_zoom() - - refresh_rects() - -func clear() -> void: - pass - -func refresh_rects() -> void: - clear_rects() - - if !_mdr: - return - - var partitions : Array = MeshDecompose.partition_mesh(_mdr) - - for p in partitions: - var s : Node = rect_editor_node_scene.instance() - - add_child(s) - s.set_editor_rect_scale(_rect_scale) - s.edited_resource_parent_size = edited_resource_current_size - s.set_edited_resource(_mdr, p) - -func clear_rects(): - for c in get_children(): - c.queue_free() - remove_child(c) - -func set_mesh_data_resource(a : MeshDataResource) -> void: - _mdr = a - -func set_mesh_data_instance(a : MeshDataInstance) -> void: - _background_texture = null - - if a: - _background_texture = a.texture - -func on_edited_resource_changed() -> void: - call_deferred("refresh") - -func get_uvs(mdr : MeshDataResource) -> PoolVector2Array: - if !_mdr: - return PoolVector2Array() - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return PoolVector2Array() - - if arrays[ArrayMesh.ARRAY_TEX_UV] == null: - return PoolVector2Array() - - return arrays[ArrayMesh.ARRAY_TEX_UV] - -func store_uvs() -> void: - _stored_uvs.resize(0) - - if !_mdr: - return - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_TEX_UV] == null: - return - - # Make sure it gets copied - _stored_uvs.append_array(arrays[ArrayMesh.ARRAY_TEX_UV]) - -func apply_uvs(mdr : MeshDataResource, stored_uvs : PoolVector2Array) -> void: - if !_mdr: - return - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_TEX_UV] == null: - return - - arrays[ArrayMesh.ARRAY_TEX_UV] = stored_uvs - - _mdr.array = arrays - -func ok_pressed() -> void: - _undo_redo.create_action("UV Editor Accept") - _undo_redo.add_do_method(self, "apply_uvs", _mdr, get_uvs(_mdr)) - _undo_redo.add_undo_method(self, "apply_uvs", _mdr, _stored_uvs) - _undo_redo.commit_action() - -func cancel_pressed() -> void: - if !_mdr: - return - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - # Make sure it gets copied - var uvs : PoolVector2Array = PoolVector2Array() - uvs.append_array(_stored_uvs) - - _undo_redo.create_action("UV Editor Cancel") - _undo_redo.add_do_method(self, "apply_uvs", _mdr, uvs) - _undo_redo.add_undo_method(self, "apply_uvs", _mdr, get_uvs(_mdr)) - _undo_redo.commit_action() - - _stored_uvs.resize(0) - -func set_selected(node : Control) -> void: - if selected_rect && is_instance_valid(selected_rect): - selected_rect.set_selected(false) - - selected_rect = node - - if selected_rect: - selected_rect.set_selected(true) diff --git a/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd b/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd deleted file mode 100644 index fa5eb106..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd +++ /dev/null @@ -1,418 +0,0 @@ -tool -extends MarginContainer - -enum DragType { - DRAG_NONE = 0, - DRAG_MOVE = 1, - DRAG_RESIZE_TOP = 1 << 1, - DRAG_RESIZE_RIGHT = 1 << 2, - DRAG_RESIZE_BOTTOM = 1 << 3, - DRAG_RESIZE_LEFT = 1 << 4 -}; - -var selected : bool = false - -var _mdr : MeshDataResource = null -var _indices : PoolIntArray = PoolIntArray() -var _uvs : PoolVector2Array = PoolVector2Array() -var _base_rect : Rect2 = Rect2(0, 0, 100, 100) -var _uv_min : Vector2 = Vector2() -var _uv_max : Vector2 = Vector2() - -var edited_resource_parent_size : Vector2 = Vector2() - -var _edited_resource_rect_border_color : Color = Color(0.8, 0.8, 0.8, 0.5) -var _edited_resource_rect_color : Color = Color(0.5, 0.5, 0.5, 0.2) -var _edited_resource_rect_selected_border_color : Color = Color(0.9, 0.9, 0.9, 0.8) -var _edited_resource_rect_selected_color : Color = Color(0.5, 0.5, 0.5, 0.4) -var _edited_resource_uv_mesh_color : Color = Color(1, 1, 1, 1) -var _editor_rect_border_size : int = 2 -var _edited_resource_font_color : Color = Color(0, 0, 0, 1) -var _editor_additional_text : String = "" - -var drag_type : int -var drag_offset : Vector2 -var drag_offset_far : Vector2 - -var _rect_scale : float = 1 - -func _draw(): - if selected: - draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_selected_color) - draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_selected_border_color, false, _editor_rect_border_size) - else: - draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_color) - draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_border_color, false, _editor_rect_border_size) - - if _mdr && _uvs.size() > 0: - var c : Color = _edited_resource_uv_mesh_color - - for i in range(0, len(_indices), 3): - draw_line(_uvs[_indices[i]] * get_size(), _uvs[_indices[i + 1]] * get_size(), c, 1, false) - draw_line(_uvs[_indices[i + 1]] * get_size(), _uvs[_indices[i + 2]] * get_size(), c, 1, false) - draw_line(_uvs[_indices[i + 2]] * get_size(), _uvs[_indices[i]] * get_size(), c, 1, false) - -func mirror_horizontal() -> void: - var pia : PoolIntArray = PoolIntArray() - for index in _indices: - var found : bool = false - - for i in pia: - if i == index: - found = true - break - - if found: - continue - - pia.append(index) - - var uv : Vector2 = _uvs[index] - uv.x = 1.0 - uv.x - _uvs.set(index, uv) - - apply_uv() - update() - -func mirror_vertical() -> void: - var pia : PoolIntArray = PoolIntArray() - for index in _indices: - var found : bool = false - - for i in pia: - if i == index: - found = true - break - - if found: - continue - - pia.append(index) - - var uv : Vector2 = _uvs[index] - uv.y = 1.0 - uv.y - _uvs.set(index, uv) - - apply_uv() - update() - -func rotate_uvs(amount : float) -> void: - var t : Transform2D = Transform2D(deg2rad(amount), Vector2()) - - var pia : PoolIntArray = PoolIntArray() - for index in _indices: - var found : bool = false - - for i in pia: - if i == index: - found = true - break - - if found: - continue - - pia.append(index) - - var uv : Vector2 = _uvs[index] - uv = t.xform(uv) - _uvs.set(index, uv) - - - re_normalize_uvs() - apply_uv() - update() - -func refresh() -> void: - if !_mdr: - return - - var rect : Rect2 = _base_rect - rect.position *= _rect_scale - rect.size *= _rect_scale - - rect_position = rect.position - rect_size = rect.size - - update() - -func set_editor_rect_scale(rect_scale) -> void: - _rect_scale = rect_scale - - refresh() - -func set_edited_resource(mdr : MeshDataResource, indices : PoolIntArray): - _mdr = mdr - _indices = indices - _uvs.resize(0) - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_TEX_UV] == null: - return - - # Make sure it gets copied - _uvs.append_array(arrays[ArrayMesh.ARRAY_TEX_UV]) - - set_up_base_rect() - - refresh() - -func set_up_base_rect() -> void: - _base_rect = Rect2() - - if !_mdr: - return - - if _uvs.size() == 0: - return - - var vmin : Vector2 = _uvs[_indices[0]] - var vmax : Vector2 = vmin - for i in range(1, _indices.size()): - var uv : Vector2 = _uvs[_indices[i]] - - if uv.x < vmin.x: - vmin.x = uv.x - - if uv.x > vmax.x: - vmax.x = uv.x - - if uv.y < vmin.y: - vmin.y = uv.y - - if uv.y > vmax.y: - vmax.y = uv.y - - _base_rect = Rect2(vmin.x, vmin.y, vmax.x - vmin.x, vmax.y - vmin.y) - _base_rect.position *= edited_resource_parent_size - _base_rect.size *= edited_resource_parent_size - - _uv_min = vmin - _uv_max = vmax - - normalize_uvs() - -func re_normalize_uvs() -> void: - if _uvs.size() == 0: - return - - var vmin : Vector2 = _uvs[_indices[0]] - var vmax : Vector2 = vmin - for i in range(1, _indices.size()): - var uv : Vector2 = _uvs[_indices[i]] - - if uv.x < vmin.x: - vmin.x = uv.x - - if uv.x > vmax.x: - vmax.x = uv.x - - if uv.y < vmin.y: - vmin.y = uv.y - - if uv.y > vmax.y: - vmax.y = uv.y - - var xmm : float = vmax.x - vmin.x - var ymm : float = vmax.y - vmin.y - - if xmm == 0: - xmm = 0.0000001 - - if ymm == 0: - ymm = 0.0000001 - - for i in range(_uvs.size()): - var uv : Vector2 = _uvs[i] - - uv.x -= vmin.x - uv.x /= xmm - - uv.y -= vmin.y - uv.y /= ymm - - _uvs[i] = uv - -func normalize_uvs() -> void: - var xmm : float = _uv_max.x - _uv_min.x - var ymm : float = _uv_max.y - _uv_min.y - - if xmm == 0: - xmm = 0.0000001 - - if ymm == 0: - ymm = 0.0000001 - - for i in range(_uvs.size()): - var uv : Vector2 = _uvs[i] - - uv.x -= _uv_min.x - uv.x /= xmm - - uv.y -= _uv_min.y - uv.y /= ymm - - _uvs[i] = uv - -func apply_uv() -> void: - if !_mdr: - return - - var rect : Rect2 = get_rect() - - #rect needs to be converted back - rect.position /= _rect_scale - rect.size /= _rect_scale - rect.position /= edited_resource_parent_size - rect.size /= edited_resource_parent_size - - var arrays : Array = _mdr.get_array() - - if arrays.size() != ArrayMesh.ARRAY_MAX: - return - - if arrays[ArrayMesh.ARRAY_TEX_UV] == null: - return - - var uvs : PoolVector2Array = arrays[ArrayMesh.ARRAY_TEX_UV] - - for index in _indices: - var uv : Vector2 = _uvs[index] - - uv = uv * rect.size + rect.position - - uvs[index] = uv - - _uv_min = rect.position - _uv_max = rect.position + rect.size - - _base_rect = get_rect() - - arrays[ArrayMesh.ARRAY_TEX_UV] = uvs - _mdr.array = arrays - - -#based on / ported from engine/scene/gui/dialogs.h and .cpp -func _notification(p_what : int) -> void: - if (p_what == NOTIFICATION_MOUSE_EXIT): - # Reset the mouse cursor when leaving the resizable window border. - if (_mdr && !drag_type): - if (get_default_cursor_shape() != CURSOR_ARROW): - set_default_cursor_shape(CURSOR_ARROW) - -#based on / ported from engine/scene/gui/dialogs.h and .cpp -func _gui_input(p_event : InputEvent) -> void: - if (p_event is InputEventMouseButton) && (p_event.get_button_index() == BUTTON_LEFT): - var mb : InputEventMouseButton = p_event as InputEventMouseButton - - if (mb.is_pressed()): - get_parent().set_selected(self) - - # Begin a possible dragging operation. - drag_type = _drag_hit_test(Vector2(mb.get_position().x, mb.get_position().y)) - - if (drag_type != DragType.DRAG_NONE): - drag_offset = get_global_mouse_position() - get_position() - - drag_offset_far = get_position() + get_size() - get_global_mouse_position() - - elif (drag_type != DragType.DRAG_NONE && !mb.is_pressed()): - # End a dragging operation. - - apply_uv() - - drag_type = DragType.DRAG_NONE - - if p_event is InputEventMouseMotion: - var mm : InputEventMouseMotion = p_event as InputEventMouseMotion - - if (drag_type == DragType.DRAG_NONE): - # Update the cursor while moving along the borders. - var cursor = CURSOR_ARROW - - var preview_drag_type : int = _drag_hit_test(Vector2(mm.get_position().x, mm.get_position().y)) - - var top_left : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_LEFT - var bottom_right : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_RIGHT - var top_right : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_RIGHT - var bottom_left : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_LEFT - - match (preview_drag_type): - DragType.DRAG_RESIZE_TOP: - cursor = CURSOR_VSIZE - DragType.DRAG_RESIZE_BOTTOM: - cursor = CURSOR_VSIZE - DragType.DRAG_RESIZE_LEFT: - cursor = CURSOR_HSIZE - DragType.DRAG_RESIZE_RIGHT: - cursor = CURSOR_HSIZE - top_left: - cursor = CURSOR_FDIAGSIZE - bottom_right: - cursor = CURSOR_FDIAGSIZE - top_right: - cursor = CURSOR_BDIAGSIZE - bottom_left: - cursor = CURSOR_BDIAGSIZE - - if (get_cursor_shape() != cursor): - set_default_cursor_shape(cursor); - - else: - # Update while in a dragging operation. - var global_pos : Vector2 = get_global_mouse_position() - - var rect : Rect2 = get_rect() - var min_size : Vector2 = get_combined_minimum_size() - - if (drag_type == DragType.DRAG_MOVE): - rect.position = global_pos - drag_offset - else: - if (drag_type & DragType.DRAG_RESIZE_TOP): - var bottom : int = rect.position.y + rect.size.y - var max_y : int = bottom - min_size.y - rect.position.y = min(global_pos.y - drag_offset.y, max_y) - rect.size.y = bottom - rect.position.y - elif (drag_type & DragType.DRAG_RESIZE_BOTTOM): - rect.size.y = global_pos.y - rect.position.y + drag_offset_far.y - - if (drag_type & DragType.DRAG_RESIZE_LEFT): - var right : int = rect.position.x + rect.size.x - var max_x : int = right - min_size.x - rect.position.x = min(global_pos.x - drag_offset.x, max_x) - rect.size.x = right - rect.position.x - elif (drag_type & DragType.DRAG_RESIZE_RIGHT): - rect.size.x = global_pos.x - rect.position.x + drag_offset_far.x - - set_size(rect.size) - set_position(rect.position) - -#based on / ported from engine/scene/gui/dialogs.h and .cpp -func _drag_hit_test(pos : Vector2) -> int: - var drag_type : int = DragType.DRAG_NONE - - var scaleborder_size : int = 5 #get_constant("scaleborder_size", "WindowDialog") - - var rect : Rect2 = get_rect() - - if (pos.y < (scaleborder_size)): - drag_type = DragType.DRAG_RESIZE_TOP - elif (pos.y >= (rect.size.y - scaleborder_size)): - drag_type = DragType.DRAG_RESIZE_BOTTOM - - if (pos.x < scaleborder_size): - drag_type |= DragType.DRAG_RESIZE_LEFT - elif (pos.x >= (rect.size.x - scaleborder_size)): - drag_type |= DragType.DRAG_RESIZE_RIGHT - - if (drag_type == DragType.DRAG_NONE): - drag_type = DragType.DRAG_MOVE - - return drag_type - -func set_selected(val : bool) -> void: - selected = val - update() diff --git a/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn b/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn deleted file mode 100644 index 3746ada0..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn +++ /dev/null @@ -1,11 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd" type="Script" id=1] - -[node name="RectViewNode" type="MarginContainer"] -margin_right = 1024.0 -margin_bottom = 600.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} diff --git a/game/addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn b/game/addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn deleted file mode 100644 index 2603514e..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn +++ /dev/null @@ -1,121 +0,0 @@ -[gd_scene load_steps=8 format=2] - -[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectEditor.gd" type="Script" id=1] -[ext_resource path="res://addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn" type="PackedScene" id=2] -[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectView.gd" type="Script" id=3] -[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_v_mirror.png" type="Texture" id=4] -[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_h_mirror.png" type="Texture" id=5] -[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_rot_right.png" type="Texture" id=6] -[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_rot_left.png" type="Texture" id=7] - -[node name="UVEditor" type="PanelContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ScrollContainer" type="ScrollContainer" parent="."] -margin_left = 7.0 -margin_top = 7.0 -margin_right = 1017.0 -margin_bottom = 593.0 - -[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"] -margin_right = 700.0 -margin_bottom = 700.0 -custom_constants/margin_right = 50 -custom_constants/margin_top = 50 -custom_constants/margin_left = 50 -custom_constants/margin_bottom = 50 - -[node name="RectView" type="Control" parent="ScrollContainer/MarginContainer"] -margin_left = 50.0 -margin_top = 50.0 -margin_right = 650.0 -margin_bottom = 650.0 -rect_min_size = Vector2( 600, 600 ) -script = ExtResource( 3 ) -zoom_widget_path = NodePath("../../../Control/HBoxContainer/EditorZoomWidget") -mirror_horizontal_button_path = NodePath("../../../Control/HBoxContainer/HorizontalMirror") -mirror_vertical_button_path = NodePath("../../../Control/HBoxContainer/VerticalMirror") -rotate_left_button_path = NodePath("../../../Control/HBoxContainer/RotLeft") -rotate_amount_spinbox_path = NodePath("../../../Control/HBoxContainer/SpinBox") -rotate_right_button_path = NodePath("../../../Control/HBoxContainer/RotRight") - -[node name="Control" type="VBoxContainer" parent="."] -margin_left = 7.0 -margin_top = 7.0 -margin_right = 1017.0 -margin_bottom = 593.0 -mouse_filter = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="Control"] -margin_right = 1010.0 -margin_bottom = 24.0 -mouse_filter = 2 -size_flags_horizontal = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="EditorZoomWidget" parent="Control/HBoxContainer" instance=ExtResource( 2 )] -anchor_right = 0.0 -anchor_bottom = 0.0 -margin_right = 115.0 -margin_bottom = 24.0 -custom_constants/separation = -8 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VSeparator2" type="VSeparator" parent="Control/HBoxContainer"] -margin_left = 119.0 -margin_right = 123.0 -margin_bottom = 24.0 - -[node name="HorizontalMirror" type="Button" parent="Control/HBoxContainer"] -margin_left = 127.0 -margin_right = 155.0 -margin_bottom = 24.0 -hint_tooltip = "Mirror the selected island horizontally.." -icon = ExtResource( 5 ) - -[node name="VerticalMirror" type="Button" parent="Control/HBoxContainer"] -margin_left = 159.0 -margin_right = 187.0 -margin_bottom = 24.0 -hint_tooltip = "Mirror the selected island vertically." -icon = ExtResource( 4 ) - -[node name="VSeparator" type="VSeparator" parent="Control/HBoxContainer"] -margin_left = 191.0 -margin_right = 195.0 -margin_bottom = 24.0 - -[node name="RotLeft" type="Button" parent="Control/HBoxContainer"] -margin_left = 199.0 -margin_right = 227.0 -margin_bottom = 24.0 -hint_tooltip = "Rotate left." -icon = ExtResource( 7 ) - -[node name="SpinBox" type="SpinBox" parent="Control/HBoxContainer"] -margin_left = 231.0 -margin_right = 305.0 -margin_bottom = 24.0 -hint_tooltip = "Rotate amount in degrees." -max_value = 360.0 -value = 45.0 -allow_greater = true -allow_lesser = true - -[node name="RotRight" type="Button" parent="Control/HBoxContainer"] -margin_left = 309.0 -margin_right = 337.0 -margin_bottom = 24.0 -hint_tooltip = "Rotate right." -icon = ExtResource( 6 ) diff --git a/game/addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd b/game/addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd deleted file mode 100644 index 32a9795a..00000000 --- a/game/addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd +++ /dev/null @@ -1,15 +0,0 @@ -tool -extends ConfirmationDialog - -func _enter_tree(): - if !is_connected("confirmed", self, "on_ok_pressed"): - connect("confirmed", self, "on_ok_pressed") - - if !get_cancel().is_connected("pressed", self, "on_cancel_pressed"): - get_cancel().connect("pressed", self, "on_cancel_pressed") - -func on_ok_pressed() -> void: - $UVEditor.ok_pressed() - -func on_cancel_pressed() -> void: - $UVEditor.cancel_pressed() diff --git a/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.gd b/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.gd deleted file mode 100644 index c0579b6c..00000000 --- a/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.gd +++ /dev/null @@ -1,218 +0,0 @@ -tool -extends HBoxContainer - -#This is a port of godot 4.0's EditorZoomWidget - -#/*************************************************************************/ -#/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -#/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -#/* */ -#/* 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. */ -#/*************************************************************************/ - -var zoom_minus : Button -var zoom_reset : Button -var zoom_plus : Button - -var EDSCALE : float = 1 - -export(float) var zoom : float = 1.0 setget set_zoom, get_zoom - -signal zoom_changed(zoom) - -func _init() -> void: - # Zoom buttons - zoom_minus = Button.new() - zoom_minus.set_flat(true) - add_child(zoom_minus) - zoom_minus.connect("pressed", self, "_button_zoom_minus") - zoom_minus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", tr("Zoom Out"), KEY_MASK_CMD | KEY_MINUS)) - zoom_minus.set_focus_mode(FOCUS_NONE) - - zoom_reset = Button.new() - zoom_reset.set_flat(true) - add_child(zoom_reset) - zoom_reset.add_constant_override("outline_size", 1) - zoom_reset.add_color_override("font_outline_color", Color(0, 0, 0)) - zoom_reset.add_color_override("font_color", Color(1, 1, 1)) - zoom_reset.connect("pressed", self, "_button_zoom_reset") - zoom_reset.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", tr("Zoom Reset"), KEY_MASK_CMD | KEY_0)) - zoom_reset.set_focus_mode(FOCUS_NONE) - #Prevent the button's size from changing when the text size changes - zoom_reset.set_custom_minimum_size(Vector2(75, 0)) - - zoom_plus = Button.new() - zoom_plus.set_flat(true) - add_child(zoom_plus) - zoom_plus.connect("pressed", self, "_button_zoom_plus") - zoom_plus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", tr("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)) # Usually direct access key for PLUS - zoom_plus.set_focus_mode(FOCUS_NONE) - - _update_zoom_label() - - add_constant_override("separation", round(-8)) - -func get_zoom() -> float: - return zoom - -func set_zoom(p_zoom : float) -> void: - if (p_zoom > 0 && p_zoom != zoom): - zoom = p_zoom; - _update_zoom_label(); - -func set_zoom_by_increments(p_increment_count : int, p_integer_only : bool) -> void: - # Remove editor scale from the index computation. - var zoom_noscale : float = zoom / max(1, EDSCALE) - var CMP_EPSILON : float = 0.00001 - - if (p_integer_only): - # Only visit integer scaling factors above 100%, and fractions with an integer denominator below 100% - # (1/2 = 50%, 1/3 = 33.33%, 1/4 = 25%, …). - # This is useful when working on pixel art projects to avoid distortion. - # This algorithm is designed to handle fractional start zoom values correctly - # (e.g. 190% will zoom up to 200% and down to 100%). - if (zoom_noscale + p_increment_count * 0.001 >= 1.0 - CMP_EPSILON): - # New zoom is certain to be above 100%. - if (p_increment_count >= 1): - # Zooming. - set_zoom(floor(zoom_noscale + p_increment_count) * max(1, EDSCALE)) - else: - # Dezooming. - set_zoom(ceil(zoom_noscale + p_increment_count) * max(1, EDSCALE)) - else: - if (p_increment_count >= 1): - # Zooming. Convert the current zoom into a denominator. - var new_zoom : float = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count) - if (is_equal_approx(zoom_noscale, new_zoom)): - # New zoom is identical to the old zoom, so try again. - # This can happen due to floating-point precision issues. - new_zoom = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count - 1) - - set_zoom(new_zoom * max(1, EDSCALE)); - else: - # Dezooming. Convert the current zoom into a denominator. - var new_zoom : float = 1.0 / floor(1.0 / zoom_noscale - p_increment_count) - if (is_equal_approx(zoom_noscale, new_zoom)): - # New zoom is identical to the old zoom, so try again. - # This can happen due to floating-point precision issues. - new_zoom = 1.0 / floor(1.0 / zoom_noscale - p_increment_count + 1) - - set_zoom(new_zoom * max(1, EDSCALE)) - else: - # Base increment factor defined as the twelveth root of two. - # This allow a smooth geometric evolution of the zoom, with the advantage of - # visiting all integer power of two scale factors. - # note: this is analogous to the 'semitones' interval in the music world - # In order to avoid numerical imprecisions, we compute and edit a zoom index - # with the following relation: zoom = 2 ^ (index / 12) - - if (zoom < CMP_EPSILON || p_increment_count == 0): - return - - # zoom = 2**(index/12) => log2(zoom) = index/12 - var closest_zoom_index : float = round(log(zoom_noscale) * 12.0 / log(2.0)) - - var new_zoom_index : float = closest_zoom_index + p_increment_count - var new_zoom : float = pow(2.0, new_zoom_index / 12.0) - - # Restore Editor scale transformation - new_zoom *= max(1, EDSCALE) - - set_zoom(new_zoom) - - -func _update_zoom_label() -> void: - var zoom_text : String = "" - - # The zoom level displayed is relative to the editor scale - # (like in most image editors). Its lower bound is clamped to 1 as some people - # lower the editor scale to increase the available real estate, - # even if their display doesn't have a particularly low DPI. - - if (zoom >= 10): - # Don't show a decimal when the zoom level is higher than 1000 %. - #zoom_text = (rtos(round((zoom / max(1, EDSCALE)) * 100))) + " %" - zoom_text = (String(round((zoom / max(1, EDSCALE)) * 100))) + " %" - else: - var v : float = (zoom / max(1, EDSCALE)) * 100 - var val : float = floor(v / 0.1 + 0.5) * 0.1 - -# zoom_text = (rtos(val)) + " %" - zoom_text = (String(val)) + " %" - - zoom_reset.set_text(zoom_text) - -func _button_zoom_minus() -> void: - set_zoom_by_increments(-6, Input.is_key_pressed(KEY_ALT)); - emit_signal("zoom_changed", zoom); - -func _button_zoom_reset() -> void: - set_zoom(1.0 * max(1, EDSCALE)); - emit_signal("zoom_changed", zoom); - -func _button_zoom_plus() -> void: - set_zoom_by_increments(6, Input.is_key_pressed(KEY_ALT)); - emit_signal("zoom_changed", zoom); - -func _notification(p_what : int) -> void: - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED): - zoom_minus.icon = get_icon("ZoomLess", "EditorIcons") - zoom_plus.icon = get_icon("ZoomMore", "EditorIcons") - -#from godot editor/editor_Settings.cpp -func ED_SHORTCUT(p_path : String, p_name : String, p_keycode : int, editor_settings : EditorSettings = null) -> ShortCut: - if OS.get_name() == "OSX": - # Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS - if (p_keycode == KEY_DELETE): - p_keycode = KEY_MASK_CMD | KEY_BACKSPACE - - var ie : InputEventKey = null - if (p_keycode): - ie = InputEventKey.new() - - ie.set_unicode(p_keycode & KEY_CODE_MASK) - ie.set_scancode(p_keycode & KEY_CODE_MASK) - ie.set_shift(bool(p_keycode & KEY_MASK_SHIFT)) - ie.set_alt(bool(p_keycode & KEY_MASK_ALT)) - ie.set_control(bool(p_keycode & KEY_MASK_CTRL)) - ie.set_metakey(bool(p_keycode & KEY_MASK_META)) - - if (!editor_settings): - var sc : ShortCut - sc = ShortCut.new() - sc.set_name(p_name) - sc.set_shortcut(ie) - sc.set_meta("original", ie) - return sc - - var sc : ShortCut = editor_settings.get_shortcut(p_path) - if (sc.is_valid()): - sc.set_name(p_name); #keep name (the ones that come from disk have no name) - sc.set_meta("original", ie); #to compare against changes - return sc; - - sc = ShortCut.new() - sc.set_name(p_name) - sc.set_shortcut(ie) - sc.set_meta("original", ie) #to compare against changes - editor_settings.add_shortcut(p_path, sc) - - return sc - diff --git a/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn b/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn deleted file mode 100644 index 5de87a91..00000000 --- a/game/addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn +++ /dev/null @@ -1,8 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.gd" type="Script" id=1] - -[node name="EditorZoomWidget" type="HBoxContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource( 1 ) diff --git a/game/addons/mesh_data_resource_editor/widgets/flex_grid_container.gd b/game/addons/mesh_data_resource_editor/widgets/flex_grid_container.gd deleted file mode 100644 index df4cb9ea..00000000 --- a/game/addons/mesh_data_resource_editor/widgets/flex_grid_container.gd +++ /dev/null @@ -1,207 +0,0 @@ -tool -extends Container - -#From https://github.com/EricEzaM/godot-color-palette - -# MIT License -# -# Copyright (c) 2020 Eric M -# -# 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. - - -var columns: int = 1 setget set_columns -var _min_x : int = 0 - -func _notification(p_what): - match p_what: - NOTIFICATION_SORT_CHILDREN: - var col_minw: Dictionary # Max of min_width of all controls in each col (indexed by col). - var row_minh: Dictionary # Max of min_height of all controls in each row (indexed by row). - var col_expanded: Array # Columns which have the SIZE_EXPAND flag set. - var row_expanded: Array # Rows which have the SIZE_EXPAND flag set. - - var hsep = get_constant("hseparation", "GridContainer") - var vsep = get_constant("vseparation", "GridContainer") - - var min_columns = 1 - _min_x = 0 - - if get_child_count() > 0: - min_columns = int(floor(rect_size.x / (get_child(0).get_combined_minimum_size().x + hsep))) - - self.columns = min_columns - - var max_col = min(get_child_count(), columns) - var max_row = ceil(float(get_child_count()) / float(columns)) - -# Compute the per-column/per-row data. - var valid_controls_index = 0 - for i in range(get_child_count()): - var c: Control = get_child(i) - if !c or !c.is_visible_in_tree(): - continue - - var row = valid_controls_index / columns - var col = valid_controls_index % columns - valid_controls_index += 1 - - var ms: Vector2 = c.get_combined_minimum_size() - - if _min_x < ms.x: - _min_x = ms.x - - if col_minw.has(col): - col_minw[col] = max(col_minw[col], ms.x) - else: - col_minw[col] = ms.x - if row_minh.has(row): - row_minh[row] = max(row_minh[row], ms.y) - else: - row_minh[row] = ms.y - - if c.get_h_size_flags() & SIZE_EXPAND: - col_expanded.push_front(col) - - if c.get_v_size_flags() & SIZE_EXPAND: - row_expanded.push_front(row) - -# Consider all empty columns expanded. - for i in range(valid_controls_index, columns): - col_expanded.push_front(i) - -# Evaluate the remaining space for expanded columns/rows. - var remaining_space: Vector2 = get_size() - - for e in col_minw.keys(): - if !col_expanded.has(e): - remaining_space.x -= col_minw.get(e) - - for e in row_minh.keys(): - if !row_expanded.has(e): - remaining_space.y -= row_minh.get(e) - - remaining_space.y -= vsep * max(max_row - 1, 0) - remaining_space.x -= hsep * max(max_col - 1, 0) - - var can_fit = false - while !can_fit && col_expanded.size() > 0: -# Check if all minwidth constraints are OK if we use the remaining space. - can_fit = true - var max_index = col_expanded.front() - - for e in col_expanded: - if col_minw.has(e): - if col_minw[e] > col_minw[max_index]: - max_index = e - if can_fit && (remaining_space.x / col_expanded.size()) < col_minw[e]: - can_fit = false - -# If not, the column with maximum minwidth is not expanded. - if (!can_fit): - col_expanded.erase(max_index) - remaining_space.x -= col_minw[max_index] - - can_fit = false - while !can_fit && row_expanded.size() > 0: -# Check if all minheight constraints are OK if we use the remaining space. - can_fit = true - var max_index = row_expanded.front() - - for e in row_expanded: - if row_minh[e] > row_minh[max_index]: - max_index = e - if can_fit && (remaining_space.y / row_expanded.size()) < row_minh[e]: - can_fit = false - -# If not, the row with maximum minheight is not expanded. - if (!can_fit): - row_expanded.erase(max_index) - remaining_space.y -= row_minh[max_index] - -# Finally, fit the nodes. - var col_expand = remaining_space.x / col_expanded.size() if col_expanded.size() > 0 else 0 - var row_expand = remaining_space.y / row_expanded.size() if row_expanded.size() > 0 else 0 - - var col_ofs = 0 - var row_ofs = 0 - - valid_controls_index = 0 - for i in range(get_child_count()): - var c: Control = get_child(i) - if (!c || !c.is_visible_in_tree()): - continue - var row = valid_controls_index / columns - var col = valid_controls_index % columns - valid_controls_index += 1 - - if (col == 0): - col_ofs = 0 - if (row > 0): - row_ofs += (row_expand if row_expanded.has(row - 1) else row_minh[row - 1]) + vsep - - var p = Vector2(col_ofs, row_ofs) - var s = Vector2(col_expand if col_expanded.has(col) else col_minw[col], row_expand if row_expanded.has(row) else row_minh[row]) - - fit_child_in_rect(c, Rect2(p, s)) - - col_ofs += s.x + hsep - - NOTIFICATION_THEME_CHANGED: - minimum_size_changed() - -func _get_minimum_size(): -# Only worry about max height, not width (since it does width automatically) - var row_minh: Dictionary - - var vsep = get_constant("vseparation", "GridContainer") - - var max_row = 0 - - var valid_controls_index = 0 - for i in range(get_child_count()): - - var c: Control = get_child(i) - if !c or !c.is_visible(): - continue - var row = valid_controls_index / columns - valid_controls_index += 1 - - var ms = c.get_combined_minimum_size() - - if row_minh.has(row): - row_minh[row] = max(row_minh[row], ms.y) - else: - row_minh[row] = ms.y - max_row = max(row, max_row) - - var ms: Vector2 - ms.x = _min_x - - for e in row_minh.keys(): - ms.y += row_minh.get(e) - - ms.y += vsep * max_row - - return ms - - -func set_columns(p_columns: int): - columns = p_columns - minimum_size_changed() diff --git a/game/project.pandemonium b/game/project.pandemonium index 1c0c1ae3..09161733 100644 --- a/game/project.pandemonium +++ b/game/project.pandemonium @@ -246,53 +246,53 @@ _global_script_classes=[ { "path": "res://addons/world_generator/resources/zone.gd" } ] _global_script_class_icons={ -@"GEBrighten": "", @"BrushPrefabs": "", -@"GameModule": "", -@"PlayerGD": "", -@"CharacterSkeketonAttachPoint": "", -@"WorldGeneratorSettings": "", -@"MMNode": "", -@"GECut": "", -@"GEBrush": "", +@"GEBrighten": "", @"GECanvas": "", -@"SpeedResource": "", -@"PlayerMaster": "", -@"MobGD": "", -@"WorldGenRaycast": "", -@"GEDarken": "", +@"GEBrush": "", +@"GECut": "", +@"MMNode": "", +@"WorldGeneratorSettings": "", +@"CharacterSkeketonAttachPoint": "", +@"PlayerGD": "", +@"GameModule": "", @"GELayer": "", -@"EntityDataGD": "", -@"EntityAIGD": "", -@"WorldGenWorld": "", -@"Continent": "", -@"GERect": "", -@"GEBucket": "", +@"GEDarken": "", +@"WorldGenRaycast": "", +@"MobGD": "", +@"PlayerMaster": "", +@"SpeedResource": "", @"GEAction": "", -@"SpellGD": "", -@"SpellEffectVisualBasic": "", +@"GEBucket": "", +@"GERect": "", +@"Continent": "", +@"WorldGenWorld": "", +@"EntityAIGD": "", +@"EntityDataGD": "", @"NetworkedPlayerGD": "", -@"TerrainWorldGenerator": "", -@"UIWindowModule": "", -@"Zone": "", +@"SpellEffectVisualBasic": "", +@"SpellGD": "", @"GELine": "", -@"ManaResource": "", -@"UIGuiChildModule": "", -@"Menu": "", -@"Main": "", -@"WorldGenBaseResource": "", -@"GEPasteCut": "", +@"Zone": "", +@"UIWindowModule": "", +@"TerrainWorldGenerator": "", @"GEUtils": "", -@"HealthResource": "", -@"ItemTemplateGD": "", -@"DisplayPlayerGD": "", -@"SubZone": "", -@"MMNodeUniversalProperty": "", +@"GEPasteCut": "", +@"WorldGenBaseResource": "", +@"Main": "", +@"Menu": "", +@"UIGuiChildModule": "", +@"ManaResource": "", @"GERainbow": "", -@"LayeredTextureMaker": "", -@"MMMateial": "", +@"MMNodeUniversalProperty": "", +@"SubZone": "", +@"DisplayPlayerGD": "", +@"ItemTemplateGD": "", +@"HealthResource": "", +@"GEMultiLine": "", @"GEPencil": "", -@"GEMultiLine": "" +@"MMMateial": "", +@"LayeredTextureMaker": "" } [application] @@ -344,7 +344,7 @@ window/size/ui_scale_touch=1.0 [editor_plugins] -enabled=PoolStringArray( "res://addons/Godoxel/plugin.cfg", "res://addons/data_manager/plugin.cfg", "res://addons/mat_maker_gd/plugin.cfg", "res://addons/mesh_data_resource_editor/plugin.cfg", "res://addons/world_generator/plugin.cfg" ) +enabled=PoolStringArray( "res://addons/Godoxel/plugin.cfg", "res://addons/data_manager/plugin.cfg", "res://addons/mat_maker_gd/plugin.cfg", "res://addons/world_generator/plugin.cfg" ) [ess]