Browse Source

Ensure move and slide snap respects stop on slope, fixes #26180

Juan Linietsky 6 years ago
parent
commit
9dfe3b6d9e
2 changed files with 11 additions and 0 deletions
  1. 6 0
      scene/2d/physics_body_2d.cpp
  2. 5 0
      scene/3d/physics_body.cpp

+ 6 - 0
scene/2d/physics_body_2d.cpp

@@ -1341,6 +1341,12 @@ Vector2 KinematicBody2D::move_and_slide_with_snap(const Vector2 &p_linear_veloci
 				on_floor = true;
 				on_floor_body = col.collider_rid;
 				floor_velocity = col.collider_vel;
+				if (p_stop_on_slope) {
+					// move and collide may stray the object a bit because of pre un-stucking,
+					// so only ensure that motion happens on floor direction in this case.
+					col.travel = p_floor_direction * p_floor_direction.dot(col.travel);
+				}
+
 			} else {
 				apply = false;
 			}

+ 5 - 0
scene/3d/physics_body.cpp

@@ -1288,6 +1288,11 @@ Vector3 KinematicBody::move_and_slide_with_snap(const Vector3 &p_linear_velocity
 				on_floor = true;
 				on_floor_body = col.collider_rid;
 				floor_velocity = col.collider_vel;
+				if (p_stop_on_slope) {
+					// move and collide may stray the object a bit because of pre un-stucking,
+					// so only ensure that motion happens on floor direction in this case.
+					col.travel = p_floor_direction * p_floor_direction.dot(col.travel);
+				}
 			} else {
 				apply = false; //snapped with floor direction, but did not snap to a floor, do not snap.
 			}