[Bf-blender-cvs] [bcc260c] fracture_modifier: improved the fake hook system, should behave now exactly as a regular hook and added some FM code comments to plan further work.

Martin Felke noreply at git.blender.org
Wed Jan 27 18:23:30 CET 2016


Commit: bcc260c778f81e823359676f1b33cf51d1821314
Author: Martin Felke
Date:   Wed Jan 27 18:23:15 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBbcc260c778f81e823359676f1b33cf51d1821314

improved the fake hook system, should behave now exactly as a regular hook and added some FM code comments to plan further work.

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index f41e877..73d095a 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,6 +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 activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -475,7 +476,7 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
 	invert_m4_m4(ob->imat, ob->obmat);
 	mat4_to_size(size, ob->obmat);
 
-	if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED) {
+	if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
 		/*record only in prefracture case here, when you want to convert to keyframes*/
 		n = frame - mi->start_frame + 1;
 
@@ -2922,11 +2923,11 @@ static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
 	}
 }
 
-static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
+static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3], FractureModifierData *fmd, Object *ob)
 {
 	//no reshape necessary as vertcount didnt change, but update rbo->pos / orn ? according to change of 1st vertex
 	//fake hook system
-	if (mv && mi->rigidbody->type == RBO_TYPE_PASSIVE &&
+	if (mi->rigidbody->type == RBO_TYPE_PASSIVE &&
 	    mi->rigidbody->physics_object && !(mi->rigidbody->flag & RBO_FLAG_KINEMATIC))
 	{
 		float oldloc[3], loc[3], diff[3], pos[3];
@@ -2936,7 +2937,7 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
 
 		//this location comes from the final DM, which might be changed by hook modifiers for example
 		//XXX TODO maybe need a proper switch for this behavior, too
-		copy_v3_v3(loc, mv->co);
+		copy_v3_v3(loc, co);
 		sub_v3_v3v3(diff, oldloc, loc);
 		//sub_v3_v3(diff, mi->centroid);
 
@@ -2949,7 +2950,9 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
 		RB_body_set_kinematic_state(mi->rigidbody->physics_object, true);
 
 		//XXX TODO how to handle rotation properly ? and omit if kinematic, else it will interfere
+		//copy_v3_v3(mi->rigidbody->pos, pos);
 		RB_body_set_loc_rot(mi->rigidbody->physics_object, pos, mi->rigidbody->orn);
+		//BKE_rigidbody_update_cell(mi, ob, pos, mi->rigidbody->orn, fmd, -1);
 	}
 }
 
@@ -2982,12 +2985,14 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o
 			{
 				if (mi != NULL)
 				{
+#if 0
 					if (mi->rigidbody->type == RBO_TYPE_PASSIVE)
 					{
 						MVert *mv = mvert + mi->vertex_indices[0];
 						rigidbody_passive_fake_hook(mi, mv);
 					}
 					else
+#endif
 					{
 						//fracture modifier case TODO, update mi->physicsmesh somehow and redraw
 						rbo->flag |= RBO_FLAG_NEEDS_RESHAPE;
@@ -3414,16 +3419,6 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 		int count = 0, brokencount = 0, plastic = 0;
 		float frame = 0;
 
-		if (rebuild || is_zero_m4(fmd->passive_parent_mat))
-		{
-			copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
-		}
-
-		//print_m4("Obmat: \n", ob->obmat);
-		//print_m4("Passivemat: \n", fmd->passive_parent_mat);
-
-		BKE_object_where_is_calc(scene, ob);
-
 		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
 			int frame = (int)BKE_scene_frame_get(scene);
@@ -3432,12 +3427,18 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				BKE_rigidbody_update_ob_array(rbw);
 			}
 		}
+		else
+		{
+			if (rebuild || is_zero_m4(fmd->passive_parent_mat))
+			{
+				copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
+			}
 
-		//count = BLI_listbase_count(&fmd->meshIslands);
+			//print_m4("Obmat: \n", ob->obmat);
+			//print_m4("Passivemat: \n", fmd->passive_parent_mat);
 
-		//if (fmd->use_compounds && rebuild)
-			/*create compound */
-		//	compound = RB_shape_new_compound();
+			BKE_object_where_is_calc(scene, ob);
+		}
 
 		for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 			if (mi->rigidbody == NULL) {
@@ -3456,6 +3457,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 					zero_v3(mi->rigidbody->ang_vel);
 				}
 
+				handle_passive_transform(fmd, mi, ob);
+
 				if (fmd->use_breaking)
 				{
 					float weight = mi->thresh_weight;
@@ -3751,6 +3754,61 @@ 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)
+{
+	RigidBodyOb *rbo = mi->rigidbody;
+
+	if (rbo->type == RBO_TYPE_PASSIVE)
+	{
+		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)
+			{
+				int totvert = dm->getNumVerts(dm);
+
+				for (md = ob->modifiers.first; md; md = md->next)
+				{
+					if (md->type == eModifierType_Fracture)
+					{
+						if ((FractureModifierData*)md == fmd)
+						{
+							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;
+
+						//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);
+
+						mti->deformVerts(md, ob, dm, vertexCos, totvert, 0);
+						rigidbody_passive_fake_hook(mi, vertexCos[mi->vertex_indices[0]], fmd, ob);
+
+						MEM_freeN(vertexCos);
+					}
+				}
+			}
+		}
+	}
+}
+
 static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw, float ctime)
 {
 	bool modFound = false;
@@ -3788,7 +3846,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					continue;
 				}
 
-				rigidbody_passive_fake_parenting(fmd, ob, rbo);
+				//handle_passive_transform(fmd, mi, ob);
 
 				/* 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)) {
@@ -3971,8 +4029,11 @@ 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);
-			rigidbody_passive_fake_parenting(rmd, ob, rbo);
+			handle_passive_transform(rmd, mi, ob);
 		}
+
+		//then update origmat
+		copy_m4_m4(rmd->origmat, ob->obmat);
 	}
 	else {
 		rbo = ob->rigidbody_object;
@@ -3981,9 +4042,6 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
 		// RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop)
 	}
 
-	//then update origmat
-	copy_m4_m4(rmd->origmat, ob->obmat);
-
 	// RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop)
 }
 
@@ -4047,8 +4105,8 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
 	if (rbw) {
 		rbw->pointcache->flag |= PTCACHE_OUTDATED;
 		//restoreKinematic(rbw);
-		if (!(rbw->pointcache->flag & PTCACHE_BAKED))
-			resetDynamic(rbw);
+		//if (!(rbw->pointcache->flag & PTCACHE_BAKED))
+		//	resetDynamic(rbw);
 	}
 }
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 608df77..422d9e5 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -87,6 +87,7 @@ static DerivedMesh* do_prefractured(FractureModifierData *fmd, Object *ob, Deriv
 static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* derivedData);
 static Shard* copy_shard(Shard *s);
 
+//TODO XXX Make BKE
 static FracMesh* copy_fracmesh(FracMesh* fm)
 {
 	FracMesh *fmesh;
@@ -94,7 +95,6 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
 	int i = 0;
 
 	fmesh = MEM_mallocN(sizeof(FracMesh), __func__);
-	//BLI_duplicatelist(&fmesh->shard_map, &fm->shard_map);
 	fmesh->shard_map.first = NULL;
 	fmesh->shard_map.last = NULL;
 
@@ -216,6 +216,7 @@ static void initData(ModifierData *md)
 	fmd->constraint_count = 0;
 }
 
+//XXX TODO, freeing functionality should be in BKE too
 static void free_meshislands(FractureModifierData* fmd, ListBase* meshIslands)
 {
 	MeshIsland *mi;
@@ -424,6 +425,7 @@ static void freeData(ModifierData *md)
 	free_shards(fmd);
 }
 
+//XXX TODO move cluster handling to BKE too
 static void do_cluster_count(FractureModifierData *fmd)
 {
 	int k = 0;
@@ -525,6 +527,7 @@ static void do_clusters(FractureModifierData *fmd, Object* obj)
 	}
 }
 
+//XXXX TODO same applies for autohide prep and normals fixing, latter could be a separate operator or so, called from refresh op
 static KDTree *build_nor_tree(DerivedMesh *dm)
 {
 	int i = 0, totvert = dm->getNumVerts(dm);
@@ -577,6 +580,7 @@ static void find_normal(DerivedMesh *dm, KDTree *tree, float co[3], short no[3],
 	copy_v3_v3_short(rno, mvert.no);
 }
 
+//Move to BKE too, TODO XXXX
 static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
 {
 	/* may have messed up meshes from conversion */
@@ -599,6 +603,7 @@ static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
 	return dm;
 }
 
+//XXX TODO plan is to get rid of this, since we have a packing mechanism now, but wrap that functionality to useful op (via C, python api is optional)
 static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
 {
 	int ctr = g_exist;
@@ -633,34 +638,6 @@ static DerivedMesh* get_object_dm(Object* o)
 	return dm_ob;
 }
 
-#if 0

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list