[Bf-blender-cvs] [6d3b738] hair_system: Added a rebuild function for "object components" (i.e. hair).

Lukas Tönne noreply at git.blender.org
Tue Aug 5 16:53:36 CEST 2014


Commit: 6d3b738c3874d333e7d6df09517a7802d3f8bbea
Author: Lukas Tönne
Date:   Tue Aug 5 16:52:50 2014 +0200
Branches: hair_system
https://developer.blender.org/rB6d3b738c3874d333e7d6df09517a7802d3f8bbea

Added a rebuild function for "object components" (i.e. hair).

This ensures that rigid bodies get added back into the world when the
animation loops around and the rigid body world gets destroyed and
rebuilt.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenkernel/intern/rigidbody_objects.c
M	source/blender/hair/HAIR_capi.cpp
M	source/blender/hair/HAIR_capi.h

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 56ad034..c9a4024 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -171,6 +171,9 @@ void BKE_object_handle_update_ex(struct EvaluationContext *eval_ctx,
                                  const bool do_proxy_update);
 void BKE_object_sculpt_modifiers_changed(struct Object *ob);
 
+void BKE_object_rigidbody_build(struct Scene *scene, struct Object *ob);
+void BKE_object_rigidbody_build_components(struct Scene *scene, struct Object *ob);
+
 void BKE_object_sim_pre_step(struct Scene *scene, struct Object *ob, float ctime);
 void BKE_object_sim_tick(struct Scene *scene, struct Object *ob, float ctime, float timestep);
 void BKE_object_sim_post_step(struct Scene *scene, struct Object *ob, float ctime);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ffc7bfc..f89a091 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -786,7 +786,6 @@ static void rigidbody_world_build(Scene *scene, RigidBodyWorld *rbw, bool rebuil
 		}
 	}
 
-
 	/* build objects */
 	BKE_rigidbody_objects_build(scene, rbw, rebuild);
 	
diff --git a/source/blender/blenkernel/intern/rigidbody_objects.c b/source/blender/blenkernel/intern/rigidbody_objects.c
index 7b7dbb0..b0e20a2 100644
--- a/source/blender/blenkernel/intern/rigidbody_objects.c
+++ b/source/blender/blenkernel/intern/rigidbody_objects.c
@@ -40,6 +40,7 @@
 #endif
 
 #include "DNA_group_types.h"
+#include "DNA_hair_types.h"
 #include "DNA_object_types.h"
 #include "DNA_object_force.h"
 #include "DNA_rigidbody_types.h"
@@ -51,6 +52,8 @@
 #include "BKE_object.h"
 #include "BKE_rigidbody.h"
 
+#include "HAIR_capi.h"
+
 /* ------------------------ */
 /* Main Simulation Sync */
 
@@ -194,60 +197,89 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 		RB_dworld_add_body(rbw->physics_world, rbo->physics_object, rbo->col_groups);
 }
 
-void BKE_rigidbody_objects_build(Scene *scene, struct RigidBodyWorld *rbw, bool rebuild)
+/* build main object rigid body */
+static void rigidbody_object_build(Scene *scene, RigidBodyWorld *rbw, Object *ob, bool rebuild)
 {
-	GroupObject *go;
-	if (!rbw->group)
-		return;
-	for (go = rbw->group->gobject.first; go; go = go->next) {
-		Object *ob = go->ob;
-		RigidBodyOb *rbo;
+	RigidBodyOb *rbo;
 
-		if (!ob || ob->type != OB_MESH)
-			continue;
+	if (!ob || ob->type != OB_MESH)
+		return;
+	
+	/* validate that we've got valid object set up here... */
+	rbo = ob->rigidbody_object;
+	/* update transformation matrix of the object so we don't get a frame of lag for simple animations */
+	BKE_object_where_is_calc(scene, ob);
+	
+	if (rbo == NULL) {
+		/* Since this object is included in the sim group but doesn't have
+			 * rigid body settings (perhaps it was added manually), add!
+			 *	- assume object to be active? That is the default for newly added settings...
+			 */
+		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
+		rigidbody_validate_sim_object(rbw, ob, true);
 		
-		/* validate that we've got valid object set up here... */
 		rbo = ob->rigidbody_object;
-		/* update transformation matrix of the object so we don't get a frame of lag for simple animations */
-		BKE_object_where_is_calc(scene, ob);
-		
-		if (rbo == NULL) {
-			/* Since this object is included in the sim group but doesn't have
-				 * rigid body settings (perhaps it was added manually), add!
-				 *	- assume object to be active? That is the default for newly added settings...
-				 */
-			ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
+	}
+	else {
+		/* perform simulation data updates as tagged */
+		/* refresh object... */
+		if (rebuild || !rbo->physics_object) {
+			/* World has been rebuilt so rebuild object */
 			rigidbody_validate_sim_object(rbw, ob, true);
-			
-			rbo = ob->rigidbody_object;
 		}
-		else {
-			/* perform simulation data updates as tagged */
-			/* refresh object... */
-			if (rebuild || !rbo->physics_object) {
-				/* World has been rebuilt so rebuild object */
-				rigidbody_validate_sim_object(rbw, ob, true);
-			}
-			else if (rbo->flag & RBO_FLAG_NEEDS_VALIDATE) {
-				rigidbody_validate_sim_object(rbw, ob, false);
-			}
-			
-			/* refresh shape... */
-			if (rbo->flag & RBO_FLAG_NEEDS_RESHAPE) {
-				/* mesh/shape data changed, so force shape refresh */
-				BKE_rigidbody_validate_sim_shape(ob, true);
-				/* now tell RB sim about it */
-				// XXX: we assume that this can only get applied for active/passive shapes that will be included as rigidbodies
-				RB_body_set_collision_shape(rbo->physics_object, rbo->physics_shape);
-			}
-			
-			rbo->flag &= ~(RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
+		else if (rbo->flag & RBO_FLAG_NEEDS_VALIDATE) {
+			rigidbody_validate_sim_object(rbw, ob, false);
 		}
 		
-		BKE_rigidbody_body_tag_used(rbo->physics_object);
+		/* refresh shape... */
+		if (rbo->flag & RBO_FLAG_NEEDS_RESHAPE) {
+			/* mesh/shape data changed, so force shape refresh */
+			BKE_rigidbody_validate_sim_shape(ob, true);
+			/* now tell RB sim about it */
+			// XXX: we assume that this can only get applied for active/passive shapes that will be included as rigidbodies
+			RB_body_set_collision_shape(rbo->physics_object, rbo->physics_shape);
+		}
 		
-		/* update simulation object... */
-		rigidbody_sync_object(scene, rbw, ob, rbo);
+		rbo->flag &= ~(RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
+	}
+	
+	BKE_rigidbody_body_tag_used(rbo->physics_object);
+	
+	/* update simulation object... */
+	rigidbody_sync_object(scene, rbw, ob, rbo);
+}
+
+/* build secondary rigidbody components */
+static void rigidbody_object_build_components(Scene *UNUSED(scene), RigidBodyWorld *rbw, Object *ob, bool rebuild)
+{
+	ModifierData *md;
+	
+	if (!ob)
+		return;
+	
+	for (md = ob->modifiers.first; md; md = md->next) {
+		if (md->type == eModifierType_Hair) {
+			HairModifierData *hmd = (HairModifierData*) md;
+			
+			if (rebuild && hmd->solver)
+				HAIR_solver_rebuild_rigidbodyworld(hmd->solver, rbw->physics_world);
+		}
+	}
+}
+
+void BKE_rigidbody_objects_build(Scene *scene, struct RigidBodyWorld *rbw, bool rebuild)
+{
+	Base *base;
+	GroupObject *go;
+	
+	if (rbw->group) {
+		for (go = rbw->group->gobject.first; go; go = go->next) {
+			rigidbody_object_build(scene, rbw, go->ob, rebuild);
+		}
+	}
+	
+	for (base = scene->base.first; base; base = base->next) {
+		rigidbody_object_build_components(scene, rbw, base->object, rebuild);
 	}
 }
 
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index f84d1ac..79d67a3 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -90,6 +90,14 @@ void HAIR_solver_update_externals(struct HAIR_Solver *csolver, Scene *scene, Obj
 	SceneConverter::sync_rigidbody_data(solver->data());
 }
 
+void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *csolver, struct rbDynamicsWorld *world)
+{
+	Solver *solver = (Solver *)csolver;
+	
+	if (solver->data())
+		solver->data()->add_to_world(world, 0xFFFFFFFF);
+}
+
 void HAIR_solver_step(struct HAIR_Solver *csolver, float time, float timestep)
 {
 	Solver *solver = (Solver *)csolver;
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index faa20c3..6e6f6ec 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -33,6 +33,7 @@ struct Object;
 struct DerivedMesh;
 struct HairCurve;
 struct HairSystem;
+struct rbDynamicsWorld;
 
 struct HAIR_Solver;
 struct HAIR_SmoothingIteratorFloat3;
@@ -43,6 +44,7 @@ void HAIR_solver_free(struct HAIR_Solver *solver);
 void HAIR_solver_set_params(struct HAIR_Solver *solver, const struct HairParams *params);
 void HAIR_solver_build_data(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
 void HAIR_solver_update_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
+void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *solver, struct rbDynamicsWorld *world);
 
 typedef struct HAIR_SolverContact {
 	float coA[3], coB[3];




More information about the Bf-blender-cvs mailing list