Fix newly introduced potential crashes in mesh data resource editor.

This commit is contained in:
Relintai 2022-08-20 02:13:09 +02:00
parent a426e173f5
commit 5925b62b2c

View File

@ -64,8 +64,11 @@ String MDIEdPlugin::get_name() const {
void MDIEdPlugin::set_gizmo_visible(const bool visible) { void MDIEdPlugin::set_gizmo_visible(const bool visible) {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
g->set_visible(visible);
current_mesh_data_instance->set_transform_gizmo_visible(!visible); if (g.is_valid()) {
g->set_visible(visible);
current_mesh_data_instance->set_transform_gizmo_visible(!visible);
}
} }
} }
@ -157,18 +160,27 @@ EditorPlugin::AfterGUIInput MDIEdPlugin::forward_spatial_gui_input(Camera *camer
void MDIEdPlugin::add_box() { void MDIEdPlugin::add_box() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->add_box(); g->add_box();
} }
} }
void MDIEdPlugin::add_triangle() { void MDIEdPlugin::add_triangle() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->add_triangle(); g->add_triangle();
} }
} }
void MDIEdPlugin::add_quad() { void MDIEdPlugin::add_quad() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->add_quad(); g->add_quad();
} }
} }
@ -176,12 +188,18 @@ void MDIEdPlugin::add_quad() {
void MDIEdPlugin::add_triangle_at() { void MDIEdPlugin::add_triangle_at() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->add_triangle_at(); g->add_triangle_at();
} }
} }
void MDIEdPlugin::add_quad_at() { void MDIEdPlugin::add_quad_at() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->add_quad_at(); g->add_quad_at();
} }
} }
@ -189,6 +207,9 @@ void MDIEdPlugin::add_quad_at() {
void MDIEdPlugin::split() { void MDIEdPlugin::split() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->split(); g->split();
} }
} }
@ -196,6 +217,9 @@ void MDIEdPlugin::split() {
void MDIEdPlugin::disconnect_action() { void MDIEdPlugin::disconnect_action() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->disconnect_action(); g->disconnect_action();
} }
} }
@ -203,12 +227,18 @@ void MDIEdPlugin::disconnect_action() {
void MDIEdPlugin::create_face() { void MDIEdPlugin::create_face() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->create_face(); g->create_face();
} }
} }
void MDIEdPlugin::delete_selected() { void MDIEdPlugin::delete_selected() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->delete_selected(); g->delete_selected();
} }
} }
@ -216,24 +246,36 @@ void MDIEdPlugin::delete_selected() {
void MDIEdPlugin::generate_normals() { void MDIEdPlugin::generate_normals() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->generate_normals(); g->generate_normals();
} }
} }
void MDIEdPlugin::remove_doubles() { void MDIEdPlugin::remove_doubles() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->remove_doubles(); g->remove_doubles();
} }
} }
void MDIEdPlugin::merge_optimize() { void MDIEdPlugin::merge_optimize() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->merge_optimize(); g->merge_optimize();
} }
} }
void MDIEdPlugin::generate_tangents() { void MDIEdPlugin::generate_tangents() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->generate_tangents(); g->generate_tangents();
} }
} }
@ -241,18 +283,27 @@ void MDIEdPlugin::generate_tangents() {
void MDIEdPlugin::connect_to_first_selected() { void MDIEdPlugin::connect_to_first_selected() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->connect_to_first_selected(); g->connect_to_first_selected();
} }
} }
void MDIEdPlugin::connect_to_avg() { void MDIEdPlugin::connect_to_avg() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->connect_to_avg(); g->connect_to_avg();
} }
} }
void MDIEdPlugin::connect_to_last_selected() { void MDIEdPlugin::connect_to_last_selected() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->connect_to_last_selected(); g->connect_to_last_selected();
} }
} }
@ -260,18 +311,27 @@ void MDIEdPlugin::connect_to_last_selected() {
void MDIEdPlugin::mark_seam() { void MDIEdPlugin::mark_seam() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->mark_seam(); g->mark_seam();
} }
} }
void MDIEdPlugin::unmark_seam() { void MDIEdPlugin::unmark_seam() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->unmark_seam(); g->unmark_seam();
} }
} }
void MDIEdPlugin::apply_seam() { void MDIEdPlugin::apply_seam() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->apply_seam(); g->apply_seam();
} }
} }
@ -279,6 +339,9 @@ void MDIEdPlugin::apply_seam() {
void MDIEdPlugin::uv_unwrap() { void MDIEdPlugin::uv_unwrap() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->uv_unwrap(); g->uv_unwrap();
} }
} }
@ -286,18 +349,27 @@ void MDIEdPlugin::uv_unwrap() {
void MDIEdPlugin::set_pivot_averaged() { void MDIEdPlugin::set_pivot_averaged() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->set_pivot_averaged(); g->set_pivot_averaged();
} }
} }
void MDIEdPlugin::set_pivot_mdi_origin() { void MDIEdPlugin::set_pivot_mdi_origin() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->set_translate(); g->set_translate();
} }
} }
void MDIEdPlugin::set_pivot_world_origin() { void MDIEdPlugin::set_pivot_world_origin() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->set_pivot_world_origin(); g->set_pivot_world_origin();
} }
} }
@ -305,18 +377,27 @@ void MDIEdPlugin::set_pivot_world_origin() {
void MDIEdPlugin::visual_indicator_outline_set(bool on) { void MDIEdPlugin::visual_indicator_outline_set(bool on) {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->visual_indicator_outline_set(on); g->visual_indicator_outline_set(on);
} }
} }
void MDIEdPlugin::visual_indicator_seam_set(bool on) { void MDIEdPlugin::visual_indicator_seam_set(bool on) {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->visual_indicator_seam_set(on); g->visual_indicator_seam_set(on);
} }
} }
void MDIEdPlugin::visual_indicator_handle_set(bool on) { void MDIEdPlugin::visual_indicator_handle_set(bool on) {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->visual_indicator_handle_set(on); g->visual_indicator_handle_set(on);
} }
} }
@ -324,6 +405,9 @@ void MDIEdPlugin::visual_indicator_handle_set(bool on) {
void MDIEdPlugin::select_all() { void MDIEdPlugin::select_all() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->select_all(); g->select_all();
} }
} }
@ -331,18 +415,27 @@ void MDIEdPlugin::select_all() {
void MDIEdPlugin::handle_selection_type_front() { void MDIEdPlugin::handle_selection_type_front() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->handle_selection_type_front(); g->handle_selection_type_front();
} }
} }
void MDIEdPlugin::handle_selection_type_back() { void MDIEdPlugin::handle_selection_type_back() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->handle_selection_type_back(); g->handle_selection_type_back();
} }
} }
void MDIEdPlugin::handle_selection_type_all() { void MDIEdPlugin::handle_selection_type_all() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->handle_selection_type_all(); g->handle_selection_type_all();
} }
} }
@ -350,12 +443,18 @@ void MDIEdPlugin::handle_selection_type_all() {
void MDIEdPlugin::extrude() { void MDIEdPlugin::extrude() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->extrude(); g->extrude();
} }
} }
void MDIEdPlugin::clean_mesh() { void MDIEdPlugin::clean_mesh() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->clean_mesh(); g->clean_mesh();
} }
} }
@ -363,11 +462,18 @@ void MDIEdPlugin::clean_mesh() {
void MDIEdPlugin::flip_selected_faces() { void MDIEdPlugin::flip_selected_faces() {
if (current_mesh_data_instance) { if (current_mesh_data_instance) {
Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance); Ref<MDIGizmo> g = get_gizmo_from(current_mesh_data_instance);
if (!g.is_valid()) {
return;
}
g->flip_selected_faces(); g->flip_selected_faces();
} }
} }
Ref<MDIGizmo> MDIEdPlugin::get_gizmo_from(MeshDataInstance *mdi) { Ref<MDIGizmo> MDIEdPlugin::get_gizmo_from(MeshDataInstance *mdi) {
if (!mdi) {
return Ref<MDIGizmo>();
}
Vector<Ref<SpatialGizmo>> gizmos = mdi->get_gizmos(); Vector<Ref<SpatialGizmo>> gizmos = mdi->get_gizmos();
for (int i = 0; i < gizmos.size(); ++i) { for (int i = 0; i < gizmos.size(); ++i) {
@ -378,7 +484,7 @@ Ref<MDIGizmo> MDIEdPlugin::get_gizmo_from(MeshDataInstance *mdi) {
} }
} }
return Ref<SpatialGizmo>(); return Ref<MDIGizmo>();
} }
MDIEdPlugin::MDIEdPlugin(EditorNode *p_node) { MDIEdPlugin::MDIEdPlugin(EditorNode *p_node) {