[Bf-blender-cvs] [27c2db4] temp_bullet_ghosts: Generalized the convex-sweep test API function to also support ghost objects.

Lukas Tönne noreply at git.blender.org
Wed Apr 29 09:08:08 CEST 2015


Commit: 27c2db4a7cb0060ba2fd9365ebc611ee2efdc08b
Author: Lukas Tönne
Date:   Fri Jan 2 11:14:58 2015 +0100
Branches: temp_bullet_ghosts
https://developer.blender.org/rB27c2db4a7cb0060ba2fd9365ebc611ee2efdc08b

Generalized the convex-sweep test API function to also support ghost
objects.

All collision test functions work with btCollisionObject, but for the
C API they need explicit variants for rbRigidBody and rbGhostObject.

===================================================================

M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/makesrna/intern/rna_rigidbody.c

===================================================================

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 4f0f638..c6fbc23 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -117,7 +117,7 @@ void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body);
 
 /* Collision detection */
 
-void RB_world_convex_sweep_test(
+void RB_dworld_convex_sweep_test_body(
         rbDynamicsWorld *world, rbRigidBody *object,
         const float loc_start[3], const float loc_end[3],
         float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit);
@@ -235,6 +235,12 @@ void RB_ghost_get_transform_matrix(rbGhostObject *object, float m_out[4][4]);
 void RB_ghost_set_loc_rot(rbGhostObject *object, const float loc[3], const float rot[4]);
 void RB_ghost_set_scale(rbGhostObject *object, const float scale[3]);
 
+/* Collision detection */
+void RB_dworld_convex_sweep_test_ghost(
+        rbDynamicsWorld *world, rbGhostObject *object,
+        const float loc_start[3], const float loc_end[3],
+        float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit);
+
 /* ********************************** */
 /* Collision Shape Methods */
 
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 2dc7e8b..fabbbad 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -396,18 +396,20 @@ void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object)
 
 /* Collision detection */
 
-void RB_world_convex_sweep_test(
-        rbDynamicsWorld *world, rbRigidBody *object,
+/* generic implementation for btCollisionObject, also used for ghost objects */
+static void dworld_convex_sweep_test(
+        rbDynamicsWorld *world, btCollisionObject *bt_object,
         const float loc_start[3], const float loc_end[3],
         float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit)
 {
-	btRigidBody *body = object->body;
-	btCollisionShape *collisionShape = body->getCollisionShape();
+	btCollisionShape *collisionShape = bt_object->getCollisionShape();
 	/* only convex shapes are supported, but user can specify a non convex shape */
 	if (collisionShape->isConvex()) {
-		btCollisionWorld::ClosestConvexResultCallback result(btVector3(loc_start[0], loc_start[1], loc_start[2]), btVector3(loc_end[0], loc_end[1], loc_end[2]));
+		btCollisionWorld::ClosestConvexResultCallback result(
+		    btVector3(loc_start[0], loc_start[1], loc_start[2]),
+		    btVector3(loc_end[0], loc_end[1], loc_end[2]));
 
-		btQuaternion obRot = body->getWorldTransform().getRotation();
+		btQuaternion obRot = bt_object->getWorldTransform().getRotation();
 		
 		btTransform rayFromTrans;
 		rayFromTrans.setIdentity();
@@ -447,6 +449,14 @@ void RB_world_convex_sweep_test(
 	}
 }
 
+void RB_dworld_convex_sweep_test_body(
+        rbDynamicsWorld *world, rbRigidBody *object,
+        const float loc_start[3], const float loc_end[3],
+        float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit)
+{
+	dworld_convex_sweep_test(world, object->body, loc_start, loc_end, v_location, v_hitpoint, v_normal, r_hit);
+}
+
 /* ............ */
 
 rbRigidBody *RB_body_new(rbCollisionShape *shape, const float loc[3], const float rot[4])
@@ -850,6 +860,14 @@ void RB_ghost_set_scale(rbGhostObject *object, const float scale[3])
 	}
 }
 
+void RB_dworld_convex_sweep_test_ghost(
+        rbDynamicsWorld *world, rbGhostObject *object,
+        const float loc_start[3], const float loc_end[3],
+        float v_location[3],  float v_hitpoint[3],  float v_normal[3], int *r_hit)
+{
+	dworld_convex_sweep_test(world, object->ghost, loc_start, loc_end, v_location, v_hitpoint, v_normal, r_hit);
+}
+
 /* ********************************** */
 /* Collision Shape Methods */
 
diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c
index 58a12f6..aa93d0c 100644
--- a/source/blender/makesrna/intern/rna_rigidbody.c
+++ b/source/blender/makesrna/intern/rna_rigidbody.c
@@ -632,8 +632,8 @@ static void rna_RigidBodyWorld_convex_sweep_test(
 	RigidBodyOb *rob = object->rigidbody_object;
 
 	if (rbw->physics_world != NULL && rob->physics_object != NULL) {
-		RB_world_convex_sweep_test(rbw->physics_world, rob->physics_object, ray_start, ray_end,
-		                           r_location, r_hitpoint, r_normal, r_hit);
+		RB_dworld_convex_sweep_test_body(rbw->physics_world, rob->physics_object, ray_start, ray_end,
+		                                 r_location, r_hitpoint, r_normal, r_hit);
 		if (*r_hit == -2) {
 			BKE_report(reports, RPT_ERROR,
 			           "A non convex collision shape was passed to the function, use only convex collision shapes");




More information about the Bf-blender-cvs mailing list