[Bf-blender-cvs] [2943437] fracture_modifier: fix for: splinters (axises should be local X, Y, Z again), added object name into material name, and allow conversion-to-keyframed-objects of multiple objects at once

Martin Felke noreply at git.blender.org
Wed Dec 17 18:35:04 CET 2014


Commit: 29434373dd04c2ab83d6b74d475bcef406b1f5e3
Author: Martin Felke
Date:   Wed Dec 17 18:34:46 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB29434373dd04c2ab83d6b74d475bcef406b1f5e3

fix for: splinters (axises should be local X, Y, Z again), added object name into material name, and allow conversion-to-keyframed-objects of multiple objects at once

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

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

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

diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 2a0c9dd..9ad6fee 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2409,43 +2409,11 @@ static int fracture_refresh_exec(bContext *C, wmOperator *UNUSED(op))
 
 static int fracture_refresh_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
-	float mat[4][4], rsmat[3][3];
-	Object* ob = CTX_data_active_object(C);
 	Scene* scene = CTX_data_scene(C);
 
 	if (WM_jobs_test(CTX_wm_manager(C), scene, WM_JOB_TYPE_OBJECT_FRACTURE))
 		return OPERATOR_CANCELLED;
 
-	/*better apply rotation and scale beforehand */
-	BKE_object_to_mat3(ob, rsmat);
-	copy_m4_m3(mat, rsmat);
-
-	/* apply to object data */
-	if (ob->type == OB_MESH) {
-		Mesh *me = ob->data;
-
-		multiresModifier_scale_disp(scene, ob);
-
-		/* adjust data */
-		BKE_mesh_transform(me, mat, true);
-
-		/* update normals */
-		BKE_mesh_calc_normals(me);
-	}
-	else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
-		float scale = 1.0f;
-		Curve *cu = ob->data;
-
-		scale = mat3_to_scale(rsmat);
-		BKE_curve_transform_ex(cu, mat, true, scale);
-	}
-
-	/*clear rotation and scale too*/
-	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);
-
 	return fracture_refresh_exec(C, op);
 }
 
@@ -2734,6 +2702,42 @@ void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
 	edit_modifier_properties(ot);
 }
 
+#if 0
+static void apply_rot_scale(Object* ob, Scene* scene)
+{
+	float mat[4][4], rsmat[3][3];
+	/*better apply rotation and scale during conversion*/
+	BKE_object_to_mat3(ob, rsmat);
+	copy_m4_m3(mat, rsmat);
+
+	/* apply to object data */
+	if (ob->type == OB_MESH) {
+		Mesh *me = ob->data;
+
+		multiresModifier_scale_disp(scene, ob);
+
+		/* adjust data */
+		BKE_mesh_transform(me, mat, true);
+
+		/* update normals */
+		BKE_mesh_calc_normals(me);
+	}
+	else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+		float scale = 1.0f;
+		Curve *cu = ob->data;
+
+		scale = mat3_to_scale(rsmat);
+		BKE_curve_transform_ex(cu, mat, true, scale);
+	}
+
+	/*clear rotation and scale too*/
+	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);
+}
+#endif
+
 static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end)
 {
 	bool is_baked = false;
@@ -2761,10 +2765,12 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 		is_baked = true;
 	}
 
+#if 0
 	if (cache && (cache->flag & PTCACHE_OUTDATED) /* && !(cache->flag & PTCACHE_BAKED)*/)
 	{
 		return false;
 	}
+#endif
 
 	parent = BKE_object_add_named(G.main, scene, OB_EMPTY, name);
 	BKE_mesh_center_centroid(ob->data, obloc);
@@ -2825,12 +2831,14 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 
 		for (i = start; i < end; i++)
 		{
+			float size[3];
+			copy_v3_v3(size, ob->size);
+
 			/*move object (loc, rot)*/
 			if (i > start)
 			{
 				float loc[3] = {0.0f, 0.0f, 0.0f}, rot[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 				float mat[4][4];
-				float size[3] = {1.0f, 1.0f, 1.0f};
 
 				//is there a bake, if yes... use that (disabled for now, odd probs...)
 				if (is_baked)
@@ -2867,6 +2875,16 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 				copy_qt_qt(ob_new->quat, rot);
 				quat_to_eul(ob_new->rot, rot);
 			}
+			else
+			{
+				mul_m4_v3(ob->obmat, ob_new->loc);
+				sub_v3_v3(ob_new->loc, obloc);
+				add_v3_v3(ob_new->loc, diff);
+
+				copy_qt_qt(ob_new->quat, ob->quat);
+				copy_v3_v3(ob_new->rot, ob->rot);
+				copy_v3_v3(ob_new->size, size);
+			}
 
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 0, i, 32);
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 1, i, 32);
@@ -2947,79 +2965,96 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op)
 	FractureJob *fj;
 	wmJob* wm_job;
 
-	rmd = (FractureModifierData *)modifiers_findByType(obact, eModifierType_Fracture);
-	if (rmd && rmd->refresh) {
-		return OPERATOR_CANCELLED;
-	}
-
-	if (rmd) {
-		int count = BLI_countlist(&rmd->meshIslands);
-		int start = RNA_int_get(op->ptr, "start_frame");
-		int end = RNA_int_get(op->ptr, "end_frame");
+	bool convertable = true;
 
-		if (count == 0)
+	if (scene->rigidbody_world && scene->rigidbody_world)
+	{
+		PointCache* cache = NULL;
+		cache = scene->rigidbody_world->pointcache;
+		if (cache && (cache->flag & PTCACHE_OUTDATED))
 		{
-			BKE_report(op->reports, RPT_WARNING, "No meshislands found, please execute fracture and simulate first");
-			return OPERATOR_CANCELLED;
+			convertable = false;
 		}
+	}
 
-		gr = BKE_group_add(G.main, "Converted");
-
-		if (rmd->execute_threaded)
-		{
-			PointerRNA *ptr;
-			/* what a dirty hack.... disable poll function */
-			wmOperatorType *ot = WM_operatortype_find("ANIM_OT_keyframe_insert_menu", 0);
-			ot->poll = NULL;
-
-			ptr = MEM_dupallocN(op->ptr);
-			ptr->type = op->ptr->type;
-			ptr->id = op->ptr->id;
-			ptr->id.data = op->ptr->id.data;
-			ptr->data = op->ptr->data;
-
-			/* job stuff */
-			scene->r.cfra = cfra;
-
-			/* setup job */
-			wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Convert to Keyframed Objects",
-								 WM_JOB_PROGRESS, WM_JOB_TYPE_OBJECT_FRACTURE);
-			fj = MEM_callocN(sizeof(FractureJob), "convert to Keyframes job");
-			fj->fmd = rmd;
-			fj->total_progress = count;
-			fj->gr = gr;
-			fj->ob = obact;
-			fj->scene = scene;
-			fj->start = start;
-			fj->end = end;
-
-			WM_jobs_customdata_set(wm_job, fj, convert_free);
-			WM_jobs_timer(wm_job, 0.1, NC_WM | ND_JOB, NC_OBJECT | ND_MODIFIER);
-			WM_jobs_callbacks(wm_job, convert_startjob, NULL, convert_update, NULL);
-
-			WM_jobs_start(CTX_wm_manager(C), wm_job);
-
-			return OPERATOR_FINISHED;
-		}
-		else
+	if (convertable)
+	{
+		CTX_DATA_BEGIN(C, Object *, selob, selected_objects)
 		{
-			if (convert_modifier_to_keyframes(rmd, gr, obact, scene, start, end))
-			{
-				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);
-				return OPERATOR_FINISHED;
-			}
-			else
-			{
-				BKE_report(op->reports, RPT_WARNING, "No valid cache data found, please run simulation first (baked ones too !)");
+			rmd = (FractureModifierData *)modifiers_findByType(selob, eModifierType_Fracture);
+			if (rmd && rmd->refresh) {
 				return OPERATOR_CANCELLED;
 			}
+
+			if (rmd) {
+				int count = BLI_countlist(&rmd->meshIslands);
+				int start = RNA_int_get(op->ptr, "start_frame");
+				int end = RNA_int_get(op->ptr, "end_frame");
+
+				if (count == 0)
+				{
+					BKE_report(op->reports, RPT_WARNING, "No meshislands found, please execute fracture and simulate first");
+					return OPERATOR_CANCELLED;
+				}
+
+				gr = BKE_group_add(G.main, "Converted");
+
+				if (rmd->execute_threaded)
+				{
+					PointerRNA *ptr;
+					/* what a dirty hack.... disable poll function */
+					wmOperatorType *ot = WM_operatortype_find("ANIM_OT_keyframe_insert_menu", 0);
+					ot->poll = NULL;
+
+					ptr = MEM_dupallocN(op->ptr);
+					ptr->type = op->ptr->type;
+					ptr->id = op->ptr->id;
+					ptr->id.data = op->ptr->id.data;
+					ptr->data = op->ptr->data;
+
+					/* job stuff */
+					scene->r.cfra = cfra;
+
+					/* setup job */
+					wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Convert to Keyframed Objects",
+										 WM_JOB_PROGRESS, WM_JOB_TYPE_OBJECT_FRACTURE);
+					fj = MEM_callocN(sizeof(FractureJob), "convert to Keyframes job");
+					fj->fmd = rmd;
+					fj->total_progress = count;
+					fj->gr = gr;
+					fj->ob = obact;
+					fj->scene = scene;
+					fj->start = start;
+					fj->end = end;
+
+					WM_jobs_customdata_set(wm_job, fj, convert_free);
+					WM_jobs_timer(wm_job, 0.1, NC_WM | ND_JOB, NC_OBJECT | ND_MODIFIER);
+					WM_jobs_callbacks(wm_job, convert_startjob, NULL, convert_update, NULL);
+
+					WM_jobs_start(CTX_wm_manager(C), wm_job);
+
+					return OPERATOR_FINISHED;
+				}
+				else
+				{
+					convert_modifier_to_keyframes(rmd, gr, selob, scene, start, end);
+				}
+			}
 		}
-	}
 
-	return OPERATOR_CANCELLED;
+		CTX_DATA_END;
+
+		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);
+		return OPERATOR_FINISHED;
+	}
+	else
+	{
+		BKE_report(op->reports, RPT_WARNING, "No valid cache data found, please run simulation first (baked ones too !)");
+		return OPERATOR_CANCELLED;
+	}
 }
 
 void OBJECT_OT_rigidbody_convert_to_keyframes(wmOperatorType *ot)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 49a767e..efd53f8 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -41,6 +41,7 @@
 #include "BLI_math_vector.h"
 #include "BLI_rand.h"
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 
 
 #include "BKE_cdderivedmesh.h"
@@ -58,6 +59,9 @@
 #include "BKE_pointcache.h"
 #include "BKE_rigidbody.h"
 #include "BKE_scene.h"
+#include "BKE_mesh.h"
+#include "BKE_curve.h"
+#include "BKE_multires.h"
 
 #include "bmesh.h"
 
@@ -70,6 +74,7 @@
 #include "DNA_particle_types.h"
 #include "DNA_rigidbody_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_curve_types.h"
 
 #include "MOD_util.h"
 
@@ -941,26 +946,40 @@ static void do_fracture(FractureModifierData *fracmd, ShardID id, Object *obj, D
 		else
 		{
 			/* autogenerate materials */
+			char name[MAX_ID_NAME];
+
 			short* totmat = give_totcolp(obj);
+
+			BLI_strncpy(name, obj->id.name + 2, strlen(obj->id.name) - 1);
 			if (*totmat == 0)
 			{
 				/*create both materials*/
 				Material* mat_inner;
-				Material* mat_outer = find_material("Outer");
+				char *matname = BLI_strdupcat(name, "_Outer");
+				Materi

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list