Added proper local transform snapping, closes #4985
This commit is contained in:
parent
1939e83a65
commit
5e1116da4c
2 changed files with 37 additions and 5 deletions
|
@ -1190,17 +1190,47 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
|
||||||
motion = motion_mask.dot(motion) * motion_mask;
|
motion = motion_mask.dot(motion) * motion_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//set_message("Translating: "+motion);
|
||||||
|
|
||||||
|
List<Node *> &selection = editor_selection->get_selected_node_list();
|
||||||
|
|
||||||
float snap = 0;
|
float snap = 0;
|
||||||
|
|
||||||
if (_edit.snap || spatial_editor->is_snap_enabled()) {
|
if (_edit.snap || spatial_editor->is_snap_enabled()) {
|
||||||
|
|
||||||
snap = spatial_editor->get_translate_snap();
|
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()) {
|
for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
|
||||||
|
|
||||||
|
|
|
@ -514,6 +514,8 @@ public:
|
||||||
float get_rotate_snap() const { return snap_rotate->get_text().to_double(); }
|
float get_rotate_snap() const { return snap_rotate->get_text().to_double(); }
|
||||||
float get_scale_snap() const { return snap_scale->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_move_gizmo(int idx) const { return move_gizmo[idx]; }
|
||||||
Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }
|
Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue