[Bf-blender-cvs] [07d652a] fracture_modifier: crash fix for convert to objects and fix for invalid positions after conversion as well (was all zeroed out)

Martin Felke noreply at git.blender.org
Fri Nov 21 15:42:02 CET 2014


Commit: 07d652a84080ec82e7e3196aada61dc8b95ed545
Author: Martin Felke
Date:   Fri Nov 21 15:41:54 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB07d652a84080ec82e7e3196aada61dc8b95ed545

crash fix for convert to objects and fix for invalid positions after conversion as well (was all zeroed out)

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

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 4ffef72..b87d2d2 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2309,8 +2309,10 @@ void BKE_rigidbody_remove_object(Scene *scene, Object *ob)
 						}
 						
 						/* this SHOULD be the correct global index*/
-						if (rbw->cache_index_map)
+						if ((rbw->cache_index_map != NULL) && (rbw->numbodies > 0))
+						{
 							rbw->cache_index_map[mi->linear_index] = NULL;
+						}
 						MEM_freeN(mi->rigidbody);
 						mi->rigidbody = NULL;
 					}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 0e1a79c..e85d6b0 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2471,6 +2471,7 @@ static void convert_modifier_to_objects(ReportList *reports, Scene* scene, Objec
 	MeshIsland *mi;
 	RigidBodyShardCon* con;
 	int i = 0;
+	RigidBodyWorld *rbw = scene->rigidbody_world;
 
 	int count = BLI_countlist(&rmd->meshIslands);
 	KDTree* objtree = BLI_kdtree_new(count);
@@ -2478,6 +2479,9 @@ static void convert_modifier_to_objects(ReportList *reports, Scene* scene, Objec
 	float max_con_mass = 0;
 	rmd->refresh = false;
 
+	if (rbw)
+		rbw->pointcache->flag |= PTCACHE_OUTDATED;
+
 	for (mi = rmd->meshIslands.first; mi; mi = mi->next) {
 		float cent[3];
 		Mesh* me;
@@ -2490,13 +2494,12 @@ static void convert_modifier_to_objects(ReportList *reports, Scene* scene, Objec
 			ob_new = base_new->object;
 		}
 		else {
-			RigidBodyWorld *rbw = NULL;
 
-			ob_new = BKE_object_add(G.main, scene, OB_MESH);
 
-			rbw = scene->rigidbody_world;
+			ob_new = BKE_object_add(G.main, scene, OB_MESH);
 
 			if (rbw) {
+				rbw->pointcache->flag |= PTCACHE_OUTDATED;
 				/* make rigidbody object settings */
 				if (ob_new->rigidbody_object == NULL) {
 					ob_new->rigidbody_object = BKE_rigidbody_create_object(scene, ob_new, RBO_TYPE_ACTIVE);
@@ -2604,6 +2607,10 @@ static void convert_modifier_to_objects(ReportList *reports, Scene* scene, Objec
 	/* free array and kdtree*/
 	MEM_freeN(objs);
 	BLI_kdtree_free(objtree);
+
+	/*argh, need to trigger a world rebuild, by all means */
+	if (rbw)
+		BKE_rigidbody_rebuild_world(scene, rbw->pointcache->startframe+1);
 }
 
 static int rigidbody_convert_exec(bContext *C, wmOperator *op)




More information about the Bf-blender-cvs mailing list