Turned the remaining mesh data resource editor gdscript classes into skeleton c++ classes.

This commit is contained in:
Relintai 2022-04-11 13:42:49 +02:00
parent 534d758c54
commit 8c1c9e53d1
13 changed files with 2161 additions and 1025 deletions

View File

@ -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()

View File

@ -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

View File

@ -1,7 +0,0 @@
[plugin]
name="mesh_data_resource_editor"
description=""
author="Relintai"
version="1.0"
script="plugin.gd"

View File

@ -1,3 +1,405 @@
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "mdi_ed.h"
void MDIEd::_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)
*/
}
void MDIEd::set_plugin(EditorPlugin *plugin) {
/*
_plugin = plugin
if uv_editor:
uv_editor.set_plugin(plugin)
*/
}
void MDIEd::set_mesh_data_resource(Ref<MeshDataResource> a) {
/*
if uv_preview:
uv_preview.set_mesh_data_resource(a)
if uv_editor:
uv_editor.set_mesh_data_resource(a)
*/
}
void MDIEd::set_mesh_data_instance(MeshDataInstance *a) {
/*
if uv_preview:
uv_preview.set_mesh_data_instance(a)
if uv_editor:
uv_editor.set_mesh_data_instance(a)
*/
}
void MDIEd::_unhandled_key_input(Ref<InputEventKey> event) {
/*
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
void MDIEd::set_edit_mode_translate() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Translate.pressed = true
*/
}
void MDIEd::set_edit_mode_rotate() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Rotate.pressed = true
*/
}
void MDIEd::set_edit_mode_scale() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Scale.pressed = true
*/
}
void MDIEd::on_edit_mode_translate_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_translate()
*/
}
void MDIEd::on_edit_mode_rotate_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_rotate()
*/
}
void MDIEd::on_edit_mode_scale_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_scale()
*/
}
//axis locks
bool MDIEd::get_axis_x() {
/*
return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed
*/
}
bool MDIEd::get_axis_y() {
/*
return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed
*/
}
bool MDIEd::get_axis_z() {
/*
return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed
*/
}
void MDIEd::set_axis_x(bool on) {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed = on
*/
}
void MDIEd::set_axis_y(bool on) {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed = on
*/
}
void MDIEd::set_axis_z(bool on) {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed = on
*/
}
void MDIEd::on_axis_x_toggled(bool on) {
/*
if _plugin:
_plugin.set_axis_x(on)
*/
}
void MDIEd::on_axis_y_toggled(bool on) {
/*
if _plugin:
_plugin.set_axis_y(on)
*/
}
void MDIEd::on_axis_z_toggled(bool on) {
/*
if _plugin:
_plugin.set_axis_z(on)
*/
}
//selection modes
void MDIEd::on_selection_mode_vertex_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_selection_mode_vertex()
*/
}
void MDIEd::on_selection_mode_edge_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_selection_mode_edge()
*/
}
void MDIEd::on_selection_mode_face_toggled(bool on) {
/*
if on:
if _plugin:
_plugin.set_selection_mode_face()
*/
}
void MDIEd::set_selection_mode_vertex() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex.pressed = true
*/
}
void MDIEd::set_selection_mode_edge() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge.pressed = true
*/
}
void MDIEd::set_selection_mode_face() {
/*
$VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face.pressed = true
*/
}
void MDIEd::_on_Extrude_pressed() {
/*
_plugin.extrude()
*/
}
void MDIEd::_on_AddBox_pressed() {
/*
_plugin.add_box()
*/
}
void MDIEd::_on_UnwrapButton_pressed() {
/*
_plugin.uv_unwrap()
*/
}
void MDIEd::_on_add_triangle_pressed() {
/*
_plugin.add_triangle()
*/
}
void MDIEd::_on_add_quad_pressed() {
/*
_plugin.add_quad()
*/
}
void MDIEd::_on_split_pressed() {
/*
_plugin.split()
*/
}
void MDIEd::_on_connect_to_first_selected_pressed() {
/*
_plugin.connect_to_first_selected()
*/
}
void MDIEd::_on_connect_to_avg_pressed() {
/*
_plugin.connect_to_avg()
*/
}
void MDIEd::_on_connect_to_last_selected_pressed() {
/*
_plugin.connect_to_last_selected()
*/
}
void MDIEd::_on_disconnect_pressed() {
/*
_plugin.disconnect_action()
*/
}
void MDIEd::_on_add_triangle_at_pressed() {
/*
_plugin.add_triangle_at()
*/
}
void MDIEd::_on_add_auad_at_pressed() {
/*
_plugin.add_quad_at()
*/
}
void MDIEd::_oncreate_face_pressed() {
/*
_plugin.create_face()
*/
}
void MDIEd::_on_delete_pressed() {
/*
_plugin.delete_selected()
*/
}
void MDIEd::_on_GenNormals_pressed() {
/*
_plugin.generate_normals()
*/
}
void MDIEd::_on_RemDoubles_pressed() {
/*
_plugin.remove_doubles()
*/
}
void MDIEd::_on_MergeOptimize_pressed() {
/*
_plugin.merge_optimize()
*/
}
void MDIEd::_on_GenTangents_pressed() {
/*
_plugin.generate_tangents()
*/
}
void MDIEd::_on_mark_seam_pressed() {
/*
_plugin.mark_seam()
*/
}
void MDIEd::_on_unmark_seam_pressed() {
/*
_plugin.unmark_seam()
*/
}
void MDIEd::_on_apply_seams_pressed() {
/*
_plugin.apply_seam()
*/
}
void MDIEd::_on_uv_edit_pressed() {
/*
$Popups/UVEditorPopup.popup_centered()
*/
}
void MDIEd::on_pivot_average_toggled(bool on) {
/*
if on:
_plugin.set_pivot_averaged()
*/
}
void MDIEd::on_pivot_mdi_origin_toggled(bool on) {
/*
if on:
_plugin.set_pivot_mdi_origin()
*/
}
void MDIEd::on_pivot_world_origin_toggled(bool on) {
/*
if on:
_plugin.set_pivot_world_origin()
*/
}
void MDIEd::on_visual_indicator_outline_toggled(bool on) {
/*
_plugin.visual_indicator_outline_set(on)
*/
}
void MDIEd::on_visual_indicator_seam_toggled(bool on) {
/*
_plugin.visual_indicator_seam_set(on)
*/
}
void MDIEd::on_visual_indicator_handle_toggled(bool on) {
/*
_plugin.visual_indicator_handle_set(on)
*/
}
void MDIEd::_on_select_all_pressed() {
/*
_plugin.select_all()
*/
}
void MDIEd::onhandle_selection_type_front_toggled(bool on) {
/*
if on:
_plugin.handle_selection_type_front()
*/
}
void MDIEd::onhandle_selection_type_back_toggled(bool on) {
/*
if on:
_plugin.handle_selection_type_back()
*/
}
void MDIEd::onhandle_selection_type_all_toggled(bool on) {
/*
if on:
_plugin.handle_selection_type_all()
*/
}
void MDIEd::_on_clean_mesh_pressed() {
/*
_plugin.clean_mesh()
*/
}
void MDIEd::_on_flip_face_pressed() {
/*
_plugin.flip_selected_faces()
*/
}
MDIEd::MDIEd() {
/*
[gd_scene load_steps=9 format=2]
[ext_resource path="res://addons/mesh_data_resource_editor/MDIEd.gd" type="Script" id=1]
@ -238,7 +640,7 @@ 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
hint_tooltip = "Only select handles that face away
the camera."
size_flags_horizontal = 3
toggle_mode = true
@ -767,3 +1169,13 @@ size_flags_vertical = 3
[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"]
*/
}
MDIEd::~MDIEd() {
}
void MDIEd::_bind_methods() {
}

View File

@ -0,0 +1,121 @@
#ifndef MDI_ED_H
#define MDI_ED_H
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "scene/gui/control.h"
class MDIEd : public Control {
GDCLASS(MDIEd, Control);
public:
void _enter_tree();
void set_plugin(EditorPlugin *plugin);
void set_mesh_data_resource(Ref<MeshDataResource> a);
void set_mesh_data_instance(MeshDataInstance *a);
void _unhandled_key_input(Ref<InputEventKey> event);
//Edit modes
void set_edit_mode_translate();
void set_edit_mode_rotate();
void set_edit_mode_scale();
void on_edit_mode_translate_toggled(bool on);
void on_edit_mode_rotate_toggled(bool on);
void on_edit_mode_scale_toggled(bool on);
//axis locks
bool get_axis_x();
bool get_axis_y();
bool get_axis_z();
void set_axis_x(bool on);
void set_axis_y(bool on);
void set_axis_z(bool on);
void on_axis_x_toggled(bool on);
void on_axis_y_toggled(bool on);
void on_axis_z_toggled(bool on);
//selection modes
void on_selection_mode_vertex_toggled(bool on);
void on_selection_mode_edge_toggled(bool on);
void on_selection_mode_face_toggled(bool on);
void set_selection_mode_vertex();
void set_selection_mode_edge();
void set_selection_mode_face();
void _on_Extrude_pressed();
void _on_AddBox_pressed();
void _on_UnwrapButton_pressed();
void _on_add_triangle_pressed();
void _on_add_quad_pressed();
void _on_split_pressed();
void _on_connect_to_first_selected_pressed();
void _on_connect_to_avg_pressed();
void _on_connect_to_last_selected_pressed();
void _on_disconnect_pressed();
void _on_add_triangle_at_pressed();
void _on_add_auad_at_pressed();
void _oncreate_face_pressed();
void _on_delete_pressed();
void _on_GenNormals_pressed();
void _on_RemDoubles_pressed();
void _on_MergeOptimize_pressed();
void _on_GenTangents_pressed();
void _on_mark_seam_pressed();
void _on_unmark_seam_pressed();
void _on_apply_seams_pressed();
void _on_uv_edit_pressed();
void on_pivot_average_toggled(bool on);
void on_pivot_mdi_origin_toggled(bool on);
void on_pivot_world_origin_toggled(bool on);
void on_visual_indicator_outline_toggled(bool on);
void on_visual_indicator_seam_toggled(bool on);
void on_visual_indicator_handle_toggled(bool on);
void _on_select_all_pressed();
void onhandle_selection_type_front_toggled(bool on);
void onhandle_selection_type_back_toggled(bool on);
void onhandle_selection_type_all_toggled(bool on);
void _on_clean_mesh_pressed();
void _on_flip_face_pressed();
MDIEd();
~MDIEd();
EditorPlugin *_plugin;
//export var uv_preview_path : NodePath
//export var uv_editor_path : NodePath
Node *uv_preview;
Node *uv_editor;
protected:
static void _bind_methods();
};
#endif

View File

@ -1,289 +1,431 @@
tool
extends EditorPlugin
/*
Copyright (c) 2019-2022 Péter Magyar
const MDRMeshUtils = preload("res://addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd")
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:
const MdiGizmoPlugin = preload("res://addons/mesh_data_resource_editor/MDIGizmoPlugin.gd")
const MDIEdGui = preload("res://addons/mesh_data_resource_editor/MDIEd.tscn")
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
var gizmo_plugin = MdiGizmoPlugin.new()
var mdi_ed_gui : Control
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 active_gizmos : Array
#include "mdi_ed_plugin.h"
var current_mesh_data_instance : MeshDataInstance = null
func _enter_tree():
void MDIEdPlugin::_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():
add_spatial_gizmo_plugin(gizmo_plugin)
set_input_event_forwarding_always_enabled()
*/
}
void MDIEdPlugin::_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):
bool MDIEdPlugin::handles(Object *object) {
/*
#print("disable_plugin")
if object is MeshDataInstance:
return true
return false
func edit(object):
return false
*/
}
void MDIEdPlugin::edit(Object *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):
current_mesh_data_instance = mdi
*/
}
void MDIEdPlugin::make_visible(bool 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():
void MDIEdPlugin::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):
void MDIEdPlugin::register_gizmo(MDIGizmo *gizmo) {
/*
active_gizmos.append(gizmo)
*/
}
void MDIEdPlugin::unregister_gizmo(MDIGizmo *gizmo) {
/*
for i in range(active_gizmos.size()):
if active_gizmos[i] == gizmo:
active_gizmos.remove(i)
return
*/
}
func set_translate() -> void:
void MDIEdPlugin::set_translate() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.set_translate()
func set_scale() -> void:
*/
}
void MDIEdPlugin::set_scale() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.set_scale()
func set_rotate() -> void:
*/
}
void MDIEdPlugin::set_rotate() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.set_rotate()
func set_axis_x(on : bool) -> void:
*/
}
void MDIEdPlugin::set_axis_x(bool on) {
/*
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:
*/
}
void MDIEdPlugin::set_axis_y(bool on) {
/*
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:
*/
}
void MDIEdPlugin::set_axis_z(bool on) {
/*
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:
void MDIEdPlugin::set_selection_mode_vertex() {
/*
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:
*/
}
void MDIEdPlugin::set_selection_mode_edge() {
/*
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:
*/
}
void MDIEdPlugin::set_selection_mode_face() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.set_selection_mode_face()
*/
}
func get_mdr() -> MeshDataResource:
Ref<MeshDataResource> MDIEdPlugin::get_mdr() {
/*
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):
bool MDIEdPlugin::forward_spatial_gui_input(int index, Camera *camera, const Ref<InputEvent> &p_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:
void MDIEdPlugin::add_box() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.add_box()
func add_triangle() -> void:
*/
}
void MDIEdPlugin::add_triangle() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.add_triangle()
func add_quad() -> void:
*/
}
void MDIEdPlugin::add_quad() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.add_quad()
*/
}
func add_triangle_at() -> void:
void MDIEdPlugin::add_triangle_at() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.add_triangle_at()
func add_quad_at() -> void:
*/
}
void MDIEdPlugin::add_quad_at() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.add_quad_at()
*/
}
func split():
void MDIEdPlugin::split() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.split()
*/
}
func connect_action():
void MDIEdPlugin::connect_action() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.connect_action()
func disconnect_action():
*/
}
void MDIEdPlugin::disconnect_action() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.disconnect_action()
*/
}
func create_face():
void MDIEdPlugin::create_face() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.create_face()
func delete_selected():
*/
}
void MDIEdPlugin::delete_selected() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.delete_selected()
*/
}
func generate_normals():
void MDIEdPlugin::generate_normals() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.generate_normals()
func remove_doubles():
*/
}
void MDIEdPlugin::remove_doubles() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.remove_doubles()
func merge_optimize():
*/
}
void MDIEdPlugin::merge_optimize() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.merge_optimize()
func generate_tangents():
*/
}
void MDIEdPlugin::generate_tangents() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.generate_tangents()
func connect_to_first_selected():
*/
}
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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():
void MDIEdPlugin::mark_seam() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.mark_seam()
func unmark_seam():
*/
}
void MDIEdPlugin::unmark_seam() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.unmark_seam()
func apply_seam():
*/
}
void MDIEdPlugin::apply_seam() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.apply_seam()
*/
}
func uv_unwrap() -> void:
void MDIEdPlugin::uv_unwrap() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.uv_unwrap()
func set_pivot_averaged():
*/
}
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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):
*/
}
void MDIEdPlugin::visual_indicator_outline_set(bool on) {
/*
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):
*/
}
void MDIEdPlugin::visual_indicator_seam_set(bool on) {
/*
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):
*/
}
void MDIEdPlugin::visual_indicator_handle_set(bool on) {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.visual_indicator_handle_set(on)
*/
}
func select_all():
void MDIEdPlugin::select_all() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.select_all()
*/
}
func handle_selection_type_front():
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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():
*/
}
void MDIEdPlugin::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():
void MDIEdPlugin::extrude() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.extrude()
func clean_mesh():
*/
}
void MDIEdPlugin::clean_mesh() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.clean_mesh()
func flip_selected_faces():
*/
}
void MDIEdPlugin::flip_selected_faces() {
/*
if current_mesh_data_instance && current_mesh_data_instance.gizmo:
current_mesh_data_instance.gizmo.flip_selected_faces()
*/
}
MDIEdPlugin::MDIEdPlugin() {
/*
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
*/
}
MDIEdPlugin::~MDIEdPlugin() {
}
void MDIEdPlugin::_bind_methods() {
}

View File

@ -0,0 +1,131 @@
#ifndef MDI_ED_PLUGIN_H
#define MDI_ED_PLUGIN_H
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "editor/editor_plugin.h"
#include "core/os/input_event.h"
class Camera;
class MDIGizmo;
class MeshDataResource;
class MdiGizmoPlugin;
class MeshDataInstance;
class MDIEdPlugin : public EditorPlugin {
GDCLASS(MDIEdPlugin, EditorPlugin);
public:
void _enter_tree();
void _exit_tree();
bool handles(Object *object);
void edit(Object *object);
void make_visible(bool visible);
void get_plugin_name();
void register_gizmo(MDIGizmo *gizmo);
void unregister_gizmo(MDIGizmo *gizmo);
void set_translate();
void set_scale();
void set_rotate();
void set_axis_x(bool on);
void set_axis_y(bool on);
void set_axis_z(bool on);
void set_selection_mode_vertex();
void set_selection_mode_edge();
void set_selection_mode_face();
Ref<MeshDataResource> get_mdr();
bool forward_spatial_gui_input(int index, Camera *camera, const Ref<InputEvent> &p_event);
void add_box();
void add_triangle();
void add_quad();
void add_triangle_at();
void add_quad_at();
void split();
void connect_action();
void disconnect_action();
void create_face();
void delete_selected();
void generate_normals();
void remove_doubles();
void merge_optimize();
void generate_tangents();
void connect_to_first_selected();
void connect_to_avg();
void connect_to_last_selected();
void mark_seam();
void unmark_seam();
void apply_seam();
void uv_unwrap();
void set_pivot_averaged();
void set_pivot_mdi_origin();
void set_pivot_world_origin();
void visual_indicator_outline_set(bool on);
void visual_indicator_seam_set(bool on);
void visual_indicator_handle_set(bool on);
void select_all();
void handle_selection_type_front();
void handle_selection_type_back();
void handle_selection_type_all();
void extrude();
void clean_mesh();
void flip_selected_faces();
MDIEdPlugin();
~MDIEdPlugin();
MdiGizmoPlugin *gizmo_plugin;
Control mdi_ed_gui;
Array active_gizmos;
Ref<MeshDataInstance> current_mesh_data_instance;
protected:
static void _bind_methods();
};
#endif

View File

@ -0,0 +1,243 @@
#ifndef MDI_GIZMO_H
#define MDI_GIZMO_H
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "editor/plugins/spatial_editor_plugin.h"
#include "core/pool_vector.h"
#include "core/variant.h"
#include "core/math/vector3.h"
#include "core/reference.h"
#include "core/math/basis.h"
#include "core/math/transform.h"
class Camera;
class MeshDataResource;
class MeshOutlineGenerator;
class InputEvent;
class EditorPlugin;
class UndoRedo;
class MDIGizmo : public EditorSpatialGizmo {
GDCLASS(MDIGizmo, EditorSpatialGizmo);
public:
enum EditMode {
EDIT_MODE_NONE = 0,
EDIT_MODE_TRANSLATE = 1,
EDIT_MODE_SCALE = 2,
EDIT_MODE_ROTATE = 3
};
enum AxisConstraint {
AXIS_CONSTRAINT_X = 1 << 0,
AXIS_CONSTRAINT_Y = 1 << 1,
AXIS_CONSTRAINT_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,
};
void setup();
void set_editor_plugin(EditorPlugin *editor_plugin);
void set_handle(int index, Camera *camera, Vector2 point);
void redraw();
void apply();
void select_all();
bool selection_click(int index, Camera *camera, const Ref<InputEvent> &event);
bool is_point_visible(Vector3 point_orig, Vector3 camera_pos, Transform gt);
void selection_click_select_front_or_back(int index, Camera *camera, const Ref<InputEvent> &event);
void selection_click_select_through(int index, Camera *camera, const Ref<InputEvent> &event);
void selection_drag(int index, Camera *camera, const Ref<InputEvent> &event);
void selection_drag_rect_select_front_back(int index, Camera *camera, const Ref<InputEvent> &event);
void selection_drag_rect_select_through(int index, Camera *camera, const Ref<InputEvent> &event);
bool forward_spatial_gui_input(int index, Camera *camera, const Ref<InputEvent> &event);
void add_to_all_selected(Vector3 ofs);
void mul_all_selected_with_basis(Basis b);
void mul_all_selected_with_transform(Transform t);
void mul_all_selected_with_transform_acc(Transform t);
void set_translate();
void set_scale();
void set_rotate();
void set_edit_mode(int em);
void set_axis_x(bool on);
void set_axis_y(bool on);
void set_axis_z(bool on);
void set_selection_mode_vertex();
void set_selection_mode_edge();
void set_selection_mode_face();
void _notification(int what);
void recalculate_handle_points();
void on_mesh_data_resource_changed(Ref<MeshDataResource> mdr);
void on_mdr_changed();
void disable_change_event();
void enable_change_event(bool update = true);
void add_triangle();
void add_quad();
bool is_verts_equal(Vector3 v0, Vector3 v1);
Vector3 find_other_vertex_for_edge(int edge, Vector3 v0);
Array split_edge_indices(int edge);
bool pool_int_arr_contains(PoolIntArray arr, int val);
PoolIntArray find_triangles_for_edge(int edge);
int find_first_triangle_for_edge(int edge);
void add_triangle_to_edge(int edge);
void add_quad_to_edge(int edge);
void add_triangle_at();
void add_quad_at();
void extrude();
void add_box();
void split();
void disconnect_action();
int get_first_triangle_index_for_vertex(int indx);
void create_face();
Array split_face_indices(int face);
int find_first_triangle_index_for_face(int face);
void delete_selected();
void generate_normals();
void generate_tangents();
void remove_doubles();
void merge_optimize();
void connect_to_first_selected();
void connect_to_avg();
void connect_to_last_selected();
PoolIntArray get_first_index_pair_for_edge(int edge);
PoolIntArray get_all_index_pairs_for_edge(int edge);
void mark_seam();
void unmark_seam();
void set_seam(Ref<MeshDataResource> mdr, PoolIntArray arr);
void apply_seam();
void clean_mesh();
void uv_unwrap();
void flip_selected_faces();
void add_mesh_change_undo_redo(Array orig_arr, Array new_arr, String action_name);
void add_mesh_seam_change_undo_redo(Array orig_arr, PoolIntArray orig_seams, Array new_arr, PoolIntArray new_seams, String action_name);
void apply_mesh_change(Ref<MeshDataResource> mdr, Array arr);
void apply_vertex_array(Ref<MeshDataResource> mdr, PoolVector3Array verts);
Array copy_arrays(Array arr);
PoolIntArray copy_pool_int_array(PoolIntArray pia);
PoolVector3Array copy_mdr_verts_array();
void setup_op_drag_indices();
Vector3 get_drag_op_pivot();
void select_handle_points(PoolVector3Array points);
void set_pivot_averaged();
void set_pivot_mdi_origin();
void set_pivot_world_origin();
void transfer_state_from(EditorSpatialGizmo *other);
void visual_indicator_outline_set(bool on);
void visual_indicator_seam_set(bool on);
void visual_indicator_handle_set(bool on);
void handle_selection_type_front();
void handle_selection_type_back();
void handle_selection_type_all();
MDIGizmo();
~MDIGizmo();
float gizmo_size;
int edit_mode;
int pivot_type;
int axis_constraint;
int selection_mode;
int handle_selection_type;
bool visual_indicator_outline;
bool visual_indicator_seam;
bool visual_indicator_handle;
Vector2 previous_point;
Vector3 _last_known_camera_facing;
bool _rect_drag;
Vector2 _rect_drag_start_point;
float _rect_drag_min_ofset;
Ref<MeshDataResource> _mdr;
PoolVector3Array _vertices;
PoolIntArray _indices;
PoolVector3Array _handle_points;
Array _handle_to_vertex_map;
PoolIntArray _selected_points;
Ref<MeshOutlineGenerator> _mesh_outline_generator;
bool _handle_drag_op;
PoolVector3Array _drag_op_orig_verices;
PoolIntArray _drag_op_indices;
Vector3 _drag_op_accumulator;
Quat _drag_op_accumulator_quat;
Vector3 _drag_op_pivot;
EditorPlugin *_editor_plugin;
UndoRedo *_undo_redo;
protected:
static void _bind_methods();
};
#endif

View File

@ -0,0 +1,63 @@
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "mdi_gizmo_plugin.h"
String MDIGizmoPlugin::get_name() const {
return "MDIGizmo";
}
int MDIGizmoPlugin::get_priority() const {
return 100;
}
bool MDIGizmoPlugin::is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
return EditorSpatialGizmoPlugin::is_handle_highlighted(p_gizmo, p_idx);
}
Ref<EditorSpatialGizmo> MDIGizmoPlugin::create_gizmo(Spatial *p_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
*/
}
MDIGizmoPlugin::MDIGizmoPlugin() {
plugin = nullptr;
create_material("main", Color(0.7, 0.7, 0.7));
create_material("seam", Color(1, 0, 0), false, true);
create_handle_material("handles");
}
MDIGizmoPlugin::~MDIGizmoPlugin() {
}
void MDIGizmoPlugin::_bind_methods() {
}

View File

@ -0,0 +1,49 @@
#ifndef MDI_GIZMO_PLUGIN_H
#define MDI_GIZMO_PLUGIN_H
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "editor/plugins/spatial_editor_plugin.h"
class MDIEdPlugin;
class MDIGizmoPlugin : public EditorSpatialGizmoPlugin {
GDCLASS(MDIGizmoPlugin, EditorSpatialGizmoPlugin);
public:
void _init();
String get_name() const;
int get_priority() const;
bool is_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
MDIGizmoPlugin();
~MDIGizmoPlugin();
MDIEdPlugin *plugin;
protected:
Ref<EditorSpatialGizmo> create_gizmo(Spatial *p_spatial);
static void _bind_methods();
};
#endif

View File

@ -1,63 +1,102 @@
tool
extends Control
/*
Copyright (c) 2019-2022 Péter Magyar
var mesh_data_resource : MeshDataResource = null setget set_mesh_data_resource
var background_texture : Texture = null
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:
func set_mesh_data_resource(a : MeshDataResource):
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "mdi_ed_uv_editor.h"
void MDIEdUVEditor::set_mesh_data_resource(Ref<MeshDataResource> a) {
/*
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):
*/
}
void MDIEdUVEditor::set_mesh_data_instance(MeshDataInstance *a) {
/*
if !a:
background_texture = null
background_texture = a.texture
func on_mdr_changed():
update()
*/
}
void MDIEdUVEditor::on_mdr_changed() {
update();
}
void MDIEdUVEditor::_draw() {
/*
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)
*/
}
MDIEdUVEditor::MDIEdUVEditor() {
}
MDIEdUVEditor::~MDIEdUVEditor() {
}
void MDIEdUVEditor::_bind_methods() {
}

View File

@ -0,0 +1,53 @@
#ifndef MDI_ED_UV_EDITOR_H
#define MDI_ED_UV_EDITOR_H
/*
Copyright (c) 2019-2022 Péter Magyar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "scene/gui/control.h"
#include "core/reference.h"
class MeshDataResource;
class MeshDataInstance;
class Texture;
class MDIEdUVEditor : public Control {
GDCLASS(MDIEdUVEditor, Control);
public:
void set_mesh_data_resource(Ref<MeshDataResource> a);
void set_mesh_data_instance(MeshDataInstance *a);
void on_mdr_changed();
void _draw();
MDIEdUVEditor();
~MDIEdUVEditor();
protected:
static void _bind_methods();
Ref<MeshDataResource> mesh_data_resource;
Ref<Texture> background_texture;
};
#endif