Browse Source

Simple workaround to make one way moving platforms work, fixes #9399

Juan Linietsky 6 years ago
parent
commit
414097ebd9
1 changed files with 13 additions and 0 deletions
  1. 13 0
      servers/physics_2d/space_2d_sw.cpp

+ 13 - 0
servers/physics_2d/space_2d_sw.cpp

@@ -737,6 +737,19 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
 						cbk.valid_dir = body_shape_xform.get_axis(1).normalized();
 						cbk.valid_dir = body_shape_xform.get_axis(1).normalized();
 						cbk.valid_depth = p_margin; //only valid depth is the collision margin
 						cbk.valid_depth = p_margin; //only valid depth is the collision margin
 						cbk.invalid_by_dir = 0;
 						cbk.invalid_by_dir = 0;
+
+						if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
+							const Body2DSW *b = static_cast<const Body2DSW *>(col_obj);
+							if ((Physics2DServer::BODY_MODE_KINEMATIC || Physics2DServer::BODY_MODE_RIGID)) {
+								//fix for moving platforms, margin is increased by how much it moved in the given direction
+								Vector2 lv = b->get_linear_velocity();
+								//compute displacement from linear velocity
+								Vector2 motion = lv * Physics2DDirectBodyStateSW::singleton->step;
+								float motion_len = motion.length();
+								motion.normalize();
+								cbk.valid_depth += motion_len * MAX(motion.dot(-cbk.valid_dir), 0.0);
+							}
+						}
 					} else {
 					} else {
 						cbk.valid_dir = Vector2();
 						cbk.valid_dir = Vector2();
 						cbk.valid_depth = 0;
 						cbk.valid_depth = 0;