apply a threshold for floor angle, fixes #16037, fixes #15632

This commit is contained in:
Juan Linietsky 2018-08-10 13:06:34 -03:00
parent c76f444c4e
commit c02fb271fd
2 changed files with 10 additions and 4 deletions

View file

@ -1204,6 +1204,9 @@ bool KinematicBody2D::move_and_collide(const Vector2 &p_motion, bool p_infinite_
return colliding; return colliding;
} }
//so, if you pass 45 as limit, avoid numerical precision erros when angle is 45.
#define FLOOR_ANGLE_THRESHOLD 0.01
Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction, bool p_infinite_inertia, float p_slope_stop_min_velocity, int p_max_slides, float p_floor_max_angle) { Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction, bool p_infinite_inertia, float p_slope_stop_min_velocity, int p_max_slides, float p_floor_max_angle) {
Vector2 floor_motion = floor_velocity; Vector2 floor_motion = floor_velocity;
@ -1257,7 +1260,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
//all is a wall //all is a wall
on_wall = true; on_wall = true;
} else { } else {
if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle)) { //floor if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //floor
on_floor = true; on_floor = true;
on_floor_body = collision.collider_rid; on_floor_body = collision.collider_rid;
@ -1272,7 +1275,7 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
set_global_transform(gt); set_global_transform(gt);
return Vector2(); return Vector2();
} }
} else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle)) { //ceiling } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling
on_ceiling = true; on_ceiling = true;
} else { } else {
on_wall = true; on_wall = true;

View file

@ -1125,6 +1125,9 @@ bool KinematicBody::move_and_collide(const Vector3 &p_motion, bool p_infinite_in
return colliding; return colliding;
} }
//so, if you pass 45 as limit, avoid numerical precision erros when angle is 45.
#define FLOOR_ANGLE_THRESHOLD 0.01
Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Vector3 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) { Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Vector3 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) {
Vector3 lv = p_linear_velocity; Vector3 lv = p_linear_velocity;
@ -1157,7 +1160,7 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve
//all is a wall //all is a wall
on_wall = true; on_wall = true;
} else { } else {
if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle)) { //floor if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //floor
on_floor = true; on_floor = true;
floor_velocity = collision.collider_vel; floor_velocity = collision.collider_vel;
@ -1171,7 +1174,7 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve
set_global_transform(gt); set_global_transform(gt);
return floor_velocity - p_floor_direction * p_floor_direction.dot(floor_velocity); return floor_velocity - p_floor_direction * p_floor_direction.dot(floor_velocity);
} }
} else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle)) { //ceiling } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling
on_ceiling = true; on_ceiling = true;
} else { } else {
on_wall = true; on_wall = true;