[Bf-blender-cvs] [fdb5188e60d] temp-fracture-modifier-2.8: attempt for proper reset of new cache together with pointcache

Martin Felke noreply at git.blender.org
Wed Aug 22 12:07:23 CEST 2018


Commit: fdb5188e60daf55dac06e70a12ad258f61bd668e
Author: Martin Felke
Date:   Wed Aug 22 12:06:51 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBfdb5188e60daf55dac06e70a12ad258f61bd668e

attempt for proper reset of new cache together with pointcache

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_dynamic.c
M	source/blender/blenkernel/intern/fracture_prefractured.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/makesrna/intern/rna_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 950616e8d57..8b100895f26 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -159,4 +159,6 @@ bool BKE_fracture_meshisland_check_frame(struct FractureModifierData *fmd, struc
 void BKE_fracture_dynamic_do(struct FractureModifierData *fmd, struct Object* ob, struct Scene* scene,
                              struct Depsgraph* depsgraph, struct Main* bmain);
 
+void BKE_fracture_clear_cache(struct FractureModifierData* fmd, struct Object *ob, struct Scene *scene);
+
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 03e4ecc5520..82a59924fd9 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -131,7 +131,7 @@ void BKE_rigidbody_aftertrans_update(struct Object *ob, float loc[3], float rot[
                                      float quat[4], float rotAxis[3], float rotAngle, struct Depsgraph *depsgraph);
 void BKE_rigidbody_sync_transforms(struct Scene* scene, struct Object *ob, float ctime);
 bool BKE_rigidbody_check_sim_running(struct RigidBodyWorld *rbw, float ctime);
-void BKE_rigidbody_cache_reset(struct RigidBodyWorld *rbw);
+void BKE_rigidbody_cache_reset(struct Scene *scene);
 void BKE_rigidbody_rebuild_world(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
 void BKE_rigidbody_do_simulation(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
 
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 539afde9a98..ca96229da5f 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -461,7 +461,7 @@ static Mesh* get_mesh(Mesh** meshes, int index, Mesh* mesh)
 
 static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain, Object* ob, Scene* scene, cell *c, int count)
 {
-	int i, j = 0;
+	int i, j = 1;
 	BisectContext bictx = {};
 	BooleanContext boctx = {};
 	MeshIsland** islands = NULL;
@@ -479,6 +479,11 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
 
 	mi->endframe = frame;
 
+	mi->locs = MEM_reallocN(mi->locs, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+	mi->rots = MEM_reallocN(mi->rots, sizeof(float) * 4 * (mi->endframe - mi->startframe + 1));
+	mi->vels = MEM_reallocN(mi->vels, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+	mi->aves = MEM_reallocN(mi->aves, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+
 	/*for each cell...*/
 //#pragma omp parallel for
 	for (i = 0; i < count; i++)
@@ -1339,6 +1344,62 @@ void fracture_copy_customdata(CustomData* src, CustomData* dst,CustomDataMask ma
 	}
 }
 
+void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scene)
+{
+	RigidBodyWorld *rbw = scene->rigidbody_world;
+	int startframe = rbw->shared->pointcache->startframe;
+	int endframe = rbw->shared->pointcache->endframe;
+	int frame = 0;
+	MeshIsland *mi, *next;
+
+	mi = fmd->shared->mesh_islands.first;
+	while (mi) {
+		if (mi->startframe > startframe || (!fmd->use_dynamic && mi->id == 0)) {
+			next = mi->next;
+			BLI_remlink(&fmd->shared->mesh_islands, mi);
+			BKE_fracture_mesh_island_free(mi, scene);
+			mi = next;
+		}
+		else {
+			mi->endframe = endframe;
+			MEM_freeN(mi->locs);
+			MEM_freeN(mi->rots);
+			MEM_freeN(mi->vels);
+			MEM_freeN(mi->aves);
+
+			frame = mi->endframe - mi->startframe + 1;
+			mi->locs = MEM_callocN(sizeof (float) * 3 *frame, "mi->locs");
+			mi->rots = MEM_callocN(sizeof (float) * 4 *frame, "mi->rots");
+			mi->vels = MEM_callocN(sizeof (float) * 3 *frame, "mi->vels");
+			mi->aves = MEM_callocN(sizeof (float) * 3 *frame, "mi->aves");
+			mi->fractured = false;
+
+			if (!mi->rigidbody->shared->physics_object)
+			{
+				float size[3];
+				mat4_to_size(size, ob->obmat);
+				int frame = (int)BKE_scene_frame_get(scene);
+
+				//mi->rigidbody->flag |= (RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
+				BKE_rigidbody_validate_sim_shard(rbw, ob, mi, fmd, true, true, size, frame);
+			}
+
+			mi = mi->next;
+		}
+	}
+
+#if 0
+	while (fmd->shared->fracture_ids.first) {
+		FractureID* fid = fmd->shared->fracture_ids.first;
+		BLI_remlink(&fmd->shared->fracture_ids, fid);
+		MEM_freeN(fid);
+	}
+#endif
+
+	fmd->shared->last_cache_end = endframe;
+	fmd->shared->last_cache_start = startframe;
+}
+
 
 Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *scene, Object* ob, float ctime)
 {
@@ -1360,9 +1421,9 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *
 		RigidBodyOb *rbo = mi->rigidbody;
 
 		if (BKE_fracture_meshisland_check_frame(fmd, mi, (int)ctime)) {
-			if (scene && fmd->use_dynamic) {
-				/* remove rigidbody physics handles here too */
+			if (scene && mi->rigidbody->shared->physics_object) {
 				BKE_rigidbody_remove_shard(scene, mi);
+				mi->rigidbody->shared->physics_object = NULL;
 			}
  			continue;
 		}
@@ -1636,6 +1697,9 @@ void BKE_update_velocity_layer(FractureModifierData *fmd, Mesh *dm)
 	{
 		mi = BLI_ghash_lookup(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i));
 		rbo = mi->rigidbody;
+		if (!rbo) {
+			continue;
+		}
 
 		velX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
 		velY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
diff --git a/source/blender/blenkernel/intern/fracture_dynamic.c b/source/blender/blenkernel/intern/fracture_dynamic.c
index 6097f281735..31dc9d4eab8 100644
--- a/source/blender/blenkernel/intern/fracture_dynamic.c
+++ b/source/blender/blenkernel/intern/fracture_dynamic.c
@@ -97,6 +97,9 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
 				fid = (FractureID*)fmd->shared->fracture_ids.first;
 			}
 
+			fmd->shared->fracture_ids.first = NULL;
+			fmd->shared->fracture_ids.last = NULL;
+
 #if 0
 			if (count > 0)
 			{
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index eac66dfe7c4..af1d1ae6d5b 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -144,13 +144,15 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
 
 		/*free old stuff here */
 		BKE_fracture_constraints_free(fmd, scene);
-		BKE_fracture_meshislands_free(fmd, scene);
+		BKE_fracture_meshislands_free(fmd, fmd->use_dynamic ? NULL : scene);
 
+#if 0
 		while (fmd->shared->fracture_ids.first) {
 			FractureID* fid = fmd->shared->fracture_ids.first;
 			BLI_remlink(&fmd->shared->fracture_ids, fid);
 			MEM_freeN(fid);
 		}
+#endif
 
 		me_tmp = BKE_fracture_mesh_copy(me, ob);
 
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index 6c666fc6ff0..091e6c04537 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -2651,7 +2651,7 @@ bool BKE_rigidbody_modifier_sync(ModifierData *md, Object *ob, Scene *scene, flo
 					RigidBodyShardCon *con;
 
 					//rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
-					BKE_rigidbody_cache_reset(rbw);
+					BKE_rigidbody_cache_reset(scene);
 					/* re-enable all constraints as well */
 					for (con = fmd->shared->mesh_constraints.first; con; con = con->next) {
 						//con->flag |= RBC_FLAG_ENABLED;
@@ -2912,7 +2912,7 @@ RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(Scene *scene, short typ
 
 	/* flag cache as outdated */
 	if (reset)
-		BKE_rigidbody_cache_reset(rbw);
+		BKE_rigidbody_cache_reset(scene);
 
 	/* return this object */
 	return rbc;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 085fe782f09..b8d37b41513 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1214,7 +1214,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, M
 	}
 
 	/* flag cache as outdated */
-	BKE_rigidbody_cache_reset(rbw);
+	BKE_rigidbody_cache_reset(scene);
 
 	/* return this object */
 	return rbo;
@@ -1321,7 +1321,7 @@ RigidBodyCon *BKE_rigidbody_create_constraint(Scene *scene, Object *ob, short ty
 	}
 
 	/* flag cache as outdated */
-	BKE_rigidbody_cache_reset(rbw);
+	BKE_rigidbody_cache_reset(scene);
 
 	/* return this object */
 	return rbc;
@@ -1386,7 +1386,7 @@ void BKE_rigidbody_remove_object(Main *bmain, Scene *scene, Object *ob)
 		BKE_rigidbody_free_object(ob, rbw);
 
 		/* flag cache as outdated */
-		BKE_rigidbody_cache_reset(rbw);
+		BKE_rigidbody_cache_reset(scene);
 
 		//BKE_rigidbody_update_ob_array(rbw, true);
 	}
@@ -1405,7 +1405,7 @@ void BKE_rigidbody_remove_constraint(Scene *scene, Object *ob)
 	BKE_rigidbody_free_constraint(ob);
 
 	/* flag cache as outdated */
-	BKE_rigidbody_cache_reset(rbw);
+	BKE_rigidbody_cache_reset(scene);
 }
 
 /* ************************************** */
@@ -2018,10 +2018,29 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
 	}
 }
 
-void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
+void BKE_rigidbody_cache_reset(Scene* scene)
 {
-	if (rbw) {
-		rbw->shared->pointcache->flag |= PTCACHE_OUTDATED;
+	if (scene) {
+		RigidBodyWorld *rbw = scene->rigidbody_world;
+
+		FractureModifierData *fmd;
+		Object *ob;
+		int i = 0;
+
+		if (rbw) {
+			rbw->shared->pointcache->flag |= PTCACHE_OUTDATED;
+			if (rbw->objects) {
+				for (i = 0; i < rbw->numbodies; i++) {
+					ob = rbw->objects[i];
+					if (ob) {
+						fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+						if (fmd) {
+							BKE_fracture_clear_cache(fmd, ob, scene);
+						}
+					}
+				}
+			}
+		}
 	}
 }
 
@@ -2130,7 +2149,7 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
 	{
 		if (!was_changed)
 		{
-			BKE_rigidbody_cache_reset(rbw);
+			BKE_rigidbody_cache_reset(scene);
 			BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
 		}
 
@@ -2161,8 +2180,8 @@ voi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list