From d52a4fa0c607cc1ce208927e8299793efbc34e19 Mon Sep 17 00:00:00 2001 From: Wayde Moss Date: Sun, 29 Nov 2020 02:50:53 -0500 Subject: - add proper support for duplicating nla strips with preblend transforms --- source/blender/blenkernel/BKE_nla.h | 9 +++---- source/blender/blenkernel/intern/nla.c | 42 +++++++++++++++++++++++++------- source/blender/makesrna/intern/rna_nla.c | 9 +++++-- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 550185970e9..ba3e3d73701 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -59,6 +59,7 @@ struct NlaTrack *BKE_nlatrack_copy(struct Main *bmain, const bool use_same_actions, const int flag); void BKE_nla_tracks_copy(struct Main *bmain, ListBase *dst, ListBase *src, const int flag); +struct NlaBlendTransform *BKE_nlastrip_blend_transform_copy(struct NlaBlendTransform *strip); struct NlaTrack *BKE_nlatrack_add(struct AnimData *adt, struct NlaTrack *prev, @@ -68,14 +69,12 @@ struct NlaStrip *BKE_nlastack_add_strip(struct AnimData *adt, struct bAction *act, const bool is_liboverride); struct NlaBlendTransform *BKE_nlastrip_new_blend_transform(struct NlaStrip *strip); -void BKE_nlastrip_free_blend_transform(struct NlaStrip *strip, - struct NlaBlendTransform *blend); +void BKE_nlastrip_free_blend_transform(struct NlaStrip *strip, struct NlaBlendTransform *blend); void BKE_nlastrip_free_blend_transform_at(struct NlaStrip *strip, int blend_index); -struct NlaBlendTransform_BoneTarget *BKE_blend_transform_new_bone( - struct NlaBlendTransform *blend); +struct NlaBlendTransform_BoneTarget *BKE_blend_transform_new_bone(struct NlaBlendTransform *blend); void BKE_blend_transform_free_bone(struct NlaBlendTransform *blend, - struct NlaBlendTransform_BoneTarget *bone_name); + struct NlaBlendTransform_BoneTarget *bone_name); void BKE_blend_transform_free_bone_at(struct NlaBlendTransform *blend, int bone_name_index); struct NlaStrip *BKE_nla_add_soundstrip(struct Main *bmain, struct Scene *scene, diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 8dd9236aa8e..0da23940958 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -34,6 +34,8 @@ #include "BLI_ghash.h" #include "BLI_listbase.h" +#include "BLI_math_rotation.h" +#include "BLI_math_vector.h" #include "BLI_string.h" #include "BLI_string_utils.h" #include "BLI_utildefines.h" @@ -211,10 +213,32 @@ NlaStrip *BKE_nlastrip_copy(Main *bmain, BLI_addtail(&strip_d->strips, cs_d); } + BLI_listbase_clear(&strip_d->blend_transforms); + LISTBASE_FOREACH (NlaBlendTransform *, blend_xform, &strip->blend_transforms) { + NlaBlendTransform *blend_xform = BKE_nlastrip_blend_transform_copy(&strip_d); + BLI_addtail(&strip_d.blend_transforms, blend_xform); + } + /* return the strip */ return strip_d; } +struct NlaBlendTransform *BKE_nlastrip_blend_transform_copy(NlaBlendTransform *blend_xform) +{ + NlaBlendTransform *duplicate_blend_xform = BKE_nlastrip_new_blend_transform(); + copy_v3_v3(duplicate_blend_xform->location, blend_xform->location); + copy_v3_v3(duplicate_blend_xform->euler, blend_xform->euler); + copy_v3_v3(duplicate_blend_xform->scale, blend_xform->scale); + + LISTBASE_FOREACH (NlaBlendTransform_BoneTarget *, bone_target, &blend_xform->bones) { + NlaBlendTransform_BoneTarget *duplicate_target = BKE_blend_transform_new_bone(); + BLI_addtail(&duplicate_blend_xform->bones, duplicate_target); + + strcpy(duplicate_target->name, bone_target->name); + } + + return duplicate_blend_xform; +} /** * Copy a single NLA Track. * \param flag: Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... @@ -398,7 +422,7 @@ NlaStrip *BKE_nlastack_add_strip(AnimData *adt, bAction *act, const bool is_libo return strip; } -NlaBlendTransform *BKE_nlastrip_new_blend_transform(NlaStrip *strip) +NlaBlendTransform *BKE_nlastrip_new_blend_transform() { NlaBlendTransform *blend = MEM_callocN(sizeof(NlaBlendTransform), __func__); blend->location[0] = 0; @@ -411,10 +435,12 @@ NlaBlendTransform *BKE_nlastrip_new_blend_transform(NlaStrip *strip) blend->scale[1] = 1; blend->scale[2] = 1; - BLI_addtail(&strip->blend_transforms, blend); - return blend; } + +NlaBlendTransform *BKE_nlastrip_copy_blend_transform(NlaStrip *strip) +{ +} void BKE_nlastrip_free_blend_transform(NlaStrip *strip, NlaBlendTransform *blend) { // todo: ensure pattern of add/removal matches others (assumptions, that remove also frees, etc) @@ -429,14 +455,12 @@ void BKE_nlastrip_free_blend_transform_at(NlaStrip *strip, int blend_index) } } -NlaBlendTransform_BoneTarget *BKE_blend_transform_new_bone(NlaBlendTransform *blend) +NlaBlendTransform_BoneTarget *BKE_blend_transform_new_bone() { - NlaBlendTransform_BoneTarget *bone_name = MEM_callocN(sizeof(NlaBlendTransform_BoneTarget), - __func__); - - BLI_addtail(&blend->bones, bone_name); + NlaBlendTransform_BoneTarget *bone_target = MEM_callocN(sizeof(NlaBlendTransform_BoneTarget), + __func__); - return bone_name; + return bone_target; } void BKE_blend_transform_free_bone(NlaBlendTransform *blend, NlaBlendTransform_BoneTarget *bone_name) diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c index fafaa00c097..3502a6e5df6 100644 --- a/source/blender/makesrna/intern/rna_nla.c +++ b/source/blender/makesrna/intern/rna_nla.c @@ -644,7 +644,10 @@ static void rna_nlastrip_blendXform_bone_name_set(PointerRNA *ptr, const char *v static NlaBlendTransform *rna_NlaStrip_blend_new(NlaStrip *strip, ReportList *reports) { - return BKE_nlastrip_new_blend_transform(strip); + NlaBlendTransform *blend_xform = BKE_nlastrip_new_blend_transform(); + BLI_addtail(&strip->blend_transforms, blend_xform); + + return blend_xform; } static void rna_NlaStrip_blend_remove(NlaStrip *strip, ReportList *reports, PointerRNA *blend) @@ -659,7 +662,9 @@ static void rna_NlaStrip_blend_remove_at(NlaStrip *strip, ReportList *reports, i static NlaBlendTransform_BoneTarget *rna_blend_bone_name_new(NlaBlendTransform *blend, ReportList *reports) { - return BKE_blend_transform_new_bone(blend); + NlaBlendTransform_BoneTarget *bone_target = BKE_blend_transform_new_bone(blend); + BLI_addtail(&blend->bones, bone_target); + return bone_target; } static void rna_blend_bone_name_remove(NlaBlendTransform *blend, -- cgit v1.2.3