[Bf-blender-cvs] [63ad55f2953] fracture_modifier: fixes for FM mesh island rigidbody path problem and volume calculation

Martin Felke noreply at git.blender.org
Tue Aug 15 02:53:20 CEST 2017


Commit: 63ad55f2953ac01e1d596c959572d7ceb44d5482
Author: Martin Felke
Date:   Tue Aug 15 02:52:59 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB63ad55f2953ac01e1d596c959572d7ceb44d5482

fixes for FM mesh island rigidbody path problem and volume calculation

scaling was ignored and only half of the dimensions for the volume were used, thus the calculated mass was 1/8th of the
correct mass.

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/physics/rigidbody_object.c
M	source/blender/makesdna/DNA_rigidbody_types.h
M	source/blender/makesrna/intern/rna_rigidbody.c

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index aa5e406bf66..7b55e983587 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -97,7 +97,7 @@ void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_center[3]);
 struct RigidBodyWorld *BKE_rigidbody_get_world(struct Scene *scene);
 void BKE_rigidbody_remove_object(struct Scene *scene, struct Object *ob);
 void BKE_rigidbody_remove_constraint(struct Scene *scene, struct Object *ob);
-float BKE_rigidbody_calc_volume(struct DerivedMesh *dm, struct RigidBodyOb *rbo);
+float BKE_rigidbody_calc_volume(struct DerivedMesh *dm, struct RigidBodyOb *rbo, Object *ob);
 void BKE_rigidbody_calc_shard_mass(struct Object* ob, struct MeshIsland* mi, struct DerivedMesh* dm);
 void BKE_rigidbody_calc_threshold(float max_con_mass, struct FractureModifierData* rmd, struct RigidBodyShardCon *con);
 float BKE_rigidbody_calc_max_con_mass(struct Object* ob);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 2ee57f9cda3..73e337bf162 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -980,6 +980,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, M
 		rbo->shape = mi->rigidbody->shape;
 		rbo->mesh_source = mi->rigidbody->mesh_source;
 		rbo->meshisland_index = mi->rigidbody->meshisland_index;
+		rbo->is_fractured = true;
 		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);
@@ -1019,6 +1020,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, M
 		mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
 
 		rbo->meshisland_index = -1;
+		rbo->is_fractured = false;
 	}
 
 	zero_v3(rbo->lin_vel);
@@ -2602,10 +2604,11 @@ static void DM_mesh_boundbox(DerivedMesh *bm, float r_loc[3], float r_size[3])
 }
 
 /* helper function to calculate volume of rigidbody object */
-float BKE_rigidbody_calc_volume(DerivedMesh *dm, RigidBodyOb *rbo)
+float BKE_rigidbody_calc_volume(DerivedMesh *dm, RigidBodyOb *rbo, Object* ob)
 {
 	float loc[3]  = {0.0f, 0.0f, 0.0f};
 	float size[3]  = {1.0f, 1.0f, 1.0f};
+	float scale[3] = {1.0f, 1.0f, 1.0f};
 	float radius = 1.0f;
 	float height = 1.0f;
 
@@ -2620,6 +2623,13 @@ float BKE_rigidbody_calc_volume(DerivedMesh *dm, RigidBodyOb *rbo)
 	/* XXX: all dimensions are auto-determined now... later can add stored settings for this*/
 	DM_mesh_boundbox(dm, loc, size);
 
+	/* also take object scale into account */
+	if (ob)
+	{
+		mat4_to_size(scale, ob->obmat);
+		mul_v3_v3(size, scale);
+	}
+
 	if (ELEM(rbo->shape, RB_SHAPE_CAPSULE, RB_SHAPE_CYLINDER, RB_SHAPE_CONE)) {
 		/* take radius as largest x/y dimension, and height as z-dimension */
 		radius = MAX2(size[0], size[1]) * 0.5f;
@@ -2653,6 +2663,8 @@ float BKE_rigidbody_calc_volume(DerivedMesh *dm, RigidBodyOb *rbo)
 		case RB_SHAPE_BOX:
 		case RB_SHAPE_CONVEXH:
 		case RB_SHAPE_TRIMESH:
+			mul_v3_fl(size, 2.0f);
+
 			volume = size[0] * size[1] * size[2];
 			if (size[0] == 0) {
 				volume = size[1] * size[2];
@@ -2702,7 +2714,7 @@ void BKE_rigidbody_calc_shard_mass(Object *ob, MeshIsland *mi, DerivedMesh *orig
 		if (ob->type == OB_MESH) {
 			/* if we have a mesh, determine its volume */
 			dm_ob = CDDM_from_mesh(ob->data);
-			vol_ob = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object);
+			vol_ob = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object, ob);
 		}
 		else {
 			/* else get object boundbox as last resort */
@@ -2713,14 +2725,14 @@ void BKE_rigidbody_calc_shard_mass(Object *ob, MeshIsland *mi, DerivedMesh *orig
 	}
 	else
 	{
-		vol_ob = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object);
+		vol_ob = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object, ob);
 	}
 
 	mass_ob = ob->rigidbody_object->mass;
 
 	if (vol_ob > 0) {
 		dm_mi = mi->physics_mesh;
-		vol_mi = BKE_rigidbody_calc_volume(dm_mi, mi->rigidbody);
+		vol_mi = BKE_rigidbody_calc_volume(dm_mi, mi->rigidbody, NULL);
 		mass_mi = (vol_mi / vol_ob) * mass_ob;
 		mi->rigidbody->mass = mass_mi;
 	}
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 38c84fb94f5..fd2b8f3b8cd 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -1719,6 +1719,18 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 					rbsc->spring_damping_ang_y = 0.5;
 					rbsc->spring_damping_ang_z = 0.5;
 				}
+
+				for (MeshIsland *mi = fmd->meshIslands.first; mi != NULL; mi = mi->next)
+				{
+					//set this new flag to distinguish between regular and fractured rigidbodies,
+					//its the same struct otherwise
+					mi->rigidbody->is_fractured = true;
+				}
+			}
+
+			if (ob->rigidbody_object)
+			{
+				ob->rigidbody_object->is_fractured = false;
 			}
 		}
 	}
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 1ea58787cd8..c20464cf6a9 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -547,7 +547,7 @@ static int rigidbody_objects_calc_mass_exec(bContext *C, wmOperator *op)
 			if (ob->type == OB_MESH) {
 				/* if we have a mesh, determine its volume */
 				dm_ob = CDDM_from_mesh(ob->data);
-				volume = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object);
+				volume = BKE_rigidbody_calc_volume(dm_ob, ob->rigidbody_object, ob);
 			}
 			else {
 				float dim[3];
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 4f79f648c5f..42fdd977cc8 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -119,7 +119,7 @@ typedef struct RigidBodyOb {
 	int col_groups;			/* Collision groups that determines wich rigid bodies can collide with each other */
 	int meshisland_index;	/* determines "offset" inside an objects meshisland list, -1 for regular rigidbodies */
 	short mesh_source;		/* (eRigidBody_MeshSource) mesh source for mesh based collision shapes */
-	short pad;
+	short is_fractured;
 	char pad2[4];
 	
 	/* Physics Parameters */
diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c
index f3e9732f47f..02dee9324a1 100644
--- a/source/blender/makesrna/intern/rna_rigidbody.c
+++ b/source/blender/makesrna/intern/rna_rigidbody.c
@@ -311,7 +311,7 @@ static char *rna_RigidBodyOb_path(PointerRNA *ptr)
 	RigidBodyOb* rbo = ptr->data;
 	Object* ob = ptr->id.data;
 	ModifierData *md = modifiers_findByType(ob, eModifierType_Fracture);
-	if (md && rbo->meshisland_index > -1)
+	if (md && rbo->is_fractured)
 	{
 		char name_esc[sizeof(md->name) * 2];
 		BLI_strescape(name_esc, md->name, sizeof(name_esc));




More information about the Bf-blender-cvs mailing list