[Bf-blender-cvs] [8bd2323] fracture_modifier: further tweaks for dynamic fracture

Martin Felke noreply at git.blender.org
Mon Oct 3 15:11:51 CEST 2016


Commit: 8bd2323829f20bf06b4f1adb004f239302327388
Author: Martin Felke
Date:   Mon Oct 3 15:11:24 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB8bd2323829f20bf06b4f1adb004f239302327388

further tweaks for dynamic fracture

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 8234507..fc0d51b 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2065,7 +2065,7 @@ static Shard* findShard(FractureModifierData *fmd, int id)
 static bool check_shard_size(FractureModifierData *fmd, int id)
 {
 	FractureID *fid;
-	float size = 0.1f;
+	float size = 0.05f;
 	Shard *s = NULL;
 
 	s = findShard(fmd, id);
@@ -2077,13 +2077,17 @@ static bool check_shard_size(FractureModifierData *fmd, int id)
 
 	BKE_shard_calc_minmax(s);
 
-	if ((fabsf(s->max[0] - s->min[0]) < size) ||
-	   (fabsf(s->max[1] - s->min[1]) < size) ||
+	if ((fabsf(s->max[0] - s->min[0]) < size) &&
+	   (fabsf(s->max[1] - s->min[1]) < size) &&
 	   (fabsf(s->max[2] - s->min[2]) < size))
 	{
 		return false;
 	}
 
+	/*if (s->raw_volume < size) {
+		return false;
+	}*/
+
 	for (fid = fmd->fracture_ids.first; fid; fid = fid->next)
 	{
 		if (fid->shardID == id)
@@ -2137,13 +2141,13 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 				int id = rbw->cache_index_map[linear_index1]->meshisland_index;
 				Shard *s = findShard(fmd1, id);
 
-				if ((force > fmd1->dynamic_force && (!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)) ||
-				    (s && ob2 && (fmd1->limit_impact && can_break(ob2, ob1, fmd1->limit_impact, s))))))
+				if ((force > fmd1->dynamic_force && (!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)))) ||
+				    (s && ob2 && (fmd1->limit_impact && can_break(ob2, ob1, fmd1->limit_impact, s))))
 				{
 					if (s) {
 						float size[3];
 
-						if (ob1 == ob2 || (ob2 && ob2->rigidbody_object && ob2->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+						if (s->parent_id > 0 || ob1 == ob2 || (ob2 && ob2->rigidbody_object && ob2->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
 							size[0] = -1.0f; //mark as invalid, so the regular object size is used
 							size[1] = -1.0f;
 							size[2] = -1.0f;
@@ -2182,12 +2186,12 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 				int id = rbw->cache_index_map[linear_index2]->meshisland_index;
 				Shard *s = findShard(fmd2, id);
 
-				if (force > fmd2->dynamic_force && (!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)) ||
-				        (ob1 && s && (fmd2->limit_impact && can_break(ob1, ob2, fmd2->limit_impact, s)))))
+				if ((force > fmd2->dynamic_force && (!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)))) ||
+				        (ob1 && s && (fmd2->limit_impact && can_break(ob1, ob2, fmd2->limit_impact, s))))
 				{
 					if (s) {
 						float size[3];
-						if (ob1 == ob2 || (ob1 && ob1->rigidbody_object && ob1->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+						if (s->parent_id > 0 ||ob1 == ob2 || (ob1 && ob1->rigidbody_object && ob1->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
 							size[0] = -1.0f; //mark as invalid, so the regular object size is used
 							size[1] = -1.0f;
 							size[2] = -1.0f;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index b67f0bd..90ac189 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -108,6 +108,7 @@
 #include "PIL_time.h"
 
 static void modifier_skin_customdata_delete(struct Object *ob);
+static void apply_loc_rot_scale(struct Object* ob, struct Scene *scene);
 
 /******************************** API ****************************/
 
@@ -2465,76 +2466,34 @@ static int fracture_refresh_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
+#if 0
+	if (rmd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+		//apply rot and loc here too
+		copy_m4_m4(rmd->origmat, obact->obmat);
+		zero_m4(rmd->passive_parent_mat);
+
+		apply_loc_rot_scale(obact, scene);
+	}
+#endif
+
 	BKE_scene_frame_set(scene, start);
 	DAG_relations_tag_update(G.main);
 	WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
 	WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
 	WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
 	
-	/*if (!rmd->execute_threaded)*/ {
-#if 0
-		float vec[3] = {0.0f, 0.0f, 0.0f};
-		if (rv3d != NULL)
-		{
-			/* need 2, 6, and 10 as forward vector, as seen in a 16-float array */
-			vec[0] = rv3d->viewmat[0][2];
-			vec[1] = rv3d->viewmat[1][2];
-			vec[2] = rv3d->viewmat[2][2];
-		}
-		copy_v3_v3(rmd->forward_vector, vec);
-#endif
-		rmd->refresh = true;
-		rmd->last_frame = INT_MAX; // delete dynamic data as well
-		DAG_id_tag_update(&obact->id, OB_RECALC_DATA);
-		WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
-	}
-#if 0
-	else {
-		/* job stuff */
-		int factor, verts, shardprogress, halvingprogress, totalprogress;
-		scene->r.cfra = cfra;
-
-		/* setup job */
-		wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Fracture",
-							 WM_JOB_PROGRESS, WM_JOB_TYPE_OBJECT_FRACTURE);
-		fj = MEM_callocN(sizeof(FractureJob), "object fracture job");
-		fj->fmd = rmd;
-		fj->ob = obact;
-		fj->scene = scene;
-
-		/* if we have shards, totalprogress = shards + islands
-		 * if we dont have shards, then calculate number of processed halving steps
-		 * if we split island to shards, add both */
-		factor = (fj->fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST) ? 4 : 2;
-		shardprogress = fj->fmd->shard_count * (factor+1); /* +1 for the meshisland creation */
-
-		if (obact->derivedFinal) {
-			verts = obact->derivedFinal->getNumVerts(obact->derivedFinal);
-		}
-		else {
-			verts = ((Mesh*)obact->data)->totvert;
-		}
-
-		halvingprogress = (int)(verts / 1000) + (fj->fmd->shard_count * factor); /*-> 1000 size of each partitioned separate loose*/
-		totalprogress = (rmd->shards_to_islands || rmd->point_source != MOD_FRACTURE_UNIFORM) ? shardprogress + halvingprogress : shardprogress;
-		fj->total_progress = totalprogress;
-
-		WM_jobs_customdata_set(wm_job, fj, fracture_free);
-		WM_jobs_timer(wm_job, 0.1, NC_WM | ND_JOB, NC_OBJECT | ND_MODIFIER);
-		WM_jobs_callbacks(wm_job, fracture_startjob, NULL, fracture_update, fracture_endjob);
-
-		WM_jobs_start(CTX_wm_manager(C), wm_job);
-	}
-#endif
+	rmd->refresh = true;
+	rmd->last_frame = INT_MAX; // delete dynamic data as well
+	DAG_id_tag_update(&obact->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
 
 	return OPERATOR_FINISHED;
 }
 
-static void apply_scale(Object* ob, Scene* scene)
-{
-	float mat[4][4], smat[3][3];
-	/*better apply scale prior to fracture, else shards get distorted*/
-	BKE_object_scale_to_mat3(ob, smat);
+static void apply_transform(Object* ob, Scene* scene, float smat[3][3]) {
+
+	float mat[4][4];
+
 	copy_m4_m3(mat, smat);
 
 	/* apply to object data */
@@ -2549,13 +2508,59 @@ static void apply_scale(Object* ob, Scene* scene)
 		/* update normals */
 		BKE_mesh_calc_normals(me);
 	}
-	else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+	else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
 		float scale = 1.0f;
 		Curve *cu = ob->data;
 
 		scale = mat3_to_scale(smat);
 		BKE_curve_transform_ex(cu, mat, true, scale);
 	}
+	else if (ob->type == OB_FONT) {
+		Curve *cu = ob->data;
+		int i;
+		float scale;
+
+		scale = mat3_to_scale(smat);
+
+		for (i = 0; i < cu->totbox; i++) {
+			TextBox *tb = &cu->tb[i];
+			tb->x *= scale;
+			tb->y *= scale;
+			tb->w *= scale;
+			tb->h *= scale;
+		}
+
+		cu->fsize *= scale;
+	}
+}
+
+static void apply_loc_rot_scale(Object* ob, Scene* scene)
+{
+	float rsmat[3][3];
+
+	//determine matrix
+	BKE_object_to_mat3(ob, rsmat);
+	copy_v3_v3(rsmat[3], ob->loc);
+
+	//apply to object data
+	apply_transform(ob, scene, rsmat);
+
+	//reset object values
+	zero_v3(ob->loc);
+	ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
+	zero_v3(ob->rot);
+	unit_qt(ob->quat);
+	unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+}
+
+static void apply_scale(Object* ob, Scene* scene)
+{
+	float smat[3][3];
+	/*better apply scale prior to fracture, else shards get distorted*/
+	BKE_object_scale_to_mat3(ob, smat);
+
+	/* apply to object data */
+	apply_transform(ob, scene, smat);
 
 	/*clear scale too*/
 	ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index d017f7a..241ebb7 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1180,7 +1180,7 @@ static FracPointCloud get_points_global(FractureModifierData *emd, Object *ob, D
 		if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && emd->limit_impact) {
 			//shrink pointcloud container around impact point, to a size
 			s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
-			if (s != NULL && (s->shard_id == 0 || s->parent_id == 0 || s->impact_size[0] > 0.0f)) {
+			if (s != NULL && (/*s->shard_id == 0 || s->parent_id == 0 || */s->impact_size[0] > 0.0f)) {
 				float size[3], nmin[3], nmax[3], loc[3], imat[4][4], tmin[3], tmax[3], quat[4];
 				print_v3("Impact Loc\n", s->impact_loc);
 				print_v3("Impact Size\n", s->impact_size);
@@ -3181,7 +3181,7 @@ static MeshIsland* find_meshisland(ListBase* meshIslands, int id)
 }
 
 
-#if 0
+
 static bool contains(float loc[3], float size[3], float point[3])
 {
 	if ((fabsf(loc[0] - point[0]) < size[0]) &&
@@ -3194,6 +3194,7 @@ static bool contains(float loc[3], float size[3], float point[3])
 	return false;
 }
 
+#if 0
 void set_rigidbody_type(FractureModifierData *fmd, Shard *s, MeshIsland *mi)
 {
 	//how far is impact location away from this shard, if beyond a bbox, keep passive
@@ -3373,6 +3374,21 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 
 			//keep 1st level shards kinematic if parent is triggered
 			if (par->id == 0 && (par->rigidbody->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact) {
+#if 0
+				ShardSequence *prev_shards = fmd->current_shard_entry ? fmd->current_shard_entry->prev : NULL;
+				Shard *par_shard = prev_shards ? BKE_shard_by_id(prev_shards->frac_mesh, s->parent_id, NULL) : NULL;
+
+				if (par_shard) {
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list