Undo redo support for the uv editor.

This commit is contained in:
Relintai 2022-01-20 21:12:05 +01:00
parent 42918bc5fc
commit 62fc405cc5
4 changed files with 98 additions and 48 deletions

View File

@ -1,7 +1,7 @@
tool tool
extends Control extends Control
var plugin : EditorPlugin var _plugin : EditorPlugin
export var uv_preview_path : NodePath export var uv_preview_path : NodePath
export var uv_editor_path : NodePath export var uv_editor_path : NodePath
@ -13,6 +13,15 @@ func _enter_tree():
uv_preview = get_node(uv_preview_path) uv_preview = get_node(uv_preview_path)
uv_editor = get_node(uv_editor_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: func set_mesh_data_resource(a : MeshDataResource) -> void:
if uv_preview: if uv_preview:
uv_preview.set_mesh_data_resource(a) uv_preview.set_mesh_data_resource(a)
@ -67,18 +76,18 @@ func set_edit_mode_scale() -> void:
func on_edit_mode_translate_toggled(on : bool) -> void: func on_edit_mode_translate_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_translate(on) _plugin.set_translate(on)
func on_edit_mode_rotate_toggled(on : bool) -> void: func on_edit_mode_rotate_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_rotate(on) _plugin.set_rotate(on)
func on_edit_mode_scale_toggled(on : bool) -> void: func on_edit_mode_scale_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_scale(on) _plugin.set_scale(on)
#axis locks #axis locks
func get_axis_x() -> bool: func get_axis_x() -> bool:
@ -100,32 +109,32 @@ func set_axis_z(on : bool) -> void:
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed = on $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed = on
func on_axis_x_toggled(on : bool) -> void: func on_axis_x_toggled(on : bool) -> void:
if plugin: if _plugin:
plugin.set_axis_x(on) _plugin.set_axis_x(on)
func on_axis_y_toggled(on : bool) -> void: func on_axis_y_toggled(on : bool) -> void:
if plugin: if _plugin:
plugin.set_axis_y(on) _plugin.set_axis_y(on)
func on_axis_z_toggled(on : bool) -> void: func on_axis_z_toggled(on : bool) -> void:
if plugin: if _plugin:
plugin.set_axis_z(on) _plugin.set_axis_z(on)
#selection modes #selection modes
func on_selection_mode_vertex_toggled(on : bool) -> void: func on_selection_mode_vertex_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_selection_mode_vertex() _plugin.set_selection_mode_vertex()
func on_selection_mode_edge_toggled(on : bool) -> void: func on_selection_mode_edge_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_selection_mode_edge() _plugin.set_selection_mode_edge()
func on_selection_mode_face_toggled(on : bool) -> void: func on_selection_mode_face_toggled(on : bool) -> void:
if on: if on:
if plugin: if _plugin:
plugin.set_selection_mode_face() _plugin.set_selection_mode_face()
func set_selection_mode_vertex() -> void: func set_selection_mode_vertex() -> void:
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex.pressed = true $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex.pressed = true
@ -141,64 +150,64 @@ func _on_Extrude_pressed():
pass # Replace with function body. pass # Replace with function body.
func _on_AddBox_pressed(): func _on_AddBox_pressed():
plugin.add_box() _plugin.add_box()
func _on_UnwrapButton_pressed(): func _on_UnwrapButton_pressed():
plugin.uv_unwrap() _plugin.uv_unwrap()
func _on_add_triangle_pressed(): func _on_add_triangle_pressed():
plugin.add_triangle() _plugin.add_triangle()
func _on_add_quad_pressed(): func _on_add_quad_pressed():
plugin.add_quad() _plugin.add_quad()
func _on_split_pressed(): func _on_split_pressed():
plugin.split() _plugin.split()
func _on_connect_to_first_selected_pressed(): func _on_connect_to_first_selected_pressed():
plugin.onnect_to_first_selected() _plugin.onnect_to_first_selected()
func _on_connect_to_avg_pressed(): func _on_connect_to_avg_pressed():
plugin.connect_to_avg() _plugin.connect_to_avg()
func _on_connect_to_last_selected_pressed(): func _on_connect_to_last_selected_pressed():
plugin.connect_to_last_selected() _plugin.connect_to_last_selected()
func _on_disconnect_pressed(): func _on_disconnect_pressed():
plugin.disconnect_action() _plugin.disconnect_action()
func _on_add_triangle_at_pressed(): func _on_add_triangle_at_pressed():
plugin.add_triangle_at() _plugin.add_triangle_at()
func _on_add_auad_at_pressed(): func _on_add_auad_at_pressed():
plugin.add_quad_at() _plugin.add_quad_at()
func _oncreate_face_pressed(): func _oncreate_face_pressed():
plugin.create_face() _plugin.create_face()
func _on_delete_pressed(): func _on_delete_pressed():
plugin.delete_selected() _plugin.delete_selected()
func _on_GenNormals_pressed(): func _on_GenNormals_pressed():
plugin.generate_normals() _plugin.generate_normals()
func _on_RemDoubles_pressed(): func _on_RemDoubles_pressed():
plugin.remove_doubles() _plugin.remove_doubles()
func _on_MergeOptimize_pressed(): func _on_MergeOptimize_pressed():
plugin.merge_optimize() _plugin.merge_optimize()
func _on_GenTangents_pressed(): func _on_GenTangents_pressed():
plugin.generate_tangents() _plugin.generate_tangents()
func _on_mark_seam_pressed(): func _on_mark_seam_pressed():
plugin.mark_seam() _plugin.mark_seam()
func _on_unmark_seam_pressed(): func _on_unmark_seam_pressed():
plugin.unmark_seam() _plugin.unmark_seam()
func _on_apply_seams_pressed(): func _on_apply_seams_pressed():
plugin.apply_seam() _plugin.apply_seam()
func _on_uv_edit_pressed(): func _on_uv_edit_pressed():
$Popups/UVEditorPopup.popup_centered() $Popups/UVEditorPopup.popup_centered()

View File

@ -18,7 +18,7 @@ func _enter_tree():
gizmo_plugin = MdiGizmoPlugin.new() gizmo_plugin = MdiGizmoPlugin.new()
mdi_ed_gui = MDIEdGui.instance() mdi_ed_gui = MDIEdGui.instance()
mdi_ed_gui.plugin = self mdi_ed_gui.set_plugin(self)
active_gizmos = [] active_gizmos = []
gizmo_plugin.plugin = self gizmo_plugin.plugin = self

View File

@ -1,9 +1,8 @@
tool tool
extends PanelContainer extends PanelContainer
func _init(): func set_plugin(plugin : EditorPlugin) -> void:
# Control/EditorZoomWidget $ScrollContainer/MarginContainer/RectView.set_plugin(plugin)
pass
func set_mesh_data_resource(a : MeshDataResource) -> void: func set_mesh_data_resource(a : MeshDataResource) -> void:
$ScrollContainer/MarginContainer/RectView.set_mesh_data_resource(a) $ScrollContainer/MarginContainer/RectView.set_mesh_data_resource(a)
@ -16,3 +15,4 @@ func ok_pressed() -> void:
func cancel_pressed() -> void: func cancel_pressed() -> void:
$ScrollContainer/MarginContainer/RectView.cancel_pressed() $ScrollContainer/MarginContainer/RectView.cancel_pressed()

View File

@ -17,6 +17,9 @@ var edited_resource_current_size : Vector2 = Vector2()
var _stored_uvs : PoolVector2Array = PoolVector2Array() var _stored_uvs : PoolVector2Array = PoolVector2Array()
var _plugin : EditorPlugin = null
var _undo_redo : UndoRedo = null
func _enter_tree(): func _enter_tree():
var zoom_widget : Node = get_node_or_null(zoom_widget_path) var zoom_widget : Node = get_node_or_null(zoom_widget_path)
@ -29,6 +32,11 @@ func _enter_tree():
if !is_connected("visibility_changed", self, "on_visibility_changed"): if !is_connected("visibility_changed", self, "on_visibility_changed"):
connect("visibility_changed", self, "on_visibility_changed") connect("visibility_changed", self, "on_visibility_changed")
func set_plugin(plugin : EditorPlugin) -> void:
_plugin = plugin
_undo_redo = _plugin.get_undo_redo()
func on_visibility_changed() -> void: func on_visibility_changed() -> void:
if is_visible_in_tree(): if is_visible_in_tree():
store_uvs() store_uvs()
@ -110,6 +118,20 @@ func set_mesh_data_instance(a : MeshDataInstance) -> void:
func on_edited_resource_changed() -> void: func on_edited_resource_changed() -> void:
call_deferred("refresh") 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: func store_uvs() -> void:
_stored_uvs.resize(0) _stored_uvs.resize(0)
@ -127,10 +149,27 @@ func store_uvs() -> void:
# Make sure it gets copied # Make sure it gets copied
_stored_uvs.append_array(arrays[ArrayMesh.ARRAY_TEX_UV]) _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: func ok_pressed() -> void:
#todo undo redo _undo_redo.create_action("UV Editor Accept")
pass _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: func cancel_pressed() -> void:
if !_mdr: if !_mdr:
@ -144,8 +183,10 @@ func cancel_pressed() -> void:
# Make sure it gets copied # Make sure it gets copied
var uvs : PoolVector2Array = PoolVector2Array() var uvs : PoolVector2Array = PoolVector2Array()
uvs.append_array(_stored_uvs) uvs.append_array(_stored_uvs)
arrays[ArrayMesh.ARRAY_TEX_UV] = uvs
_mdr.array = arrays _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) _stored_uvs.resize(0)