57 #include "RNA_prototypes.h"
76 const char group_name[],
77 const char rna_path[],
92 short eq_id = 1, eq_path = 1, eq_index = 1, eq_group = 1;
115 if (eq_id && eq_path && eq_index && eq_group) {
127 ListBase *list,
const char idname[],
const char name[],
short flag,
short keyingflag)
162 const char group_name[],
163 const char rna_path[],
172 CLOG_ERROR(&
LOG,
"no Keying Set and/or RNA Path to add path with");
185 CLOG_ERROR(&
LOG,
"destination already exists in Keying Set");
199 ksp->
group[0] =
'\0';
246 for (ksn = newlist->
first; ksn; ksn = ksn->
next) {
258 for (
KS_Path *kspn = ksn->paths.first; kspn; kspn = kspn->
next) {
276 for (ksp = ks->
paths.
first; ksp; ksp = kspn) {
294 for (ks = list->
first; ks; ks = ksn) {
369 const char *rna_path,
370 const int array_index,
373 if (rna_path ==
NULL) {
377 const char *path = rna_path;
384 "Animato: Invalid path. ID = '%s', '%s[%d]'",
397 if (array_len && array_index >= array_len) {
400 "Animato: Invalid array index. ID = '%s', '%s[%d]', array length is %d",
409 r_result->
prop_index = array_len ? array_index : -1;
414 #define ANIMSYS_FLOAT_AS_BOOL(value) ((value) > (1.0f - FLT_EPSILON))
428 if (array_index != -1) {
430 orig_value = (
float)orig_value_coerce;
434 orig_value = (
float)orig_value_coerce;
439 if (array_index != -1) {
441 orig_value = (
float)orig_value_coerce;
445 orig_value = (
float)orig_value_coerce;
450 if (array_index != -1) {
452 orig_value = (
float)orig_value_coerce;
456 orig_value = (
float)orig_value_coerce;
462 orig_value = (
float)orig_value_coerce;
470 if (r_value !=
NULL) {
471 *r_value = orig_value;
492 if (old_value == value) {
499 if (array_index != -1) {
508 int value_coerce = (int)value;
510 if (array_index != -1) {
519 float value_coerce = value;
521 if (array_index != -1) {
530 const int value_coerce = (int)value;
551 if (
ptr->
type != &RNA_NlaStrip) {
568 const char *rna_path,
591 bool flush_to_original)
604 if (flush_to_original) {
622 float r_quaternion[4])
624 FCurve *quat_curve_fcu = first_fcurve;
628 r_quaternion[0] = 1.0f;
629 r_quaternion[1] = 0.0f;
630 r_quaternion[2] = 0.0f;
631 r_quaternion[3] = 0.0f;
633 int fcurve_offset = 0;
634 for (; fcurve_offset < 4 && quat_curve_fcu;
635 ++fcurve_offset, quat_curve_fcu = quat_curve_fcu->
next) {
642 const int array_index = quat_curve_fcu->
array_index;
644 r_quaternion[array_index] =
calculate_fcurve(&quat_rna, quat_curve_fcu, anim_eval_context);
647 if (fcurve_offset < 4) {
653 return fcurve_offset;
666 const float blend_factor)
668 float current_quat[4];
671 float target_quat[4];
673 *anim_rna, first_fcurve, anim_eval_context, target_quat);
675 float blended_quat[4];
676 interp_qt_qtqt(blended_quat, current_quat, target_quat, blend_factor);
680 return num_fcurves_read;
688 const float blend_factor)
690 char *channel_to_skip =
NULL;
691 int num_channels_to_skip = 0;
694 if (num_channels_to_skip) {
698 if (
STREQ(channel_to_skip, fcu->rna_path)) {
700 num_channels_to_skip--;
716 &anim_rna, fcu, anim_eval_context, blend_factor);
721 num_channels_to_skip = num_fcurves_read - 1;
726 const float fcurve_value =
calculate_fcurve(&anim_rna, fcu, anim_eval_context);
729 float value_to_write;
731 value_to_write = (1 - blend_factor) * current_value + blend_factor * fcurve_value;
740 value_to_write = roundf(value_to_write);
749 value_to_write = fcurve_value;
766 .eval_time = eval_time,
841 else if (act->
idroot != idcode) {
845 "AnimSys Safety Check Failed: Action '%s' is not meant to be used from ID-Blocks of "
846 "type %d such as '%s'\n",
891 const bool flush_to_original)
907 const float blend_factor)
940 const bool flush_to_original)
986 const bool flush_to_original)
991 float ctime = anim_eval_context->
eval_time;
994 for (strip = strips->
first; strip; strip = strip->
next) {
1005 if (ctime < strip->start) {
1006 if (strip == strips->
first) {
1021 strip = strip->
prev;
1032 if (ctime > strip->
end) {
1034 if (strip == strips->
last) {
1057 ctime = estrip->
start;
1060 ctime = estrip->
end;
1071 anim_eval_context, ctime);
1080 switch (estrip->
type) {
1095 anim_eval_context, estrip->
start);
1097 anim_eval_context, estrip->
end);
1106 nes->
strip = estrip;
1122 const bool flush_to_original)
1125 single_tracks_list.
first = single_tracks_list.
last = single_strip;
1128 dst_list, &single_tracks_list, -1, anim_eval_context, flush_to_original);
1167 return ((
A->ptr.data !=
B->ptr.data) || (
A->prop !=
B->prop));
1185 return nec_snapshot;
1214 snapshot->
base = base;
1217 "NlaEvalSnapshot::channels");
1230 snapshot->
size *= 2;
1234 size_t byte_size =
sizeof(*snapshot->
channels) * snapshot->
size;
1236 snapshot->
channels, byte_size,
"NlaEvalSnapshot::channels");
1252 while (snapshot !=
NULL) {
1254 if (nec_snapshot !=
NULL) {
1255 return nec_snapshot;
1257 snapshot = snapshot->
base;
1270 if (*slot ==
NULL) {
1278 *slot = nec_snapshot;
1288 for (
int i = 0; i < snapshot->
size; i++) {
1290 if (nec_snapshot !=
NULL) {
1314 memset(nlaeval, 0,
sizeof(*nlaeval));
1344 if (index >= 0 && index < nec->base_snapshot.length) {
1363 "Animation: Invalid array index. ID = '%s', '%s[%d]', array length is %d",
1364 id ? (
id->
name + 2) :
"<No ID>",
1406 for (
int i = 0; i <
length; i++) {
1407 r_values[i] = (
float)tmp_bool[i];
1414 for (
int i = 0; i <
length; i++) {
1415 r_values[i] = (
float)tmp_int[i];
1423 memset(r_values, 0,
sizeof(
float) *
length);
1449 for (
int i = 0; i <
length; i++) {
1450 if (r_values[i] == 0.0f) {
1482 nlaeval->
key_hash, key, (
void ***)&p_key, (
void ***)&p_key_nec);
1499 nec->
owner = nlaeval;
1549 "Animato: Invalid path. ID = '%s', '%s'",
1568 return *p_path_nec = nec;
1575 const float strip_value,
1576 const float blended_value,
1577 const float influence,
1578 float *r_lower_value)
1580 if (
IS_EQF(influence, 0.0f)) {
1581 *r_lower_value = blended_value;
1585 switch (blendmode) {
1588 *r_lower_value = blended_value - (strip_value * influence);
1593 *r_lower_value = blended_value + (strip_value * influence);
1598 const float denominator = (influence * strip_value + (1.0f - influence));
1599 if (
IS_EQF(denominator, 0.0f)) {
1606 if (
IS_EQF(blended_value, 0.0f)) {
1641 *r_lower_value = blended_value / denominator;
1651 if (
IS_EQF(influence, 1.0f)) {
1663 *r_lower_value = (blended_value - (strip_value * influence)) / (1.0f - influence);
1674 const float strip_value,
1675 const float blended_value,
1676 const float influence,
1677 float *r_lower_value)
1679 if (
IS_EQF(influence, 0.0f)) {
1680 *r_lower_value = blended_value;
1688 *r_lower_value = blended_value - (strip_value - base_value) * influence;
1692 if (
IS_EQF(strip_value, 0.0f)) {
1699 if (
IS_EQF(blended_value, 0.0f)) {
1711 *r_lower_value = 1.0f;
1718 if (
IS_EQF(base_value, 0.0f)) {
1722 *r_lower_value = blended_value /
powf(strip_value / base_value, influence);
1726 BLI_assert_msg(0,
"Use nla_combine_quaternion_get_inverted_lower_values()");
1735 const float blended_values[4],
1736 const float influence,
1737 float r_lower_value[4])
1739 if (
IS_EQF(influence, 0.0f)) {
1748 float tmp_strip_values[4], tmp_blended[4];
1756 mul_qt_qtqt(r_lower_value, tmp_blended, tmp_strip_values);
1762 const float lower_value,
1763 const float strip_value,
1764 const float influence)
1767 if (
IS_EQF(influence, 0.0f)) {
1772 switch (blendmode) {
1775 return lower_value + (strip_value * influence);
1779 return lower_value - (strip_value * influence);
1783 return influence * (lower_value * strip_value) + (1 - influence) * lower_value;
1794 return lower_value * (1.0f - influence) + (strip_value * influence);
1802 const float lower_value,
1803 const float strip_value,
1804 const float influence)
1807 if (
IS_EQF(influence, 0.0f)) {
1815 return lower_value + (strip_value - base_value) * influence;
1818 if (
IS_EQF(base_value, 0.0f)) {
1821 return lower_value *
powf(strip_value / base_value, influence);
1831 const float lower_value,
1832 const float blended_value,
1833 const float influence,
1834 float *r_strip_value)
1837 if (
IS_EQF(influence, 0.0f)) {
1841 switch (blendmode) {
1843 *r_strip_value = (blended_value - lower_value) / influence;
1847 *r_strip_value = (lower_value - blended_value) / influence;
1851 if (
IS_EQF(lower_value, 0.0f)) {
1853 if (
IS_EQF(blended_value, 0.0f)) {
1854 *r_strip_value = 1.0f;
1871 *r_strip_value = ((blended_value - lower_value) / (influence * lower_value)) + 1.0f;
1888 *r_strip_value = (blended_value - lower_value * (1.0f - influence)) / influence;
1896 const float lower_value,
1897 const float blended_value,
1898 const float influence,
1899 float *r_strip_value)
1902 if (
IS_EQF(influence, 0.0f)) {
1909 *r_strip_value = base_value + (blended_value - lower_value) / influence;
1913 if (
IS_EQF(base_value, 0.0f)) {
1917 if (
IS_EQF(lower_value, 0.0f)) {
1919 if (
IS_EQF(blended_value, 0.0f)) {
1920 *r_strip_value = base_value;
1927 *r_strip_value = base_value *
powf(blended_value / lower_value, 1.0f / influence);
1941 const float strip_values[4],
1942 const float influence,
1943 float r_blended_value[4])
1945 float tmp_lower[4], tmp_strip_values[4];
1951 mul_qt_qtqt(r_blended_value, tmp_lower, tmp_strip_values);
1956 const float blended_values[4],
1957 const float influence,
1958 float r_strip_values[4])
1965 if (
IS_EQF(influence, 0.0f)) {
1968 float tmp_lower[4], tmp_blended[4];
1974 mul_qt_qtqt(r_strip_values, tmp_lower, tmp_blended);
2010 for (
int j = 0; j < 4; j++) {
2032 memcpy(dst->
values,
src->values,
src->length *
sizeof(
float));
2041 const float upper_influence,
2044 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2045 if (upper_necs !=
NULL && has_influence) {
2063 const float upper_influence,
2066 const bool has_influence = !
IS_EQF(upper_influence, 0.0f);
2067 if (upper_necs !=
NULL && has_influence) {
2088 const int upper_blendmode,
2089 const float upper_influence,
2094 lower_necs, upper_necs, upper_influence, r_blended_necs)) {
2099 for (
int j = 0; j <
length; j++) {
2106 upper_blendmode, lower_necs->
values[j], upper_necs->
values[j], upper_influence);
2118 const float upper_influence,
2123 lower_necs, upper_necs, upper_influence, r_blended_necs)) {
2132 for (
int j = 0; j <
length; j++) {
2139 mix_mode, base_values[j], 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)) {
2184 const int upper_blendmode,
2185 const float upper_influence,
2190 switch (upper_blendmode) {
2213 lower_necs, upper_necs, upper_blendmode, upper_influence, r_blended_necs);
2231 const int upper_blendmode,
2232 const float upper_influence,
2239 for (
int j = 0; j <
length; j++) {
2249 &r_upper_necs->
values[j]);
2264 const float upper_influence,
2275 for (
int j = 0; j <
length; j++) {
2286 &r_upper_necs->
values[j]);
2302 const float upper_influence,
2334 const int upper_blendmode,
2335 const float upper_influence,
2340 if (
IS_EQF(upper_influence, 0.0f)) {
2345 switch (upper_blendmode) {
2350 lower_necs, blended_necs, upper_influence, r_upper_necs);
2357 lower_necs, blended_necs, upper_influence, r_upper_necs);
2370 lower_necs, blended_necs, upper_blendmode, upper_influence, r_upper_necs);
2381 const int upper_blendmode,
2382 const float upper_influence,
2388 blended_necs, upper_necs, upper_influence, r_lower_necs)) {
2394 for (
int j = 0; j <
length; j++) {
2412 &r_lower_necs->
values[j]);
2421 const float upper_influence,
2427 blended_necs, upper_necs, upper_influence, r_lower_necs)) {
2435 for (
int j = 0; j <
length; j++) {
2454 &r_lower_necs->
values[j]);
2463 const float upper_influence,
2473 blended_necs, upper_necs, upper_influence, r_lower_necs)) {
2480 memcpy(r_lower_necs->
values, blended_necs->
values, 4 *
sizeof(
float));
2506 const int upper_blendmode,
2507 const float upper_influence,
2513 switch (upper_blendmode) {
2518 blended_necs, upper_necs, upper_influence, r_lower_necs);
2525 blended_necs, upper_necs, upper_influence, r_lower_necs);
2537 blended_necs, upper_necs, upper_blendmode, upper_influence, r_lower_necs);
2556 if (list2 && list2->
first) {
2575 fcm2 = list2->
first;
2597 fcm2 = list2->
first;
2670 if (strip ==
NULL) {
2675 CLOG_ERROR(&
LOG,
"NLA-Strip Eval Error: Strip '%s' has no Action", strip->
name);
2684 switch (evaluation_mode) {
2732 const bool flush_to_original)
2758 switch (evaluation_mode) {
2820 ptr,
channels, &tmp_modifiers, &tmp_nes, &snapshot1, anim_eval_context);
2829 for (
int i = 0; i < necs->
length; i++) {
2843 ptr,
channels, &tmp_modifiers, &tmp_nes, &snapshot2, anim_eval_context);
2852 for (
int i = 0; i < necs->
length; i++) {
2865 !
"This case shouldn't occur. Transitions assumed to not reference other "
2883 const bool flush_to_original)
2948 const bool flush_to_original)
2965 switch (strip->
type) {
3004 const bool flush_to_original)
3048 const bool flush_to_original)
3070 for (
int i = 0; i < nec_snapshot->
length; i++) {
3072 float value = nec_snapshot->
values[i];
3073 if (nec->is_array) {
3077 if (flush_to_original) {
3090 GSet *touched_actions)
3123 GSet *touched_actions)
3184 const bool keyframing_to_strip,
3202 if (!is_inplace_tweak) {
3211 if (keyframing_to_strip) {
3212 r_tweak_strip->
extendmode = (is_inplace_tweak &&
3221 const bool keyframing_to_strip,
3224 memset(r_action_strip, 0,
sizeof(
NlaStrip));
3233 r_action_strip->
act = action;
3240 (r_action_strip->
actstart + 1.0f) :
3241 (r_action_strip->
actend);
3261 const bool actionstrip_evaluated = r_action_strip->
act && !soloing && eval_upper;
3262 if (!actionstrip_evaluated) {
3267 if (keyframing_to_strip) {
3303 const bool any_strip_evaluated)
3309 if (any_strip_evaluated) {
3356 const bool flush_to_original)
3359 short track_index = 0;
3360 bool has_strips =
false;
3380 if (nlt == tweaked_track) {
3384 &estrips, &tweak_strip, anim_eval_context, flush_to_original);
3388 &estrips, &nlt->
strips, track_index, anim_eval_context, flush_to_original);
3405 for (nes = estrips.
first; nes; nes = nes->
next) {
3440 short track_index = 0;
3441 bool has_strips =
false;
3457 if (nlt == tweaked_track) {
3467 &lower_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3481 for (; nlt; nlt = nlt->
next, track_index++) {
3493 upper_estrips, &nlt->
strips, track_index, anim_eval_context,
false);
3516 NULL, tweak_strip, anim_eval_context,
false);
3523 NULL, action_strip, anim_eval_context,
false);
3540 for (nes = lower_estrips.
first; nes; nes = nes->
next) {
3561 const bool flush_to_original)
3579 CLOG_WARN(&
LOG,
"NLA Eval: Stopgap for active action on NLA Stack - no strips case");
3593 for (
int i = 0; i < snapshot->
size; i++) {
3613 const short upper_blendmode,
3614 const float upper_influence,
3622 if (upper_necs ==
NULL && lower_necs ==
NULL) {
3627 if (lower_necs ==
NULL) {
3633 lower_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3640 const short upper_blendmode,
3641 const float upper_influence,
3648 if (blended_necs ==
NULL) {
3655 if (lower_necs ==
NULL) {
3661 lower_necs, blended_necs, upper_blendmode, upper_influence, result_necs);
3678 const short upper_blendmode,
3679 const float upper_influence,
3686 if (blended_necs ==
NULL) {
3696 blended_necs, upper_necs, upper_blendmode, upper_influence, result_necs);
3727 ctx =
MEM_callocN(
sizeof(*ctx),
"NlaKeyframingContext");
3752 if (r_force_all !=
NULL) {
3753 *r_force_all =
false;
3757 for (
int i = 0; i <
count; i++) {
3758 if (!
ELEM(index, i, -1)) {
3780 int blend_mode =
context->strip.blendmode;
3781 float influence =
context->strip.influence;
3791 if (influence <= 0.0f) {
3816 memcpy(blended_necs->
values, values,
sizeof(
float) *
count);
3821 const bool can_force_all = r_force_all !=
NULL;
3825 *r_force_all =
true;
3841 &id_ptr, eval_data,
NULL, nes, &blended_snapshot, anim_eval_context);
3846 &
context->lower_eval_data.eval_snapshot,
3853 for (
int i = 0; i <
count; i++) {
3857 values[i] = blended_necs->
values[i];
3936 const bool flush_to_original)
3990 printf(
"Evaluate all animation - %f\n", ctime);
4002 #define EVAL_ANIM_IDS(first, aflag) \
4003 for (id = first; id; id = id->next) { \
4004 if (ID_REAL_USERS(id) > 0) { \
4005 AnimData *adt = BKE_animdata_from_id(id); \
4006 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4017 #define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \
4018 for (id = first; id; id = id->next) { \
4019 if (ID_REAL_USERS(id) > 0) { \
4020 AnimData *adt = BKE_animdata_from_id(id); \
4021 NtId_Type *ntp = (NtId_Type *)id; \
4022 if (ntp->nodetree) { \
4023 AnimData *adt2 = BKE_animdata_from_id((ID *)ntp->nodetree); \
4024 BKE_animsys_evaluate_animdata( \
4025 &ntp->nodetree->id, adt2, &anim_eval_context, ADT_RECALC_ANIM, flush_to_original); \
4027 BKE_animsys_evaluate_animdata(id, adt, &anim_eval_context, aflag, flush_to_original); \
4042 printf(
"\tNo Actions, so no animation needs to be evaluated...\n");
4163 int driver_index = 0;
4225 for (; dvar_orig && dvar; dvar_orig = dvar_orig->
next, dvar = dvar->
next) {
typedef float(TangentPoint)[2]
Blender kernel action and pose functionality.
void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers)
struct AnimData * BKE_animdata_from_id(const struct ID *id)
float evaluate_fcurve(struct FCurve *fcu, float evaltime)
float calculate_fcurve(struct PathResolvedRNA *anim_rna, struct FCurve *fcu, const struct AnimationEvalContext *anim_eval_context)
bool BKE_fcurve_is_empty(struct FCurve *fcu)
void evaluate_value_fmodifiers(FModifiersStackStorage *storage, ListBase *modifiers, struct FCurve *fcu, float *cvalue, float evaltime)
float evaluate_time_fmodifiers(FModifiersStackStorage *storage, ListBase *modifiers, struct FCurve *fcu, float cvalue, float evaltime)
uint evaluate_fmodifiers_storage_size_per_modifier(ListBase *modifiers)
#define BKE_LIB_FOREACHID_PROCESS_ID(_data, _id, _cb_flag)
General operations, lookup, etc. for materials.
void BKE_nlastrip_recalculate_bounds_sync_action(struct 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.
unsigned int BLI_ghashutil_ptrhash(const void *key)
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GSet * BLI_gset_ptr_new(const char *info)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, 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)
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void pow_qt_fl_normalized(float q[4], float f)
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() ATTR_MALLOC
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
bool BLI_uniquename(struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_len)
#define UNUSED_VARS_NDEBUG(...)
#define IN_RANGE_INCL(a, b, c)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_debug_print_eval_subdata_index(struct 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)
struct Depsgraph Depsgraph
bool DEG_is_active(const struct Depsgraph *depsgraph)
void DEG_debug_print_eval_time(struct Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address, float time)
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_NOTHING
@ NLASTRIP_TYPE_TRANSITION
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
static void nlaeval_init(NlaEvalData *nlaeval)
void BKE_animsys_free_nla_keyframing_context_cache(struct ListBase *cache)
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, ListBase *list, 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 void nlaevalchan_assert_blendOrcombine_compatible(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, NlaEvalChannelSnapshot *blended_necs)
static bool is_action_track_evaluated_without_nla(const AnimData *adt, const bool any_strip_evaluated)
static NlaEvalChannelSnapshot * nlaeval_snapshot_find_channel(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
static NlaTrack * nlatrack_find_tweaked(const AnimData *adt)
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 nlavalidmask_init(NlaValidMask *mask, int bits)
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 NlaEvalChannelSnapshot * nlaeval_snapshot_get(NlaEvalSnapshot *snapshot, int index)
static NlaEvalChannel * nlaevalchan_verify(PointerRNA *ptr, NlaEvalData *nlaeval, const char *path)
void nlasnapshot_blend_strip_get_inverted_lower_snapshot(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const struct AnimationEvalContext *anim_eval_context)
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time)
static NlaEvalStrip * nlastrips_ctime_get_strip_single(ListBase *dst_list, NlaStrip *single_strip, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static void nlaeval_fmodifiers_join_stacks(ListBase *result, ListBase *list1, ListBase *list2)
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)
void BKE_keyingsets_blend_read_expand(BlendExpander *expander, ListBase *list)
static void animsys_blend_in_fcurves(PointerRNA *ptr, ListBase *fcurves, const AnimationEvalContext *anim_eval_context, const float blend_factor)
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)
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 NlaEvalChannel * nlaevalchan_verify_key(NlaEvalData *nlaeval, const char *path, NlaEvalChannelKey *key)
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 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)
static int animsys_blend_fcurves_quaternion(PathResolvedRNA *anim_rna, FCurve *first_fcurve, const AnimationEvalContext *anim_eval_context, const float blend_factor)
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)
KS_Path * BKE_keyingset_find_path(KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int UNUSED(group_mode))
void BKE_keyingsets_blend_write(BlendWriter *writer, ListBase *list)
static void animsys_calculate_nla(PointerRNA *ptr, AnimData *adt, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
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 is_fcurve_evaluatable(FCurve *fcu)
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)
NlaKeyframingContext * BKE_animsys_get_nla_keyframing_context(struct ListBase *cache, struct PointerRNA *ptr, struct AnimData *adt, const AnimationEvalContext *anim_eval_context)
void animsys_evaluate_action(PointerRNA *ptr, bAction *act, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static int nlaevalchan_validate_index(const NlaEvalChannel *nec, int index)
static void nla_eval_domain_action(PointerRNA *ptr, NlaEvalData *channels, bAction *act, GSet *touched_actions)
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)
NlaEvalStrip * nlastrips_ctime_get_strip(ListBase *list, ListBase *strips, short index, const AnimationEvalContext *anim_eval_context, const bool flush_to_original)
static void nlaeval_snapshot_ensure_size(NlaEvalSnapshot *snapshot, int size)
void BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context, struct PointerRNA *prop_ptr, struct PropertyRNA *prop, float *values, int count, int index, const struct AnimationEvalContext *anim_eval_context, bool *r_force_all, BLI_bitmap *r_successful_remaps)
void BKE_keyingsets_blend_read_data(BlendDataReader *reader, ListBase *list)
#define ANIMSYS_FLOAT_AS_BOOL(value)
void BKE_keyingset_free(KeyingSet *ks)
#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)
void animsys_blend_in_action(PointerRNA *ptr, bAction *act, const AnimationEvalContext *anim_eval_context, const float blend_factor)
KeyingSet * BKE_keyingset_add(ListBase *list, const char idname[], const char name[], short flag, short keyingflag)
static NlaEvalChannelSnapshot * nlaeval_snapshot_ensure_channel(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
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 void nlaeval_snapshot_init(NlaEvalSnapshot *snapshot, NlaEvalData *nlaeval, NlaEvalSnapshot *base)
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 nlaevalchan_assert_nonNull(NlaEvalChannelSnapshot *necs)
static void nlaeval_free(NlaEvalData *nlaeval)
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 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 NlaEvalChannelSnapshot ** nlaeval_snapshot_ensure_slot(NlaEvalSnapshot *snapshot, NlaEvalChannel *nec)
static float nlastrip_get_influence(NlaStrip *strip, float cframe)
static bool nlaevalchan_blendOrcombine_try_copy_from_lower(NlaEvalChannelSnapshot *lower_necs, NlaEvalChannelSnapshot *upper_necs, const float upper_influence, NlaEvalChannelSnapshot *r_blended_necs)
static int animsys_quaternion_evaluate_fcurves(PathResolvedRNA quat_rna, FCurve *first_fcurve, const AnimationEvalContext *anim_eval_context, float r_quaternion[4])
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)
static void nlasnapshot_from_action(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, bAction *action, const float evaltime, NlaEvalSnapshot *r_snapshot)
void nlasnapshot_blend_strip_no_blend(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const struct AnimationEvalContext *anim_eval_context)
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)
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 char nlaevalchan_detect_mix_mode(NlaEvalChannelKey *key, int length)
static NlaEvalChannelSnapshot * nlaevalchan_snapshot_new(NlaEvalChannel *nec)
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)
void nlasnapshot_blend_strip(PointerRNA *ptr, NlaEvalData *channels, ListBase *modifiers, NlaEvalStrip *nes, NlaEvalSnapshot *snapshot, const struct AnimationEvalContext *anim_eval_context, const bool flush_to_original)
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 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)
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)
bool BKE_animsys_write_to_rna_path(PathResolvedRNA *anim_rna, const float value)
void BKE_keyingsets_free(ListBase *list)
void BKE_keyingsets_blend_read_lib(BlendLibReader *reader, ID *id, ListBase *list)
static void nlaevalchan_copy_values(NlaEvalChannelSnapshot *dst, NlaEvalChannelSnapshot *src)
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
int main(int argc, char *argv[])
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
const Depsgraph * depsgraph
SyclQueue void void * src
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_recallocN_id)(void *vmemh, size_t len, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
T length(const vec_base< T, Size > &a)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode)
@ STRIP_EVAL_BLEND_GET_INVERTED_LOWER_SNAPSHOT
struct NlaEvalChannelSnapshot NlaEvalChannelSnapshot
@ 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)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value)
int RNA_property_float_clamp(PointerRNA *ptr, PropertyRNA *prop, float *value)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
const char * RNA_property_identifier(const PropertyRNA *prop)
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
bool RNA_property_animateable(const PointerRNA *ptr, PropertyRNA *prop)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
PropertyType RNA_property_type(PropertyRNA *prop)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
bool RNA_property_boolean_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
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)
int RNA_property_enum_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
int RNA_property_flag(PropertyRNA *prop)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
int RNA_property_int_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
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)
float RNA_property_float_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
struct AnimOverride * next
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
struct NlaEvalStrip * next
NlaStrip action_track_strip
NlaEvalData lower_eval_data
NlaEvalStrip * eval_strip
struct NlaStrip * orig_strip
struct PropertyRNA * prop