diff --git a/scene/animation/animation_mixer.cpp b/scene/animation/animation_mixer.cpp index e23fc56a23b1..522fc2db327e 100644 --- a/scene/animation/animation_mixer.cpp +++ b/scene/animation/animation_mixer.cpp @@ -2138,3 +2138,73 @@ AnimationMixer::AnimationMixer() { AnimationMixer::~AnimationMixer() { } + +void AnimatedValuesBackup::set_data(const HashMap p_data) { + clear_data(); + + for (const KeyValue &E : p_data) { + data.insert(E.key, get_cache_copy(E.value)); + } +} + +HashMap AnimatedValuesBackup::get_data() const { + HashMap ret; + for (const KeyValue &E : data) { + ret.insert(E.key, get_cache_copy(E.value)); + } + return ret; +} + +void AnimatedValuesBackup::clear_data() { + for (KeyValue &K : data) { + memdelete(K.value); + } + data.clear(); +} + +AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer::TrackCache *p_cache) const { + switch (p_cache->type) { + case Animation::TYPE_VALUE: { + AnimationMixer::TrackCacheValue *src = static_cast(p_cache); + AnimationMixer::TrackCacheValue *tc = memnew(AnimationMixer::TrackCacheValue); + memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheValue)); + return tc; + } + + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + AnimationMixer::TrackCacheTransform *src = static_cast(p_cache); + AnimationMixer::TrackCacheTransform *tc = memnew(AnimationMixer::TrackCacheTransform); + memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheTransform)); + return tc; + } + + case Animation::TYPE_BLEND_SHAPE: { + AnimationMixer::TrackCacheBlendShape *src = static_cast(p_cache); + AnimationMixer::TrackCacheBlendShape *tc = memnew(AnimationMixer::TrackCacheBlendShape); + memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheBlendShape)); + return tc; + } + + case Animation::TYPE_BEZIER: { + AnimationMixer::TrackCacheBezier *src = static_cast(p_cache); + AnimationMixer::TrackCacheBezier *tc = memnew(AnimationMixer::TrackCacheBezier); + memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheBezier)); + return tc; + } + + case Animation::TYPE_AUDIO: { + AnimationMixer::TrackCacheAudio *src = static_cast(p_cache); + AnimationMixer::TrackCacheAudio *tc = memnew(AnimationMixer::TrackCacheAudio); + memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheAudio)); + return tc; + } + + case Animation::TYPE_METHOD: + case Animation::TYPE_ANIMATION: { + // Nothing to do here. + } break; + } + return nullptr; +} diff --git a/scene/animation/animation_mixer.h b/scene/animation/animation_mixer.h index 247462b8adb1..9dc48e7b1cb4 100644 --- a/scene/animation/animation_mixer.h +++ b/scene/animation/animation_mixer.h @@ -388,14 +388,13 @@ class AnimatedValuesBackup : public RefCounted { HashMap data; public: - void set_data(const HashMap p_data) { data = p_data; }; - HashMap get_data() const { return data; }; + void set_data(const HashMap p_data); + HashMap get_data() const; + void clear_data(); - ~AnimatedValuesBackup() { - for (KeyValue &K : data) { - memdelete(K.value); - } - } + AnimationMixer::TrackCache *get_cache_copy(AnimationMixer::TrackCache *p_cache) const; + + ~AnimatedValuesBackup() { clear_data(); } }; VARIANT_ENUM_CAST(AnimationMixer::AnimationCallbackModeProcess);