diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2018-09-08 11:03:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-08 11:03:18 +0200 |
commit | df39a034dccbc2c0e78b7345d13224278da7a608 (patch) | |
tree | c7d1f555fd7ebb851dd03274d01c6f719df7357e /modules | |
parent | 4b6846a59d785af3bef6a29958387ed0ee0f6575 (diff) | |
parent | 3eaaf712db9a2319873ff6d758ac20778edbd133 (diff) |
Merge pull request #21843 from AndreaCatania/bugfix1
Fixed crash during raycast and CCD radius calculation
Diffstat (limited to 'modules')
-rw-r--r-- | modules/bullet/godot_result_callbacks.h | 5 | ||||
-rw-r--r-- | modules/bullet/rigid_body_bullet.cpp | 13 |
2 files changed, 13 insertions, 5 deletions
diff --git a/modules/bullet/godot_result_callbacks.h b/modules/bullet/godot_result_callbacks.h index 61247e2a7a..8e70b72841 100644 --- a/modules/bullet/godot_result_callbacks.h +++ b/modules/bullet/godot_result_callbacks.h @@ -74,7 +74,10 @@ public: virtual bool needsCollision(btBroadphaseProxy *proxy0) const; virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult &rayResult, bool normalInWorldSpace) { - m_shapeId = rayResult.m_localShapeInfo->m_triangleIndex; // "m_triangleIndex" Is a odd name but contains the compound shape ID + if (rayResult.m_localShapeInfo) + m_shapeId = rayResult.m_localShapeInfo->m_triangleIndex; // "m_triangleIndex" Is a odd name but contains the compound shape ID + else + m_shapeId = 0; return btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace); } }; diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index 2974d6b3e4..73f0393684 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -316,6 +316,7 @@ void RigidBodyBullet::destroy_kinematic_utilities() { void RigidBodyBullet::main_shape_resetted() { btBody->setCollisionShape(get_main_shape()); + set_continuous_collision_detection(is_continuous_collision_detection_enabled()); // Reset } void RigidBodyBullet::reload_body() { @@ -716,15 +717,19 @@ void RigidBodyBullet::set_continuous_collision_detection(bool p_enable) { if (p_enable) { // This threshold enable CCD if the object moves more than // 1 meter in one simulation frame - btBody->setCcdMotionThreshold(1); + btBody->setCcdMotionThreshold(0.1); /// Calculate using the rule writte below the CCD swept sphere radius /// CCD works on an embedded sphere of radius, make sure this radius /// is embedded inside the convex objects, preferably smaller: /// for an object of dimensions 1 meter, try 0.2 - btVector3 center; btScalar radius; - btBody->getCollisionShape()->getBoundingSphere(center, radius); + if (btBody->getCollisionShape()) { + btVector3 center; + btBody->getCollisionShape()->getBoundingSphere(center, radius); + } else { + radius = 0; + } btBody->setCcdSweptSphereRadius(radius * 0.2); } else { btBody->setCcdMotionThreshold(0.); @@ -733,7 +738,7 @@ void RigidBodyBullet::set_continuous_collision_detection(bool p_enable) { } bool RigidBodyBullet::is_continuous_collision_detection_enabled() const { - return 0. != btBody->getCcdMotionThreshold(); + return 0. < btBody->getCcdMotionThreshold(); } void RigidBodyBullet::set_linear_velocity(const Vector3 &p_velocity) { |