Blender V5.0
fmodifier.cc File Reference
#include <algorithm>
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstring>
#include "MEM_guardedalloc.h"
#include "CLG_log.h"
#include "DNA_anim_types.h"
#include "DNA_screen_types.h"
#include "BLT_translation.hh"
#include "BLI_listbase.h"
#include "BLI_math_base.h"
#include "BLI_noise.h"
#include "BLI_noise.hh"
#include "BLI_utildefines.h"
#include "BKE_fcurve.hh"

Go to the source code of this file.

Classes

struct  tFCMED_Cycles

Functions

F-Curve Modifier Public API
FModifieradd_fmodifier (ListBase *modifiers, int type, FCurve *owner_fcu)
FModifiercopy_fmodifier (const FModifier *src)
void copy_fmodifiers (ListBase *dst, const ListBase *src)
bool remove_fmodifier (ListBase *modifiers, FModifier *fcm)
void free_fmodifiers (ListBase *modifiers)
FModifierfind_active_fmodifier (ListBase *modifiers)
void set_active_fmodifier (ListBase *modifiers, FModifier *fcm)
bool list_has_suitable_fmodifier (const ListBase *modifiers, int mtype, short acttype)
uint evaluate_fmodifiers_storage_size_per_modifier (const ListBase *modifiers)
static float eval_fmodifier_influence (FModifier *fcm, float evaltime)
float evaluate_time_fmodifiers (FModifiersStackStorage *storage, const ListBase *modifiers, const FCurve *fcu, float cvalue, float evaltime)
void evaluate_value_fmodifiers (FModifiersStackStorage *storage, const ListBase *modifiers, const FCurve *fcu, float *cvalue, float evaltime)
void fcurve_bake_modifiers (FCurve *fcu, int start, int end)

Variables

static CLG_LogRef LOG = {"anim.fmodifier"}

F-Curve Modifier Types

#define BINARYSEARCH_FRAMEEQ_THRESH   0.0001f
static FModifierTypeInfo FMI_GENERATOR
static FModifierTypeInfo FMI_FN_GENERATOR
static FModifierTypeInfo FMI_ENVELOPE
static FModifierTypeInfo FMI_CYCLES
static FModifierTypeInfo FMI_NOISE
static FModifierTypeInfo FMI_LIMITS
static FModifierTypeInfo FMI_STEPPED
static void fcm_generator_free (FModifier *fcm)
static void fcm_generator_copy (FModifier *fcm, const FModifier *src)
static void fcm_generator_new_data (void *mdata)
static void fcm_generator_verify (FModifier *fcm)
static void fcm_generator_evaluate (const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
static void fcm_fn_generator_new_data (void *mdata)
static double sinc (double x)
static void fcm_fn_generator_evaluate (const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
static void fcm_envelope_free (FModifier *fcm)
static void fcm_envelope_copy (FModifier *fcm, const FModifier *src)
static void fcm_envelope_new_data (void *mdata)
static void fcm_envelope_verify (FModifier *fcm)
static void fcm_envelope_evaluate (const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
int BKE_fcm_envelope_find_index (FCM_EnvelopeData array[], float frame, int arraylen, bool *r_exists)
static void fcm_cycles_new_data (void *mdata)
static float fcm_cycles_time (const FCurve *fcu, const FModifier *fcm, float, float evaltime, void *storage_)
static void fcm_cycles_evaluate (const FCurve *, const FModifier *, float *cvalue, float, void *storage_)
static void fcm_noise_new_data (void *mdata)
static void fcm_noise_evaluate (const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
static float fcm_limits_time (const FCurve *, const FModifier *fcm, float, float evaltime, void *)
static void fcm_limits_evaluate (const FCurve *, const FModifier *fcm, float *cvalue, float, void *)
static void fcm_stepped_new_data (void *mdata)
static float fcm_stepped_time (const FCurve *, const FModifier *fcm, float, float evaltime, void *)

F-Curve Modifier Type API

all of the f-curve modifier API functions use #fmodifiertypeinfo structs to carry out and operations that involve f-curve modifier specific code.

static FModifierTypeInfofmodifiersTypeInfo [FMODIFIER_NUM_TYPES]
static short FMI_INIT = 1
static void fmods_init_typeinfo ()
const FModifierTypeInfoget_fmodifier_typeinfo (const int type)
const FModifierTypeInfofmodifier_get_typeinfo (const FModifier *fcm)

Macro Definition Documentation

◆ BINARYSEARCH_FRAMEEQ_THRESH

#define BINARYSEARCH_FRAMEEQ_THRESH   0.0001f

Definition at line 502 of file fmodifier.cc.

Referenced by BKE_fcm_envelope_find_index().

Function Documentation

◆ add_fmodifier()

◆ BKE_fcm_envelope_find_index()

int BKE_fcm_envelope_find_index ( FCM_EnvelopeData array[],
float frame,
int arraylen,
bool * r_exists )

Definition at line 504 of file fmodifier.cc.

References BINARYSEARCH_FRAMEEQ_THRESH, CLOG_ERROR, CLOG_WARN, IS_EQT, and LOG.

◆ copy_fmodifier()

FModifier * copy_fmodifier ( const FModifier * src)

◆ copy_fmodifiers()

void copy_fmodifiers ( ListBase * dst,
const ListBase * src )

◆ eval_fmodifier_influence()

float eval_fmodifier_influence ( FModifier * fcm,
float evaltime )
static

◆ evaluate_fmodifiers_storage_size_per_modifier()

uint evaluate_fmodifiers_storage_size_per_modifier ( const ListBase * modifiers)

◆ evaluate_time_fmodifiers()

float evaluate_time_fmodifiers ( FModifiersStackStorage * storage,
const ListBase * modifiers,
const FCurve * fcu,
float cvalue,
float evaltime )

Evaluate time modifications imposed by some F-Curve Modifiers.

  • This step acts as an optimization to prevent the F-Curve stack being evaluated several times by modifiers requesting the time be modified, as the final result would have required using the modified time
  • Modifiers only ever receive the unmodified time, as subsequent modifiers should be working on the 'global' result of the modified curve, not some localized segment, so evaltime gets set to whatever the last time-modifying modifier likes.
  • We start from the end of the stack, as only the last one matters for now.
Parameters
fcuCan be NULL.

Definition at line 1381 of file fmodifier.cc.

References FModifiersStackStorage::buffer, ELEM, eval_fmodifier_influence(), evaltime, FModifierTypeInfo::evaluate_modifier_time, FCURVE_MOD_OFF, FCurve::flag, FMODIFIER_FLAG_DISABLED, FMODIFIER_FLAG_MUTED, FMODIFIER_FLAG_RANGERESTRICT, fmodifier_get_typeinfo(), interpf(), ListBase::last, FModifiersStackStorage::modifier_count, POINTER_OFFSET, FModifier::prev, and FModifiersStackStorage::size_per_modifier.

Referenced by evaluate_fcurve_ex(), and nlasnapshot_from_action().

◆ evaluate_value_fmodifiers()

◆ fcm_cycles_evaluate()

void fcm_cycles_evaluate ( const FCurve * ,
const FModifier * ,
float * cvalue,
float ,
void * storage_ )
static

Definition at line 768 of file fmodifier.cc.

References tFCMED_Cycles::cycyofs.

◆ fcm_cycles_new_data()

void fcm_cycles_new_data ( void * mdata)
static

Definition at line 610 of file fmodifier.cc.

References data, and FCM_EXTRAPOLATE_CYCLIC.

◆ fcm_cycles_time()

◆ fcm_envelope_copy()

void fcm_envelope_copy ( FModifier * fcm,
const FModifier * src )
static

Definition at line 393 of file fmodifier.cc.

References FMod_Envelope::data, FModifier::data, and MEM_dupallocN().

◆ fcm_envelope_evaluate()

void fcm_envelope_evaluate ( const FCurve * ,
const FModifier * fcm,
float * cvalue,
float evaltime,
void *  )
static

◆ fcm_envelope_free()

void fcm_envelope_free ( FModifier * fcm)
static

Definition at line 383 of file fmodifier.cc.

References FMod_Envelope::data, FModifier::data, and MEM_freeN().

◆ fcm_envelope_new_data()

void fcm_envelope_new_data ( void * mdata)
static

Definition at line 404 of file fmodifier.cc.

References FMod_Envelope::max, and FMod_Envelope::min.

◆ fcm_envelope_verify()

void fcm_envelope_verify ( FModifier * fcm)
static

Definition at line 413 of file fmodifier.cc.

References FMod_Envelope::data, and FModifier::data.

◆ fcm_fn_generator_evaluate()

void fcm_fn_generator_evaluate ( const FCurve * ,
const FModifier * fcm,
float * cvalue,
float evaltime,
void *  )
static

◆ fcm_fn_generator_new_data()

void fcm_fn_generator_new_data ( void * mdata)
static

Definition at line 260 of file fmodifier.cc.

References data.

◆ fcm_generator_copy()

void fcm_generator_copy ( FModifier * fcm,
const FModifier * src )
static

Definition at line 100 of file fmodifier.cc.

References FMod_Generator::coefficients, FModifier::data, and MEM_dupallocN().

◆ fcm_generator_evaluate()

void fcm_generator_evaluate ( const FCurve * ,
const FModifier * fcm,
float * cvalue,
float evaltime,
void *  )
static

◆ fcm_generator_free()

void fcm_generator_free ( FModifier * fcm)
static

Definition at line 90 of file fmodifier.cc.

References data, FModifier::data, and MEM_freeN().

◆ fcm_generator_new_data()

void fcm_generator_new_data ( void * mdata)
static

Definition at line 111 of file fmodifier.cc.

References data, and MEM_calloc_arrayN().

◆ fcm_generator_verify()

void fcm_generator_verify ( FModifier * fcm)
static

◆ fcm_limits_evaluate()

void fcm_limits_evaluate ( const FCurve * ,
const FModifier * fcm,
float * cvalue,
float ,
void *  )
static

Definition at line 905 of file fmodifier.cc.

References data, FModifier::data, FCM_LIMIT_YMAX, and FCM_LIMIT_YMIN.

◆ fcm_limits_time()

float fcm_limits_time ( const FCurve * ,
const FModifier * fcm,
float ,
float evaltime,
void *  )
static

Definition at line 885 of file fmodifier.cc.

References data, FModifier::data, evaltime, FCM_LIMIT_XMAX, and FCM_LIMIT_XMIN.

◆ fcm_noise_evaluate()

void fcm_noise_evaluate ( const FCurve * ,
const FModifier * fcm,
float * cvalue,
float evaltime,
void *  )
static

◆ fcm_noise_new_data()

void fcm_noise_new_data ( void * mdata)
static

Definition at line 796 of file fmodifier.cc.

References data, and FCM_NOISE_MODIF_REPLACE.

◆ fcm_stepped_new_data()

void fcm_stepped_new_data ( void * mdata)
static

Definition at line 940 of file fmodifier.cc.

References data.

◆ fcm_stepped_time()

float fcm_stepped_time ( const FCurve * ,
const FModifier * fcm,
float ,
float evaltime,
void *  )
static

Definition at line 949 of file fmodifier.cc.

References data, FModifier::data, evaltime, FCM_STEPPED_NO_AFTER, and FCM_STEPPED_NO_BEFORE.

◆ fcurve_bake_modifiers()

void fcurve_bake_modifiers ( FCurve * fcu,
int start,
int end )

Bake modifiers for given F-Curve to curve sample data, in the frame range defined by start and end (inclusive).

Definition at line 1490 of file fmodifier.cc.

References CLOG_ERROR, FCurve::driver, ELEM, fcurve_samplingcb_evalcurve(), fcurve_store_samples(), ListBase::first, free_fmodifiers(), LOG, and FCurve::modifiers.

◆ find_active_fmodifier()

FModifier * find_active_fmodifier ( ListBase * modifiers)

Find the active F-Modifier.

Definition at line 1236 of file fmodifier.cc.

References ELEM, ListBase::first, FMODIFIER_FLAG_ACTIVE, and LISTBASE_FOREACH.

Referenced by ANIM_fmodifiers_copy_to_buf(), and draw_fcurve().

◆ fmodifier_get_typeinfo()

const FModifierTypeInfo * fmodifier_get_typeinfo ( const FModifier * fcm)

This function should always be used to get the appropriate type-info, as it has checks which prevent segfaults in some weird cases.

Definition at line 1056 of file fmodifier.cc.

References get_fmodifier_typeinfo(), and FModifier::type.

Referenced by BKE_fmodifiers_blend_read_data(), BKE_fmodifiers_blend_write(), copy_fmodifier(), copy_fmodifiers(), evaluate_fmodifiers_storage_size_per_modifier(), evaluate_time_fmodifiers(), evaluate_value_fmodifiers(), fmodifier_panel_header(), list_has_suitable_fmodifier(), and remove_fmodifier().

◆ fmods_init_typeinfo()

◆ free_fmodifiers()

void free_fmodifiers ( ListBase * modifiers)

◆ get_fmodifier_typeinfo()

const FModifierTypeInfo * get_fmodifier_typeinfo ( int type)

◆ list_has_suitable_fmodifier()

bool list_has_suitable_fmodifier ( const ListBase * modifiers,
int mtype,
short acttype )

Do we have any modifiers which match certain criteria.

Parameters
mtypeType of modifier (if 0, doesn't matter).
acttypeType of action to perform (if -1, doesn't matter).

Definition at line 1272 of file fmodifier.cc.

References FModifierTypeInfo::acttype, ELEM, ListBase::first, fmodifier_get_typeinfo(), and LISTBASE_FOREACH.

Referenced by BKE_fcurve_is_empty(), setexpo_action_keys(), and setexpo_graph_keys().

◆ remove_fmodifier()

bool remove_fmodifier ( ListBase * modifiers,
FModifier * fcm )

◆ set_active_fmodifier()

void set_active_fmodifier ( ListBase * modifiers,
FModifier * fcm )

Set the active F-Modifier.

Definition at line 1254 of file fmodifier.cc.

References ELEM, ListBase::first, FModifier::flag, FMODIFIER_FLAG_ACTIVE, and LISTBASE_FOREACH.

Referenced by graph_fmodifier_add_exec(), and nla_fmodifier_add_exec().

◆ sinc()

double sinc ( double x)
static

Definition at line 273 of file fmodifier.cc.

References fabs(), M_PI, sin, and x.

Referenced by fcm_fn_generator_evaluate().

Variable Documentation

◆ FMI_CYCLES

FModifierTypeInfo FMI_CYCLES
static
Initial value:
= {
sizeof(FMod_Cycles),
"FMod_Cycles",
sizeof(tFCMED_Cycles),
nullptr,
nullptr,
nullptr ,
}
@ FMI_TYPE_EXTRAPOLATION
Definition BKE_fcurve.hh:90
@ FMI_REQUIRES_ORIGINAL_DATA
#define BLT_I18NCONTEXT_ID_ACTION
#define CTX_N_(context, msgid)
@ FMODIFIER_TYPE_CYCLES
static void fcm_cycles_new_data(void *mdata)
Definition fmodifier.cc:610
static float fcm_cycles_time(const FCurve *fcu, const FModifier *fcm, float, float evaltime, void *storage_)
Definition fmodifier.cc:618
static void fcm_cycles_evaluate(const FCurve *, const FModifier *, float *cvalue, float, void *storage_)
Definition fmodifier.cc:768

Definition at line 778 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_ENVELOPE

FModifierTypeInfo FMI_ENVELOPE
static
Initial value:
= {
sizeof(FMod_Envelope),
0,
"FMod_Envelope",
0,
nullptr,
}
@ FMI_TYPE_REPLACE_VALUES
Definition BKE_fcurve.hh:94
@ FMODIFIER_TYPE_ENVELOPE
static void fcm_envelope_new_data(void *mdata)
Definition fmodifier.cc:404
static void fcm_envelope_verify(FModifier *fcm)
Definition fmodifier.cc:413
static void fcm_envelope_free(FModifier *fcm)
Definition fmodifier.cc:383
static void fcm_envelope_copy(FModifier *fcm, const FModifier *src)
Definition fmodifier.cc:393
static void fcm_envelope_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:423

Definition at line 481 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_FN_GENERATOR

FModifierTypeInfo FMI_FN_GENERATOR
static
Initial value:
= {
CTX_N_(BLT_I18NCONTEXT_ID_ACTION, "Built-In Function"),
"FMod_FunctionGenerator",
0,
nullptr,
nullptr,
nullptr,
nullptr,
}
@ FMI_TYPE_GENERATE_CURVE
Definition BKE_fcurve.hh:96
@ FMI_REQUIRES_NOTHING
@ FMODIFIER_TYPE_FN_GENERATOR
static void fcm_fn_generator_new_data(void *mdata)
Definition fmodifier.cc:260
static void fcm_fn_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:282

Definition at line 365 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_GENERATOR

FModifierTypeInfo FMI_GENERATOR
static
Initial value:
= {
sizeof(FMod_Generator),
"FMod_Generator",
0,
nullptr,
}
@ FMODIFIER_TYPE_GENERATOR
static void fcm_generator_new_data(void *mdata)
Definition fmodifier.cc:111
static void fcm_generator_free(FModifier *fcm)
Definition fmodifier.cc:90
static void fcm_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:155
static void fcm_generator_verify(FModifier *fcm)
Definition fmodifier.cc:124
static void fcm_generator_copy(FModifier *fcm, const FModifier *src)
Definition fmodifier.cc:100

Definition at line 232 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_INIT

short FMI_INIT = 1
static

Definition at line 1009 of file fmodifier.cc.

Referenced by get_fmodifier_typeinfo().

◆ FMI_LIMITS

FModifierTypeInfo FMI_LIMITS
static
Initial value:
= {
sizeof(FMod_Limits),
"FMod_Limits",
0,
nullptr,
nullptr,
nullptr,
nullptr,
}
@ FMI_REQUIRES_RUNTIME_CHECK
@ FMODIFIER_TYPE_LIMITS
static void fcm_limits_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float, void *)
Definition fmodifier.cc:905
static float fcm_limits_time(const FCurve *, const FModifier *fcm, float, float evaltime, void *)
Definition fmodifier.cc:885

Definition at line 922 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_NOISE

FModifierTypeInfo FMI_NOISE
static
Initial value:
= {
sizeof(FMod_Noise),
0,
"FMod_Noise",
0,
nullptr,
nullptr,
nullptr,
}
@ FMODIFIER_TYPE_NOISE
static void fcm_noise_new_data(void *mdata)
Definition fmodifier.cc:796
static void fcm_noise_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:812

Definition at line 867 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_STEPPED

FModifierTypeInfo FMI_STEPPED
static
Initial value:
= {
sizeof(FMod_Limits),
"FMod_Stepped",
0,
nullptr,
nullptr,
nullptr,
nullptr,
}
@ FMODIFIER_TYPE_STEPPED
static float fcm_stepped_time(const FCurve *, const FModifier *fcm, float, float evaltime, void *)
Definition fmodifier.cc:949
static void fcm_stepped_new_data(void *mdata)
Definition fmodifier.cc:940

Definition at line 982 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ fmodifiersTypeInfo

FModifierTypeInfo* fmodifiersTypeInfo[FMODIFIER_NUM_TYPES]
static

Definition at line 1008 of file fmodifier.cc.

Referenced by fmods_init_typeinfo(), and get_fmodifier_typeinfo().

◆ LOG

CLG_LogRef LOG = {"anim.fmodifier"}
static

Definition at line 32 of file fmodifier.cc.