Fix (unreported) foreach_id missing handling of ID pointers from RNA strips modifiers.
Also factorized fcurve modifiers foreach_id processing into their own new function, `BKE_fmodifiers_foreach_id`.
This commit is contained in:
@@ -237,6 +237,12 @@ void BKE_fcurves_copy(ListBase *dst, ListBase *src);
|
||||
* Pass new name string when it's been edited otherwise pass empty string. */
|
||||
void BKE_fmodifier_name_set(struct FModifier *fcm, const char *name);
|
||||
|
||||
/**
|
||||
* Callback used by lib_query to walk over all ID usages
|
||||
* (mimics `foreach_id` callback of #IDTypeInfo structure).
|
||||
*/
|
||||
void BKE_fmodifiers_foreach_id(struct ListBase *fmodifiers, struct LibraryForeachIDData *data);
|
||||
|
||||
/**
|
||||
* Callback used by lib_query to walk over all ID usages
|
||||
* (mimics `foreach_id` callback of #IDTypeInfo structure).
|
||||
|
||||
@@ -171,21 +171,10 @@ void BKE_fmodifier_name_set(FModifier *fcm, const char *name)
|
||||
BLI_uniquename(&list, fcm, fmi->name, '.', offsetof(FModifier, name), sizeof(fcm->name));
|
||||
}
|
||||
|
||||
void BKE_fcurve_foreach_id(FCurve *fcu, LibraryForeachIDData *data)
|
||||
void BKE_fmodifiers_foreach_id(ListBase *fmodifiers, LibraryForeachIDData *data)
|
||||
{
|
||||
ChannelDriver *driver = fcu->driver;
|
||||
|
||||
if (driver != nullptr) {
|
||||
LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) {
|
||||
/* only used targets */
|
||||
DRIVER_TARGETS_USED_LOOPER_BEGIN (dvar) {
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, dtar->id, IDWALK_CB_NOP);
|
||||
}
|
||||
DRIVER_TARGETS_LOOPER_END;
|
||||
}
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (FModifier *, fcm, &fcu->modifiers) {
|
||||
LISTBASE_FOREACH (FModifier *, fcm, fmodifiers) {
|
||||
/* library data for specific F-Modifier types */
|
||||
switch (fcm->type) {
|
||||
case FMODIFIER_TYPE_PYTHON: {
|
||||
FMod_Python *fcm_py = (FMod_Python *)fcm->data;
|
||||
@@ -205,6 +194,23 @@ void BKE_fcurve_foreach_id(FCurve *fcu, LibraryForeachIDData *data)
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_fcurve_foreach_id(FCurve *fcu, LibraryForeachIDData *data)
|
||||
{
|
||||
ChannelDriver *driver = fcu->driver;
|
||||
|
||||
if (driver != nullptr) {
|
||||
LISTBASE_FOREACH (DriverVar *, dvar, &driver->variables) {
|
||||
/* only used targets */
|
||||
DRIVER_TARGETS_USED_LOOPER_BEGIN (dvar) {
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, dtar->id, IDWALK_CB_NOP);
|
||||
}
|
||||
DRIVER_TARGETS_LOOPER_END;
|
||||
}
|
||||
}
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fmodifiers_foreach_id(&fcu->modifiers, data));
|
||||
}
|
||||
|
||||
/* ----------------- Finding F-Curves -------------------------- */
|
||||
|
||||
FCurve *id_data_find_fcurve(
|
||||
|
||||
@@ -574,6 +574,9 @@ void BKE_nla_strip_foreach_id(NlaStrip *strip, LibraryForeachIDData *data)
|
||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcu, data));
|
||||
}
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data,
|
||||
BKE_fmodifiers_foreach_id(&strip->modifiers, data));
|
||||
|
||||
LISTBASE_FOREACH (NlaStrip *, substrip, &strip->strips) {
|
||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_nla_strip_foreach_id(substrip, data));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user