[Bf-blender-cvs] [779edcd] hair_system: Basic support for Bullet GhostObjects in the rigidbody API and the hair system.

Lukas Tönne noreply at git.blender.org
Sat Aug 2 17:57:05 CEST 2014


Commit: 779edcd9b7ddc1e0cdc6bff922068533b229b820
Author: Lukas Tönne
Date:   Sat Aug 2 17:56:22 2014 +0200
Branches: hair_system
https://developer.blender.org/rB779edcd9b7ddc1e0cdc6bff922068533b229b820

Basic support for Bullet GhostObjects in the rigidbody API and the hair
system.

These ghost objects are pure collision objects (without rigid body
dynamics) which can be used to retrieve collision info from Bullet and
use it in the hair solver.

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

M	intern/rigidbody/CMakeLists.txt
M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
A	intern/rigidbody/rb_internal_types.h
M	source/blender/blenloader/intern/readfile.c
M	source/blender/hair/CMakeLists.txt
M	source/blender/hair/HAIR_capi.cpp
M	source/blender/hair/intern/HAIR_curve.h
M	source/blender/hair/intern/HAIR_scene.cpp
M	source/blender/hair/intern/HAIR_scene.h
M	source/blender/hair/intern/HAIR_solver.cpp
M	source/blender/hair/intern/HAIR_solver.h
M	source/blender/hair/intern/HAIR_types.h

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

diff --git a/intern/rigidbody/CMakeLists.txt b/intern/rigidbody/CMakeLists.txt
index 5d84c2c..dae0e36 100644
--- a/intern/rigidbody/CMakeLists.txt
+++ b/intern/rigidbody/CMakeLists.txt
@@ -31,6 +31,7 @@ set(INC_SYS
 
 set(SRC
 	rb_bullet_api.cpp
+	rb_internal_types.h
 	
 	RBI_api.h
 )
diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 58653c5..6078e1d 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -58,7 +58,11 @@ typedef struct rbDynamicsWorld rbDynamicsWorld;
 
 /* Rigid Body */
 typedef struct rbRigidBody rbRigidBody;
-extern size_t rbRigidBodySize;
+extern const size_t rbRigidBodySize;
+
+/* Ghost Object */
+typedef struct rbGhostObject rbGhostObject;
+extern const size_t rbGhostObjectSize;
 
 /* Collision Shape */
 typedef struct rbCollisionShape rbCollisionShape;
@@ -117,6 +121,10 @@ void RB_dworld_add_body(rbDynamicsWorld *world, rbRigidBody *body, int col_group
 /* Remove RigidBody from dynamics world */
 void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *body);
 
+/* Ghost Object for detecting collisions */
+void RB_dworld_add_ghost(rbDynamicsWorld *world, rbGhostObject *object, int col_groups);
+void RB_dworld_remove_ghost(rbDynamicsWorld *world, rbGhostObject *object);
+
 /* Collision detection */
 
 void RB_world_convex_sweep_test(
@@ -132,6 +140,10 @@ void RB_body_init(rbRigidBody *object, rbCollisionShape *shape, const float loc[
 /* Delete the given RigidBody instance */
 void RB_body_free(rbRigidBody *object);
 
+/* Ghost Object for detecting collisions */
+void RB_ghost_init(rbGhostObject *object, rbCollisionShape *shape, const float loc[3], const float rot[4]);
+void RB_ghost_free(rbGhostObject *object);
+
 /* Settings ------------------------- */
 
 /* 'Type' */
@@ -222,6 +234,14 @@ void RB_body_get_orientation(rbRigidBody *body, float v_out[4]);
 
 void RB_body_apply_central_force(rbRigidBody *body, const float v_in[3]);
 
+/* ............ */
+
+int RB_ghost_get_flags(rbGhostObject *ghost);
+void RB_ghost_set_flag(rbGhostObject *ghost, int flag);
+void RB_ghost_clear_flag(rbGhostObject *ghost, int flag);
+
+void RB_ghost_set_loc_rot(rbGhostObject *ghost, const float loc[3], const float rot[4]);
+
 /* ********************************** */
 /* Collision Shape Methods */
 
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index f1d135b..2fdb0e8 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -72,6 +72,12 @@ subject to the following restrictions:
 #include "BulletCollision/Gimpact/btGImpactShape.h"
 #include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h"
 #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
+#include "BulletCollision/CollisionDispatch/btGhostObject.h"
+
+#include "rb_internal_types.h"
+
+const size_t rbRigidBodySize = sizeof(rbRigidBody);
+const size_t rbGhostObjectSize = sizeof(rbGhostObject);
 
 struct rbDynamicsWorld {
 	btDiscreteDynamicsWorld *dynamicsWorld;
@@ -82,22 +88,6 @@ struct rbDynamicsWorld {
 	btOverlapFilterCallback *filterCallback;
 };
 
-struct rbRigidBody {
-	rbRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo) :
-	    body(constructionInfo),
-	    col_groups(0),
-	    flag(0)
-	{}
-	~rbRigidBody()
-	{}
-	
-	btRigidBody body;
-	int col_groups;
-	int flag;
-};
-
-size_t rbRigidBodySize = sizeof(rbRigidBody);
-
 struct rbVert {
 	float x, y, z;
 };
@@ -300,6 +290,21 @@ void RB_dworld_remove_body(rbDynamicsWorld *world, rbRigidBody *object)
 	world->dynamicsWorld->removeRigidBody(body);
 }
 
+void RB_dworld_add_ghost(rbDynamicsWorld *world, rbGhostObject *object, int col_groups)
+{
+	btGhostObject *ghost = &object->ghost;
+	object->col_groups = col_groups;
+	
+	world->dynamicsWorld->addCollisionObject(ghost);
+}
+
+void RB_dworld_remove_ghost(rbDynamicsWorld *world, rbGhostObject *object)
+{
+	btGhostObject *ghost = &object->ghost;
+	
+	world->dynamicsWorld->removeCollisionObject(ghost);
+}
+
 /* Collision detection */
 
 void RB_world_convex_sweep_test(
@@ -396,6 +401,34 @@ void RB_body_free(rbRigidBody *object)
 	object->~rbRigidBody();
 }
 
+/* ............ */
+
+void RB_ghost_init(rbGhostObject *object, rbCollisionShape *shape, const float loc[3], const float rot[4])
+{
+	/* current transform */
+	btTransform trans;
+	trans.setOrigin(btVector3(loc[0], loc[1], loc[2]));
+	trans.setRotation(btQuaternion(rot[1], rot[2], rot[3], rot[0]));
+	
+	/* make rigidbody, using placement new to initialize given memory buffer */
+	new (object) rbGhostObject();
+	object->ghost.setUserPointer(object);
+	
+	object->ghost.setWorldTransform(trans);
+}
+
+void RB_ghost_free(rbGhostObject *object)
+{
+//	btGhostObject *ghost = &object->ghost;
+	
+	/* collision shape is done elsewhere... */
+	
+	/* body itself */
+	
+	/* only call destructor, memory management happens externally */
+	object->~rbGhostObject();
+}
+
 /* Settings ------------------------- */
 
 void RB_body_set_collision_shape(rbRigidBody *object, rbCollisionShape *shape)
@@ -691,6 +724,37 @@ void RB_body_apply_central_force(rbRigidBody *object, const float v_in[3])
 	body->applyCentralForce(btVector3(v_in[0], v_in[1], v_in[2]));
 }
 
+/* ............ */
+
+int RB_ghost_get_flags(rbGhostObject *ghost)
+{
+	return ghost->flag;
+}
+
+void RB_ghost_set_flag(rbGhostObject *ghost, int flag)
+{
+	ghost->flag |= flag;
+}
+
+void RB_ghost_clear_flag(rbGhostObject *ghost, int flag)
+{
+	ghost->flag &= ~flag;
+}
+
+void RB_ghost_set_loc_rot(rbGhostObject *object, const float loc[3], const float rot[4])
+{
+	btGhostObject *ghost = &object->ghost;
+	
+	/* set transform matrix */
+	btTransform trans;
+	trans.setOrigin(btVector3(loc[0], loc[1], loc[2]));
+	trans.setRotation(btQuaternion(rot[1], rot[2], rot[3], rot[0]));
+	
+	ghost->setWorldTransform(trans);
+}
+
+
+
 /* ********************************** */
 /* Collision Shape Methods */
 
diff --git a/source/blender/hair/intern/HAIR_scene.h b/intern/rigidbody/rb_internal_types.h
similarity index 50%
copy from source/blender/hair/intern/HAIR_scene.h
copy to intern/rigidbody/rb_internal_types.h
index 95e3d4d..8acf9f1 100644
--- a/source/blender/hair/intern/HAIR_scene.h
+++ b/intern/rigidbody/rb_internal_types.h
@@ -15,35 +15,53 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * The Original Code is Copyright (C) 2014 Blender Foundation.
+ * The Original Code is Copyright (C) 2014 Blender Foundation,
  * All rights reserved.
  *
- * Contributor(s): Blender Foundation,
- *                 Lukas Toenne
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung, Sergej Reich, Lukas Toenne
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#ifndef __HAIR_SCENE_H__
-#define __HAIR_SCENE_H__
-
-struct Scene;
-struct Object;
-struct DerivedMesh;
-struct HairSystem;
+/** \file RBI_types.h
+ *  \ingroup RigidBody
+ *  \brief Rigid Body datatypes for Physics Engines
+ */
 
-HAIR_NAMESPACE_BEGIN
+#ifndef __RB_TYPES_H__
+#define __RB_TYPES_H__
 
-struct SolverData;
-struct SolverForces;
+#include "btBulletDynamicsCommon.h"
+#include "BulletCollision/CollisionDispatch/btGhostObject.h"
 
-struct SceneConverter {
-	static SolverData *build_solver_data(Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time);
-	static void update_solver_data_externals(SolverData *data, SolverForces &force, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time);
+struct rbRigidBody {
+	rbRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo) :
+	    body(constructionInfo),
+	    col_groups(0),
+	    flag(0)
+	{}
+	~rbRigidBody()
+	{}
 	
-	static void apply_solver_data(SolverData *data, Scene *scene, Object *ob, HairSystem *hsys);
+	btRigidBody body;
+	int col_groups;
+	int flag;
 };
 
-HAIR_NAMESPACE_END
+struct rbGhostObject {
+	rbGhostObject() :
+	    ghost(),
+	    col_groups(0),
+	    flag(0)
+	{}
+	~rbGhostObject()
+	{}
+	
+	btGhostObject ghost;
+	int col_groups;
+	int flag;
+};
 
-#endif
+#endif /* __RB_TYPES_H__ */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 71fc2ae..708bd15 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4594,6 +4594,9 @@ static void direct_link_hair_system(FileData *fd, HairSystem *hsys)
 	for (hair = hsys->curves, i = 0; i < hsys->totcurves; ++hair, ++i) {
 		hair->points = newdataadr(fd, hair->points);
 	}
+
+	hsys->physics_objects = NULL;
+	hsys->tot_physics_objects = 0;
 }
 
 static void direct_link_modifiers(FileData *fd, ListBase *lb)
diff --git a/source/blender/hair/CMakeLists.txt b/source/blender/hair/CMakeLists.txt
index 5ff2988..15a0f5f 100644
--- a/source/blender/hair/CMakeLists.txt
+++ b/source/blender/hair/CMakeLists.txt
@@ -63,4 +63,14 @@ add_definitions(
 	-DHAIR_NAMESPACE_END=}
 )
 
+if(WITH_BULLET)
+	list(APPEND INC_SYS
+		${BULLET_INCLUDE_DIRS}
+	)
+	list(APPEND INC
+		../../../intern/rigidbody
+	)
+	add_definitions(-DWITH_BULLET)
+endif()
+
 blender_add_lib(bf_hair "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index b2103c9..08141de 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -29,6 +29,7 @@ extern "C" {
 
 #include "DNA_hair_types.h"
 #include "DNA_object_types.h"
+#include "DNA_rigidbody_types.h"
 #include "DNA_scene_types.h"
 
 #include "BKE_hair.h"
@@ -68,9 +69,19 @@ void HAIR_solver_set_params(struct HAIR_Solver *csolver, const struct HairParams
 void HAIR_solver_build_data(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
 {
 	Solver *solver = (Solver *)csolver;
+	RigidBodyWorld *rbw = scene->rigidbody_world;
+	rbDynamicsWorld *world = rbw ? (rbDynamicsWorld *)rbw->physics_world : NULL;
+	
+	if (world && solver->data())
+		solver->data()->remove_from_world(world);
 	
 	SolverData *data = SceneConverter::build_solver_data(scene, ob, dm, hsys, time);
 	solver->set_data(data);
+	
+	if (world) {
+		// XXX col_groups ?
+		data->add_to_world(w

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list