Browse Source

Ray cast return shape id. Fixes #14473

AndreaCatania 7 years ago
parent
commit
785173e899
2 changed files with 9 additions and 2 deletions
  1. 8 1
      modules/bullet/godot_result_callbacks.h
  2. 1 1
      modules/bullet/space_bullet.cpp

+ 8 - 1
modules/bullet/godot_result_callbacks.h

@@ -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

+ 1 - 1
modules/bullet/space_bullet.cpp

@@ -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);