Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Perform safe copies in AnimatedValuesBackup::get_cache_copy() #85302

Merged
merged 1 commit into from Nov 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 5 additions & 10 deletions scene/animation/animation_mixer.cpp
Expand Up @@ -2166,38 +2166,33 @@ AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer:
switch (p_cache->type) {
case Animation::TYPE_VALUE: {
AnimationMixer::TrackCacheValue *src = static_cast<AnimationMixer::TrackCacheValue *>(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;
}

case Animation::TYPE_POSITION_3D:
case Animation::TYPE_ROTATION_3D:
case Animation::TYPE_SCALE_3D: {
AnimationMixer::TrackCacheTransform *src = static_cast<AnimationMixer::TrackCacheTransform *>(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<AnimationMixer::TrackCacheBlendShape *>(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<AnimationMixer::TrackCacheBezier *>(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<AnimationMixer::TrackCacheAudio *>(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;
}

Expand Down
58 changes: 58 additions & 0 deletions scene/animation/animation_mixer.h
Expand Up @@ -142,6 +142,15 @@ class AnimationMixer : public Node {
ObjectID object_id;
real_t total_weight = 0.0;

TrackCache() = default;
TrackCache(const TrackCache &p_other) :
RandomShaper marked this conversation as resolved.
Show resolved Hide resolved
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() {}
};

Expand All @@ -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;
}
Expand All @@ -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() {}
};
Expand All @@ -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.
Expand All @@ -206,6 +251,13 @@ class AnimationMixer : public Node {
real_t init_value = 0.0;
real_t value = 0.0;
Vector<StringName> 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;
}
Expand Down Expand Up @@ -235,6 +287,12 @@ class AnimationMixer : public Node {
Ref<AudioStreamPlaybackPolyphonic> audio_stream_playback;
HashMap<ObjectID, PlayingAudioTrackInfo> 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;
}
Expand Down