[Bf-blender-cvs] [c9cd415] fracture_modifier: added basic support to clean up keyframes directly after converting to keyframed objects, but you need cache to bake so the operator can run again (and it will refracture automatically, too)

Martin Felke noreply at git.blender.org
Fri Oct 30 19:12:55 CET 2015


Commit: c9cd41547c888100bc8f7ece7d0a6ef7a3a796cc
Author: Martin Felke
Date:   Fri Oct 30 19:12:17 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rBc9cd41547c888100bc8f7ece7d0a6ef7a3a796cc

added basic support to clean up keyframes directly after converting to keyframed objects, but you need cache to bake so the operator can run again (and it will refracture automatically, too)

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

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/editors/include/ED_anim_api.h
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_ops.c
M	source/blender/editors/space_action/action_edit.c
M	source/blender/editors/space_buttons/buttons_context.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 0e405e5..230250c 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -136,6 +136,7 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
             box.label("Inner Vertex Group:")
             box.prop_search(md, "inner_vertex_group", ob, "vertex_groups", text = "")
 
+        layout.context_pointer_set("modifier", md)
         layout.operator("object.fracture_refresh", text="Execute Fracture", icon='MOD_EXPLODE').reset = True
 
 class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
@@ -212,6 +213,7 @@ class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, Panel):
         if not(md.refresh):
            layout.prop(md, "execute_threaded")
 
+        layout.context_pointer_set("modifier", md)
         layout.operator("object.rigidbody_convert_to_objects", text = "Convert To Objects")
         layout.operator("object.rigidbody_convert_to_keyframes", text = "Convert To Keyframed Objects")
 
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index dfa667d..37d9b62 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -687,5 +687,8 @@ void ED_animedit_unlink_action(struct bContext *C, struct ID *id, struct AnimDat
 
 /* ************************************************ */
 
+/* Fracture Modifier keyframe conversion cleanup necessary.... */
+void clean_action_keys(struct bAnimContext *ac, float thresh, bool clean_chan);
+
 #endif /* __ED_ANIM_API_H__ */
 
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index f8302b9..c4d967e 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -180,7 +180,6 @@ void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot);
 void OBJECT_OT_explode_refresh(struct wmOperatorType *ot);
 void OBJECT_OT_ocean_bake(struct wmOperatorType *ot);
 void OBJECT_OT_fracture_refresh(struct wmOperatorType *ot);
-void OBJECT_OT_rigidbody_constraints_refresh(struct wmOperatorType *ot);
 void OBJECT_OT_rigidbody_convert_to_objects(struct wmOperatorType *ot);
 void OBJECT_OT_rigidbody_convert_to_keyframes(struct wmOperatorType *ot);
 void OBJECT_OT_skin_root_mark(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index edf561a..ec4bd10 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -96,6 +96,7 @@
 #include "ED_mesh.h"
 #include "ED_physics.h"
 #include "ED_keyframing.h"
+#include "ED_anim_api.h" //clean keyframes
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -2546,8 +2547,13 @@ static int fracture_refresh_invoke(bContext *C, wmOperator *op, const wmEvent *U
 	if (WM_jobs_test(CTX_wm_manager(C), scene, WM_JOB_TYPE_OBJECT_FRACTURE))
 		return OPERATOR_CANCELLED;
 
-	apply_scale(ob, scene);
-	return fracture_refresh_exec(C, op);
+	if (edit_modifier_invoke_properties(C, op))
+	{
+		apply_scale(ob, scene);
+		return fracture_refresh_exec(C, op);
+	}
+
+	return OPERATOR_CANCELLED;
 }
 
 
@@ -2570,6 +2576,7 @@ void OBJECT_OT_fracture_refresh(wmOperatorType *ot)
 
 /****************** rigidbody constraint refresh operator *********************/
 
+#if 0
 static int rigidbody_refresh_constraints_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	Object *obact = ED_object_active_context(C);
@@ -2613,6 +2620,7 @@ void OBJECT_OT_rigidbody_constraints_refresh(wmOperatorType *ot)
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
 	edit_modifier_properties(ot);
 }
+#endif
 
 static void do_add_group_unchecked(Group* group, Object *ob, Base *bas)
 {
@@ -2782,6 +2790,8 @@ static void do_restore_scene_link(Scene* scene, int count, Scene **bgscene, Base
 		scene->basact = b;
 		MEM_freeN(bas);
 		(*basarray)[i] = NULL;
+
+		//DAG_id_tag_update(&b->object->id, OB_RECALC_DATA);
 	}
 
 	/*delete 2nd scene and basarrays*/
@@ -2997,14 +3007,14 @@ static int rigidbody_convert_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
-/*static int rigidbody_convert_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+static int rigidbody_convert_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
 {
 	
-	if (edit_modifier_invoke_properties(C, op) || true)
+	if (edit_modifier_invoke_properties(C, op))
 		return rigidbody_convert_exec(C, op);
 	else
 		return OPERATOR_CANCELLED;
-}*/
+}
 
 
 void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
@@ -3014,7 +3024,7 @@ void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
 	ot->idname = "OBJECT_OT_rigidbody_convert_to_objects";
 
 	ot->poll = fracture_poll;
-	//ot->invoke = rigidbody_convert_invoke;
+	ot->invoke = rigidbody_convert_invoke;
 	ot->exec = rigidbody_convert_exec;
 
 	/* flags */
@@ -3022,9 +3032,37 @@ void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
 	edit_modifier_properties(ot);
 }
 
+static bAnimContext* make_anim_context(Scene* scene, Object* ob)
+{
+	bAnimContext *ac = MEM_callocN(sizeof(bAnimContext), "make_anim_context");
+
+	/* craft a dummy animcontext here, sigh... why cant we just pass the object and action ? */
+	ac->scene = scene;
+	if (scene) {
+		ac->markers = &scene->markers;
+		ac->obact = ob;
+	}
+
+	ac->sa = NULL;
+	ac->ar = NULL;
+	ac->sl = NULL;
+	ac->spacetype = 0;
+	ac->regiontype = 0;
+
+	if (ob->adt)
+	{
+		ac->data = ob->adt->action;
+		ac->datatype = ANIMCONT_ACTION;
+		ac->mode = SACTCONT_ACTION;
+	}
+
+	return ac;
+}
+
 static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi, Group* gr, Object* ob, Scene* scene,
                                   int start, int end, int count, Object* parent, bool is_baked,
-                                  PTCacheID* pid, PointCache *cache, float obloc[3], float diff[3], int *j, Base **base)
+                                  PTCacheID* pid, PointCache *cache, float obloc[3], float diff[3], int *j, Base **base,
+                                  float threshold, bool clean_chan)
 {
 	int i = 0;
 	Object* ob_new = NULL;
@@ -3075,12 +3113,14 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi,
 		start = mi->start_frame;
 	}
 
-	if (end > mi->start_frame + mi->frame_count) {
+	if (end != mi->start_frame + mi->frame_count) {
 		end = mi->start_frame + mi->frame_count;
 	}
 
 	if (mi->rigidbody->type == RBO_TYPE_ACTIVE)
 	{
+		bAnimContext *ac;
+		short flag = INSERTKEY_NEEDED | INSERTKEY_XYZ2RGB;
 		for (i = start; i < end; i++)
 		{
 			float size[3];
@@ -3138,17 +3178,24 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi,
 				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);
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 2, i, 32);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 0, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 1, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 2, i, flag);
 
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 0, i, 32);
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 1, i, 32);
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 2, i, 32);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 0, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 1, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 2, i, flag);
 
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 0, i, 32);
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 1, i, 32);
-			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 2, i, 32);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 0, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 1, i, flag);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 2, i, flag);
+		}
+
+		if (i == end)
+		{
+			ac = make_anim_context(scene, ob_new);
+			clean_action_keys(ac, threshold, clean_chan);
+			MEM_freeN(ac);
 		}
 	}
 	else
@@ -3170,7 +3217,8 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi,
 	return ob_new;
 }
 
-static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end)
+static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end,
+                                          float threshold, bool clean_chan)
 {
 	bool is_baked = false;
 	PointCache* cache = NULL;
@@ -3212,7 +3260,8 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 	for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 	{
 		Object *obj = do_convert_meshIsland(fmd, mi, gr, ob, scene, start, end, count,
-		                                    parent, is_baked, &pid, cache, obloc, diff, &k, &basarray_old[i]);
+		                                    parent, is_baked, &pid, cache, obloc, diff, &k, &basarray_old[i],
+		                                    threshold, clean_chan);
 		if (!obj) {
 			return false;
 		}
@@ -3224,11 +3273,15 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 	}
 
 	do_restore_scene_link(scene, count, &bgscene, &basarray, &basarray_old);
-
 	printf("Converting Islands to Keyframed Objects done, %g\n", PIL_check_seconds_timer() - starttime);
 
 	BKE_scene_frame_set(scene, (double)start);
 
+	//select / make FM object active
+	/*bas = BKE_scene_base_find(scene, ob);
+	scene->basact = bas;
+	ED_base_object_select(bas, BA_SELECT);*/
+
 	return true;
 }
 
@@ -3276,7 +3329,9 @@ static void convert_startjob(void *customdata, sh

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list