From 01dd6b05935ee1897e9b469f01d784e6965ed60c Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Thu, 8 Oct 2020 08:43:34 +0100 Subject: [PATCH] Apply infinite inertia checks to Godot physics 3D --- servers/physics/space_sw.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp index eda0d1e6ffb0..bc0591d4d0a2 100644 --- a/servers/physics/space_sw.cpp +++ b/servers/physics/space_sw.cpp @@ -783,6 +783,13 @@ bool SpaceSW::test_body_motion(BodySW *p_body, const Transform &p_from, const Ve const CollisionObjectSW *col_obj = intersection_query_results[i]; int shape_idx = intersection_query_subindex_results[i]; + if (CollisionObjectSW::TYPE_BODY == col_obj->get_type()) { + const BodySW *b = static_cast(col_obj); + if (p_infinite_inertia && PhysicsServer::BODY_MODE_STATIC != b->get_mode() && PhysicsServer::BODY_MODE_KINEMATIC != b->get_mode()) { + continue; + } + } + if (CollisionSolverSW::solve_static(body_shape, body_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), cbkres, cbkptr, nullptr, p_margin)) { collided = cbk.amount > 0; } @@ -865,6 +872,13 @@ bool SpaceSW::test_body_motion(BodySW *p_body, const Transform &p_from, const Ve const CollisionObjectSW *col_obj = intersection_query_results[i]; int shape_idx = intersection_query_subindex_results[i]; + if (CollisionObjectSW::TYPE_BODY == col_obj->get_type()) { + const BodySW *b = static_cast(col_obj); + if (p_infinite_inertia && PhysicsServer::BODY_MODE_STATIC != b->get_mode() && PhysicsServer::BODY_MODE_KINEMATIC != b->get_mode()) { + continue; + } + } + //test initial overlap, does it collide if going all the way? Vector3 point_A, point_B; Vector3 sep_axis = motion_normal; @@ -971,6 +985,13 @@ bool SpaceSW::test_body_motion(BodySW *p_body, const Transform &p_from, const Ve const CollisionObjectSW *col_obj = intersection_query_results[i]; int shape_idx = intersection_query_subindex_results[i]; + if (CollisionObjectSW::TYPE_BODY == col_obj->get_type()) { + const BodySW *b = static_cast(col_obj); + if (p_infinite_inertia && PhysicsServer::BODY_MODE_STATIC != b->get_mode() && PhysicsServer::BODY_MODE_KINEMATIC != b->get_mode()) { + continue; + } + } + rcd.object = col_obj; rcd.shape = shape_idx; rcd.local_shape = j;