[Bf-blender-cvs] [0a693d7] temp_bullet_ghosts: Added API representation of manifold contact points and the direct contact test function from btCollisionWorld.

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


Commit: 0a693d7716d955666471afc1ee67b49dfb7ffd8e
Author: Lukas Tönne
Date:   Fri Jan 2 17:25:39 2015 +0100
Branches: temp_bullet_ghosts
https://developer.blender.org/rB0a693d7716d955666471afc1ee67b49dfb7ffd8e

Added API representation of manifold contact points and the direct
contact test function from btCollisionWorld.

This function can be used for testing individual collision objects
(rigid bodies or ghosts) against objects in the world. It is only
useful for one-way interaction (rigid bodies don't react to the tested
object), but allows collision detection without adding objects into the
world. The current build process for the scene dynamics world is very
much centered on Blender Objects and extending it is difficult.

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

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 c6fbc23..7ab63c4 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -51,6 +51,11 @@ extern "C" {
 
 // ----------
 
+typedef enum rbObjectType {
+	RB_OBJECT_RIGIDBODY,
+	RB_OBJECT_GHOST,
+} rbObjectType;
+
 /* Dynamics World */
 typedef struct rbDynamicsWorld rbDynamicsWorld;
 
@@ -69,6 +74,9 @@ typedef struct rbMeshData rbMeshData;
 /* Constraint */
 typedef struct rbConstraint rbConstraint;
 
+/* Manifold Contact Point */
+typedef struct rbManifoldPoint rbManifoldPoint;
+
 /* ********************************** */
 /* Dynamics World Methods */
 
@@ -105,6 +113,26 @@ void RB_dworld_test_collision(rbDynamicsWorld *world);
 void RB_dworld_export(rbDynamicsWorld *world, const char *filename);
 
 /* ********************************** */
+/* Manifold Point Methods */
+
+void RB_manifold_point_local_A(const rbManifoldPoint *pt, float vec[3]);
+void RB_manifold_point_local_B(const rbManifoldPoint *pt, float vec[3]);
+void RB_manifold_point_world_A(const rbManifoldPoint *pt, float vec[3]);
+void RB_manifold_point_world_B(const rbManifoldPoint *pt, float vec[3]);
+void RB_manifold_point_normal_world_B(const rbManifoldPoint *pt, float vec[3]);
+float RB_manifold_point_distance(const rbManifoldPoint *pt);
+float RB_manifold_point_combined_friction(const rbManifoldPoint *pt);
+float RB_manifold_point_combined_rolling_friction(const rbManifoldPoint *pt);
+float RB_manifold_point_combined_restitution(const rbManifoldPoint *pt);
+int RB_manifold_point_part_id0(const rbManifoldPoint *pt);
+int RB_manifold_point_index0(const rbManifoldPoint *pt);
+int RB_manifold_point_part_id1(const rbManifoldPoint *pt);
+int RB_manifold_point_index1(const rbManifoldPoint *pt);
+void *RB_manifold_point_get_user_persistent_data(const rbManifoldPoint *pt);
+void RB_manifold_point_set_user_persistent_data(const rbManifoldPoint *pt, void *data);
+float RB_manifold_point_lifetime(const rbManifoldPoint *pt);
+
+/* ********************************** */
 /* Rigid Body Methods */
 
 /* Setup ---------------------------- */
@@ -117,11 +145,18 @@ void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body);
 
 /* Collision detection */
 
-void RB_dworld_convex_sweep_test_body(
+typedef void (*rbContactCallback)(void *userdata, rbManifoldPoint *cp,
+                                  const void *collob0, rbObjectType type0, int part0, int index0,
+                                  const void *collob1, rbObjectType type1, int part1, int index1);
+
+void RB_dworld_convex_sweep_closest_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);
 
+void RB_dworld_contact_test_body(rbDynamicsWorld *world, rbRigidBody *object, rbContactCallback cb, void *userdata, int col_groups);
+void RB_dworld_contact_test_ghost(rbDynamicsWorld *world, rbGhostObject *object, rbContactCallback cb, void *userdata, int col_groups);
+
 /* ............ */
 
 /* Create new RigidBody instance */
@@ -236,7 +271,7 @@ void RB_ghost_set_loc_rot(rbGhostObject *object, const float loc[3], const float
 void RB_ghost_set_scale(rbGhostObject *object, const float scale[3]);
 
 /* Collision detection */
-void RB_dworld_convex_sweep_test_ghost(
+void RB_dworld_convex_sweep_closest_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);
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index fabbbad..806e912 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -74,6 +74,19 @@ subject to the following restrictions:
 #include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h"
 #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
 
+static inline rbObjectType rigidbody_get_object_type(int bt_internal_type)
+{
+	switch (bt_internal_type) {
+		case btCollisionObject::CO_RIGID_BODY: return RB_OBJECT_RIGIDBODY;
+		case btCollisionObject::CO_GHOST_OBJECT: return RB_OBJECT_GHOST;
+		
+		default:
+			/* unknown btCollisionObject type, should never happen */
+			assert(false);
+			return RB_OBJECT_RIGIDBODY;
+	}
+}
+
 struct rbDynamicsWorld {
 	btDiscreteDynamicsWorld *dynamicsWorld;
 	btDefaultCollisionConfiguration *collisionConfiguration;
@@ -230,6 +243,10 @@ struct rbCompoundShape : public rbCollisionShape {
 	btCollisionShape *get_cshape() { return &cshape; }
 };
 
+struct rbManifoldPoint {
+	int unused;
+};
+
 struct rbFilterCallback : public btOverlapFilterCallback
 {
 	virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const
@@ -375,6 +392,30 @@ void RB_dworld_export(rbDynamicsWorld *world, const char *filename)
 }
 
 /* ********************************** */
+/* Manifold Point Methods */
+
+#define BTPT(pt) ((btManifoldPoint *)(pt))
+
+void RB_manifold_point_local_A(const rbManifoldPoint *pt, float vec[3]) { copy_v3_btvec3(vec, BTPT(pt)->m_localPointA); }
+void RB_manifold_point_local_B(const rbManifoldPoint *pt, float vec[3]) { copy_v3_btvec3(vec, BTPT(pt)->m_localPointB); }
+void RB_manifold_point_world_A(const rbManifoldPoint *pt, float vec[3]) { copy_v3_btvec3(vec, BTPT(pt)->m_positionWorldOnA); }
+void RB_manifold_point_world_B(const rbManifoldPoint *pt, float vec[3]) { copy_v3_btvec3(vec, BTPT(pt)->m_positionWorldOnB); }
+void RB_manifold_point_normal_world_B(const rbManifoldPoint *pt, float vec[3]) { copy_v3_btvec3(vec, BTPT(pt)->m_normalWorldOnB); }
+float RB_manifold_point_distance(const rbManifoldPoint *pt) { return BTPT(pt)->m_distance1; }
+float RB_manifold_point_combined_friction(const rbManifoldPoint *pt) { return BTPT(pt)->m_combinedFriction; }
+float RB_manifold_point_combined_rolling_friction(const rbManifoldPoint *pt) { return BTPT(pt)->m_combinedRollingFriction; }
+float RB_manifold_point_combined_restitution(const rbManifoldPoint *pt) { return BTPT(pt)->m_combinedRestitution; }
+int RB_manifold_point_part_id0(const rbManifoldPoint *pt) { return BTPT(pt)->m_partId0; }
+int RB_manifold_point_index0(const rbManifoldPoint *pt) { return BTPT(pt)->m_index0; }
+int RB_manifold_point_part_id1(const rbManifoldPoint *pt) { return BTPT(pt)->m_partId1; }
+int RB_manifold_point_index1(const rbManifoldPoint *pt) { return BTPT(pt)->m_index1; }
+void *RB_manifold_point_get_user_persistent_data(const rbManifoldPoint *pt) { return BTPT(pt)->m_userPersistentData; }
+void RB_manifold_point_set_user_persistent_data(const rbManifoldPoint *pt, void *data) { BTPT(pt)->m_userPersistentData = data; }
+float RB_manifold_point_lifetime(const rbManifoldPoint *pt) { return BTPT(pt)->m_lifeTime; }
+
+#undef BTPT
+
+/* ********************************** */
 /* Rigid Body Methods */
 
 /* Setup ---------------------------- */
@@ -396,8 +437,8 @@ void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object)
 
 /* Collision detection */
 
-/* generic implementation for btCollisionObject, also used for ghost objects */
-static void dworld_convex_sweep_test(
+/* generic implementation for btCollisionObject */
+static void dworld_convex_sweep_closest(
         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)
@@ -449,12 +490,59 @@ static void dworld_convex_sweep_test(
 	}
 }
 
-void RB_dworld_convex_sweep_test_body(
+void RB_dworld_convex_sweep_closest_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);
+	dworld_convex_sweep_closest(world, object->body, loc_start, loc_end, v_location, v_hitpoint, v_normal, r_hit);
+}
+
+struct	rbContactResultCallback : public btCollisionWorld::ContactResultCallback
+{
+	rbContactResultCallback(rbContactCallback cb, void *userdata, int col_groups) :
+		m_collision_filter_group(btBroadphaseProxy::DefaultFilter),
+		m_collision_filter_mask(btBroadphaseProxy::AllFilter),
+		m_callback(cb),
+		m_userdata(userdata),
+		m_col_groups(col_groups)
+	{
+	}
+	
+	short m_collision_filter_group;
+	short m_collision_filter_mask;
+	
+	rbContactCallback m_callback;
+	void *m_userdata;
+	int m_col_groups;
+	
+	bool needsCollision(btBroadphaseProxy *proxy0) const
+	{
+		rbCollisionObject *rb0 = (rbCollisionObject *)((btCollisionObject *)proxy0->m_clientObject)->getUserPointer();
+		
+		bool collides;
+		collides = (m_collision_filter_group & proxy0->m_collisionFilterMask) != 0;
+		collides = collides && (proxy0->m_collisionFilterGroup & m_collision_filter_mask);
+		collides = collides && (m_col_groups & rb0->col_groups);
+		
+		return collides;
+	}
+	
+	btScalar addSingleResult(btManifoldPoint& cp,
+	                         const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0,
+	                         const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1)
+	{
+		m_callback(m_userdata, (rbManifoldPoint *)(&cp),
+				   colObj0Wrap, rigidbody_get_object_type(colObj0Wrap->getCollisionObject()->getInternalType()), partId0, index0,
+				   colObj1Wrap, rigidbody_get_object_type(colObj1Wrap->getCollisionObject()->getInternalType()), partId1, index1);
+		return cp.getDistance();
+	}
+};
+
+void RB_dworld_contact_test_body(rbDynamicsWorld *world, rbRigidBody *object, rbContactCallback cb, void *userdata, int col_groups)
+{
+	rbContactResultCallback result(cb, userdata, col_groups);
+	world->dynamicsWorld->contactTest(object->body, result);
 }
 
 /* ............ */
@@ -860,12 +948,18 @@ void RB_ghost_set_scale(rbGhostObject *object, const float scale[3])
 	}
 }
 
-void RB_dworld_convex_sweep_test_ghost(
+void RB_dworld_convex_sweep_closest_ghost(
         rbDynamicsWorld *world, rbGhostObject *object,
         const float loc_start[3], const float loc_end[3],
    

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list