Refactor: keyframing.cc #113595
|
@ -204,7 +204,7 @@ static eFCU_Cycle_Type remap_cyclic_keyframe_location(FCurve *fcu, float *px, fl
|
|||
}
|
||||
|
||||
BezTriple *first = &fcu->bezt[0], *last = &fcu->bezt[fcu->totvert - 1];
|
||||
float start = first->vec[1][0], end = last->vec[1][0];
|
||||
const float start = first->vec[1][0], end = last->vec[1][0];
|
||||
|
||||
if (start >= end) {
|
||||
return FCU_CYCLE_NONE;
|
||||
|
@ -338,7 +338,7 @@ static short new_key_needed(FCurve *fcu, float cFrame, float nValue)
|
|||
* keyframe is not equal to last keyframe.
|
||||
*/
|
||||
bezt = (fcu->bezt + (fcu->totvert - 1));
|
||||
float valA = bezt->vec[1][1];
|
||||
const float valA = bezt->vec[1][1];
|
||||
float valB;
|
||||
if (prev) {
|
||||
valB = prev->vec[1][1];
|
||||
|
@ -423,10 +423,8 @@ static bool insert_keyframe_value(ReportList *reports,
|
|||
|
||||
/* only insert keyframes where they are needed */
|
||||
if (flag & INSERTKEY_NEEDED) {
|
||||
short insert_mode;
|
||||
|
||||
/* check whether this curve really needs a new keyframe */
|
||||
insert_mode = new_key_needed(fcu, cfra, curval);
|
||||
static short insert_mode = new_key_needed(fcu, cfra, curval);
|
||||
|
||||
/* only return success if keyframe added */
|
||||
if (insert_mode == KEYNEEDED_DONTADD) {
|
||||
|
@ -466,7 +464,6 @@ bool insert_keyframe_direct(ReportList *reports,
|
|||
NlaKeyframingContext *nla_context,
|
||||
eInsertKeyFlags flag)
|
||||
{
|
||||
float curval = 0.0f;
|
||||
|
||||
/* no F-Curve to add keyframe to? */
|
||||
if (fcu == nullptr) {
|
||||
|
@ -507,7 +504,7 @@ bool insert_keyframe_direct(ReportList *reports,
|
|||
/* Obtain the value to insert. */
|
||||
float value_buffer[RNA_MAX_ARRAY_LENGTH];
|
||||
int value_count;
|
||||
int index = fcu->array_index;
|
||||
const int index = fcu->array_index;
|
||||
|
||||
BLI_bitmap *successful_remaps = nullptr;
|
||||
float *values = get_keyframe_values(reports,
|
||||
|
@ -523,8 +520,9 @@ bool insert_keyframe_direct(ReportList *reports,
|
|||
nullptr,
|
||||
&successful_remaps);
|
||||
|
||||
float current_value = 0.0f;
|
||||
if (index >= 0 && index < value_count) {
|
||||
curval = values[index];
|
||||
current_value = values[index];
|
||||
}
|
||||
|
||||
if (values != value_buffer) {
|
||||
|
@ -539,7 +537,8 @@ bool insert_keyframe_direct(ReportList *reports,
|
|||
return false;
|
||||
}
|
||||
|
||||
return insert_keyframe_value(reports, &ptr, prop, fcu, anim_eval_context, curval, keytype, flag);
|
||||
return insert_keyframe_value(
|
||||
reports, &ptr, prop, fcu, anim_eval_context, current_value, keytype, flag);
|
||||
}
|
||||
|
||||
/** Find or create the #FCurve based on the given path, and insert the specified value into it. */
|
||||
|
@ -560,52 +559,52 @@ static bool insert_keyframe_fcurve_value(Main *bmain,
|
|||
* - if we're replacing keyframes only, DO NOT create new F-Curves if they do not exist yet
|
||||
* but still try to get the F-Curve if it exists...
|
||||
*/
|
||||
bool can_create_curve = (flag & (INSERTKEY_REPLACE | INSERTKEY_AVAILABLE)) == 0;
|
||||
const bool can_create_curve = (flag & (INSERTKEY_REPLACE | INSERTKEY_AVAILABLE)) == 0;
|
||||
FCurve *fcu = can_create_curve ?
|
||||
ED_action_fcurve_ensure(bmain, act, group, ptr, rna_path, array_index) :
|
||||
ED_action_fcurve_find(act, rna_path, array_index);
|
||||
|
||||
/* we may not have a F-Curve when we're replacing only... */
|
||||
if (fcu) {
|
||||
const bool is_new_curve = (fcu->totvert == 0);
|
||||
|
||||
/* set color mode if the F-Curve is new (i.e. without any keyframes) */
|
||||
if (is_new_curve && (flag & INSERTKEY_XYZ2RGB)) {
|
||||
/* for Loc/Rot/Scale and also Color F-Curves, the color of the F-Curve in the Graph Editor,
|
||||
* is determined by the array index for the F-Curve
|
||||
*/
|
||||
PropertySubType prop_subtype = RNA_property_subtype(prop);
|
||||
if (ELEM(prop_subtype, PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR, PROP_COORDS)) {
|
||||
fcu->color_mode = FCURVE_COLOR_AUTO_RGB;
|
||||
}
|
||||
else if (ELEM(prop_subtype, PROP_QUATERNION)) {
|
||||
fcu->color_mode = FCURVE_COLOR_AUTO_YRGB;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the curve has only one key, make it cyclic if appropriate. */
|
||||
const bool is_cyclic_action = (flag & INSERTKEY_CYCLE_AWARE) && BKE_action_is_cyclic(act);
|
||||
|
||||
if (is_cyclic_action && fcu->totvert == 1) {
|
||||
make_new_fcurve_cyclic(act, fcu);
|
||||
}
|
||||
|
||||
/* update F-Curve flags to ensure proper behavior for property type */
|
||||
update_autoflags_fcurve_direct(fcu, prop);
|
||||
|
||||
/* insert keyframe */
|
||||
const bool success = insert_keyframe_value(
|
||||
reports, ptr, prop, fcu, anim_eval_context, curval, keytype, flag);
|
||||
|
||||
/* If the curve is new, make it cyclic if appropriate. */
|
||||
if (is_cyclic_action && is_new_curve) {
|
||||
make_new_fcurve_cyclic(act, fcu);
|
||||
}
|
||||
|
||||
return success;
|
||||
if (!fcu) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
const bool is_new_curve = (fcu->totvert == 0);
|
||||
|
||||
/* set color mode if the F-Curve is new (i.e. without any keyframes) */
|
||||
if (is_new_curve && (flag & INSERTKEY_XYZ2RGB)) {
|
||||
/* for Loc/Rot/Scale and also Color F-Curves, the color of the F-Curve in the Graph Editor,
|
||||
* is determined by the array index for the F-Curve
|
||||
*/
|
||||
PropertySubType prop_subtype = RNA_property_subtype(prop);
|
||||
if (ELEM(prop_subtype, PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR, PROP_COORDS)) {
|
||||
fcu->color_mode = FCURVE_COLOR_AUTO_RGB;
|
||||
}
|
||||
else if (ELEM(prop_subtype, PROP_QUATERNION)) {
|
||||
fcu->color_mode = FCURVE_COLOR_AUTO_YRGB;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the curve has only one key, make it cyclic if appropriate. */
|
||||
const bool is_cyclic_action = (flag & INSERTKEY_CYCLE_AWARE) && BKE_action_is_cyclic(act);
|
||||
|
||||
if (is_cyclic_action && fcu->totvert == 1) {
|
||||
make_new_fcurve_cyclic(act, fcu);
|
||||
}
|
||||
|
||||
/* update F-Curve flags to ensure proper behavior for property type */
|
||||
update_autoflags_fcurve_direct(fcu, prop);
|
||||
|
||||
/* insert keyframe */
|
||||
const bool success = insert_keyframe_value(
|
||||
reports, ptr, prop, fcu, anim_eval_context, curval, keytype, flag);
|
||||
|
||||
/* If the curve is new, make it cyclic if appropriate. */
|
||||
if (is_cyclic_action && is_new_curve) {
|
||||
make_new_fcurve_cyclic(act, fcu);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
int insert_keyframe(Main *bmain,
|
||||
|
@ -620,13 +619,6 @@ int insert_keyframe(Main *bmain,
|
|||
ListBase *nla_cache,
|
||||
eInsertKeyFlags flag)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop = nullptr;
|
||||
AnimData *adt;
|
||||
ListBase tmp_nla_cache = {nullptr, nullptr};
|
||||
NlaKeyframingContext *nla_context = nullptr;
|
||||
int ret = 0;
|
||||
|
||||
/* validate pointer first - exit if failure */
|
||||
if (id == nullptr) {
|
||||
BKE_reportf(reports, RPT_ERROR, "No ID block to insert keyframe in (path = %s)", rna_path);
|
||||
|
@ -638,6 +630,8 @@ int insert_keyframe(Main *bmain,
|
|||
return 0;
|
||||
}
|
||||
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop = nullptr;
|
||||
PointerRNA id_ptr = RNA_id_pointer_create(id);
|
||||
if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) {
|
||||
BKE_reportf(
|
||||
|
@ -666,7 +660,9 @@ int insert_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
/* apply NLA-mapping to frame to use (if applicable) */
|
||||
adt = BKE_animdata_from_id(id);
|
||||
NlaKeyframingContext *nla_context = nullptr;
|
||||
ListBase tmp_nla_cache = {nullptr, nullptr};
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
const AnimationEvalContext remapped_context = nla_time_remap(
|
||||
anim_eval_context, &id_ptr, adt, act, nla_cache ? nla_cache : &tmp_nla_cache, &nla_context);
|
||||
|
||||
|
@ -690,6 +686,7 @@ int insert_keyframe(Main *bmain,
|
|||
&successful_remaps);
|
||||
|
||||
/* Key the entire array. */
|
||||
int key_count = 0;
|
||||
if (array_index == -1 || force_all) {
|
||||
/* In force mode, if any of the curves succeeds, drop the replace mode and restart. */
|
||||
if (force_all && (flag & (INSERTKEY_REPLACE | INSERTKEY_AVAILABLE)) != 0) {
|
||||
|
@ -713,7 +710,7 @@ int insert_keyframe(Main *bmain,
|
|||
keytype,
|
||||
flag))
|
||||
{
|
||||
ret++;
|
||||
key_count++;
|
||||
exclude = array_index;
|
||||
break;
|
||||
}
|
||||
|
@ -728,18 +725,18 @@ int insert_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
if (array_index != exclude) {
|
||||
ret += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
key_count += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -751,18 +748,18 @@ int insert_keyframe(Main *bmain,
|
|||
continue;
|
||||
}
|
||||
|
||||
ret += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
key_count += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -771,18 +768,18 @@ int insert_keyframe(Main *bmain,
|
|||
if (array_index >= 0 && array_index < value_count &&
|
||||
BLI_BITMAP_TEST_BOOL(successful_remaps, array_index))
|
||||
{
|
||||
ret += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
key_count += insert_keyframe_fcurve_value(bmain,
|
||||
reports,
|
||||
&ptr,
|
||||
prop,
|
||||
act,
|
||||
group,
|
||||
rna_path,
|
||||
array_index,
|
||||
&remapped_context,
|
||||
values[array_index],
|
||||
keytype,
|
||||
flag);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -793,7 +790,7 @@ int insert_keyframe(Main *bmain,
|
|||
MEM_freeN(successful_remaps);
|
||||
BKE_animsys_free_nla_keyframing_context_cache(&tmp_nla_cache);
|
||||
|
||||
if (ret) {
|
||||
if (key_count > 0) {
|
||||
if (act != nullptr) {
|
||||
DEG_id_tag_update(&act->id, ID_RECALC_ANIMATION_NO_FLUSH);
|
||||
}
|
||||
|
@ -802,7 +799,7 @@ int insert_keyframe(Main *bmain,
|
|||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return key_count;
|
||||
}
|
||||
|
||||
/* ************************************************** */
|
||||
|
@ -839,10 +836,6 @@ int delete_keyframe(Main *bmain,
|
|||
float cfra)
|
||||
{
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop;
|
||||
int array_index_max = array_index + 1;
|
||||
int ret = 0;
|
||||
|
||||
/* sanity checks */
|
||||
if (ELEM(nullptr, id, adt)) {
|
||||
|
@ -851,6 +844,8 @@ int delete_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
/* validate pointer first - exit if failure */
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop;
|
||||
PointerRNA id_ptr = RNA_id_pointer_create(id);
|
||||
if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) {
|
||||
BKE_reportf(
|
||||
|
@ -882,6 +877,7 @@ int delete_keyframe(Main *bmain,
|
|||
}
|
||||
}
|
||||
|
||||
int array_index_max = array_index + 1;
|
||||
/* key entire array convenience method */
|
||||
if (array_index == -1) {
|
||||
array_index = 0;
|
||||
|
@ -897,6 +893,7 @@ int delete_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
/* will only loop once unless the array index was -1 */
|
||||
int key_count = 0;
|
||||
for (; array_index < array_index_max; array_index++) {
|
||||
FCurve *fcu = ED_action_fcurve_find(act, rna_path, array_index);
|
||||
|
||||
|
@ -915,13 +912,13 @@ int delete_keyframe(Main *bmain,
|
|||
continue;
|
||||
}
|
||||
|
||||
ret += delete_keyframe_fcurve(adt, fcu, cfra);
|
||||
key_count += delete_keyframe_fcurve(adt, fcu, cfra);
|
||||
}
|
||||
if (ret) {
|
||||
if (key_count) {
|
||||
deg_tag_after_keyframe_delete(bmain, id, adt);
|
||||
}
|
||||
/* return success/failure */
|
||||
return ret;
|
||||
return key_count;
|
||||
}
|
||||
|
||||
/* ************************************************** */
|
||||
|
@ -946,10 +943,6 @@ int clear_keyframe(Main *bmain,
|
|||
eInsertKeyFlags /*flag*/)
|
||||
{
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop;
|
||||
int array_index_max = array_index + 1;
|
||||
int ret = 0;
|
||||
|
||||
/* sanity checks */
|
||||
if (ELEM(nullptr, id, adt)) {
|
||||
|
@ -958,6 +951,8 @@ int clear_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
/* validate pointer first - exit if failure */
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop;
|
||||
PointerRNA id_ptr = RNA_id_pointer_create(id);
|
||||
if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) {
|
||||
BKE_reportf(
|
||||
|
@ -987,6 +982,7 @@ int clear_keyframe(Main *bmain,
|
|||
}
|
||||
|
||||
/* key entire array convenience method */
|
||||
int array_index_max = array_index + 1;
|
||||
if (array_index == -1) {
|
||||
array_index = 0;
|
||||
array_index_max = RNA_property_array_length(&ptr, prop);
|
||||
|
@ -1000,6 +996,7 @@ int clear_keyframe(Main *bmain,
|
|||
}
|
||||
}
|
||||
|
||||
int key_count = 0;
|
||||
/* will only loop once unless the array index was -1 */
|
||||
for (; array_index < array_index_max; array_index++) {
|
||||
FCurve *fcu = ED_action_fcurve_find(act, rna_path, array_index);
|
||||
|
@ -1022,13 +1019,13 @@ int clear_keyframe(Main *bmain,
|
|||
ANIM_fcurve_delete_from_animdata(nullptr, adt, fcu);
|
||||
|
||||
/* return success */
|
||||
ret++;
|
||||
key_count++;
|
||||
}
|
||||
if (ret) {
|
||||
if (key_count) {
|
||||
deg_tag_after_keyframe_delete(bmain, id, adt);
|
||||
}
|
||||
/* return success/failure */
|
||||
return ret;
|
||||
return key_count;
|
||||
}
|
||||
|
||||
} // namespace blender::animrig
|
||||
|
|
Loading…
Reference in New Issue