Parcourir la source

Added proper local transform snapping, closes #4985

Juan Linietsky il y a 8 ans
Parent
commit
5e1116da4c

+ 34 - 4
editor/plugins/spatial_editor_plugin.cpp

@@ -1190,17 +1190,47 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 							motion = motion_mask.dot(motion) * motion_mask;
 						}
 
+						//set_message("Translating: "+motion);
+
+						List<Node *> &selection = editor_selection->get_selected_node_list();
+
 						float snap = 0;
 
 						if (_edit.snap || spatial_editor->is_snap_enabled()) {
 
 							snap = spatial_editor->get_translate_snap();
-							motion.snap(Vector3(snap, snap, snap));
-						}
+							bool local_coords = spatial_editor->are_local_coords_enabled();
+
+							if (local_coords) {
+								bool multiple = false;
+								Spatial *node = NULL;
+								for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+
+									Spatial *sp = E->get()->cast_to<Spatial>();
+									if (!sp) {
+										continue;
+									}
+									if (node) {
+										multiple = true;
+										break;
+									} else {
+										node = sp;
+									}
+								}
 
-						//set_message("Translating: "+motion);
+								if (multiple) {
+									motion.snap(Vector3(snap, snap, snap));
+								} else {
+									Basis b = node->get_global_transform().basis.orthonormalized();
+									Vector3 local_motion = b.inverse().xform(motion);
+									local_motion.snap(Vector3(snap, snap, snap));
+									motion = b.xform(local_motion);
+								}
 
-						List<Node *> &selection = editor_selection->get_selected_node_list();
+							} else {
+								motion.snap(Vector3(snap, snap, snap));
+							}
+						}
 
 						for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
 

+ 2 - 0
editor/plugins/spatial_editor_plugin.h

@@ -514,6 +514,8 @@ public:
 	float get_rotate_snap() const { return snap_rotate->get_text().to_double(); }
 	float get_scale_snap() const { return snap_scale->get_text().to_double(); }
 
+	bool are_local_coords_enabled() const { return transform_menu->get_popup()->is_item_checked(transform_menu->get_popup()->get_item_index(SpatialEditor::MENU_TRANSFORM_LOCAL_COORDS)); }
+
 	Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; }
 	Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }