[Bf-blender-cvs] [e6341b51070] fracture_modifier: fix for rotated box shapes in external mode + print -1 for unbreakable threshold in phys viz

Martin Felke noreply at git.blender.org
Thu Aug 24 10:30:50 CEST 2017


Commit: e6341b510709be7624e3b48cdd01273187b90662
Author: Martin Felke
Date:   Thu Aug 24 10:30:28 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBe6341b510709be7624e3b48cdd01273187b90662

fix for rotated box shapes in external mode + print -1 for unbreakable threshold in phys viz

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

M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 1f1aa574084..13e884e180a 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -440,7 +440,13 @@ void TickDiscreteDynamicsWorld::debugDrawWorld(draw_string str_callback)
 static const char* val_to_str(rbConstraint* con, int precision, int *length)
 {
 	std::ostringstream oss;
-	oss << std::fixed << std::setprecision(precision) << con->id << ":" << con->con->getAppliedImpulse() << ":" << con->con->getBreakingImpulseThreshold();
+	btScalar threshold = con->con->getBreakingImpulseThreshold();
+	if (threshold == FLT_MAX)
+	{
+		threshold = -1;
+	}
+
+	oss << std::fixed << std::setprecision(precision) << con->id << ":" << con->con->getAppliedImpulse() << ":" << threshold;
 	*length = oss.str().length();
 	const char *ret = strdup(oss.str().c_str());
 	return ret;
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index b0cc6af9fcf..fad1258444e 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2780,7 +2780,7 @@ static void fracture_update_shards(FractureModifierData *fmd, Shard *s)
 	fm->shard_count++;
 }
 
-static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s, int vertstart)
+static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s, int vertstart, float quat[4])
 {
 	MeshIsland *mi;
 	int k = 0, j = 0, totvert;
@@ -2852,6 +2852,8 @@ static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 
 		/* then eliminate centroid in vertex coords*/
 		sub_v3_v3(mv->co, s->centroid);
+
+		mul_qt_v3(quat, mv->co);
 	}
 
 	copy_v3_v3(mi->centroid, s->centroid);
@@ -3160,7 +3162,7 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 	Shard *s;
 	int vertstart = 0;
 	short totcol = 0, totdef = 0;
-	float loc[3], quat[4];
+	float loc[3], quat[4], iquat[4];
 
 	if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL || own->type != OB_MESH || !own->data)
 		return NULL;
@@ -3180,7 +3182,8 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 	fmd->frac_mesh->progress_counter += s->totvert;
 
 	//hrm need to rebuild ALL islands since vertex refs are bonkers now after mesh has changed
-	mi = fracture_shard_to_island(fmd, s, vertstart);
+	invert_qt_qt(iquat, quat);
+	mi = fracture_shard_to_island(fmd, s, vertstart, iquat);
 
 	copy_qt_qt(mi->rot, quat);
 	copy_v3_v3(mi->centroid, loc);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c9e49313bce..250a221c798 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -846,25 +846,24 @@ RigidBodyOb *BKE_rigidbody_create_shard(Scene *scene, Object *ob, Object *target
 	if (target && target->rigidbody_object)
 	{
 		rbo = BKE_rigidbody_copy_object(target);
-		//mat4_to_loc_quat(rbo->pos, rbo->orn, target->obmat);
-
+		mat4_to_loc_quat(rbo->pos, rbo->orn, target->obmat);
 	}
 	else
 	{
 		/* regular FM case */
 		rbo = BKE_rigidbody_copy_object(ob);
 		rbo->type = mi->ground_weight > 0.01f ? RBO_TYPE_PASSIVE : RBO_TYPE_ACTIVE;
-	}
 
-	/* set initial transform */
-	mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
-	mat4_to_size(size, ob->obmat);
+		/* set initial transform */
+		mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+		mat4_to_size(size, ob->obmat);
 
-	//add initial "offset" (centroid), maybe subtract ob->obmat ?? (not sure)
-	copy_v3_v3(centr, mi->centroid);
-	mul_v3_v3(centr, size);
-	mul_qt_v3(rbo->orn, centr);
-	add_v3_v3(rbo->pos, centr);
+		//add initial "offset" (centroid), maybe subtract ob->obmat ?? (not sure)
+		copy_v3_v3(centr, mi->centroid);
+		mul_v3_v3(centr, size);
+		mul_qt_v3(rbo->orn, centr);
+		add_v3_v3(rbo->pos, centr);
+	}
 
 	/* return this object */
 	return rbo;
@@ -5198,25 +5197,28 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					mul_v3_v3(centr, size);
 					mul_qt_v3(rbo->orn, centr);
 					add_v3_v3(rbo->pos, centr);
-				}
 
-				//frame = (int)BKE_scene_frame_get(md->scene);
-				//print_v3("RBO POS:", rbo->pos);
-#if 0
-				if (mode)
-				{
-					float rot[4];
-					copy_qt_qt(rot, mi->rot);
-					mul_qt_qtqt(rot, rot, rbo->orn);
-					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
-				}
-				else
-				{
-					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+					if (mode)
+					{
+						mul_qt_qtqt(rbo->orn, rbo->orn, mi->rot);
+					}
 				}
-#endif
+
 				if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {
-					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+
+					float quat[4];
+
+					if (mode)
+					{
+						float iquat[4];
+						invert_qt_qt(iquat, mi->rot);
+						mul_qt_qtqt(quat, rbo->orn, iquat);
+					}
+					else {
+						copy_qt_qt(quat, rbo->orn);
+					}
+
+					BKE_rigidbody_update_cell(mi, ob, rbo->pos, quat, fmd, (int)ctime);
 				}
 			}



More information about the Bf-blender-cvs mailing list