[Bf-blender-cvs] [d5d33db] fracture_modifier: fix: fake parenting in testfile didnt work anymore after fake hook was added to code, now both should work depending on whether the kinematic flag is set (=parenting) or not (=hook, if vertexgroup and hookmodifiers are used)

Martin Felke noreply at git.blender.org
Wed Jan 27 22:08:55 CET 2016


Commit: d5d33dbd40eba13043b95c6cfb31b04dda32ded7
Author: Martin Felke
Date:   Wed Jan 27 21:19:05 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd5d33dbd40eba13043b95c6cfb31b04dda32ded7

fix: fake parenting in testfile didnt work anymore after fake hook was added to code, now both should work depending on whether the kinematic flag is set (=parenting) or not (=hook, if vertexgroup and hookmodifiers are used)

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

M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 73d095a..7896b72 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,7 +78,7 @@
 static void resetDynamic(RigidBodyWorld *rbw);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed);
 static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo);
-static void handle_passive_transform(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
+static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
 
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -2923,7 +2923,7 @@ static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
 	}
 }
 
-static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3], FractureModifierData *fmd, Object *ob)
+static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3])
 {
 	//no reshape necessary as vertcount didnt change, but update rbo->pos / orn ? according to change of 1st vertex
 	//fake hook system
@@ -3457,7 +3457,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 					zero_v3(mi->rigidbody->ang_vel);
 				}
 
-				handle_passive_transform(fmd, mi, ob);
+				rigidbody_passive_hook(fmd, mi, ob);
 
 				if (fmd->use_breaking)
 				{
@@ -3754,55 +3754,48 @@ bool BKE_rigidbody_check_sim_running(RigidBodyWorld *rbw, float ctime)
 	return (rbw && (rbw->flag & RBW_FLAG_MUTED) == 0 && ctime > rbw->pointcache->startframe);
 }
 
-static void handle_passive_transform(FractureModifierData *fmd, MeshIsland *mi, Object* ob)
+static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob)
 {
 	RigidBodyOb *rbo = mi->rigidbody;
 
-	if (rbo->type == RBO_TYPE_PASSIVE)
+	if (rbo->type == RBO_TYPE_PASSIVE && !(rbo->flag & RBO_FLAG_KINEMATIC))
 	{
-		if (rbo->flag & RBO_FLAG_KINEMATIC)
-		{
-			rigidbody_passive_fake_parenting(fmd, ob, rbo);
-		}
-		else
+		DerivedMesh *dm = fmd->visible_mesh_cached;
+		ModifierData *md;
+		bool found = false;
+
+		if (dm)
 		{
-			DerivedMesh *dm = fmd->visible_mesh_cached;
-			ModifierData *md;
-			bool found = false;
+			int totvert = dm->getNumVerts(dm);
 
-			if (dm)
+			for (md = ob->modifiers.first; md; md = md->next)
 			{
-				int totvert = dm->getNumVerts(dm);
-
-				for (md = ob->modifiers.first; md; md = md->next)
+				if (md->type == eModifierType_Fracture)
 				{
-					if (md->type == eModifierType_Fracture)
+					if ((FractureModifierData*)md == fmd)
 					{
-						if ((FractureModifierData*)md == fmd)
-						{
-							found = true;
-						}
+						found = true;
 					}
+				}
 
-					//only eval following hookmodifiers, based on our derivedmesh
-					if (md->type == eModifierType_Hook && found)
-					{
-						float (*vertexCos)[3];
-						const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-						HookModifierData *hmd = (HookModifierData*)md;
+				//only eval following hookmodifiers, based on our derivedmesh
+				if (md->type == eModifierType_Hook && found)
+				{
+					float (*vertexCos)[3];
+					const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+					HookModifierData *hmd = (HookModifierData*)md;
 
-						//skip hook modifiers which were just added and arent valid yet
-						if (!hmd->object)
-							continue;
+					//skip hook modifiers which were just added and arent valid yet
+					if (!hmd->object)
+						continue;
 
-						vertexCos = MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
-						dm->getVertCos(dm, vertexCos);
+					vertexCos = MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
+					dm->getVertCos(dm, vertexCos);
 
-						mti->deformVerts(md, ob, dm, vertexCos, totvert, 0);
-						rigidbody_passive_fake_hook(mi, vertexCos[mi->vertex_indices[0]], fmd, ob);
+					mti->deformVerts(md, ob, dm, vertexCos, totvert, 0);
+					rigidbody_passive_fake_hook(mi, vertexCos[mi->vertex_indices[0]]);
 
-						MEM_freeN(vertexCos);
-					}
+					MEM_freeN(vertexCos);
 				}
 			}
 		}
@@ -3846,7 +3839,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					continue;
 				}
 
-				//handle_passive_transform(fmd, mi, ob);
+				rigidbody_passive_fake_parenting(fmd, ob, rbo);
 
 				/* use rigid body transform after cache start frame if objects is not being transformed */
 				if (BKE_rigidbody_check_sim_running(rbw, ctime) && !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
@@ -4029,7 +4022,14 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
 		{
 			rbo = mi->rigidbody;
 			do_reset_rigidbody(rbo, ob, mi, loc, rot, quat, rotAxis, rotAngle);
-			handle_passive_transform(rmd, mi, ob);
+			if (rbo->flag & RBO_FLAG_KINEMATIC)
+			{
+				rigidbody_passive_fake_parenting(rmd, ob, rbo);
+			}
+			else
+			{
+				rigidbody_passive_hook(rmd, mi, ob);
+			}
 		}
 
 		//then update origmat




More information about the Bf-blender-cvs mailing list