Commit: a293d028b9b0e3623dd69eb06b6eb5acf6f861d4 Author: Martin Felke Date: Thu Jun 1 12:42:32 2017 +0200 Branches: fracture_modifier https://developer.blender.org/rBa293d028b9b0e3623dd69eb06b6eb5acf6f861d4
new "Handle" option for convert to keyframes, if set calculates handles to be auto or vector(adaptive), but can be slower =================================================================== M source/blender/editors/object/object_modifier.c =================================================================== diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 9693d28dd5c..8c5afcdf06b 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -3112,7 +3112,7 @@ MINLINE void compare_v3_fl(bool r[3], const float a[3], const float b) 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, - float threshold, int step, ReportList* reports) + float threshold, int step, bool calc_handles, ReportList* reports) { int i = 0; Object* ob_new = NULL; @@ -3179,14 +3179,25 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi, { //bAnimContext *ac; int stepp = adaptive ? 1 : step; - short flag = INSERTKEY_FAST /*| INSERTKEY_NEEDED*/ | INSERTKEY_NO_USERPREF; + short flag = calc_handles ? 0 : INSERTKEY_FAST | INSERTKEY_NO_USERPREF | INSERTKEY_NEEDED; for (i = start; i < end; i += stepp) { + char handle = U.keyhandles_new; + char interp = U.ipo_new; bool dostep = adaptive ? (((i + start) % step == 0) || i == start || i == end) : true; float size[3] = {1, 1, 1}; bool locset[3] = {true, true, true}; bool rotset[3] = {true, true, true}; + if (dostep) { + U.keyhandles_new = HD_AUTO; + U.ipo_new = BEZT_IPO_BEZ; + } + else if (adaptive && !dostep) { + U.keyhandles_new = HD_VECT; + U.ipo_new = BEZT_IPO_BEZ; + } + //adaptive optimization, only try to insert necessary frames... but doesnt INSERT_NEEDED do the same ?! if (adaptive || !dostep) { @@ -3282,8 +3293,9 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi, loc_quat_size_to_mat4(mat, loc, rot, size); - if (locset[0] || locset[1] || locset[2] || rotset[0] || rotset[1] || rotset[2]) + if (locset[0] || locset[1] || locset[2] || rotset[0] || rotset[1] || rotset[2]) { BKE_scene_frame_set(scene, (double)i); + } copy_m4_m4(ob_new->obmat, mat); @@ -3314,6 +3326,10 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi, //insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 0, i, BEZT_KEYTYPE_KEYFRAME, flag); //insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 1, i, BEZT_KEYTYPE_KEYFRAME, flag); //insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 2, i, BEZT_KEYTYPE_KEYFRAME, flag); + + //restore values + U.keyhandles_new = handle; + U.ipo_new = interp; } if (mi->locs) @@ -3358,7 +3374,7 @@ static Object* do_convert_meshIsland(FractureModifierData* fmd, MeshIsland *mi, } static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end, - float threshold, int step, ReportList *reports) + float threshold, int step, bool calc_handles, ReportList *reports) { bool is_baked = false; PointCache* cache = NULL; @@ -3408,7 +3424,7 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, { Object *obj = do_convert_meshIsland(fmd, mi, gr, ob, scene, start, end, count, parent, is_baked, &pid, cache, obloc, diff, &k, &basarray_old[i], - threshold, step, reports); + threshold, step, calc_handles, reports); if (!obj) { return false; } @@ -3464,6 +3480,7 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op) int start = RNA_int_get(op->ptr, "start_frame"); int end = RNA_int_get(op->ptr, "end_frame"); int step = RNA_int_get(op->ptr, "step"); + bool calc_handles = RNA_boolean_get(op->ptr, "calc_handles"); int frame = 0; //fill conversion array cache @@ -3518,7 +3535,7 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op) } gr = BKE_group_add(G.main, "Converted"); - convert_modifier_to_keyframes(rmd, gr, selob, scene, start, end, threshold, step, op->reports); + convert_modifier_to_keyframes(rmd, gr, selob, scene, start, end, threshold, step, calc_handles, op->reports); } } @@ -3548,12 +3565,7 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op) static int rigidbody_convert_keyframes_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { - if (edit_modifier_invoke_properties(C, op)) - { - return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 5 * UI_UNIT_Y); - } - - return OPERATOR_CANCELLED; + return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 5 * UI_UNIT_Y); } void OBJECT_OT_rigidbody_convert_to_keyframes(wmOperatorType *ot) @@ -3570,8 +3582,10 @@ void OBJECT_OT_rigidbody_convert_to_keyframes(wmOperatorType *ot) RNA_def_int(ot->srna, "start_frame", 1, 0, 300000, "Start Frame", "", 0, 300000); RNA_def_int(ot->srna, "end_frame", 250, 0, 300000, "End Frame", "", 0, 300000); RNA_def_int(ot->srna, "step", 1, 1, 10000, "Step", "", 1, 10000); - RNA_def_float(ot->srna, "threshold", 0.2f, 0.0f, FLT_MAX, "Threshold", "", 0.0f, 1000.0f); - //RNA_def_boolean(ot->srna, "channels", false, "Channels", ""); + RNA_def_float(ot->srna, "threshold", 0.2f, 0.0f, FLT_MAX, "Threshold", "Ratio of change in location or rotation which has to be exceeded to set a keyframe", + 0.0f, 1000.0f); + RNA_def_boolean(ot->srna, "calc_handles", false, "Handles", + "Smoothes step handles and makes adaptive handles vector, useful in conjunction with large step size, very slow with small step size"); /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs