From fbb931df8c5dfddb0c5204829244ea3e45aa1cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Fri, 24 Nov 2023 10:48:02 +0100 Subject: [PATCH] Perform safe copies in AnimatedValuesBackup::get_cache_copy() --- scene/animation/animation_mixer.cpp | 15 +++----- scene/animation/animation_mixer.h | 58 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/scene/animation/animation_mixer.cpp b/scene/animation/animation_mixer.cpp index 522fc2db327e..f375b2eb83c2 100644 --- a/scene/animation/animation_mixer.cpp +++ b/scene/animation/animation_mixer.cpp @@ -2166,8 +2166,7 @@ AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer: 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)); + AnimationMixer::TrackCacheValue *tc = memnew(AnimationMixer::TrackCacheValue(*src)); return tc; } @@ -2175,29 +2174,25 @@ AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer: 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)); + AnimationMixer::TrackCacheTransform *tc = memnew(AnimationMixer::TrackCacheTransform(*src)); 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)); + AnimationMixer::TrackCacheBlendShape *tc = memnew(AnimationMixer::TrackCacheBlendShape(*src)); 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)); + AnimationMixer::TrackCacheBezier *tc = memnew(AnimationMixer::TrackCacheBezier(*src)); 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)); + AnimationMixer::TrackCacheAudio *tc = memnew(AnimationMixer::TrackCacheAudio(*src)); return tc; } diff --git a/scene/animation/animation_mixer.h b/scene/animation/animation_mixer.h index 9dc48e7b1cb4..0cd204b38445 100644 --- a/scene/animation/animation_mixer.h +++ b/scene/animation/animation_mixer.h @@ -142,6 +142,15 @@ class AnimationMixer : public Node { ObjectID object_id; real_t total_weight = 0.0; + TrackCache() = default; + TrackCache(const TrackCache &p_other) : + root_motion(p_other.root_motion), + setup_pass(p_other.setup_pass), + type(p_other.type), + object(p_other.object), + object_id(p_other.object_id), + total_weight(p_other.total_weight) {} + virtual ~TrackCache() {} }; @@ -161,6 +170,24 @@ class AnimationMixer : public Node { Quaternion rot; Vector3 scale; + TrackCacheTransform(const TrackCacheTransform &p_other) : + TrackCache(p_other), +#ifndef _3D_DISABLED + node_3d(p_other.node_3d), + skeleton(p_other.skeleton), +#endif + bone_idx(p_other.bone_idx), + loc_used(p_other.loc_used), + rot_used(p_other.rot_used), + scale_used(p_other.scale_used), + init_loc(p_other.init_loc), + init_rot(p_other.init_rot), + init_scale(p_other.init_scale), + loc(p_other.loc), + rot(p_other.rot), + scale(p_other.scale) { + } + TrackCacheTransform() { type = Animation::TYPE_POSITION_3D; } @@ -178,6 +205,14 @@ class AnimationMixer : public Node { float init_value = 0; float value = 0; int shape_index = -1; + + TrackCacheBlendShape(const TrackCacheBlendShape &p_other) : + TrackCache(p_other), + mesh_3d(p_other.mesh_3d), + init_value(p_other.init_value), + value(p_other.value), + shape_index(p_other.shape_index) {} + TrackCacheBlendShape() { type = Animation::TYPE_BLEND_SHAPE; } ~TrackCacheBlendShape() {} }; @@ -189,6 +224,16 @@ class AnimationMixer : public Node { bool is_continuous = false; bool is_using_angle = false; Variant element_size; + + TrackCacheValue(const TrackCacheValue &p_other) : + TrackCache(p_other), + init_value(p_other.init_value), + value(p_other.value), + subpath(p_other.subpath), + is_continuous(p_other.is_continuous), + is_using_angle(p_other.is_using_angle), + element_size(p_other.element_size) {} + TrackCacheValue() { type = Animation::TYPE_VALUE; } ~TrackCacheValue() { // Clear ref to avoid leaking. @@ -206,6 +251,13 @@ class AnimationMixer : public Node { real_t init_value = 0.0; real_t value = 0.0; Vector subpath; + + TrackCacheBezier(const TrackCacheBezier &p_other) : + TrackCache(p_other), + init_value(p_other.init_value), + value(p_other.value), + subpath(p_other.subpath) {} + TrackCacheBezier() { type = Animation::TYPE_BEZIER; } @@ -235,6 +287,12 @@ class AnimationMixer : public Node { Ref audio_stream_playback; HashMap playing_streams; // Key is Animation resource ObjectID. + TrackCacheAudio(const TrackCacheAudio &p_other) : + TrackCache(p_other), + audio_stream(p_other.audio_stream), + audio_stream_playback(p_other.audio_stream_playback), + playing_streams(p_other.playing_streams) {} + TrackCacheAudio() { type = Animation::TYPE_AUDIO; }