64#include "RNA_prototypes.hh"
86 const char group_name[],
87 const char rna_path[],
92 if (
ELEM(
nullptr, ks, rna_path,
id)) {
100 short eq_id = 1, eq_path = 1, eq_index = 1, eq_group = 1;
108 if ((ksp->rna_path ==
nullptr) || !
STREQ(rna_path, ksp->rna_path)) {
113 if (ksp->array_index != array_index) {
123 if (eq_id && eq_path && eq_index && eq_group) {
135 ListBase *list,
const char idname[],
const char name[],
short flag,
short keyingflag)
166 const char group_name[],
167 const char rna_path[],
175 if (
ELEM(
nullptr, ks, rna_path)) {
203 ksp->
group[0] =
'\0';
230 if (
ELEM(
nullptr, ks, ksp)) {
251 kspn->rna_path =
static_cast<char *
>(
MEM_dupallocN(kspn->rna_path));
288 if (list ==
nullptr) {
352 const char *rna_path,
353 const int array_index,
356 if (rna_path ==
nullptr) {
360 const char *path = rna_path;
367 "Invalid path. ID = '%s', '%s[%d]'",
368 (
ptr->owner_id) ? (
ptr->owner_id->name + 2) :
"<No ID>",
380 if (array_len && array_index >= array_len) {
383 "Invalid array index. ID = '%s', '%s[%d]', array length is %d",
384 (
ptr->owner_id) ? (
ptr->owner_id->name + 2) :
"<No ID>",
392 r_result->
prop_index = array_len ? array_index : -1;
397#define ANIMSYS_FLOAT_AS_BOOL(value) ((value) > (1.0f - FLT_EPSILON))
411 if (array_index != -1) {
413 orig_value =
float(orig_value_coerce);
417 orig_value =
float(orig_value_coerce);
422 if (array_index != -1) {
424 orig_value =
float(orig_value_coerce);
428 orig_value =
float(orig_value_coerce);
433 if (array_index != -1) {
435 orig_value =
float(orig_value_coerce);
439 orig_value =
float(orig_value_coerce);
445 orig_value =
float(orig_value_coerce);
452 if (r_value !=
nullptr) {
453 *r_value = orig_value;
462 const bool force_write)
477 if (old_value == value) {
485 if (array_index != -1) {
494 int value_coerce = int(value);
496 if (array_index != -1) {
505 float value_coerce = value;
507 if (array_index != -1) {
516 const int value_coerce = int(value);
535 if (
ptr->owner_id ==
nullptr) {
536 if (
ptr->type != &RNA_NlaStrip) {
553 const char *rna_path,
576 bool flush_to_original)
579 for (
FCurve *fcu : fcurves) {
589 if (flush_to_original) {
604 float r_quaternion[4])
610 r_quaternion[0] = 1.0f;
611 r_quaternion[1] = 0.0f;
612 r_quaternion[2] = 0.0f;
613 r_quaternion[3] = 0.0f;
615 for (
FCurve *quat_curve_fcu : quat_fcurves) {
616 const int array_index = quat_curve_fcu->array_index;
618 r_quaternion[array_index] =
calculate_fcurve(&quat_rna, quat_curve_fcu, anim_eval_context);
621 if (quat_fcurves.
size() < 4) {
635 const float blend_factor)
639 float current_quat[4];
642 float target_quat[4];
644 *anim_rna, quaternion_fcurves, anim_eval_context, target_quat);
646 float blended_quat[4];
647 interp_qt_qtqt(blended_quat, current_quat, target_quat, blend_factor);
657 const float blend_factor)
659 char *channel_to_skip =
nullptr;
660 int num_channels_to_skip = 0;
662 FCurve *fcu = fcurves[fcurve_index];
664 if (num_channels_to_skip) {
670 num_channels_to_skip--;
689 quat_fcurves.
append(quat_fcurve);
697 num_channels_to_skip = quat_fcurves.
size() - 1;
702 const float fcurve_value =
calculate_fcurve(&anim_rna, fcu, anim_eval_context);
705 float value_to_write;
707 value_to_write = (1 - blend_factor) * current_value + blend_factor * fcurve_value;
717 value_to_write =
roundf(value_to_write);
726 value_to_write = fcurve_value;
799 if (
ELEM(
nullptr,
id, act)) {
823 else if (act->
idroot != idcode) {
827 "AnimSys Safety Check Failed: Action '%s' is not meant to be used from ID-Blocks of "
828 "type %d such as '%s'\n",
846 if (
ELEM(
nullptr, act, agrp)) {
857 const auto visit_fcurve = [&](
FCurve *fcu) {
880 visit_fcurve(fcurve);
886 const int32_t action_slot_handle,
888 const bool flush_to_original)
891 if (act ==
nullptr) {
916 const int32_t action_slot_handle,
918 const float blend_factor)
957 const bool flush_to_original)
1003 const bool flush_to_original)
1008 float ctime = anim_eval_context->
eval_time;
1017 bool in_range =
IN_RANGE_INCL(ctime, strip->start, strip->end);
1019 switch (strip->extendmode) {
1024 in_range = ctime >= strip->start;
1037 if (ctime < strip->start) {
1038 if (strip == strips->
first) {
1053 strip = strip->prev;
1064 if (ctime > strip->end) {
1066 if (strip == strips->
last) {
1089 ctime = estrip->
start;
1092 ctime = estrip->
end;
1103 anim_eval_context, ctime);
1112 switch (estrip->
type) {
1114 if (estrip->
act ==
nullptr) {
1126 anim_eval_context, estrip->
start);
1128 anim_eval_context, estrip->
end);
1137 nes->
strip = estrip;
1153 const bool flush_to_original)
1156 single_tracks_list.
first = single_tracks_list.
last = single_strip;
1159 dst_list, &single_tracks_list, -1, anim_eval_context, flush_to_original);
1198 return ((
A->ptr.data !=
B->ptr.data) || (
A->prop !=
B->prop));
1210 MEM_callocN(byte_size,
"NlaEvalChannelSnapshot"));
1217 return nec_snapshot;
1246 snapshot->
base = base;
1249 "NlaEvalSnapshot::channels");
1255 return (index < snapshot->
size) ? snapshot->
channels[index] :
nullptr;
1262 snapshot->
size *= 2;
1266 size_t byte_size =
sizeof(*snapshot->
channels) * snapshot->
size;
1284 while (snapshot !=
nullptr) {
1286 if (nec_snapshot !=
nullptr) {
1287 return nec_snapshot;
1289 snapshot = snapshot->
base;
1302 if (*slot ==
nullptr) {
1310 *slot = nec_snapshot;
1319 if (snapshot->
channels !=
nullptr) {
1320 for (
int i = 0;
i < snapshot->
size;
i++) {
1322 if (nec_snapshot !=
nullptr) {
1330 snapshot->
base =
nullptr;
1341 nec->
key.~NlaEvalChannelKey();
1347 memset(nlaeval, 0,
sizeof(*nlaeval));
1377 if (index >= 0 && index < nec->base_snapshot.length) {
1396 "Animation: Invalid array index. ID = '%s', '%s[%d]', array length is %d",
1397 id ? (id->
name + 2) :
"<No ID>",
1440 r_values[
i] =
float(tmp_bool[
i]);
1448 r_values[
i] =
float(tmp_int[
i]);
1456 memset(r_values, 0,
sizeof(
float) *
length);
1483 if (r_values[
i] == 0.0f) {
1515 nlaeval->
key_hash, key, (
void ***)&p_key, (
void ***)&p_key_nec);
1532 nec->
owner = nlaeval;
1560 if (path ==
nullptr) {
1573 *p_path_nec =
nullptr;
1582 "Invalid path. ID = '%s', '%s'",
1583 (
ptr->owner_id) ? (
ptr->owner_id->name + 2) :
"<No ID>",
1601 return *p_path_nec = nec;
1608 const float strip_value,
1609 const float blended_value,
1610 const float influence,
1611 float *r_lower_value)
1613 if (
IS_EQF(influence, 0.0f)) {
1614 *r_lower_value = blended_value;
1618 switch (blendmode) {
1620 *r_lower_value = blended_value - (strip_value * influence);
1624 *r_lower_value = blended_value + (strip_value * influence);
1629 const float denominator = (influence * strip_value + (1.0f - influence));
1630 if (
IS_EQF(denominator, 0.0f)) {
1637 if (
IS_EQF(blended_value, 0.0f)) {
1672 *r_lower_value = blended_value / denominator;
1682 if (
IS_EQF(influence, 1.0f)) {
1694 *r_lower_value = (blended_value - (strip_value * influence)) / (1.0f - influence);
1705 const float strip_value,
1706 const float blended_value,
1707 const float influence,
1708 float *r_lower_value)
1710 if (
IS_EQF(influence, 0.0f)) {
1711 *r_lower_value = blended_value;
1719 *r_lower_value = blended_value - (strip_value - base_value) * influence;
1722 if (
IS_EQF(strip_value, 0.0f)) {
1729 if (
IS_EQF(blended_value, 0.0f)) {
1742 *r_lower_value = 1.0f;
1749 if (
IS_EQF(base_value, 0.0f)) {
1753 *r_lower_value = blended_value /
powf(strip_value / base_value, influence);
1757 BLI_assert_msg(0,
"Use nla_combine_quaternion_get_inverted_lower_values()");
1766 const float blended_values[4],
1767 const float influence,
1768 float r_lower_value[4])
1770 if (
IS_EQF(influence, 0.0f)) {
1779 float tmp_strip_values[4], tmp_blended[4];
1787 mul_qt_qtqt(r_lower_value, tmp_blended, tmp_strip_values);
1793 const float lower_value,
1794 const float strip_value,
1795 const float influence)
1798 if (
IS_EQF(influence, 0.0f)) {
1803 switch (blendmode) {
1805 return lower_value + (strip_value * influence);
1808 return lower_value - (strip_value * influence);
1811 return influence * (lower_value * strip_value) + (1 - influence) * lower_value;
1822 return lower_value * (1.0f - influence) + (strip_value * influence);
1830 const float lower_value,
1831 const float strip_value,
1832 const float influence)
1835 if (
IS_EQF(influence, 0.0f)) {
1843 return lower_value + (strip_value - base_value) * influence;
1846 if (
IS_EQF(base_value, 0.0f)) {
1849 return lower_value *
powf(strip_value / base_value, influence);
1859 const float lower_value,
1860 const float blended_value,
1861 const float influence,
1862 float *r_strip_value)
1865 if (
IS_EQF(influence, 0.0f)) {
1869 switch (blendmode) {
1871 *r_strip_value = (blended_value - lower_value) / influence;
1875 *r_strip_value = (lower_value - blended_value) / influence;
1879 if (
IS_EQF(lower_value, 0.0f)) {
1881 if (
IS_EQF(blended_value, 0.0f)) {
1882 *r_strip_value = 1.0f;
1899 *r_strip_value = ((blended_value - lower_value) / (influence * lower_value)) + 1.0f;
1916 *r_strip_value = (blended_value - lower_value * (1.0f - influence)) / influence;
1924 const float lower_value,
1925 const float blended_value,
1926 const float influence,
1927 float *r_strip_value)
1930 if (
IS_EQF(influence, 0.0f)) {
1937 *r_strip_value = base_value + (blended_value - lower_value) / influence;
1941 if (
IS_EQF(base_value, 0.0f)) {
1945 if (
IS_EQF(lower_value, 0.0f)) {
1947 if (
IS_EQF(blended_value, 0.0f)) {
1948 *r_strip_value = base_value;
1955 *r_strip_value = base_value *
powf(blended_value / lower_value, 1.0f / influence);
1969 const float strip_values[4],
1970 const float influence,
1971 float r_blended_value[4])
1973 float tmp_lower[4], tmp_strip_values[4];
1979 mul_qt_qtqt(r_blended_value, tmp_lower, tmp_strip_values);
1984 const float blended_values[4],
1985 const float influence,
1986 float r_strip_values[4])
1993 if (
IS_EQF(influence, 0.0f)) {
1996 float tmp_lower[4], tmp_blended[4];
2002 mul_qt_qtqt(r_strip_values, tmp_lower, tmp_blended);
2039 for (
int j = 0; j < 4; j++) {
2071 const float upper_influence,
2074 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2075 if (upper_necs !=
nullptr && has_influence) {
2093 const float upper_influence,
2096 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2097 if (upper_necs !=
nullptr && has_influence) {
2118 const int upper_blendmode,
2119 const float upper_influence,
2124 lower_necs, upper_necs, upper_influence, r_blended_necs))
2130 for (
int j = 0; j <
length; j++) {
2137 upper_blendmode, lower_necs->
values[j], upper_necs->
values[j], upper_influence);
2149 const float upper_influence,
2154 lower_necs, upper_necs, upper_influence, r_blended_necs))
2164 for (
int j = 0; j <
length; j++) {
2171 mix_mode, base_values[j], lower_necs->
values[j], upper_necs->
values[j], upper_influence);
2183 const float upper_influence,
2188 lower_necs, upper_necs, upper_influence, r_blended_necs))
2217 const int upper_blendmode,
2218 const float upper_influence,
2223 switch (upper_blendmode) {
2246 lower_necs, upper_necs, upper_blendmode, upper_influence, r_blended_necs);
2264 const int upper_blendmode,
2265 const float upper_influence,
2272 for (
int j = 0; j <
length; j++) {
2282 &r_upper_necs->
values[j]);
2297 const float upper_influence,
2308 for (
int j = 0; j <
length; j++) {
2319 &r_upper_necs->
values[j]);
2335 const float upper_influence,
2367 const int upper_blendmode,
2368 const float upper_influence,
2373 if (
IS_EQF(upper_influence, 0.0f)) {
2378 switch (upper_blendmode) {
2383 lower_necs, blended_necs, upper_influence, r_upper_necs);
2390 lower_necs, blended_necs, upper_influence, r_upper_necs);
2403 lower_necs, blended_necs, upper_blendmode, upper_influence, r_upper_necs);
2414 const int upper_blendmode,
2415 const float upper_influence,
2421 blended_necs, upper_necs, upper_influence, r_lower_necs))
2428 for (
int j = 0; j <
length; j++) {
2446 &r_lower_necs->
values[j]);
2455 const float upper_influence,
2461 blended_necs, upper_necs, upper_influence, r_lower_necs))
2470 for (
int j = 0; j <
length; j++) {
2489 &r_lower_necs->
values[j]);
2498 const float upper_influence,
2508 blended_necs, upper_necs, upper_influence, r_lower_necs))
2516 memcpy(r_lower_necs->
values, blended_necs->
values, 4 *
sizeof(
float));
2543 const int upper_blendmode,
2544 const float upper_influence,
2550 switch (upper_blendmode) {
2555 blended_necs, upper_necs, upper_influence, r_lower_necs);
2562 blended_necs, upper_necs, upper_influence, r_lower_necs);
2574 blended_necs, upper_necs, upper_blendmode, upper_influence, r_lower_necs);
2592 if (
ELEM(
nullptr, list1, list1->
first)) {
2593 if (list2 && list2->
first) {
2599 else if (
ELEM(
nullptr, list2, list2->
first)) {
2625 if (
ELEM(
nullptr, list1, list2)) {
2637 fcm1->
next =
nullptr;
2638 fcm2->
prev =
nullptr;
2661 &storage, modifiers,
nullptr, 0.0f,
evaltime);
2671 if (nec ==
nullptr) {
2683 necs->
values[fcu->array_index] = value;
2706 if (strip ==
nullptr) {
2710 if (strip->
act ==
nullptr) {
2715 ListBase tmp_modifiers = {
nullptr,
nullptr};
2720 switch (evaluation_mode) {
2783 const bool flush_to_original)
2785 ListBase tmp_modifiers = {
nullptr,
nullptr};
2809 switch (evaluation_mode) {
2873 ptr, channels, &tmp_modifiers, &tmp_nes, &snapshot1, anim_eval_context);
2878 if (necs ==
nullptr) {
2882 for (
int i = 0;
i < necs->
length;
i++) {
2896 ptr, channels, &tmp_modifiers, &tmp_nes, &snapshot2, anim_eval_context);
2901 if (necs ==
nullptr) {
2905 for (
int i = 0;
i < necs->
length;
i++) {
2918 "This case shouldn't occur. "
2919 "Transitions assumed to not reference other transitions.");
2936 const bool flush_to_original)
2938 ListBase tmp_modifiers = {
nullptr,
nullptr};
2959 nullptr, &strip->
strips, -1, &child_context, flush_to_original);
3002 const bool flush_to_original)
3019 switch (strip->
type) {
3058 const bool flush_to_original)
3102 const bool flush_to_original)
3105 if (channels ==
nullptr) {
3124 for (
int i = 0;
i < nec_snapshot->
length;
i++) {
3126 float value = nec_snapshot->
values[
i];
3127 if (nec->is_array) {
3131 if (flush_to_original) {
3151 if (!touched_actions.
add(action_and_slot)) {
3163 if (nec !=
nullptr) {
3188 ptr, channels, strip->act, strip->action_slot_handle, touched_actions);
3230 const bool keyframing_to_strip,
3236 r_tweak_strip->
next = r_tweak_strip->
prev =
nullptr;
3248 if (!is_inplace_tweak) {
3256 if (keyframing_to_strip) {
3265 const bool keyframing_to_strip,
3281 r_action_strip->
act = action;
3286 const float2 frame_range = action ? action->wrap().get_frame_range_of_keys(
true) :
3288 r_action_strip->
actstart = frame_range[0];
3289 r_action_strip->
actend = frame_range[1];
3293 r_action_strip->
end = r_action_strip->
actend;
3307 const bool actionstrip_evaluated = r_action_strip->
act && !soloing && eval_upper;
3308 if (!actionstrip_evaluated) {
3313 if (keyframing_to_strip) {
3335 const bool any_strip_evaluated)
3337 if (adt->
action ==
nullptr) {
3341 if (any_strip_evaluated) {
3364 if (adt ==
nullptr) {
3386 const bool flush_to_original)
3389 short track_index = 0;
3390 bool has_strips =
false;
3391 ListBase estrips = {
nullptr,
nullptr};
3410 if (nlt == tweaked_track) {
3414 &estrips, &tweak_strip, anim_eval_context, flush_to_original);
3418 &estrips, &nlt->
strips, track_index, anim_eval_context, flush_to_original);
3470 short track_index = 0;
3471 bool has_strips =
false;
3474 ListBase lower_estrips = {
nullptr,
nullptr};
3487 if (nlt == tweaked_track) {
3497 &lower_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3511 for (; nlt; nlt = nlt->
next, track_index++) {
3523 upper_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3545 nullptr, tweak_strip, anim_eval_context,
false);
3552 nullptr, action_strip, anim_eval_context,
false);
3594 const bool flush_to_original)
3602 &echannels,
ptr, adt, anim_eval_context, flush_to_original);
3603 if (did_evaluate_something) {
3614 return did_evaluate_something;
3621 for (
int i = 0;
i < snapshot->
size;
i++) {
3623 if (necs ==
nullptr) {
3641 const short upper_blendmode,
3642 const float upper_influence,
3650 if (upper_necs ==
nullptr && lower_necs ==
nullptr) {
3655 if (lower_necs ==
nullptr) {
3661 lower_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3668 const short upper_blendmode,
3669 const float upper_influence,
3676 if (blended_necs ==
nullptr) {
3683 if (lower_necs ==
nullptr) {
3689 lower_necs, blended_necs, upper_blendmode, upper_influence, result_necs);
3696 const short upper_blendmode,
3697 const float upper_influence,
3704 if (blended_necs ==
nullptr) {
3714 blended_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3748 if (ctx ==
nullptr) {
3773 r_values_mask.
fill(
false);
3775 if (r_force_all !=
nullptr) {
3776 *r_force_all =
false;
3781 if (!
ELEM(index,
i, -1)) {
3785 remap_domain[
i].set();
3789 if (context ==
nullptr || context->strip.act ==
nullptr) {
3790 r_values_mask = remap_domain;
3795 if (context->eval_strip ==
nullptr) {
3801 int blend_mode = context->strip.blendmode;
3802 float influence = context->strip.influence;
3807 r_values_mask = remap_domain;
3812 if (influence <= 0.0f) {
3817 NlaEvalData *eval_data = &context->lower_eval_data;
3822 key.
ptr = *prop_ptr;
3839 const bool can_force_all = r_force_all !=
nullptr;
3844 *r_force_all =
true;
3846 remap_domain.
fill(
true);
3861 &id_ptr, eval_data,
nullptr, nes, &blended_snapshot, anim_eval_context);
3866 &context->lower_eval_data.eval_snapshot,
3877 values[
i] = blended_necs->
values[
i];
3880 for (
int i = 0;
i < blended_necs->
length;
i++) {
3955 const bool flush_to_original)
3959 if (
ELEM(
nullptr,
id, adt)) {
3973 bool did_nla_evaluate_anything =
false;
3979 &id_ptr, adt, anim_eval_context, flush_to_original);
3982 if (!did_nla_evaluate_anything && adt->
action) {
3986 id_ptr, action, adt->
slot_handle, *anim_eval_context, flush_to_original);
4018 printf(
"Evaluate all animation - %f\n", ctime);
4030#define EVAL_ANIM_IDS(first, aflag) \
4031 for (id = static_cast<ID *>(first); id; id = static_cast<ID *>(id->next)) { \
4032 if (ID_REAL_USERS(id) > 0) { \
4033 AnimData *adt = BKE_animdata_from_id(id); \
4034 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4045#define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \
4046 for (id = static_cast<ID *>(first); id; id = static_cast<ID *>(id->next)) { \
4047 if (ID_REAL_USERS(id) > 0) { \
4048 AnimData *adt = BKE_animdata_from_id(id); \
4049 NtId_Type *ntp = (NtId_Type *)id; \
4050 if (ntp->nodetree) { \
4051 AnimData *adt2 = BKE_animdata_from_id((ID *)ntp->nodetree); \
4052 BKE_animsys_evaluate_animdata( \
4053 &ntp->nodetree->id, adt2, &anim_eval_context, ADT_RECALC_ANIM, flush_to_original); \
4055 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4070 printf(
"\tNo Actions, so no animation needs to be evaluated...\n");
4185 int driver_index = 0;
4216 if (is_active_depsgraph) {
4284 for (; dvar_orig && dvar; dvar_orig = dvar_orig->
next, dvar = dvar->
next) {
4311 if (marker->prop !=
nullptr) {
4332 if (marker->prop !=
nullptr) {
Functions and classes to work with Actions.
Functions for backward compatibility with the legacy Action API.
Layered Action evaluation.
Blender kernel action and pose functionality.
AnimData * BKE_animdata_from_id(const ID *id)
float evaluate_time_fmodifiers(FModifiersStackStorage *storage, const ListBase *modifiers, const FCurve *fcu, float cvalue, float evaltime)
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)
bool BKE_fcurve_is_empty(const FCurve *fcu)
float evaluate_fcurve(const FCurve *fcu, float evaltime)
float calculate_fcurve(PathResolvedRNA *anim_rna, FCurve *fcu, const AnimationEvalContext *anim_eval_context)
#define IDP_BlendDataRead(reader, prop)
IDProperty * IDP_CopyProperty_ex(const IDProperty *prop, int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
#define BKE_LIB_FOREACHID_PROCESS_ID(data_, id_, cb_flag_)
General operations, lookup, etc. for materials.
void BKE_nla_clip_length_ensure_nonzero(const float *actstart, float *r_actend)
void BKE_nlastrip_recalculate_bounds_sync_action(NlaStrip *strip)
bool BKE_nlatrack_is_enabled(const AnimData &adt, const NlaTrack &nlt)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_DISABLE(_bitmap, _index)
#define BLI_BITMAP_SIZE(_num)
void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
#define BLI_BITMAP_TEST_BOOL(_bitmap, _index)
void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
#define BLI_BITMAP_SET(_bitmap, _index, _set)
unsigned int BLI_ghashutil_ptrhash(const void *key)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_ensure_p_ex(GHash *gh, const void *key, void ***r_key, void ***r_val) ATTR_WARN_UNUSED_RESULT
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void void void void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1
void pow_qt_fl_normalized(float q[4], float fac)
void interp_qt_qtqt(float q[4], const float a[4], const float b[4], float t)
void invert_qt_normalized(float q[4])
float normalize_qt(float q[4])
float normalize_qt_qt(float r[4], const float q[4])
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
MINLINE void zero_v4(float r[4])
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
char * STRNCPY(char(&dst)[N], const char *src)
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
#define IN_RANGE_INCL(a, b, c)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_debug_print_eval_time(Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address, float time)
bool DEG_is_active(const Depsgraph *depsgraph)
void DEG_debug_print_eval_subdata_index(Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address, const char *subdata_comment, const char *subdata_name, const void *subdata_address, int subdata_index)
float DEG_get_ctime(const Depsgraph *graph)
bool DEG_is_evaluated(const T *id)
#define MAX_DRIVER_TARGETS
@ NLASTRIP_FLAG_USR_INFLUENCE
@ NLASTRIP_FLAG_USR_TIME_CYCLIC
@ NLASTRIP_FLAG_NO_TIME_MAP
@ NLASTRIP_FLAG_EDIT_TOUCHED
@ NLASTRIP_FLAG_SYNC_LENGTH
@ ADT_NLA_EVAL_UPPER_TRACKS
@ NLASTRIP_EXTEND_HOLD_FORWARD
@ NLASTRIP_EXTEND_NOTHING
@ NLASTRIP_TYPE_TRANSITION
Read Guarded memory(de)allocation.
static void nlaeval_init(NlaEvalData *nlaeval)
static void nla_eval_domain_strips(PointerRNA *ptr, NlaEvalData *channels, ListBase *strips, ActionAndSlotSet &touched_actions)
static float nla_combine_value(const int mix_mode, float base_value, const float lower_value, const float strip_value, const float influence)
static bool nla_combine_get_inverted_lower_value(const int mix_mode, float base_value, const float strip_value, const float blended_value, const float influence, float *r_lower_value)
static void animsys_evaluate_fcurves(PointerRNA *ptr, Span< FCurve * > fcurves, const AnimationEvalContext *anim_eval_context, bool flush_to_original)
void nlasnapshot_enable_all_blend_domain(NlaEvalSnapshot *snapshot)
void BKE_animsys_evaluate_animdata(ID *id, AnimData *adt, const AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, const bool flush_to_original)
static void animsys_write_orig_anim_rna(PointerRNA *ptr, const char *rna_path, int array_index, float value)
static void nlastrip_evaluate_meta(const int evaluation_mode, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static CLG_LogRef LOG_ANIM_FCURVE
static bool is_action_track_evaluated_without_nla(const AnimData *adt, const bool any_strip_evaluated)
static NlaEvalChannel * nlaevalchan_verify_key(NlaEvalData *nlaeval, const char *path, NlaEvalChannelKey *key)
AnimationEvalContext BKE_animsys_eval_context_construct(Depsgraph *depsgraph, float eval_time)
void BKE_animsys_evaluate_all_animation(Main *main, Depsgraph *depsgraph, float ctime)
void BKE_keyingsets_copy(ListBase *newlist, const ListBase *list)
static bool is_nlatrack_evaluatable(const AnimData *adt, const NlaTrack *nlt)
static void nlaevalchan_free_data(NlaEvalChannel *nec)
static void nlavalidmask_free(NlaValidMask *mask)
static void nlastrip_evaluate_transition(const int evaluation_mode, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
void nlasnapshot_ensure_channels(NlaEvalData *eval_data, NlaEvalSnapshot *snapshot)
static void animsys_create_action_track_strip(const AnimData *adt, const bool keyframing_to_strip, NlaStrip *r_action_strip)
static void nlaevalchan_assert_nonNull(const NlaEvalChannelSnapshot *necs)
static void nlavalidmask_init(NlaValidMask *mask, int bits)
void BKE_keyingset_free_paths(KeyingSet *ks)
static float nla_blend_value(const int blendmode, const float lower_value, const float strip_value, const float influence)
static void nlaevalchan_combine_value_get_inverted_upper_evalchan(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *blended_necs, const float upper_influence, NlaEvalChannelSnapshot *r_upper_necs)
bool BKE_animsys_rna_path_resolve(PointerRNA *ptr, const char *rna_path, const int array_index, PathResolvedRNA *r_result)
static CLG_LogRef LOG_ANIM_KEYINGSET
static bool nlaevalchan_blendOrcombine_try_copy_from_lower(const NlaEvalChannelSnapshot *lower_necs, const NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
static void nlaeval_fmodifiers_join_stacks(ListBase *result, ListBase *list1, ListBase *list2)
KeyingSet * BKE_keyingset_add(ListBase *list, const char idname[], const char name[], short flag, short keyingflag)
static void animsys_blend_fcurves_quaternion(PathResolvedRNA *anim_rna, Span< FCurve * > quaternion_fcurves, const AnimationEvalContext *anim_eval_context, const float blend_factor)
void BKE_keyingset_free_path(KeyingSet *ks, KS_Path *ksp)
void nlasnapshot_blend(NlaEvalData *eval_data, NlaEvalSnapshot *lower_snapshot, NlaEvalSnapshot *upper_snapshot, const short upper_blendmode, const float upper_influence, NlaEvalSnapshot *r_blended_snapshot)
static uint nlaevalchan_keyhash(const void *ptr)
void nlasnapshot_blend_get_inverted_upper_snapshot(NlaEvalData *eval_data, NlaEvalSnapshot *lower_snapshot, NlaEvalSnapshot *blended_snapshot, const short upper_blendmode, const float upper_influence, NlaEvalSnapshot *r_upper_snapshot)
static void nlaevalchan_assert_blendOrcombine_compatible(const NlaEvalChannelSnapshot *lower_necs, const NlaEvalChannelSnapshot *upper_necs, const NlaEvalChannelSnapshot *blended_necs)
static void nlaevalchan_combine_quaternion_get_inverted_upper_evalchan(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *blended_necs, const float upper_influence, NlaEvalChannelSnapshot *r_upper_necs)
static void nlaevalchan_blendOrcombine_get_inverted_upper_evalchan(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *blended_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_upper_necs)
static void nla_eval_domain_action(PointerRNA *ptr, NlaEvalData *channels, bAction *act, const animrig::slot_handle_t slot_handle, ActionAndSlotSet &touched_actions)
KS_Path * BKE_keyingset_add_path(KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, short flag, short groupmode)
void BKE_animsys_nla_remap_keyframe_values(NlaKeyframingContext *context, PointerRNA *prop_ptr, PropertyRNA *prop, const blender::MutableSpan< float > values, int index, const AnimationEvalContext *anim_eval_context, bool *r_force_all, blender::BitVector<> &r_values_mask)
void BKE_animsys_eval_animdata(Depsgraph *depsgraph, ID *id)
static bool nla_combine_get_inverted_strip_value(const int mix_mode, float base_value, const float lower_value, const float blended_value, const float influence, float *r_strip_value)
static void nlaevalchan_blend_value_get_inverted_upper_evalchan(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *blended_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_upper_necs)
void BKE_time_markers_blend_read(BlendDataReader *reader, ListBase &markers)
static void nlaevalchan_get_default_values(NlaEvalChannel *nec, float *r_values)
static bool nlaevalchan_blendOrcombine_try_copy_to_lower(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_lower_necs)
static void nlaevalchan_combine_value_get_inverted_lower_evalchan(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_lower_necs)
static bool is_fcurve_evaluatable(const FCurve *fcu)
Set< ActionAndSlot > ActionAndSlotSet
void nlasnapshot_blend_strip(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
NlaKeyframingContext * BKE_animsys_get_nla_keyframing_context(ListBase *cache, PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context)
static void nlaevalchan_blendOrcombine(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
#define EVAL_ANIM_IDS(first, aflag)
static bool nlaevalchan_validate_index_ex(const NlaEvalChannel *nec, const int array_index)
void BKE_copy_time_markers(ListBase &markers_dst, const ListBase &markers_src, const int flag)
static void animsys_evaluate_overrides(PointerRNA *ptr, AnimData *adt)
void BKE_animsys_free_nla_keyframing_context_cache(ListBase *cache)
static void nlasnapshot_from_action(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, bAction *action, const animrig::slot_handle_t slot_handle, const float evaltime, NlaEvalSnapshot *r_snapshot)
KS_Path * BKE_keyingset_find_path(KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int)
void BKE_animsys_eval_driver_unshare(Depsgraph *depsgraph, ID *id_eval)
static void nlaevalchan_blend_value(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
static void nlaevalchan_snapshot_copy(NlaEvalChannelSnapshot *dst, const NlaEvalChannelSnapshot *src)
static CLG_LogRef LOG_ANIM_DRIVER
void BKE_keyingsets_blend_write(BlendWriter *writer, ListBase *list)
bool BKE_animsys_read_from_rna_path(PathResolvedRNA *anim_rna, float *r_value)
void nlasnapshot_blend_get_inverted_lower_snapshot(NlaEvalData *eval_data, NlaEvalSnapshot *blended_snapshot, NlaEvalSnapshot *upper_snapshot, const short upper_blendmode, const float upper_influence, NlaEvalSnapshot *r_lower_snapshot)
static bool nla_blend_get_inverted_lower_value(const int blendmode, const float strip_value, const float blended_value, const float influence, float *r_lower_value)
static void nlaevalchan_blend_value_get_inverted_lower_evalchan(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_lower_necs)
void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *agrp, const AnimationEvalContext *anim_eval_context)
static NlaEvalChannelSnapshot * nlaeval_snapshot_get(NlaEvalSnapshot *snapshot, int index)
static NlaEvalChannel * nlaevalchan_verify(PointerRNA *ptr, NlaEvalData *nlaeval, const char *path)
static void animsys_quaternion_evaluate_fcurves(PathResolvedRNA quat_rna, Span< FCurve * > quat_fcurves, const AnimationEvalContext *anim_eval_context, float r_quaternion[4])
NlaEvalStrip * nlastrips_ctime_get_strip(ListBase *list, ListBase *strips, short index, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static int nlaevalchan_validate_index(const NlaEvalChannel *nec, int index)
static void animsys_blend_in_fcurves(PointerRNA *ptr, Span< FCurve * > fcurves, const AnimationEvalContext *anim_eval_context, const float blend_factor)
static NlaEvalStrip * nlastrips_ctime_get_strip_single(ListBase *dst_list, NlaStrip *single_strip, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static bool nla_blend_get_inverted_strip_value(const int blendmode, const float lower_value, const float blended_value, const float influence, float *r_strip_value)
static void nlaeval_snapshot_ensure_size(NlaEvalSnapshot *snapshot, int size)
static NlaEvalChannelSnapshot * nlaevalchan_snapshot_new(NlaEvalChannel *nec)
void nlasnapshot_blend_strip_no_blend(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context)
void BKE_keyingsets_blend_read_data(BlendDataReader *reader, ListBase *list)
static NlaEvalChannelSnapshot * nlaeval_snapshot_ensure_channel(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
#define ANIMSYS_FLOAT_AS_BOOL(value)
#define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag)
bool BKE_animsys_write_to_rna_path(PathResolvedRNA *anim_rna, const float value, const bool force_write)
static void nlaevalchan_combine_quaternion_get_inverted_lower_evalchan(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_lower_necs)
static void nla_combine_quaternion(const float lower_values[4], const float strip_values[4], const float influence, float r_blended_value[4])
void BKE_animsys_update_driver_array(ID *id)
static bool nla_combine_quaternion_get_inverted_strip_values(const float lower_values[4], const float blended_values[4], const float influence, float r_strip_values[4])
static void nlaevalchan_combine_quaternion(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
static NlaTrack * nlatrack_find_tweaked(const AnimData *adt)
static void nlaeval_snapshot_init(NlaEvalSnapshot *snapshot, NlaEvalData *nlaeval, NlaEvalSnapshot *base)
static CLG_LogRef LOG_ANIM_NLA
static bool animsys_calculate_nla(PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
std::pair< bAction *, animrig::slot_handle_t > ActionAndSlot
void animsys_evaluate_action(PointerRNA *ptr, bAction *act, const int32_t action_slot_handle, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static void nlaeval_snapshot_free_data(NlaEvalSnapshot *snapshot)
static void nla_combine_quaternion_get_inverted_lower_values(const float strip_values[4], const float blended_values[4], const float influence, float r_lower_value[4])
static void nlaeval_free(NlaEvalData *nlaeval)
void nlastrip_evaluate(const int evaluation_mode, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static void nlaevalchan_assert_blendOrcombine_compatible_quaternion(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, NlaEvalChannelSnapshot *blended_necs)
static float nlastrip_get_influence(NlaStrip *strip, float cframe)
static bool animsys_evaluate_nla_for_flush(NlaEvalData *echannels, PointerRNA *ptr, const AnimData *adt, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static bool nlaevalchan_keycmp(const void *a, const void *b)
void BKE_animsys_eval_driver(Depsgraph *depsgraph, ID *id, int driver_index, FCurve *fcu_orig)
static bool nlaevalchan_combine_quaternion_handle_undefined_blend_values(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_or_lower_necs)
void BKE_keyingsets_foreach_id(LibraryForeachIDData *data, const ListBase *keyingsets)
static void animsys_create_tweak_strip(const AnimData *adt, const bool keyframing_to_strip, NlaStrip *r_tweak_strip)
void nlasnapshot_blend_strip_get_inverted_lower_snapshot(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const AnimationEvalContext *anim_eval_context)
static void nlaevalchan_snapshot_free(NlaEvalChannelSnapshot *nec_snapshot)
void nladata_flush_channels(PointerRNA *ptr, NlaEvalData *channels, NlaEvalSnapshot *snapshot, const bool flush_to_original)
static void action_idcode_patch_check(ID *id, bAction *act)
static void nlaeval_fmodifiers_split_stacks(ListBase *list1, ListBase *list2)
static void nlaevalchan_copy_values(NlaEvalChannelSnapshot *dst, const NlaEvalChannelSnapshot *src)
static char nlaevalchan_detect_mix_mode(NlaEvalChannelKey *key, int length)
void BKE_time_markers_blend_write(BlendWriter *writer, ListBase &markers)
static bool animsys_construct_orig_pointer_rna(const PointerRNA *ptr, PointerRNA *ptr_orig)
static void animsys_evaluate_drivers(PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context)
static void animsys_evaluate_nla_domain(PointerRNA *ptr, NlaEvalData *channels, AnimData *adt)
static void animsys_evaluate_nla_for_keyframing(PointerRNA *ptr, const AnimData *adt, const AnimationEvalContext *anim_eval_context, NlaKeyframingContext *r_context)
static void nlaevalchan_combine_value(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
static void nlastrip_evaluate_actionclip(const int evaluation_mode, PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot)
static NlaEvalChannelSnapshot * nlaeval_snapshot_find_channel(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
static void nlaevalchan_blendOrCombine_get_inverted_lower_evalchan(NlaEvalChannelSnapshot *blended_necs, NlaEvalChannelSnapshot *upper_necs, const int upper_blendmode, const float upper_influence, NlaEvalChannelSnapshot *r_lower_necs)
void animsys_blend_in_action(PointerRNA *ptr, bAction *act, const int32_t action_slot_handle, const AnimationEvalContext *anim_eval_context, const float blend_factor)
static void nlastrip_evaluate_controls(NlaStrip *strip, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
AnimationEvalContext BKE_animsys_eval_context_construct_at(const AnimationEvalContext *anim_eval_context, float eval_time)
static NlaEvalChannelSnapshot ** nlaeval_snapshot_ensure_slot(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
void BKE_keyingsets_free(ListBase *list)
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode)
BMesh const char void * data
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
constexpr T * end() const
constexpr T * begin() const
constexpr Span slice_safe(const int64_t start, const int64_t size) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
void append(const T &value)
bool is_action_legacy() const
bool is_action_layered() const
Span< FCurve * > fcurves()
static constexpr slot_handle_t unassigned
void fill(const bool value)
IndexRange index_range() const
float length(VecOp< float, D >) RET
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void *(* MEM_recallocN_id)(void *vmemh, size_t len, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 fmod(const float2 a, const float b)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
Vector< FCurve * > fcurves_for_action_slot(bAction *action, slot_handle_t slot_handle)
Vector< const FCurve * > fcurves_all(const bAction *action)
bool action_treat_as_legacy(const bAction &action)
void evaluate_and_apply_action(PointerRNA &animated_id_ptr, Action &action, slot_handle_t slot_handle, const AnimationEvalContext &anim_eval_context, bool flush_to_original)
decltype(::ActionSlot::handle) slot_handle_t
Span< FCurve * > fcurves_for_action_slot(Action &action, slot_handle_t slot_handle)
Vector< T * > listbase_to_vector(ListBase &list)
@ STRIP_EVAL_BLEND_GET_INVERTED_LOWER_SNAPSHOT
struct NlaEvalChannelKey NlaEvalChannelKey
@ NES_TIME_TRANSITION_END
@ NES_TIME_TRANSITION_START
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_get_default_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, bool value)
void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
bool RNA_property_array_check(PropertyRNA *prop)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value)
int RNA_property_float_clamp(PointerRNA *ptr, PropertyRNA *prop, float *value)
int RNA_property_int_get_default(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_struct_is_ID(const StructRNA *type)
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_animateable(const PointerRNA *ptr, PropertyRNA *prop_orig)
PropertyType RNA_property_type(PropertyRNA *prop)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_boolean_get_default_array(PointerRNA *ptr, PropertyRNA *prop, bool *values)
void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
float RNA_property_float_get_default(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_flag(PropertyRNA *prop)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
void RNA_property_int_get_default_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
bool RNA_property_boolean_get_default(PointerRNA *ptr, PropertyRNA *prop)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
const char * RNA_property_identifier(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
struct Depsgraph * depsgraph
struct PropertyRNA * prop
NlaValidMask remap_domain
NlaValidMask blend_domain
struct NlaEvalChannel * channel
struct NlaEvalData * owner
NlaEvalChannelSnapshot base_snapshot
NlaEvalSnapshot eval_snapshot
NlaEvalSnapshot base_snapshot
struct NlaEvalSnapshot * base
NlaEvalChannelSnapshot ** channels
NlaStrip action_track_strip
NlaEvalData lower_eval_data
NlaEvalStrip * eval_strip
int32_t action_slot_handle
struct NlaStrip * orig_strip