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:
2009-06-19 04:58:40 +00:00
parent a87bc73d32
commit 8ffb1dacad
2 changed files with 10 additions and 4 deletions

View File

@@ -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);

View File

@@ -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);
}
}