forked from bartvdbraak/blender
Added BKE_fcurves_main_cb(), a wrapper around BKE_animdata_main_cb to make it easier to apply fixes to all F-Curves in a file
This commit is contained in:
parent
41b4b8ded6
commit
6ebf244ace
@ -152,9 +152,15 @@ char *BKE_animdata_driver_path_hack(struct bContext *C, struct PointerRNA *ptr,
|
|||||||
/* Define for callback looper used in BKE_animdata_main_cb */
|
/* Define for callback looper used in BKE_animdata_main_cb */
|
||||||
typedef void (*ID_AnimData_Edit_Callback)(struct ID *id, struct AnimData *adt, void *user_data);
|
typedef void (*ID_AnimData_Edit_Callback)(struct ID *id, struct AnimData *adt, void *user_data);
|
||||||
|
|
||||||
|
/* Define for callback looper used in BKE_fcurves_main_cb */
|
||||||
|
typedef void (*ID_FCurve_Edit_Callback)(struct ID *id, struct FCurve *fcu, void *user_data);
|
||||||
|
|
||||||
|
|
||||||
/* Loop over all datablocks applying callback */
|
/* Loop over all datablocks applying callback */
|
||||||
void BKE_animdata_main_cb(struct Main *main, ID_AnimData_Edit_Callback func, void *user_data);
|
void BKE_animdata_main_cb(struct Main *bmain, ID_AnimData_Edit_Callback func, void *user_data);
|
||||||
|
|
||||||
|
/* Loop over all datablocks applying callback to all its F-Curves */
|
||||||
|
void BKE_fcurves_main_cb(struct Main *bmain, ID_FCurve_Edit_Callback func, void *user_data);
|
||||||
|
|
||||||
/* ************************************* */
|
/* ************************************* */
|
||||||
// TODO: overrides, remapping, and path-finding api's
|
// TODO: overrides, remapping, and path-finding api's
|
||||||
|
@ -1011,6 +1011,74 @@ void BKE_animdata_fix_paths_remove(ID *id, const char *prefix)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Apply Op to All FCurves in Database --------------------------- */
|
||||||
|
|
||||||
|
/* "User-Data" wrapper used by BKE_fcurves_main_cb() */
|
||||||
|
typedef struct AllFCurvesCbWrapper {
|
||||||
|
ID_FCurve_Edit_Callback func; /* Operation to apply on F-Curve */
|
||||||
|
void *user_data; /* Custom data for that operation */
|
||||||
|
} AllFCurvesCbWrapper;
|
||||||
|
|
||||||
|
/* Helper for adt_apply_all_fcurves_cb() - Apply wrapped operator to list of F-Curves */
|
||||||
|
static void fcurves_apply_cb(ID *id, ListBase *fcurves, ID_FCurve_Edit_Callback func, void *user_data)
|
||||||
|
{
|
||||||
|
FCurve *fcu;
|
||||||
|
|
||||||
|
for (fcu = fcurves->first; fcu; fcu = fcu->next) {
|
||||||
|
func(id, fcu, user_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Helper for adt_apply_all_fcurves_cb() - Recursively go through each NLA strip */
|
||||||
|
static void nlastrips_apply_all_curves_cb(ID *id, ListBase *strips, AllFCurvesCbWrapper *wrapper)
|
||||||
|
{
|
||||||
|
NlaStrip *strip;
|
||||||
|
|
||||||
|
for (strip = strips->first; strip; strip = strip->next) {
|
||||||
|
/* fix strip's action */
|
||||||
|
if (strip->act) {
|
||||||
|
fcurves_apply_cb(id, &strip->act->curves, wrapper->func, wrapper->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check sub-strips (if metas) */
|
||||||
|
nlastrips_apply_all_curves_cb(id, &strip->strips, wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Helper for BKE_fcurves_main_cb() - Dispatch wrapped operator to all F-Curves */
|
||||||
|
static void adt_apply_all_fcurves_cb(ID *id, AnimData *adt, AllFCurvesCbWrapper *wrapper)
|
||||||
|
{
|
||||||
|
NlaTrack *nlt;
|
||||||
|
|
||||||
|
if (adt->action) {
|
||||||
|
fcurves_apply_cb(id, &adt->action->curves, wrapper->func, wrapper->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adt->tmpact) {
|
||||||
|
fcurves_apply_cb(id, &adt->tmpact->curves, wrapper->func, wrapper->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free drivers - stored as a list of F-Curves */
|
||||||
|
fcurves_apply_cb(id, &adt->drivers, wrapper->func, wrapper->user_data);
|
||||||
|
|
||||||
|
/* NLA Data - Animation Data for Strips */
|
||||||
|
for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) {
|
||||||
|
nlastrips_apply_all_curves_cb(id, &nlt->strips, wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* apply the given callback function on all F-Curves attached to data in main database */
|
||||||
|
void BKE_fcurves_main_cb(Main *mainptr, ID_FCurve_Edit_Callback func, void *user_data)
|
||||||
|
{
|
||||||
|
/* Wrap F-Curve operation stuff to pass to the general AnimData-level func */
|
||||||
|
AllFCurvesCbWrapper wrapper = {func, user_data};
|
||||||
|
|
||||||
|
/* Use the AnimData-based function so that we don't have to reimplement all that stuff */
|
||||||
|
BKE_animdata_main_cb(mainptr, adt_apply_all_fcurves_cb, &wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Whole Database Ops -------------------------------------------- */
|
/* Whole Database Ops -------------------------------------------- */
|
||||||
|
|
||||||
/* apply the given callback function on all data in main database */
|
/* apply the given callback function on all data in main database */
|
||||||
|
Loading…
Reference in New Issue
Block a user