[Bf-blender-cvs] [7023be4] fracture_modifier: fix for Fracture Modifier to object converter (external mode), not all settings were taken into account, and object disappeared when not being on startframe, but as converting mid-sim yields unexpected results, still limiting conversion to startframe, added a notification for this

Martin Felke noreply at git.blender.org
Sun Jan 24 17:18:49 CET 2016


Commit: 7023be40be0e35273fcff0826fd6b81e00a3e1e0
Author: Martin Felke
Date:   Sun Jan 24 17:18:28 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB7023be40be0e35273fcff0826fd6b81e00a3e1e0

fix for Fracture Modifier to object converter (external mode), not all settings were taken into account, and object disappeared when not being on startframe, but as converting mid-sim yields unexpected results, still limiting conversion to startframe, added a notification for this

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/physics/rigidbody_object.c

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 6eab856..545c15c 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -62,7 +62,7 @@ void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc);
 
 /* create Blender-side settings data - physics objects not initialized yet */
 struct RigidBodyWorld *BKE_rigidbody_create_world(struct Scene *scene);
-struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type);
+struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type, struct MeshIsland *mi);
 struct RigidBodyCon *BKE_rigidbody_create_constraint(struct Scene *scene, struct Object *ob, short type, struct RigidBodyShardCon *con);
 struct RigidBodyOb *BKE_rigidbody_create_shard(struct Scene *scene, struct Object *ob, struct Object *target, struct MeshIsland *mi);
 struct RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(struct Scene *scene, short type, bool reset);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c813862..5eaabff 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2262,7 +2262,7 @@ RigidBodyOb *BKE_rigidbody_create_shard(Scene *scene, Object *ob, Object *target
 
 	/* make rigidbody object settings */
 	if (ob->rigidbody_object == NULL) {
-		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
+		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE, NULL);
 	}
 	else {
 		ob->rigidbody_object->type = RBO_TYPE_ACTIVE;
@@ -2335,7 +2335,7 @@ void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw)
 }
 
 /* Add rigid body settings to the specified object */
-RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
+RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, MeshIsland *mi)
 {
 	RigidBodyOb *rbo;
 	RigidBodyWorld *rbw = scene->rigidbody_world;
@@ -2352,39 +2352,65 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
 	/* create new settings data, and link it up */
 	rbo = MEM_callocN(sizeof(RigidBodyOb), "RigidBodyOb");
 
-	/* set default settings */
-	rbo->type = type;
+	if (mi != NULL && mi->rigidbody != NULL)
+	{
+		rbo->type = mi->rigidbody->type;
+		rbo->mass = mi->rigidbody->mass;
 
-	rbo->mass = 1.0f;
+		rbo->friction = mi->rigidbody->friction;
+		rbo->restitution = mi->rigidbody->restitution;
 
-	rbo->friction = 0.5f; /* best when non-zero. 0.5 is Bullet default */
-	rbo->restitution = 0.0f; /* best when zero. 0.0 is Bullet default */
+		rbo->margin = mi->rigidbody->margin;
 
-	rbo->margin = 0.04f; /* 0.04 (in meters) is Bullet default */
+		rbo->lin_sleep_thresh = mi->rigidbody->lin_sleep_thresh;
+		rbo->ang_sleep_thresh = mi->rigidbody->ang_sleep_thresh;
+		rbo->force_thresh = mi->rigidbody->force_thresh;
 
-	rbo->lin_sleep_thresh = 0.4f; /* 0.4 is half of Bullet default */
-	rbo->ang_sleep_thresh = 0.5f; /* 0.5 is half of Bullet default */
-	rbo->force_thresh = 0.0f; /*dont activate by force by default */
+		rbo->col_groups = mi->rigidbody->col_groups;
 
-	rbo->lin_damping = 0.04f; /* 0.04 is game engine default */
-	rbo->ang_damping = 0.1f; /* 0.1 is game engine default */
+		rbo->shape = mi->rigidbody->shape;
+		rbo->mesh_source = mi->rigidbody->mesh_source;
+		rbo->meshisland_index = mi->rigidbody->meshisland_index;
+		copy_v3_v3(rbo->pos, mi->rigidbody->pos);
+		copy_qt_qt(rbo->orn, mi->rigidbody->orn);
+		//mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+	}
+	else
+	{
+		/* set default settings */
+		rbo->type = type;
 
-	rbo->col_groups = 1;
+		rbo->mass = 1.0f;
 
-	/* use triangle meshes for passive objects
-	 * use convex hulls for active objects since dynamic triangle meshes are very unstable
-	 */
-	if (type == RBO_TYPE_ACTIVE)
-		rbo->shape = RB_SHAPE_CONVEXH;
-	else
-		rbo->shape = RB_SHAPE_TRIMESH;
+		rbo->friction = 0.5f; /* best when non-zero. 0.5 is Bullet default */
+		rbo->restitution = 0.0f; /* best when zero. 0.0 is Bullet default */
 
-	rbo->mesh_source = RBO_MESH_DEFORM;
+		rbo->margin = 0.04f; /* 0.04 (in meters) is Bullet default */
 
-	/* set initial transform */
-	mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+		rbo->lin_sleep_thresh = 0.4f; /* 0.4 is half of Bullet default */
+		rbo->ang_sleep_thresh = 0.5f; /* 0.5 is half of Bullet default */
+		rbo->force_thresh = 0.0f; /*dont activate by force by default */
 
-	rbo->meshisland_index = -1;
+		rbo->lin_damping = 0.04f; /* 0.04 is game engine default */
+		rbo->ang_damping = 0.1f; /* 0.1 is game engine default */
+
+		rbo->col_groups = 1;
+
+		/* use triangle meshes for passive objects
+		 * use convex hulls for active objects since dynamic triangle meshes are very unstable
+		 */
+		if (type == RBO_TYPE_ACTIVE)
+			rbo->shape = RB_SHAPE_CONVEXH;
+		else
+			rbo->shape = RB_SHAPE_TRIMESH;
+
+		rbo->mesh_source = RBO_MESH_DEFORM;
+
+		/* set initial transform */
+		mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+
+		rbo->meshisland_index = -1;
+	}
 
 	zero_v3(rbo->lin_vel);
 	zero_v3(rbo->ang_vel);
@@ -3510,7 +3536,7 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 				 * 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);
+				ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE, NULL);
 				rigidbody_validate_sim_object(rbw, ob, true, true);
 
 				rbo = ob->rigidbody_object;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 2ac55c5..ff83d4b 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2713,9 +2713,9 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
 		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);
+			ob_new->rigidbody_object = BKE_rigidbody_create_object(scene, ob_new, RBO_TYPE_ACTIVE, mi);
 		}
-		ob_new->rigidbody_object->type = RBO_TYPE_ACTIVE;
+		//ob_new->rigidbody_object->type = RBO_TYPE_ACTIVE;
 		ob_new->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;
 
 		/* add object to rigid body group */
@@ -2754,13 +2754,23 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
 
 	DM_to_mesh(mi->physics_mesh, me, ob_new, CD_MASK_MESH, false);
 
-	/*set origin to centroid*/
-	copy_v3_v3(cent, mi->centroid);
-	mul_m4_v3(ob_new->obmat, cent);
-	copy_v3_v3(ob_new->loc, cent);
+	if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
+	{
+		/*set origin to centroid*/
+		copy_v3_v3(cent, mi->centroid);
+		mul_m4_v3(ob_new->obmat, cent);
+		copy_v3_v3(ob_new->loc, cent);
+	}
+	else
+	{
+		float size[3] = {1.0f, 1.0f, 1.0f};
+		copy_v3_v3(ob_new->loc, mi->rigidbody->pos);
+		copy_qt_qt(ob_new->quat, mi->rigidbody->orn);
+		loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, size);
+	}
 
 	/*set mass*/
-	ob_new->rigidbody_object->mass = mi->rigidbody->mass;
+	//ob_new->rigidbody_object->mass = mi->rigidbody->mass;
 
 	/*store obj indexes in kdtree and objs in array*/
 	BLI_kdtree_insert(*objtree, i, mi->centroid);
@@ -3007,13 +3017,14 @@ static int rigidbody_convert_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
-	if (!rmd)
+	if (!rmd || (scene->rigidbody_world && cfra != scene->rigidbody_world->pointcache->startframe))
+	{
+		BKE_report(op->reports, RPT_WARNING, "Unable to convert to objects, either no Fracture Modifier present or not on startframe" );
 		return OPERATOR_CANCELLED;
-
-	if (rmd && scene->rigidbody_world && cfra == scene->rigidbody_world->pointcache->startframe) {
-		convert_modifier_to_objects(op->reports, scene, obact, rmd);
 	}
 
+	convert_modifier_to_objects(op->reports, scene, obact, rmd);
+
 	if (rbw) {
 		/* flatten the cache and throw away all traces of the modifiers */
 		short steps_per_second = rbw->steps_per_second;
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 8291a2a..64e7d8a 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -115,7 +115,7 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList *rep
 
 	/* make rigidbody object settings */
 	if (ob->rigidbody_object == NULL) {
-		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, type);
+		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, type, NULL);
 	}
 	ob->rigidbody_object->type = type;
 	ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;




More information about the Bf-blender-cvs mailing list