[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