66 FMODIFIER_TYPE_MODNAME,
69 FMI_REQUIRES_SOME_REQUIREMENT,
97 if (data->coefficients) {
121 cp = data->coefficients =
static_cast<float *
>(
122 MEM_callocN(
sizeof(
float) * 2,
"FMod_Generator_Coefs"));
132 switch (data->mode) {
135 const int arraysize_new = data->poly_order + 1;
137 if (data->arraysize != arraysize_new) {
138 data->coefficients =
static_cast<float *
>(
139 MEM_recallocN(data->coefficients,
sizeof(
float) * arraysize_new));
140 data->arraysize = arraysize_new;
146 const int arraysize_new = data->poly_order * 2;
148 if (data->arraysize != arraysize_new) {
149 data->coefficients =
static_cast<float *
>(
150 MEM_recallocN(data->coefficients,
sizeof(
float) * arraysize_new));
151 data->arraysize = arraysize_new;
169 switch (data->mode) {
173 float *powers =
static_cast<float *
>(
174 MEM_callocN(
sizeof(
float) * data->arraysize,
"Poly Powers"));
180 for (
uint i = 0; i < data->arraysize; i++) {
183 powers[i] = powers[i - 1] *
evaltime;
191 for (
uint i = 0; i < data->arraysize; i++) {
192 value += data->coefficients[i] * powers[i];
196 if (data->poly_order) {
213 float value = 1.0f, *cp =
nullptr;
218 for (cp = data->coefficients, i = 0; (cp) && (i <
uint(data->poly_order)); cp += 2, i++) {
219 value *= (cp[0] *
evaltime + cp[1]);
223 if (data->poly_order) {
270 data->phase_multiplier = 1.0f;
279 if (
fabs(x) < 0.0001) {
293 double arg = data->phase_multiplier *
evaltime + data->phase_offset;
294 double (*fn)(
double v) =
nullptr;
299 switch (data->type) {
358 float value =
float(data->amplitude *
float(fn(arg)) + data->value_offset);
375 "FMod_FunctionGenerator",
435 float min = 0.0f, max = 0.0f, fac = 0.0f;
439 if (env->
data ==
nullptr) {
444 lastfed = prevfed + (env->
totvert - 1);
460 for (a = 0; prevfed && fed && (a < env->
totvert - 1); a++, prevfed = fed, fed++) {
463 float afac, bfac,
diff;
469 min = bfac * prevfed->min + afac * fed->
min;
470 max = bfac * prevfed->max + afac * fed->
max;
482 *cvalue =
min + fac * (max -
min);
506#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001f
513 int start = 0, end = arraylen;
514 int loopbreaker = 0, maxloop = arraylen * 2;
523 if ((arraylen <= 0) || (
array ==
nullptr)) {
532 framenum =
array[0].time;
537 if (frame < framenum) {
542 framenum =
array[(arraylen - 1)].time;
545 return (arraylen - 1);
547 if (frame > framenum) {
554 for (loopbreaker = 0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) {
558 int mid = start + ((end - start) / 2);
560 float midfra =
array[mid].time;
569 if (frame > midfra) {
572 else if (frame < midfra) {
578 if (loopbreaker == (maxloop - 1)) {
583 "\tround = %d: start = %d, end = %d, arraylen = %d",
593#undef BINARYSEARCH_FRAMEEQ_THRESH
627 float firstkey[2], lastkey[2], cycyofs = 0.0f;
628 short side = 0, mode = 0;
639 if (fcu ==
nullptr || (fcu->
bezt ==
nullptr && fcu->
fpt ==
nullptr)) {
648 firstkey[0] = firstbezt->
vec[1][0];
649 firstkey[1] = firstbezt->
vec[1][1];
651 lastkey[0] = lastbezt->
vec[1][0];
652 lastkey[1] = lastbezt->
vec[1][1];
659 firstkey[0] = prevfpt->
vec[0];
660 firstkey[1] = prevfpt->
vec[1];
662 lastkey[0] = lastfpt->
vec[0];
663 lastkey[1] = lastfpt->
vec[1];
671 if (data->before_mode) {
673 mode = data->before_mode;
674 cycles = data->before_cycles;
679 if (data->after_mode) {
681 mode = data->after_mode;
682 cycles = data->after_cycles;
686 if (
ELEM(0, side, mode)) {
693 const float cycdx = lastkey[0] - firstkey[0];
694 const float cycdy = lastkey[1] - firstkey[1];
714 else if (cycle > cycles) {
734 evaltime = (side == 1 ? lastkey[0] : firstkey[0]);
737 evaltime = (side == 1 ? firstkey[0] : lastkey[0]);
806 data->strength = 1.0f;
827 data->size,
evaltime - data->offset, data->phase, 0.1f, data->depth);
830 switch (data->modification) {
832 *cvalue = *cvalue + noise * data->strength;
835 *cvalue = *cvalue - noise * data->strength;
838 *cvalue = *cvalue * noise * data->strength;
842 *cvalue = *cvalue + (noise - 0.5f) * data->strength;
875 return data->rect.xmin;
878 return data->rect.xmax;
894 if ((data->flag &
FCM_LIMIT_YMIN) && (*cvalue < data->rect.ymin)) {
895 *cvalue = data->rect.ymin;
897 if ((data->flag &
FCM_LIMIT_YMAX) && (*cvalue > data->rect.ymax)) {
898 *cvalue = data->rect.ymax;
954 snapblock =
int((
evaltime - data->offset) / data->step_size);
959 return (
float(snapblock) * data->step_size) + data->offset;
1012 "fmodifiersTypeInfo should be indexed by the modifier type number");
1031 CLOG_ERROR(&
LOG,
"No valid F-Curve Modifier type-info data available. Type = %i", type);
1058 if (
ELEM(
nullptr, modifiers, fmi)) {
1067 "Cannot add 'Cycles' modifier to F-Curve, as 'Cycles' modifier can only be "
1076 fcm->
curve = owner_fcu;
1111 if (src ==
nullptr) {
1118 dst->
curve =
nullptr;
1136 if (
ELEM(
nullptr, dst, src)) {
1145 srcfcm = srcfcm->
next, fcm = fcm->
next)
1151 fcm->
curve =
nullptr;
1165 if (fcm ==
nullptr) {
1205 if (modifiers ==
nullptr) {
1210 for (fcm =
static_cast<FModifier *
>(modifiers->
first); fcm; fcm = fmn) {
1219 if (
ELEM(
nullptr, modifiers, modifiers->
first)) {
1237 if (
ELEM(
nullptr, modifiers, modifiers->
first)) {
1243 fm->
flag &= ~FMODIFIER_FLAG_ACTIVE;
1255 if ((mtype == 0) && (acttype == 0)) {
1256 return (modifiers && modifiers->
first);
1260 if (
ELEM(
nullptr, modifiers, modifiers->
first)) {
1267 short mOk = 1, aOk = 1;
1271 mOk = (fcm->type == mtype);
1274 aOk = (fmi->
acttype == acttype);
1292 if (
ELEM(
nullptr, modifiers, modifiers->
first)) {
1301 if (fmi ==
nullptr) {
1319 if (fcm ==
nullptr) {
1343 float a = fcm->
sfra;
1345 return influence * (
evaltime - a) / (
b - a);
1351 float a = fcm->
efra;
1353 return influence * (
evaltime - a) / (
b - a);
1368 if (
ELEM(
nullptr, modifiers, modifiers->
last)) {
1388 fcm = fcm->prev, fcm_index--)
1392 if (fmi ==
nullptr) {
1430 if (
ELEM(
nullptr, modifiers, modifiers->
first)) {
1440 for (fcm =
static_cast<FModifier *
>(modifiers->
first); fcm; fcm = fcm->
next, fcm_index++) {
1443 if (fmi ==
nullptr) {
1457 float nval = *cvalue;
1461 *cvalue =
interpf(nval, *cvalue, influence);
1477 CLOG_ERROR(&
LOG,
"No F-Curve with F-Curve Modifiers to Bake");
@ FMI_TYPE_REPLACE_VALUES
@ FMI_TYPE_GENERATE_CURVE
void BKE_fmodifier_name_set(FModifier *fcm, const char *name)
void BKE_fcurve_handles_recalc(FCurve *fcu)
@ FMI_REQUIRES_RUNTIME_CHECK
@ FMI_REQUIRES_ORIGINAL_DATA
void fcurve_store_samples(FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb)
float fcurve_samplingcb_evalcurve(FCurve *fcu, void *data, float evaltime)
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float interpf(float target, float origin, float t)
float BLI_noise_turbulence(float noisesize, float x, float y, float z, int nr)
#define POINTER_OFFSET(v, ofs)
#define BLT_I18NCONTEXT_ID_ACTION
#define CTX_N_(context, msgid)
typedef double(DMatrix)[4][4]
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_STR_ERROR(clg_ref, str)
struct FMod_Cycles FMod_Cycles
struct FMod_Noise FMod_Noise
struct FMod_Envelope FMod_Envelope
@ FCM_EXTRAPOLATE_CYCLIC_OFFSET
struct FMod_Limits FMod_Limits
struct FMod_Generator FMod_Generator
@ FCM_NOISE_MODIF_REPLACE
@ FCM_NOISE_MODIF_SUBTRACT
@ FCM_NOISE_MODIF_MULTIPLY
@ FMODIFIER_TYPE_FN_GENERATOR
@ FMODIFIER_TYPE_GENERATOR
@ FMODIFIER_TYPE_ENVELOPE
@ FCM_GENERATOR_POLYNOMIAL_FACTORISED
@ FCM_GENERATOR_POLYNOMIAL
@ FMODIFIER_FLAG_USEINFLUENCE
@ FMODIFIER_FLAG_DISABLED
@ FMODIFIER_FLAG_RANGERESTRICT
struct FMod_FunctionGenerator FMod_FunctionGenerator
@ UI_PANEL_DATA_EXPAND_ROOT
Read Guarded memory(de)allocation.
#define MEM_recallocN(vmemh, len)
ATTR_WARN_UNUSED_RESULT const BMVert * v
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void fcurve_bake_modifiers(FCurve *fcu, int start, int end)
static float eval_fmodifier_influence(FModifier *fcm, float evaltime)
static FModifierTypeInfo FMI_ENVELOPE
static void fcm_envelope_new_data(void *mdata)
FModifier * copy_fmodifier(const FModifier *src)
static void fcm_cycles_new_data(void *mdata)
float evaluate_time_fmodifiers(FModifiersStackStorage *storage, const ListBase *modifiers, const FCurve *fcu, float cvalue, float evaltime)
void copy_fmodifiers(ListBase *dst, const ListBase *src)
static float fcm_cycles_time(const FCurve *fcu, const FModifier *fcm, float, float evaltime, void *storage_)
static void fcm_fn_generator_new_data(void *mdata)
static void fcm_envelope_verify(FModifier *fcm)
uint evaluate_fmodifiers_storage_size_per_modifier(const ListBase *modifiers)
void evaluate_value_fmodifiers(FModifiersStackStorage *storage, const ListBase *modifiers, const FCurve *fcu, float *cvalue, float evaltime)
static void fcm_limits_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float, void *)
static FModifierTypeInfo FMI_STEPPED
static FModifierTypeInfo FMI_GENERATOR
static float fcm_limits_time(const FCurve *, const FModifier *fcm, float, float evaltime, void *)
FModifier * add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu)
bool remove_fmodifier(ListBase *modifiers, FModifier *fcm)
static double sinc(double x)
bool list_has_suitable_fmodifier(const ListBase *modifiers, int mtype, short acttype)
static float fcm_stepped_time(const FCurve *, const FModifier *fcm, float, float evaltime, void *)
static void fcm_fn_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
void set_active_fmodifier(ListBase *modifiers, FModifier *fcm)
static void fcm_noise_new_data(void *mdata)
static FModifierTypeInfo FMI_CYCLES
static void fcm_stepped_new_data(void *mdata)
const FModifierTypeInfo * get_fmodifier_typeinfo(const int type)
static void fcm_cycles_evaluate(const FCurve *, const FModifier *, float *cvalue, float, void *storage_)
static FModifierTypeInfo * fmodifiersTypeInfo[FMODIFIER_NUM_TYPES]
static void fcm_generator_new_data(void *mdata)
static void fcm_generator_free(FModifier *fcm)
int BKE_fcm_envelope_find_index(FCM_EnvelopeData array[], float frame, int arraylen, bool *r_exists)
FModifier * find_active_fmodifier(ListBase *modifiers)
static FModifierTypeInfo FMI_LIMITS
static void fmods_init_typeinfo()
static void fcm_generator_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
static void fcm_generator_verify(FModifier *fcm)
void free_fmodifiers(ListBase *modifiers)
static void fcm_generator_copy(FModifier *fcm, const FModifier *src)
static void fcm_envelope_free(FModifier *fcm)
static void fcm_envelope_copy(FModifier *fcm, const FModifier *src)
static void fcm_envelope_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
const FModifierTypeInfo * fmodifier_get_typeinfo(const FModifier *fcm)
static FModifierTypeInfo FMI_NOISE
static FModifierTypeInfo FMI_FN_GENERATOR
#define BINARYSEARCH_FRAMEEQ_THRESH
static void fcm_noise_evaluate(const FCurve *, const FModifier *fcm, float *cvalue, float evaltime, void *)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float2 fmod(const float2 a, const float b)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float3 ceil(const float3 a)
ccl_device_inline float3 cos(float3 v)
ccl_device_inline float3 log(float3 v)
void(* copy_data)(FModifier *fcm, const FModifier *src)
void(* new_data)(void *mdata)
void(* free_data)(FModifier *fcm)
void(* evaluate_modifier)(const FCurve *fcu, const FModifier *fcm, float *cvalue, float evaltime, void *storage)
float(* evaluate_modifier_time)(const FCurve *fcu, const FModifier *fcm, float cvalue, float evaltime, void *storage)