46#include "RNA_prototypes.hh"
75 if (strip ==
nullptr) {
86 if (strip->
act !=
nullptr && do_id_user) {
105 if (nlt ==
nullptr) {
111 stripn = strip->
next;
124 if (
ELEM(
nullptr, tracks, tracks->first)) {
129 for (nlt =
static_cast<NlaTrack *
>(tracks->first); nlt; nlt = nltn) {
142 const bool use_same_action,
151 if (strip ==
nullptr) {
157 strip_d->
next = strip_d->
prev =
nullptr;
161 if (use_same_action) {
191 const bool use_same_actions,
198 if (nlt ==
nullptr) {
204 nlt_d->
next = nlt_d->
prev =
nullptr;
223 if (
ELEM(
nullptr, dst, src)) {
248 "Expecting the same number of source and destination strips");
252 if (strip_dest ==
nullptr) {
258 if (strip_source == active_strip) {
265 "Expecting topology of source and destination strips to be equal");
266 if (src_is_meta && dst_is_meta) {
268 active_strip, &strip_source->
strips, &strip_dest->
strips);
269 if (found_in_meta !=
nullptr) {
270 return found_in_meta;
274 strip_dest = strip_dest->
next;
309 if (track_source == adt_source->
act_track) {
318 track_dest = track_dest->
next;
323 const bool source_has_actstrip = adt_source->
actstrip !=
nullptr;
324 const bool dest_has_actstrip = adt_dest->
actstrip !=
nullptr;
326 "Active strip did not copy correctly");
362 if (is_liboverride) {
382 sizeof(new_track->
name));
388 const bool is_liboverride)
395 if (prev ==
nullptr) {
407 first_local = first_local->
next)
410 prev = first_local !=
nullptr ? first_local->
prev : prev;
423 sizeof(new_track->
name));
464 if (*r_actend <= *actstart) {
465 *r_actend = *actstart + 1.0f;
476 if (act ==
nullptr) {
491 strip->
flag &= ~NLASTRIP_FLAG_SYNC_LENGTH;
495 Action &action = act->wrap();
502 nla::assign_action(*strip, action, animated_id);
507 strip->
actend = frame_range[1];
522 const bool is_liboverride)
529 if (
ELEM(
nullptr, adt, act)) {
535 if (strip ==
nullptr) {
567 if (speaker->
sound) {
656 return strip->
end - scale * (cframe - strip->
actstart);
659 return (strip->
end + (strip->
actstart * scale - cframe)) / scale;
672 return strip->
actend -
fmodf(cframe - strip->
start, actlength * scale) / scale;
708 return strip->
end - (length * cframe);
715 return (length * cframe) + strip->
start;
723 switch (strip->
type) {
786 if ((strips ==
nullptr) ||
IS_EQF(start, end)) {
790 puts(
"BKE_nlastrips_has_space() error... start and end arguments swapped");
791 std::swap(start, end);
799 if (strip->start >= end) {
806 if ((strip->end > start) || (strip->end > end)) {
821 if (
ELEM(
nullptr, strips, strips->
first)) {
828 for (strip =
static_cast<NlaStrip *
>(strips->
first); strip; strip = stripn) {
831 stripn = strip->
next;
840 if (sstrip->start <= strip->
start) {
860 bool not_added =
true;
868 if (ns->start >= strip->
start) {
882 if (
ELEM(
nullptr, strips, strip)) {
902 if (
ELEM(
nullptr, strips, strips->
first)) {
907 for (strip =
static_cast<NlaStrip *
>(strips->
first); strip; strip = stripn) {
908 stripn = strip->
next;
912 if (mstrip ==
nullptr) {
954 if (
ELEM(
nullptr, strips, strip)) {
976 if (
ELEM(
nullptr, strips, strips->
first)) {
981 for (strip =
static_cast<NlaStrip *
>(strips->
first); strip; strip = stripn) {
982 stripn = strip->
next;
999 if (
ELEM(
nullptr, mstrip, strip)) {
1025 if (strip->
end > mstrip->
end) {
1032 mstrip->
end = strip->
end;
1046 float oStart, oEnd, offset;
1048 short scaleChanged = 0;
1067 offset = mstrip->
start - oStart;
1070 oLen = oEnd - oStart;
1071 nLen = mstrip->
end - mstrip->
start;
1072 scaleChanged = !
IS_EQF(oLen, nLen);
1089 p1 = (strip->start - oStart) / oLen;
1090 p2 = (strip->end - oStart) / oLen;
1104 strip->start = (p1 * nLen) + mstrip->
start;
1105 strip->end = (p2 * nLen) + mstrip->
start;
1108 const double action_len = strip->actend - strip->actstart;
1109 const double repeated_len = action_len * strip->repeat;
1110 const double strip_len = strip->end - strip->start;
1111 strip->scale = strip_len / repeated_len;
1115 strip->start += offset;
1116 strip->end += offset;
1141 if (
ELEM(
nullptr, tracks, tracks->first)) {
1159 if (adt ==
nullptr) {
1171 printf(
"%s: Active strip (%p, %s) not in NLA track found (%p, %s)\n",
1195 nt->
flag &= ~NLATRACK_SOLO;
1209 adt->
flag &= ~ADT_NLA_SOLO_TRACK;
1213 adt->
flag &= ~ADT_NLA_SOLO_TRACK;
1220 if (
ELEM(
nullptr, tracks, tracks->first)) {
1226 nlt->flag &= ~NLATRACK_ACTIVE;
1247 puts(
"BKE_nlatrack_has_space() error... start and end arguments swapped");
1248 std::swap(start, end);
1287 if (
ELEM(
nullptr, nlt, strip)) {
1316 bounds[0] = bounds[1] = 0.0f;
1329 bounds[0] = strip->
start;
1333 bounds[1] = strip->
end;
1359 if (inner_active !=
nullptr) {
1360 return inner_active;
1377 limit_prev = strip->
prev->
end;
1404 while (
next !=
nullptr) {
1418 while (prev !=
nullptr) {
1431 if (nlt ==
nullptr) {
1453 if (adt ==
nullptr) {
1461 nls->flag &= ~NLASTRIP_FLAG_ACTIVE;
1473 if (
STREQ(strip->name, name)) {
1482 if (inner_strip !=
nullptr) {
1497 const float stripLen = (strip) ? strip->
end - strip->
start : 0.0f;
1498 const float boundsLen =
fabsf(max -
min);
1501 if ((strip ==
nullptr) ||
IS_EQF(stripLen, 0.0f) ||
IS_EQF(boundsLen, 0.0f)) {
1509 if ((stripLen < boundsLen) &&
1514 if ((stripLen > boundsLen) &&
1526 if (timeline_frame < strip->start) {
1527 return strip->
start - timeline_frame;
1529 if (strip->
end < timeline_frame) {
1530 return timeline_frame - strip->
end;
1542 float offset = 0.0f;
1553 else if (strip->
end < nls->
end) {
1566 for (; nls; nls = nls->
next) {
1567 nls->
start += offset;
1572 else if (strip->
end > nls->
start) {
1579 for (; nls; nls = nls->
next) {
1580 nls->
start += offset;
1590 float offset = 0.0f;
1614 for (; nls; nls = nls->
prev) {
1615 nls->
start -= offset;
1620 else if (strip->
start < nls->
end) {
1627 for (; nls; nls = nls->
prev) {
1628 nls->
start -= offset;
1637 float prev_actstart;
1647 strip->
actend = frame_range[1];
1674 if (
IS_EQF(mapping, 0.0f) == 0) {
1675 strip->
end = (actlen * mapping) + strip->
start;
1690 const double strip_len = strip->
end - strip->
start;
1691 double blend_in = strip->
blendin;
1692 double blend_out = strip->
blendout;
1694 double blend_in_max = strip_len - blend_out;
1699 CLAMP(blend_in, 0, blend_in_max);
1700 CLAMP(blend_out, 0, strip_len - blend_in);
1717 if (strip->fcurves.first) {
1729 if (
ELEM(
nullptr, tracks, tracks->first)) {
1749 if (strip ==
nullptr) {
1759 if (fcu ==
nullptr) {
1791 if (fcu ==
nullptr) {
1811 if (
ELEM(
nullptr,
ptr, prop)) {
1816 if (
ptr->
type == &RNA_NlaStrip) {
1820 static bool needs_init =
true;
1831 if (
ELEM(prop, prop_influence, prop_time)) {
1852 if (
ELEM(
nullptr, adt, strip)) {
1857 if (strip->
name[0] == 0) {
1858 switch (strip->
type) {
1883 if (tstrip == strip) {
1902 sizeof(strip->
name));
1927 if ((nls->start <= strip->
start) && (nls->end >= strip->
end)) {
1934 if (nls->end < strip->
start) {
1937 if (nls->start > strip->
end) {
1944 if ((nls->next ==
nullptr) ||
IS_EQF(nls->next->start, nls->end) == 0) {
1945 if ((nls->end > strip->
start) && (nls->end < strip->
end)) {
1949 if ((nls->prev ==
nullptr) ||
IS_EQF(nls->prev->end, nls->start) == 0) {
1950 if ((nls->start < strip->
end) && (nls->start > strip->
start)) {
1960 float *ps =
nullptr, *pe =
nullptr;
1961 float *ns =
nullptr, *ne =
nullptr;
1964 if (
ELEM(
nullptr, nls, nlt)) {
1967 if ((nlt->
prev ==
nullptr) && (nlt->
next ==
nullptr)) {
1989 if (((ps && ns) && (*ps > *ns)) || (ps)) {
2002 if (((pe && ne) && (*pe > *ne)) || (pe)) {
2031 if (strip->
start >= strip->
end || strip->
prev ==
nullptr || strip->
next ==
nullptr) {
2052 "While moving NLA strips, a transition strip could no longer be applied to the new "
2053 "positions and was removed.\n");
2067#define STASH_TRACK_NAME DATA_("[Action Stash]")
2074 if (strip->act == act) {
2104 prev_track = prev_track->
prev)
2117 if (prev_track ==
nullptr) {
2181 if (strip ==
nullptr) {
2189 "Expecting un-assigning an action to always work when pushing down an NLA strip");
2218 NlaTrack **r_track_of_active_strip,
2245 if (activeTrack ==
nullptr) {
2258 if ((activeTrack) && (activeStrip ==
nullptr)) {
2263 activeStrip = strip;
2269 *r_track_of_active_strip = activeTrack;
2270 *r_active_strip = activeStrip;
2292 if (
ELEM(
nullptr, activeTrack, activeStrip, activeStrip->
act)) {
2294 printf(
"NLA tweak-mode enter - neither active requirement found\n");
2295 printf(
"\tactiveTrack = %p, activeStrip = %p\n", (
void *)activeTrack, (
void *)activeStrip);
2305 if (strip->act == activeStrip->
act) {
2309 strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER;
2316 activeStrip->
flag &= ~NLASTRIP_FLAG_TWEAKUSER;
2324 for (
NlaTrack *nlt = activeTrack->
next; nlt; nlt = nlt->next) {
2346 if (activeStrip->
act) {
2351 animrig::ActionSlotAssignmentResult::OK)
2353 printf(
"NLA tweak-mode enter - could not assign slot %s\n",
2354 strip_slot ? strip_slot->
name :
"-unassigned-");
2379 if (!active_strip || !active_strip->
act) {
2449 "When exiting tweak mode, unassigning the tweaked Action should work");
2462 "when a slot is assigned, the action should layered");
2473 nlt->flag &= ~NLATRACK_DISABLED;
2476 strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER;
2479 adt->
flag &= ~ADT_NLA_EDIT_ON;
2487 printf(
"\033[38;5;214mNLA state");
2494 printf(
" - ADT is nil!\n");
2508 printf(
" SKEYS_COLLAPSED");
2510 printf(
" EVAL_UPPER_TRACKS");
2517 printf(
" - No tracks\n");
2520 printf(
" - Active track: %s (#%d)\n",
2526 printf(
" - Track #%d %s: ", nlt->index, nlt->name);
2540 printf(
"TEMPORARILY_ADDED ");
2542 printf(
"OVERRIDELIBRARY_LOCAL ");
2546 printf(
" - Strip %s: ", strip->name);
2554 printf(
"USR_INFLUENCE ");
2558 printf(
"USR_TIME_CYCLIC ");
2568 printf(
"INVALID_LOCATION ");
2627 nlt->flag &= ~NLATRACK_OVERRIDELIBRARY_LOCAL;
2652 if (is_tweak_mode) {
2659 if (!is_tweak_mode) {
Blender kernel action and pose functionality.
AnimData * BKE_animdata_from_id(const ID *id)
void BKE_fcurve_foreach_id(FCurve *fcu, LibraryForeachIDData *data)
void copy_fmodifiers(ListBase *dst, const ListBase *src)
void BKE_fcurve_blend_write_listbase(BlendWriter *writer, ListBase *fcurves)
FCurve * BKE_fcurve_find(ListBase *list, const char rna_path[], int array_index)
void BKE_fmodifiers_blend_write(BlendWriter *writer, ListBase *fmodifiers)
void BKE_fcurve_blend_read_data_listbase(BlendDataReader *reader, ListBase *fcurves)
FCurve * BKE_fcurve_create(void)
void BKE_fmodifiers_blend_read_data(BlendDataReader *reader, ListBase *fmodifiers, FCurve *curve)
void BKE_fcurves_free(ListBase *list)
void BKE_fcurves_copy(ListBase *dst, ListBase *src)
void free_fmodifiers(ListBase *modifiers)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data_, func_call_)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
#define NLASTRIP_MIN_LEN_THRESH
bool BKE_sound_info_get(struct Main *main, struct bSound *sound, SoundInfo *sound_info)
#define BLI_assert_msg(a, msg)
bool BLI_ghash_haskey(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t void BLI_uniquename_cb(UniquenameCheckCallback unique_check, void *arg, const char *defname, char delim, char *name, size_t name_maxncpy) ATTR_NONNULL(1
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 IN_RANGE(a, b, c)
#define UNUSED_VARS_NDEBUG(...)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_write_struct_list(writer, struct_name, list_ptr)
#define CLOG_ERROR(clg_ref,...)
#define ID_IS_LINKED(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ NLASTRIP_FLAG_USR_INFLUENCE
@ NLASTRIP_FLAG_INVALID_LOCATION
@ NLASTRIP_FLAG_TEMP_META
@ NLASTRIP_FLAG_AUTO_BLENDS
@ NLASTRIP_FLAG_USR_TIME_CYCLIC
@ NLASTRIP_FLAG_NO_TIME_MAP
@ NLASTRIP_FLAG_TWEAKUSER
@ NLASTRIP_FLAG_EDIT_TOUCHED
@ NLASTRIP_FLAG_SYNC_LENGTH
@ ADT_NLA_SKEYS_COLLAPSED
@ ADT_NLA_EVAL_UPPER_TRACKS
@ NLASTRIP_EXTEND_NOTHING
@ NLASTRIP_TYPE_TRANSITION
@ NLATRACK_TEMPORARILY_ADDED
@ NLATRACK_OVERRIDELIBRARY_LOCAL
Read Guarded memory(de)allocation.
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode)
float BKE_nla_tweakedit_remap(AnimData *adt, float cframe, short mode)
bool BKE_nlatrack_get_bounds(NlaTrack *nlt, float bounds[2])
static void blend_write_nla_strips(BlendWriter *writer, ListBase *strips)
static void nla_tweakmode_exit_nofollowptr(AnimData *adt)
void BKE_nlameta_flush_transforms(NlaStrip *mstrip)
static bool is_nla_in_tweakmode(AnimData *adt)
float BKE_nlastrip_distance_to_frame(const NlaStrip *strip, const float timeline_frame)
bool BKE_nlatrack_has_animated_strips(NlaTrack *nlt)
void BKE_nlastrip_remove_and_free(ListBase *strips, NlaStrip *strip, const bool do_id_user)
void BKE_nlastrips_clear_metastrip(ListBase *strips, NlaStrip *strip)
static bool nlastrip_validate_transition_start_end(ListBase *strips, NlaStrip *strip)
static void nla_tweakmode_find_active(const ListBase *nla_tracks, NlaTrack **r_track_of_active_strip, NlaStrip **r_active_strip)
void BKE_nla_debug_print_flags(AnimData *adt, ID *owner_id)
static void update_active_track(AnimData *adt_dest, const AnimData *adt_source)
void BKE_nla_tracks_copy(Main *bmain, ListBase *dst, const ListBase *src, const int flag)
void BKE_nla_clip_length_ensure_nonzero(const float *actstart, float *r_actend)
void BKE_nlastrip_recalculate_bounds_sync_action(NlaStrip *strip)
static float nlastrip_get_frame_actionclip(NlaStrip *strip, float cframe, short mode)
void BKE_nlastrips_sort_strips(ListBase *strips)
void BKE_nlastrips_clear_metas(ListBase *strips, bool only_sel, bool only_temp)
float BKE_nlastrip_compute_frame_to_next_strip(NlaStrip *strip)
static void nlastrip_get_endpoint_overlaps(NlaStrip *strip, NlaTrack *track, float **start, float **end)
void BKE_nla_tracks_copy_from_adt(Main *bmain, AnimData *adt_dest, const AnimData *adt_source, const int flag)
static NlaStrip * nlastrip_find_active(ListBase *strips)
void BKE_nla_validate_state(AnimData *adt)
void BKE_nla_tweakmode_exit_nofollowptr(AnimData *adt)
NlaStrip * BKE_nlastrip_prev_in_track(NlaStrip *strip, bool skip_transitions)
NlaTrack * BKE_nlatrack_new()
void BKE_nlatrack_solo_toggle(AnimData *adt, NlaTrack *nlt)
bool BKE_nla_tweakmode_enter(const OwnedAnimData owned_adt)
static NlaStrip * find_active_strip_from_listbase(const NlaStrip *active_strip, const ListBase *strips_source, const ListBase *strips_dest)
void BKE_nlatrack_free(NlaTrack *nlt, const bool do_id_user)
NlaStrip * BKE_nlastrip_next_in_track(NlaStrip *strip, bool skip_transitions)
static float nlastrip_get_frame_transition(NlaStrip *strip, float cframe, short mode)
NlaStrip * BKE_nlastrip_new(bAction *act, ID &animated_id)
NlaStrip * BKE_nlastrip_find_by_name(NlaTrack *nlt, const char *name)
void BKE_nlatrack_remove_strip(NlaTrack *track, NlaStrip *strip)
void BKE_nlastrips_add_strip_unsafe(ListBase *strips, NlaStrip *strip)
static void blend_data_read_nla_strips(BlendDataReader *reader, ListBase *strips)
void BKE_nlastrip_recalculate_bounds(NlaStrip *strip)
NlaTrack * BKE_nlatrack_new_after(ListBase *nla_tracks, NlaTrack *prev, bool is_liboverride)
bool BKE_nlastrips_has_space(ListBase *strips, float start, float end)
void BKE_nla_tweakmode_exit(const OwnedAnimData owned_adt)
bool BKE_nlastrips_add_strip(ListBase *strips, NlaStrip *strip)
NlaTrack * BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride)
bool BKE_nlastrip_has_curves_for_property(const PointerRNA *ptr, const PropertyRNA *prop)
static NlaStrip * nlastrip_find_by_name(ListBase *strips, const char *name)
void BKE_nlastrip_remove(ListBase *strips, NlaStrip *strip)
void BKE_nlastrip_recalculate_blend(NlaStrip *strip)
NlaTrack * BKE_nlatrack_find_tweaked(AnimData *adt)
void BKE_nlastrip_set_active(AnimData *adt, NlaStrip *strip)
void BKE_nlatrack_insert_after(ListBase *nla_tracks, NlaTrack *prev, NlaTrack *new_track, const bool is_liboverride)
NlaTrack * BKE_nlatrack_new_head(ListBase *nla_tracks, bool is_liboverride)
static void nla_tweakmode_exit_sync_strip_lengths(AnimData *adt)
float BKE_nla_clip_length_get_nonzero(const NlaStrip *strip)
void BKE_nla_blend_write(BlendWriter *writer, ListBase *tracks)
bool BKE_nla_action_stash(const OwnedAnimData owned_adt, const bool is_liboverride)
void BKE_nla_tracks_free(ListBase *tracks, bool do_id_user)
bool BKE_nlatrack_has_space(NlaTrack *nlt, float start, float end)
void BKE_nlatrack_sort_strips(NlaTrack *nlt)
NlaStrip * BKE_nlastrip_find_active(NlaTrack *nlt)
void BKE_nla_liboverride_post_process(ID *id, AnimData *adt)
NlaStrip * BKE_nla_add_soundstrip(Main *bmain, Scene *scene, Speaker *speaker)
static void BKE_nlastrip_validate_autoblends(NlaTrack *nlt, NlaStrip *nls)
NlaStrip * BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_action, const int flag)
NlaTrack * BKE_nlatrack_find_active(ListBase *tracks)
void BKE_nlatrack_set_active(ListBase *tracks, NlaTrack *nlt_a)
static void nlastrip_fix_resize_overlaps(NlaStrip *strip)
NlaTrack * BKE_nlatrack_copy(Main *bmain, NlaTrack *nlt, const bool use_same_actions, const int flag)
void BKE_nlatrack_insert_before(ListBase *nla_tracks, NlaTrack *next, NlaTrack *new_track, bool is_liboverride)
bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt)
float BKE_nlastrip_compute_frame_from_previous_strip(NlaStrip *strip)
bool BKE_nlastrip_within_bounds(NlaStrip *strip, float min, float max)
static void update_active_strip(AnimData *adt_dest, NlaTrack *track_dest, const AnimData *adt_source, const NlaTrack *track_source)
void BKE_nla_tweakmode_clear_flags(AnimData *adt)
bool BKE_nlatrack_add_strip(NlaTrack *nlt, NlaStrip *strip, const bool is_liboverride)
void BKE_nlatrack_remove(ListBase *tracks, NlaTrack *nlt)
void BKE_nlastrip_validate_name(AnimData *adt, NlaStrip *strip)
bool BKE_nlameta_add_strip(NlaStrip *mstrip, NlaStrip *strip)
bool BKE_nlatrack_has_strips(ListBase *tracks)
void BKE_nla_action_pushdown(const OwnedAnimData owned_adt, const bool is_liboverride)
bool BKE_nlatracks_have_animated_strips(ListBase *tracks)
static bool nla_editbone_name_check(void *arg, const char *name)
void BKE_nlastrip_free(NlaStrip *strip, const bool do_id_user)
NlaStrip * BKE_nlastack_add_strip(const OwnedAnimData owned_adt, bAction *act, const bool is_liboverride)
static bool visit_strip(NlaStrip *strip, blender::FunctionRef< bool(NlaStrip *)> callback)
void BKE_nlatrack_remove_and_free(ListBase *tracks, NlaTrack *nlt, bool do_id_user)
void BKE_nlastrip_validate_fcurves(NlaStrip *strip)
bool BKE_nla_action_is_stashed(AnimData *adt, bAction *act)
NlaTrack * BKE_nlatrack_new_before(ListBase *nla_tracks, NlaTrack *next, bool is_liboverride)
void BKE_nla_blend_read_data(BlendDataReader *reader, ID *id_owner, ListBase *tracks)
void BKE_nla_strip_foreach_id(NlaStrip *strip, LibraryForeachIDData *data)
void BKE_nlastrips_make_metas(ListBase *strips, bool is_temp)
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
float2 get_frame_range() const ATTR_WARN_UNUSED_RESULT
bool is_cyclic() const ATTR_WARN_UNUSED_RESULT
bool is_action_layered() const
bool has_keyframes(slot_handle_t action_slot_handle) const ATTR_WARN_UNUSED_RESULT
Slot * slot_for_handle(slot_handle_t handle)
void users_add(ID &animated_id)
static constexpr slot_handle_t unassigned
DEGForeachIDComponentCallback callback
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float3 ceil(const float3 a)
ActionSlotAssignmentResult assign_action_slot_handle(NlaStrip &strip, slot_handle_t slot_handle, ID &animated_id)
bool generic_assign_action(ID &animated_id, bAction *action_to_assign, bAction *&action_ptr_ref, slot_handle_t &slot_handle_ref, char *slot_name)
ActionSlotAssignmentResult assign_action_and_slot(Action *action, Slot *slot_to_assign, ID &animated_id)
bool unassign_action(ID &animated_id)
bool foreach_strip(ID *id, blender::FunctionRef< bool(NlaStrip *)> callback)
bool foreach_strip_adt(const AnimData &adt, blender::FunctionRef< bool(NlaStrip *)> callback)
PropertyRNA * RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int32_t action_slot_handle