65#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)) {
176 CLOG_ERROR(&
LOG,
"no Keying Set and/or RNA Path to add path with");
189 CLOG_ERROR(&
LOG,
"destination already exists in Keying Set");
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) {
295 for (ks =
static_cast<KeyingSet *
>(list->first); ks; ks = ksn) {
352 const char *rna_path,
353 const int array_index,
356 if (rna_path ==
nullptr) {
360 const char *path = rna_path;
367 "Animato: Invalid path. ID = '%s', '%s[%d]'",
380 if (array_len && array_index >= array_len) {
383 "Animato: Invalid array index. ID = '%s', '%s[%d]', array length is %d",
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;
474 if (old_value == value) {
481 if (array_index != -1) {
490 int value_coerce =
int(value);
492 if (array_index != -1) {
501 float value_coerce = value;
503 if (array_index != -1) {
512 const int value_coerce =
int(value);
532 if (
ptr->
type != &RNA_NlaStrip) {
549 const char *rna_path,
572 bool flush_to_original)
575 for (
FCurve *fcu : fcurves) {
585 if (flush_to_original) {
600 float r_quaternion[4])
606 r_quaternion[0] = 1.0f;
607 r_quaternion[1] = 0.0f;
608 r_quaternion[2] = 0.0f;
609 r_quaternion[3] = 0.0f;
611 for (
FCurve *quat_curve_fcu : quat_fcurves) {
612 const int array_index = quat_curve_fcu->array_index;
614 r_quaternion[array_index] =
calculate_fcurve(&quat_rna, quat_curve_fcu, anim_eval_context);
617 if (quat_fcurves.
size() < 4) {
631 const float blend_factor)
635 float current_quat[4];
638 float target_quat[4];
640 *anim_rna, quaternion_fcurves, anim_eval_context, target_quat);
642 float blended_quat[4];
643 interp_qt_qtqt(blended_quat, current_quat, target_quat, blend_factor);
653 const float blend_factor)
655 char *channel_to_skip =
nullptr;
656 int num_channels_to_skip = 0;
658 FCurve *fcu = fcurves[fcurve_index];
660 if (num_channels_to_skip) {
666 num_channels_to_skip--;
685 quat_fcurves.
append(quat_fcurve);
693 num_channels_to_skip = quat_fcurves.
size() - 1;
698 const float fcurve_value =
calculate_fcurve(&anim_rna, fcu, anim_eval_context);
701 float value_to_write;
703 value_to_write = (1 - blend_factor) * current_value + blend_factor * fcurve_value;
713 value_to_write = roundf(value_to_write);
722 value_to_write = fcurve_value;
738 ctx.eval_time = eval_time;
795 if (
ELEM(
nullptr,
id, act)) {
799#ifdef WITH_ANIM_BAKLAVA
810 idcode =
GS(id->name);
821 else if (act->
idroot != idcode) {
825 "AnimSys Safety Check Failed: Action '%s' is not meant to be used from ID-Blocks of "
826 "type %d such as '%s'\n",
844 if (
ELEM(
nullptr, act, agrp)) {
855 const auto visit_fcurve = [&](
FCurve *fcu) {
866#ifdef WITH_ANIM_BAKLAVA
876#ifdef WITH_ANIM_BAKLAVA
881 visit_fcurve(fcurve);
888 const int32_t action_slot_handle,
890 const bool flush_to_original)
893 if (act ==
nullptr) {
918 const int32_t action_slot_handle,
920 const float blend_factor)
959 const bool flush_to_original)
1005 const bool flush_to_original)
1010 float ctime = anim_eval_context->
eval_time;
1019 bool in_range =
IN_RANGE_INCL(ctime, strip->start, strip->end);
1021 switch (strip->extendmode) {
1026 in_range = ctime >= strip->start;
1039 if (ctime < strip->start) {
1040 if (strip == strips->
first) {
1055 strip = strip->
prev;
1066 if (ctime > strip->end) {
1068 if (strip == strips->
last) {
1091 ctime = estrip->
start;
1094 ctime = estrip->
end;
1105 anim_eval_context, ctime);
1114 switch (estrip->
type) {
1116 if (estrip->
act ==
nullptr) {
1128 anim_eval_context, estrip->
start);
1130 anim_eval_context, estrip->
end);
1139 nes->
strip = estrip;
1155 const bool flush_to_original)
1158 single_tracks_list.
first = single_tracks_list.
last = single_strip;
1161 dst_list, &single_tracks_list, -1, anim_eval_context, flush_to_original);
1173 mask->ptr = mask->buffer;
1180 if (mask->ptr != mask->buffer) {
1200 return ((A->ptr.data !=
B->ptr.data) || (A->prop !=
B->prop));
1212 MEM_callocN(byte_size,
"NlaEvalChannelSnapshot"));
1219 return nec_snapshot;
1248 snapshot->
base = base;
1257 return (index < snapshot->size) ? snapshot->
channels[index] :
nullptr;
1263 if (size > snapshot->
size) {
1264 snapshot->
size *= 2;
1268 size_t byte_size =
sizeof(*snapshot->
channels) * snapshot->
size;
1286 while (snapshot !=
nullptr) {
1288 if (nec_snapshot !=
nullptr) {
1289 return nec_snapshot;
1291 snapshot = snapshot->
base;
1304 if (*slot ==
nullptr) {
1312 *slot = nec_snapshot;
1321 if (snapshot->
channels !=
nullptr) {
1322 for (
int i = 0; i < snapshot->
size; i++) {
1324 if (nec_snapshot !=
nullptr) {
1332 snapshot->
base =
nullptr;
1343 nec->
key.~NlaEvalChannelKey();
1349 memset(nlaeval, 0,
sizeof(*nlaeval));
1379 if (index >= 0 && index < nec->base_snapshot.length) {
1398 "Animation: Invalid array index. ID = '%s', '%s[%d]', array length is %d",
1399 id ? (id->name + 2) :
"<No ID>",
1439 tmp_bool =
static_cast<bool *
>(
MEM_malloc_arrayN(length,
sizeof(*tmp_bool), __func__));
1441 for (
int i = 0; i <
length; i++) {
1442 r_values[i] =
float(tmp_bool[i]);
1447 tmp_int =
static_cast<int *
>(
MEM_malloc_arrayN(length,
sizeof(*tmp_int), __func__));
1449 for (
int i = 0; i <
length; i++) {
1450 r_values[i] =
float(tmp_int[i]);
1458 memset(r_values, 0,
sizeof(
float) * length);
1484 for (
int i = 0; i <
length; i++) {
1485 if (r_values[i] == 0.0f) {
1517 nlaeval->
key_hash, key, (
void ***)&p_key, (
void ***)&p_key_nec);
1534 nec->
owner = nlaeval;
1562 if (path ==
nullptr) {
1575 *p_path_nec =
nullptr;
1584 "Animato: Invalid path. ID = '%s', '%s'",
1603 return *p_path_nec = nec;
1610 const float strip_value,
1611 const float blended_value,
1612 const float influence,
1613 float *r_lower_value)
1615 if (
IS_EQF(influence, 0.0f)) {
1616 *r_lower_value = blended_value;
1620 switch (blendmode) {
1622 *r_lower_value = blended_value - (strip_value * influence);
1626 *r_lower_value = blended_value + (strip_value * influence);
1631 const float denominator = (influence * strip_value + (1.0f - influence));
1632 if (
IS_EQF(denominator, 0.0f)) {
1639 if (
IS_EQF(blended_value, 0.0f)) {
1674 *r_lower_value = blended_value / denominator;
1684 if (
IS_EQF(influence, 1.0f)) {
1696 *r_lower_value = (blended_value - (strip_value * influence)) / (1.0f - influence);
1707 const float strip_value,
1708 const float blended_value,
1709 const float influence,
1710 float *r_lower_value)
1712 if (
IS_EQF(influence, 0.0f)) {
1713 *r_lower_value = blended_value;
1721 *r_lower_value = blended_value - (strip_value - base_value) * influence;
1724 if (
IS_EQF(strip_value, 0.0f)) {
1731 if (
IS_EQF(blended_value, 0.0f)) {
1744 *r_lower_value = 1.0f;
1751 if (
IS_EQF(base_value, 0.0f)) {
1755 *r_lower_value = blended_value /
powf(strip_value / base_value, influence);
1759 BLI_assert_msg(0,
"Use nla_combine_quaternion_get_inverted_lower_values()");
1768 const float blended_values[4],
1769 const float influence,
1770 float r_lower_value[4])
1772 if (
IS_EQF(influence, 0.0f)) {
1781 float tmp_strip_values[4], tmp_blended[4];
1789 mul_qt_qtqt(r_lower_value, tmp_blended, tmp_strip_values);
1795 const float lower_value,
1796 const float strip_value,
1797 const float influence)
1800 if (
IS_EQF(influence, 0.0f)) {
1805 switch (blendmode) {
1807 return lower_value + (strip_value * influence);
1810 return lower_value - (strip_value * influence);
1813 return influence * (lower_value * strip_value) + (1 - influence) * lower_value;
1824 return lower_value * (1.0f - influence) + (strip_value * influence);
1832 const float lower_value,
1833 const float strip_value,
1834 const float influence)
1837 if (
IS_EQF(influence, 0.0f)) {
1845 return lower_value + (strip_value - base_value) * influence;
1848 if (
IS_EQF(base_value, 0.0f)) {
1851 return lower_value *
powf(strip_value / base_value, influence);
1861 const float lower_value,
1862 const float blended_value,
1863 const float influence,
1864 float *r_strip_value)
1867 if (
IS_EQF(influence, 0.0f)) {
1871 switch (blendmode) {
1873 *r_strip_value = (blended_value - lower_value) / influence;
1877 *r_strip_value = (lower_value - blended_value) / influence;
1881 if (
IS_EQF(lower_value, 0.0f)) {
1883 if (
IS_EQF(blended_value, 0.0f)) {
1884 *r_strip_value = 1.0f;
1901 *r_strip_value = ((blended_value - lower_value) / (influence * lower_value)) + 1.0f;
1918 *r_strip_value = (blended_value - lower_value * (1.0f - influence)) / influence;
1926 const float lower_value,
1927 const float blended_value,
1928 const float influence,
1929 float *r_strip_value)
1932 if (
IS_EQF(influence, 0.0f)) {
1939 *r_strip_value = base_value + (blended_value - lower_value) / influence;
1943 if (
IS_EQF(base_value, 0.0f)) {
1947 if (
IS_EQF(lower_value, 0.0f)) {
1949 if (
IS_EQF(blended_value, 0.0f)) {
1950 *r_strip_value = base_value;
1957 *r_strip_value = base_value *
powf(blended_value / lower_value, 1.0f / influence);
1971 const float strip_values[4],
1972 const float influence,
1973 float r_blended_value[4])
1975 float tmp_lower[4], tmp_strip_values[4];
1981 mul_qt_qtqt(r_blended_value, tmp_lower, tmp_strip_values);
1986 const float blended_values[4],
1987 const float influence,
1988 float r_strip_values[4])
1995 if (
IS_EQF(influence, 0.0f)) {
1998 float tmp_lower[4], tmp_blended[4];
2004 mul_qt_qtqt(r_strip_values, tmp_lower, tmp_blended);
2041 for (
int j = 0; j < 4; j++) {
2073 const float upper_influence,
2076 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2077 if (upper_necs !=
nullptr && has_influence) {
2095 const float upper_influence,
2098 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2099 if (upper_necs !=
nullptr && has_influence) {
2120 const int upper_blendmode,
2121 const float upper_influence,
2126 lower_necs, upper_necs, upper_influence, r_blended_necs))
2131 const int length = lower_necs->
length;
2132 for (
int j = 0; j <
length; j++) {
2139 upper_blendmode, lower_necs->
values[j], upper_necs->
values[j], upper_influence);
2151 const float upper_influence,
2156 lower_necs, upper_necs, upper_influence, r_blended_necs))
2163 const int length = lower_necs->
length;
2166 for (
int j = 0; j <
length; j++) {
2173 mix_mode, base_values[j], lower_necs->
values[j], upper_necs->
values[j], upper_influence);
2185 const float upper_influence,
2190 lower_necs, upper_necs, upper_influence, r_blended_necs))
2219 const int upper_blendmode,
2220 const float upper_influence,
2225 switch (upper_blendmode) {
2248 lower_necs, upper_necs, upper_blendmode, upper_influence, r_blended_necs);
2266 const int upper_blendmode,
2267 const float upper_influence,
2273 const int length = lower_necs->
length;
2274 for (
int j = 0; j <
length; j++) {
2284 &r_upper_necs->
values[j]);
2299 const float upper_influence,
2307 const int length = lower_necs->
length;
2310 for (
int j = 0; j <
length; j++) {
2321 &r_upper_necs->
values[j]);
2337 const float upper_influence,
2369 const int upper_blendmode,
2370 const float upper_influence,
2375 if (
IS_EQF(upper_influence, 0.0f)) {
2380 switch (upper_blendmode) {
2385 lower_necs, blended_necs, upper_influence, r_upper_necs);
2392 lower_necs, blended_necs, upper_influence, r_upper_necs);
2405 lower_necs, blended_necs, upper_blendmode, upper_influence, r_upper_necs);
2416 const int upper_blendmode,
2417 const float upper_influence,
2423 blended_necs, upper_necs, upper_influence, r_lower_necs))
2428 const int length = r_lower_necs->
length;
2430 for (
int j = 0; j <
length; j++) {
2448 &r_lower_necs->
values[j]);
2457 const float upper_influence,
2463 blended_necs, upper_necs, upper_influence, r_lower_necs))
2470 const int length = r_lower_necs->
length;
2472 for (
int j = 0; j <
length; j++) {
2491 &r_lower_necs->
values[j]);
2500 const float upper_influence,
2510 blended_necs, upper_necs, upper_influence, r_lower_necs))
2518 memcpy(r_lower_necs->
values, blended_necs->
values, 4 *
sizeof(
float));
2545 const int upper_blendmode,
2546 const float upper_influence,
2552 switch (upper_blendmode) {
2557 blended_necs, upper_necs, upper_influence, r_lower_necs);
2564 blended_necs, upper_necs, upper_influence, r_lower_necs);
2576 blended_necs, upper_necs, upper_blendmode, upper_influence, r_lower_necs);
2594 if (
ELEM(
nullptr, list1, list1->
first)) {
2595 if (list2 && list2->
first) {
2596 result->first = list2->
first;
2597 result->last = list2->
last;
2601 else if (
ELEM(
nullptr, list2, list2->
first)) {
2602 result->first = list1->
first;
2603 result->last = list1->
last;
2610 result->first = list1->
first;
2611 result->last = list2->
last;
2627 if (
ELEM(
nullptr, list1, list2)) {
2639 fcm1->
next =
nullptr;
2640 fcm2->
prev =
nullptr;
2663 &storage, modifiers,
nullptr, 0.0f,
evaltime);
2673 if (nec ==
nullptr) {
2685 necs->
values[fcu->array_index] = value;
2708 if (strip ==
nullptr) {
2712 if (strip->
act ==
nullptr) {
2713 CLOG_ERROR(&
LOG,
"NLA-Strip Eval Error: Strip '%s' has no Action", strip->
name);
2717 ListBase tmp_modifiers = {
nullptr,
nullptr};
2722 switch (evaluation_mode) {
2785 const bool flush_to_original)
2787 ListBase tmp_modifiers = {
nullptr,
nullptr};
2811 switch (evaluation_mode) {
2875 ptr, channels, &tmp_modifiers, &tmp_nes, &snapshot1, anim_eval_context);
2880 if (necs ==
nullptr) {
2884 for (
int i = 0; i < necs->
length; i++) {
2898 ptr, channels, &tmp_modifiers, &tmp_nes, &snapshot2, anim_eval_context);
2903 if (necs ==
nullptr) {
2907 for (
int i = 0; i < necs->
length; i++) {
2920 "This case shouldn't occur. "
2921 "Transitions assumed to not reference other transitions.");
2938 const bool flush_to_original)
2940 ListBase tmp_modifiers = {
nullptr,
nullptr};
2961 nullptr, &strip->
strips, -1, &child_context, flush_to_original);
3004 const bool flush_to_original)
3021 switch (strip->
type) {
3051 strip->
flag &= ~NLASTRIP_FLAG_EDIT_TOUCHED;
3060 const bool flush_to_original)
3104 const bool flush_to_original)
3107 if (channels ==
nullptr) {
3126 for (
int i = 0; i < nec_snapshot->
length; i++) {
3128 float value = nec_snapshot->
values[i];
3129 if (nec->is_array) {
3133 if (flush_to_original) {
3147 GSet *touched_actions)
3161 if (nec !=
nullptr) {
3180 GSet *touched_actions)
3186 ptr, channels, strip->act, strip->action_slot_handle, touched_actions);
3242 const bool keyframing_to_strip,
3248 r_tweak_strip->
next = r_tweak_strip->
prev =
nullptr;
3260 if (!is_inplace_tweak) {
3268 if (keyframing_to_strip) {
3277 const bool keyframing_to_strip,
3282 memset(r_action_strip, 0,
sizeof(
NlaStrip));
3293 r_action_strip->
act = action;
3298 const float2 frame_range = action ? action->wrap().get_frame_range_of_keys(
true) :
3300 r_action_strip->
actstart = frame_range[0];
3301 r_action_strip->
actend = frame_range[1];
3305 r_action_strip->
end = r_action_strip->
actend;
3319 const bool actionstrip_evaluated = r_action_strip->
act && !soloing && eval_upper;
3320 if (!actionstrip_evaluated) {
3325 if (keyframing_to_strip) {
3361 const bool any_strip_evaluated)
3363 if (adt->
action ==
nullptr) {
3367 if (any_strip_evaluated) {
3390 if (adt ==
nullptr) {
3412 const bool flush_to_original)
3415 short track_index = 0;
3416 bool has_strips =
false;
3417 ListBase estrips = {
nullptr,
nullptr};
3436 if (nlt == tweaked_track) {
3440 &estrips, &tweak_strip, anim_eval_context, flush_to_original);
3444 &estrips, &nlt->
strips, track_index, anim_eval_context, flush_to_original);
3496 short track_index = 0;
3497 bool has_strips =
false;
3500 ListBase lower_estrips = {
nullptr,
nullptr};
3513 if (nlt == tweaked_track) {
3523 &lower_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3537 for (; nlt; nlt = nlt->
next, track_index++) {
3549 upper_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3571 nullptr, tweak_strip, anim_eval_context,
false);
3578 nullptr, action_strip, anim_eval_context,
false);
3620 const bool flush_to_original)
3628 &echannels,
ptr, adt, anim_eval_context, flush_to_original);
3629 if (did_evaluate_something) {
3640 return did_evaluate_something;
3647 for (
int i = 0; i < snapshot->
size; i++) {
3649 if (necs ==
nullptr) {
3667 const short upper_blendmode,
3668 const float upper_influence,
3676 if (upper_necs ==
nullptr && lower_necs ==
nullptr) {
3681 if (lower_necs ==
nullptr) {
3687 lower_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3694 const short upper_blendmode,
3695 const float upper_influence,
3702 if (blended_necs ==
nullptr) {
3709 if (lower_necs ==
nullptr) {
3715 lower_necs, blended_necs, upper_blendmode, upper_influence, result_necs);
3722 const short upper_blendmode,
3723 const float upper_influence,
3730 if (blended_necs ==
nullptr) {
3740 blended_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3774 if (ctx ==
nullptr) {
3798 const int count = values.size();
3799 r_values_mask.
fill(
false);
3801 if (r_force_all !=
nullptr) {
3802 *r_force_all =
false;
3806 for (
int i = 0; i <
count; i++) {
3807 if (!
ELEM(index, i, -1)) {
3811 remap_domain[i].set();
3815 if (context ==
nullptr || context->strip.act ==
nullptr) {
3816 r_values_mask = remap_domain;
3821 if (context->eval_strip ==
nullptr) {
3827 int blend_mode = context->strip.blendmode;
3828 float influence = context->strip.influence;
3833 r_values_mask = remap_domain;
3838 if (influence <= 0.0f) {
3843 NlaEvalData *eval_data = &context->lower_eval_data;
3848 key.
ptr = *prop_ptr;
3860 std::copy(values.begin(), values.end(), blended_necs->
values);
3865 const bool can_force_all = r_force_all !=
nullptr;
3870 *r_force_all =
true;
3872 remap_domain.
fill(
true);
3887 &id_ptr, eval_data,
nullptr, nes, &blended_snapshot, anim_eval_context);
3899 for (
int i = 0; i <
count; i++) {
3903 values[i] = blended_necs->
values[i];
3906 for (
int i = 0; i < blended_necs->
length; i++) {
3981 const bool flush_to_original)
3985 if (
ELEM(
nullptr,
id, adt)) {
3999 bool did_nla_evaluate_anything =
false;
4005 &id_ptr, adt, anim_eval_context, flush_to_original);
4008 if (!did_nla_evaluate_anything && adt->
action) {
4012 id_ptr, action, adt->
slot_handle, *anim_eval_context, flush_to_original);
4044 printf(
"Evaluate all animation - %f\n", ctime);
4056#define EVAL_ANIM_IDS(first, aflag) \
4057 for (id = static_cast<ID *>(first); id; id = static_cast<ID *>(id->next)) { \
4058 if (ID_REAL_USERS(id) > 0) { \
4059 AnimData *adt = BKE_animdata_from_id(id); \
4060 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4071#define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \
4072 for (id = static_cast<ID *>(first); id; id = static_cast<ID *>(id->next)) { \
4073 if (ID_REAL_USERS(id) > 0) { \
4074 AnimData *adt = BKE_animdata_from_id(id); \
4075 NtId_Type *ntp = (NtId_Type *)id; \
4076 if (ntp->nodetree) { \
4077 AnimData *adt2 = BKE_animdata_from_id((ID *)ntp->nodetree); \
4078 BKE_animsys_evaluate_animdata( \
4079 &ntp->nodetree->id, adt2, &anim_eval_context, ADT_RECALC_ANIM, flush_to_original); \
4081 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4096 printf(
"\tNo Actions, so no animation needs to be evaluated...\n");
4215 int driver_index = 0;
4276 for (; dvar_orig && dvar; dvar_orig = dvar_orig->
next, dvar = dvar->
next) {
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 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)
#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)
A dynamically sized string ADT.
GSet * BLI_gset_ptr_new(const char *info)
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)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
bool BLI_gset_add(GSet *gs, void *key)
bool BLI_ghash_ensure_p_ex(GHash *gh, const void *key, void ***r_key, void ***r_val) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct 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 struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT 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
#define STRNCPY(dst, 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 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)
#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
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void nlaeval_init(NlaEvalData *nlaeval)
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 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 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)
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)
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)
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)
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)
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)
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)
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 nla_eval_domain_action(PointerRNA *ptr, NlaEvalData *channels, bAction *act, const animrig::slot_handle_t slot_handle, GSet *touched_actions)
static void nlaeval_snapshot_init(NlaEvalSnapshot *snapshot, NlaEvalData *nlaeval, NlaEvalSnapshot *base)
static bool animsys_calculate_nla(PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
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)
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 nla_eval_domain_strips(PointerRNA *ptr, NlaEvalData *channels, ListBase *strips, GSet *touched_actions)
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)
bool BKE_animsys_write_to_rna_path(PathResolvedRNA *anim_rna, const float value)
void BKE_keyingsets_free(ListBase *list)
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode)
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
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
local_group_size(16, 16) .push_constant(Type b
const Depsgraph * depsgraph
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 *(* MEM_mallocN)(size_t len, const char *str)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_recallocN_id)(void *vmemh, size_t len, const char *str)
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)
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)
Span< FCurve * > fcurves_for_action_slot(Action &action, slot_handle_t slot_handle)
decltype(::ActionSlot::handle) slot_handle_t
Vector< T * > listbase_to_vector(ListBase &list)
@ STRIP_EVAL_BLEND_GET_INVERTED_LOWER_SNAPSHOT
struct NlaEvalChannelSnapshot NlaEvalChannelSnapshot
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)
int RNA_property_enum_get_default(PointerRNA *, PropertyRNA *prop)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
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)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
bool RNA_property_boolean_get_default(PointerRNA *ptr, PropertyRNA *prop)
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