summaryrefslogtreecommitdiff
path: root/scene/resources/animation.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-01-27 15:42:05 +0100
committerRémi Verschelde <rverschelde@gmail.com>2023-01-27 15:42:05 +0100
commit1bf7b84fbff4ff648ea0f56842cf287724a1c9b8 (patch)
tree20d55fb21667f642195d7510113dad67d47c0497 /scene/resources/animation.cpp
parent8a1369192ea1c3a82ac50b0b878a99d29f2c1282 (diff)
parent95244f0e7a81a340af6810dd4dbf033449045b91 (diff)
Merge pull request #62123 from holgac/bugfix-62097
Fix infinite loop in animation compress
Diffstat (limited to 'scene/resources/animation.cpp')
-rw-r--r--scene/resources/animation.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index 50f3015814..cb3c865f05 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -4691,6 +4691,7 @@ void Animation::compress(uint32_t p_page_size, uint32_t p_fps, float p_split_tol
data_tracks.resize(tracks_to_compress.size());
time_tracks.resize(tracks_to_compress.size());
+ uint32_t needed_min_page_size = base_page_size;
for (uint32_t i = 0; i < data_tracks.size(); i++) {
data_tracks[i].split_tolerance = p_split_tolerance;
if (track_get_type(tracks_to_compress[i]) == TYPE_BLEND_SHAPE) {
@@ -4698,7 +4699,12 @@ void Animation::compress(uint32_t p_page_size, uint32_t p_fps, float p_split_tol
} else {
data_tracks[i].components = 3;
}
+ needed_min_page_size += data_tracks[i].data.size() + data_tracks[i].get_temp_packet_size();
}
+ for (uint32_t i = 0; i < time_tracks.size(); i++) {
+ needed_min_page_size += time_tracks[i].packets.size() * 4; // time packet is 32 bits
+ }
+ ERR_FAIL_COND_MSG(p_page_size < needed_min_page_size, "Cannot compress with the given page size");
while (true) {
// Begin by finding the keyframe in all tracks with the time closest to the current time