diff options
author | Germano <germano.costa@ig.com.br> | 2017-12-05 16:19:47 +0300 |
---|---|---|
committer | Germano <germano.costa@ig.com.br> | 2017-12-05 16:19:47 +0300 |
commit | 6734bb1faf3a4c5c2446ecc4d2261f0d2ea9a39b (patch) | |
tree | 6cc83f565c6cff4e27ee4d3a46a0d57ecbe083e9 /source/blender/blenkernel | |
parent | deaeee8e4d92cfd43e641db6a86273e70a4dae7d (diff) | |
parent | 70c2d8a1a2b8b1e8c1f60f30451dbad88fba7188 (diff) |
Merge branch 'master' into blender2.8
# Conflicts:
# source/blender/editors/mesh/editmesh_select.c
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_animsys.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 77 |
2 files changed, 78 insertions, 7 deletions
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 622767baa10..cd64cdce2b8 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -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 */ 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 */ -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 diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 5b7947df9dd..07de2ad6342 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -800,8 +800,7 @@ static void nlastrips_path_rename_fix(ID *owner_id, const char *prefix, const ch } } -/* ----------------------- */ - +/* Rename Sub-ID Entities in RNA Paths ----------------------- */ /* Fix up the given RNA-Path * @@ -947,8 +946,7 @@ void BKE_animdata_fix_paths_rename(ID *owner_id, AnimData *adt, ID *ref_id, cons MEM_freeN(newN); } -/* *************************** */ -/* remove of individual paths */ +/* Remove FCurves with Prefix -------------------------------------- */ /* Check RNA-Paths for a list of F-Curves */ static void fcurves_path_remove_fix(const char *prefix, ListBase *curves) @@ -976,7 +974,6 @@ static void nlastrips_path_remove_fix(const char *prefix, ListBase *strips) /* recursively check strips, fixing only actions... */ for (strip = strips->first; strip; strip = strip->next) { - /* fix strip's action */ if (strip->act) fcurves_path_remove_fix(prefix, &strip->act->curves); @@ -999,7 +996,6 @@ void BKE_animdata_fix_paths_remove(ID *id, const char *prefix) /* check if there's any AnimData to start with */ if (adt) { - /* free fcurves */ if (adt->action) fcurves_path_remove_fix(prefix, &adt->action->curves); @@ -1017,6 +1013,75 @@ 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, void *wrapper_data) +{ + AllFCurvesCbWrapper *wrapper = wrapper_data; + 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 -------------------------------------------- */ /* apply the given callback function on all data in main database */ |