NLA SoC: Bugfix for Deleting Keyframes
When an F-Curve doesn't contain any keyframes anymore but it still exists, the F-Curve's value is not recalculated and flushed anymore if the F-Curve's value will not change. That is, if the F-Curve doesn't have any other data, i.e. drivers or generator-modifiers, which would still change its value, it wouldn't be recalculated to have a value of zero. This solves the problem of deleting all scale keyframes, whereby objects/bones would appear to 'vanish'
This commit is contained in:
@@ -112,7 +112,7 @@ void fcurve_free_modifiers(struct FCurve *fcu);
|
||||
struct FModifier *fcurve_find_active_modifier(struct FCurve *fcu);
|
||||
void fcurve_set_active_modifier(struct FCurve *fcu, struct FModifier *fcm);
|
||||
|
||||
short fcurve_has_suitable_modifier(FCurve *fcu, int mtype, short acttype);
|
||||
short fcurve_has_suitable_modifier(struct FCurve *fcu, int mtype, short acttype);
|
||||
|
||||
float evaluate_time_fmodifiers(ListBase *modifiers, struct FCurve *fcu, float cvalue, float evaltime);
|
||||
void evaluate_value_fmodifiers(ListBase *modifiers, struct FCurve *fcu, float *cvalue, float evaltime);
|
||||
|
@@ -2415,10 +2415,16 @@ float evaluate_fcurve (FCurve *fcu, float evaltime)
|
||||
}
|
||||
|
||||
/* Calculate the value of the given F-Curve at the given frame, and set its curval */
|
||||
// TODO: will this be necessary?
|
||||
void calculate_fcurve (FCurve *fcu, float ctime)
|
||||
{
|
||||
/* calculate and set curval (evaluates driver too) */
|
||||
fcu->curval= evaluate_fcurve(fcu, ctime);
|
||||
/* only calculate + set curval (overriding the existing value) if curve has
|
||||
* any data which warrants this...
|
||||
*/
|
||||
if ( (fcu->totvert) || (fcu->driver && !(fcu->driver->flag & DRIVER_FLAG_INVALID)) ||
|
||||
fcurve_has_suitable_modifier(fcu, 0, FMI_TYPE_GENERATE_CURVE) )
|
||||
{
|
||||
/* calculate and set curval (evaluates driver too if necessary) */
|
||||
fcu->curval= evaluate_fcurve(fcu, ctime);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user