Merge pull request #14498 from AndreaCatania/patch-1
Ray cast return correct shape id. Fixes #14473
This commit is contained in:
commit
defeb49b01
2 changed files with 9 additions and 2 deletions
|
@ -50,14 +50,21 @@ struct GodotFilterCallback : public btOverlapFilterCallback {
|
|||
struct GodotClosestRayResultCallback : public btCollisionWorld::ClosestRayResultCallback {
|
||||
const Set<RID> *m_exclude;
|
||||
bool m_pickRay;
|
||||
int m_shapeId;
|
||||
|
||||
public:
|
||||
GodotClosestRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld, const Set<RID> *p_exclude) :
|
||||
btCollisionWorld::ClosestRayResultCallback(rayFromWorld, rayToWorld),
|
||||
m_exclude(p_exclude),
|
||||
m_pickRay(false) {}
|
||||
m_pickRay(false),
|
||||
m_shapeId(0) {}
|
||||
|
||||
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
|
||||
return btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
|
||||
}
|
||||
};
|
||||
|
||||
// store all colliding object
|
||||
|
|
|
@ -97,7 +97,7 @@ bool BulletPhysicsDirectSpaceState::intersect_ray(const Vector3 &p_from, const V
|
|||
B_TO_G(btResult.m_hitNormalWorld.normalize(), r_result.normal);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btResult.m_collisionObject->getUserPointer());
|
||||
if (gObj) {
|
||||
r_result.shape = 0;
|
||||
r_result.shape = btResult.m_shapeId;
|
||||
r_result.rid = gObj->get_self();
|
||||
r_result.collider_id = gObj->get_instance_id();
|
||||
r_result.collider = 0 == r_result.collider_id ? NULL : ObjectDB::get_instance(r_result.collider_id);
|
||||
|
|
Loading…
Reference in a new issue