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:
Bastien Montagne
2023-08-11 15:42:06 +02:00
parent cad95478ce
commit 4facf670a8
3 changed files with 29 additions and 14 deletions
+6
View File
@@ -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).
+20 -14
View File
@@ -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(
+3
View File
@@ -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));
}