Blender V4.3
fmodifier.cc File Reference
#include <algorithm>
#include <cfloat>
#include <cmath>
#include <cstddef>
#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_blenlib.h"
#include "BLI_ghash.h"
#include "BLI_math_base.h"
#include "BLI_noise.h"
#include "BLI_utildefines.h"
#include "BKE_fcurve.hh"
#include "BKE_idprop.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 = {"bke.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 506 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 508 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()

static 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 1361 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, and FModifiersStackStorage::size_per_modifier.

Referenced by evaluate_fcurve_ex(), and nlasnapshot_from_action().

◆ evaluate_value_fmodifiers()

◆ fcm_cycles_evaluate()

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

Definition at line 772 of file fmodifier.cc.

References tFCMED_Cycles::cycyofs.

◆ fcm_cycles_new_data()

static void fcm_cycles_new_data ( void * mdata)
static

Definition at line 614 of file fmodifier.cc.

References FMod_Cycles::before_mode, and FCM_EXTRAPOLATE_CYCLIC.

◆ fcm_cycles_time()

◆ fcm_envelope_copy()

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

Definition at line 397 of file fmodifier.cc.

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

◆ fcm_envelope_evaluate()

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

◆ fcm_envelope_free()

static void fcm_envelope_free ( FModifier * fcm)
static

Definition at line 387 of file fmodifier.cc.

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

◆ fcm_envelope_new_data()

static void fcm_envelope_new_data ( void * mdata)
static

Definition at line 408 of file fmodifier.cc.

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

◆ fcm_envelope_verify()

static void fcm_envelope_verify ( FModifier * fcm)
static

Definition at line 417 of file fmodifier.cc.

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

◆ fcm_fn_generator_evaluate()

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

◆ fcm_fn_generator_new_data()

static void fcm_fn_generator_new_data ( void * mdata)
static

Definition at line 264 of file fmodifier.cc.

References FMod_FunctionGenerator::amplitude.

◆ fcm_generator_copy()

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

Definition at line 102 of file fmodifier.cc.

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

◆ fcm_generator_evaluate()

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

◆ fcm_generator_free()

static void fcm_generator_free ( FModifier * fcm)
static

Definition at line 92 of file fmodifier.cc.

References FModifier::data, and MEM_freeN().

◆ fcm_generator_new_data()

static void fcm_generator_new_data ( void * mdata)
static

Definition at line 113 of file fmodifier.cc.

References MEM_callocN, and FMod_Generator::poly_order.

◆ fcm_generator_verify()

static void fcm_generator_verify ( FModifier * fcm)
static

◆ fcm_limits_evaluate()

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

Definition at line 885 of file fmodifier.cc.

References FModifier::data, FCM_LIMIT_YMAX, and FCM_LIMIT_YMIN.

◆ fcm_limits_time()

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

Definition at line 865 of file fmodifier.cc.

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

◆ fcm_noise_evaluate()

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

◆ fcm_noise_new_data()

static void fcm_noise_new_data ( void * mdata)
static

Definition at line 800 of file fmodifier.cc.

References FCM_NOISE_MODIF_REPLACE, and FMod_Noise::size.

◆ fcm_stepped_new_data()

static void fcm_stepped_new_data ( void * mdata)
static

Definition at line 920 of file fmodifier.cc.

References FMod_Stepped::step_size.

◆ fcm_stepped_time()

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

Definition at line 929 of file fmodifier.cc.

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

◆ 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 1470 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 1216 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 1036 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 1252 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 1234 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()

static double sinc ( double x)
static

Definition at line 277 of file fmodifier.cc.

References fabs(), M_PI, 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:88
@ FMI_REQUIRES_ORIGINAL_DATA
#define BLT_I18NCONTEXT_ID_ACTION
#define CTX_N_(context, msgid)
struct FMod_Cycles FMod_Cycles
@ FMODIFIER_TYPE_CYCLES
static void fcm_cycles_new_data(void *mdata)
Definition fmodifier.cc:614
static float fcm_cycles_time(const FCurve *fcu, const FModifier *fcm, float, float evaltime, void *storage_)
Definition fmodifier.cc:622
static void fcm_cycles_evaluate(const FCurve *, const FModifier *, float *cvalue, float, void *storage_)
Definition fmodifier.cc:772

Definition at line 782 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:92
struct FMod_Envelope FMod_Envelope
@ FMODIFIER_TYPE_ENVELOPE
static void fcm_envelope_new_data(void *mdata)
Definition fmodifier.cc:408
static void fcm_envelope_verify(FModifier *fcm)
Definition fmodifier.cc:417
static void fcm_envelope_free(FModifier *fcm)
Definition fmodifier.cc:387
static void fcm_envelope_copy(FModifier *fcm, const FModifier *src)
Definition fmodifier.cc:397
static void fcm_envelope_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:427

Definition at line 485 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:94
@ FMI_REQUIRES_NOTHING
@ FMODIFIER_TYPE_FN_GENERATOR
struct FMod_FunctionGenerator FMod_FunctionGenerator
static void fcm_fn_generator_new_data(void *mdata)
Definition fmodifier.cc:264
static void fcm_fn_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:286

Definition at line 369 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_GENERATOR

FModifierTypeInfo FMI_GENERATOR
static
Initial value:
= {
sizeof(FMod_Generator),
"FMod_Generator",
0,
nullptr,
}
struct FMod_Generator FMod_Generator
@ FMODIFIER_TYPE_GENERATOR
static void fcm_generator_new_data(void *mdata)
Definition fmodifier.cc:113
static void fcm_generator_free(FModifier *fcm)
Definition fmodifier.cc:92
static void fcm_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:158
static void fcm_generator_verify(FModifier *fcm)
Definition fmodifier.cc:127
static void fcm_generator_copy(FModifier *fcm, const FModifier *src)
Definition fmodifier.cc:102

Definition at line 236 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ FMI_INIT

short FMI_INIT = 1
static

Definition at line 989 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
struct FMod_Limits FMod_Limits
@ FMODIFIER_TYPE_LIMITS
static void fcm_limits_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float, void *)
Definition fmodifier.cc:885
static float fcm_limits_time(const FCurve *, const FModifier *fcm, float, float evaltime, void *)
Definition fmodifier.cc:865

Definition at line 902 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 ,
nullptr,
}
struct FMod_Noise FMod_Noise
@ FMODIFIER_TYPE_NOISE
static void fcm_noise_new_data(void *mdata)
Definition fmodifier.cc:800
static void fcm_noise_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
Definition fmodifier.cc:813

Definition at line 847 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:929
static void fcm_stepped_new_data(void *mdata)
Definition fmodifier.cc:920

Definition at line 962 of file fmodifier.cc.

Referenced by fmods_init_typeinfo().

◆ fmodifiersTypeInfo

FModifierTypeInfo* fmodifiersTypeInfo[FMODIFIER_NUM_TYPES]
static

Definition at line 988 of file fmodifier.cc.

Referenced by fmods_init_typeinfo(), and get_fmodifier_typeinfo().

◆ LOG