diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/key.c | 16 | ||||
-rw-r--r-- | source/blender/editors/object/object_shapekey.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_key.c | 7 |
3 files changed, 23 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 0f04c03688c..2dc615c19f9 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -1558,9 +1558,23 @@ KeyBlock *BKE_keyblock_add(Key *key, const char *name) KeyBlock *BKE_keyblock_add_ctime(Key *key, const char *name, const bool do_force) { KeyBlock *kb = BKE_keyblock_add(key, name); + const float cpos = key->ctime / 100.0f; + /* In case of absolute keys, there is no point in adding more than one key with the same pos. + * Hence only set new keybloc pos to current time if none previous one already use it. + * Now at least people just adding absolute keys without touching to ctime + * won't have to systematically use retiming func (and have ordering issues, too). See T39897. + */ + if (!do_force && (key->type != KEY_RELATIVE)) { + KeyBlock *it_kb; + for (it_kb = key->block.first; it_kb; it_kb = it_kb->next) { + if (it_kb->pos == cpos) { + return kb; + } + } + } if (do_force || (key->type != KEY_RELATIVE)) { - kb->pos = key->ctime / 100.0f; + kb->pos = cpos; BKE_key_sort(key); } diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 5dd20a76e28..cfd1c4d3b0a 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -334,7 +334,7 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* properties */ - RNA_def_boolean(ot->srna, "from_mix", 1, "From Mix", "Create the new shape key from the existing mix of keys"); + RNA_def_boolean(ot->srna, "from_mix", true, "From Mix", "Create the new shape key from the existing mix of keys"); } static int shape_key_remove_exec(bContext *C, wmOperator *op) diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index a72e207178b..7d10511d1c4 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -92,6 +92,12 @@ static void rna_ShapeKey_name_set(PointerRNA *ptr, const char *value) BKE_all_animdata_fix_paths_rename(NULL, "key_blocks", oldname, kb->name); } +static float rna_ShapeKey_frame_get(PointerRNA *ptr) +{ + KeyBlock *kb = (KeyBlock *)ptr->data; + return kb->pos * 100.0f; /* Because pos is ctime/100... */ +} + static void rna_ShapeKey_value_set(PointerRNA *ptr, float value) { KeyBlock *data = (KeyBlock *)ptr->data; @@ -571,6 +577,7 @@ static void rna_def_keyblock(BlenderRNA *brna) prop = RNA_def_property(srna, "frame", PROP_FLOAT, PROP_TIME); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_float_sdna(prop, NULL, "pos"); + RNA_def_property_float_funcs(prop, "rna_ShapeKey_frame_get", NULL, NULL); RNA_def_property_ui_text(prop, "Frame", "Frame for absolute keys"); RNA_def_property_update(prop, 0, "rna_Key_update_data"); |