[Bf-blender-cvs] [e1e6e2d] fracture_modifier: stability factor should now influence overall stability of object more directly. This should allow to control breaking behavior of the compounds better. As before the masses still have the biggest influence to the breaking behavior, followed by thresholds and connection count per shard.

Martin Felke noreply at git.blender.org
Sat Mar 26 18:51:11 CET 2016


Commit: e1e6e2d04b3a04cc68b2bbc61df01804271ecaa7
Author: Martin Felke
Date:   Sat Mar 26 18:50:39 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBe1e6e2d04b3a04cc68b2bbc61df01804271ecaa7

stability factor should now influence overall stability of object more directly.
This should allow to control breaking behavior of the compounds better.
As before the masses still have the biggest influence to the breaking behavior, followed by thresholds and
connection count per shard.

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

M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
index a846cf7..4c60e2d 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -23,6 +23,8 @@ class btConnectionSortPredicate
 			btVector3 locRhs = (locRhsA + locRhsB) * 0.5f;
 
 			//lhs.parent should match rhs.parent... same object
+			btAssert(lhs.m_parent == rhs.m_parent);
+
 			btScalar dLhs = lhs.m_parent->getWorldTransform().getOrigin().distance(locLhs);
 			btScalar dRhs = rhs.m_parent->getWorldTransform().getOrigin().distance(locRhs);
 			//btTransform id = btTransform::getIdentity();
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 2e29995..661ae7e 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -193,8 +193,8 @@ class TickDiscreteDynamicsWorld : public btFractureDynamicsWorld
 btScalar connection_dist(btFractureBody *fbody, int index, btVector3 impact)
 {
 	btConnection& con = fbody->m_connections[index];
-	btVector3 con_posA = fbody->getWorldTransform().inverse() * con.m_obA->getWorldTransform().getOrigin();
-	btVector3 con_posB = fbody->getWorldTransform().inverse() * con.m_obB->getWorldTransform().getOrigin();
+	btVector3 con_posA = con.m_parent->getWorldTransform().inverse() * con.m_obA->getWorldTransform().getOrigin();
+	btVector3 con_posB = con.m_parent->getWorldTransform().inverse() * con.m_obB->getWorldTransform().getOrigin();
 	btVector3 con_pos = (con_posA + con_posB) * 0.5f;
 
 	return impact.distance(con_pos);
@@ -252,9 +252,14 @@ bool weakenCompound(const btCollisionObject *body, btScalar force, btVector3 imp
 			btVector3 imp = fbody->getWorldTransform().inverse() * impact;
 			btScalar dist = connection_dist(fbody, i, imp);
 			btConnection& con = fbody->m_connections[i];
-			btScalar lforce = force; //* (1.0f - fbody->m_propagationParameter.m_stability_factor);
+			btScalar lforce = force;
 			if (dist > 0.0f)
+			{
 				lforce = lforce / dist; // the closer, the higher the force
+				//printf("lforce %f\n", lforce);
+				lforce *= (1.0f - fbody->m_propagationParameter.m_stability_factor);
+				//printf("lforce2 %f\n", lforce);
+			}
 
 			if (lforce > fbody->m_propagationParameter.m_minimum_impulse)
 			{
@@ -272,7 +277,7 @@ bool weakenCompound(const btCollisionObject *body, btScalar force, btVector3 imp
 				}
 			}
 
-			btScalar pdist = connection_dist(fbody, i, fbody->getWorldTransform().getOrigin());
+			btScalar pdist = connection_dist(fbody, i, con.m_parent->getWorldTransform().getOrigin());
 			if (pdist > (dim * (1.0f - fbody->m_propagationParameter.m_stability_factor)))
 			{
 				break;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 9b4740a..80d8bf3 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -221,11 +221,10 @@ void BKE_rigidbody_calc_threshold(float max_con_mass, FractureModifierData *rmd,
 
 		if (rmd->use_compounds)
 		{
-			/*float min_mass = MIN2(con->mi1->rigidbody->mass, con->mi2->rigidbody->mass);
+			float min_mass = MIN2(con->mi1->rigidbody->mass, con->mi2->rigidbody->mass);
 			float max_mass = MAX2(con->mi1->rigidbody->mass, con->mi2->rigidbody->mass);
 
-			thresh = ((min_mass + (rmd->mass_threshold_factor * max_mass)) / (min_mass + max_mass)) * max_thresh;*/
-			thresh = max_thresh;
+			thresh = ((min_mass + (rmd->mass_threshold_factor * max_mass)) / (min_mass + max_mass)) * max_thresh;
 		}
 		else;
 		{
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 70509dc..fac1d4f 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2335,6 +2335,7 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl
 	dist = rmd->contact_dist;
 	factor = rmd->mass_threshold_factor;
 
+#if 0
 	if (factor > 0.0f && rmd->use_compounds) {
 		if (mi->rigidbody->mass > 0.0f && max_mass > 0.0f) {
 			float ratio = mi->rigidbody->mass / max_mass;
@@ -2342,6 +2343,7 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl
 			limit *= (factor * ratio);
 		}
 	}
+#endif
 
 	if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
 		mul_v3_m4v3(obj_centr, rmd->origmat, mi->centroid);




More information about the Bf-blender-cvs mailing list