Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2020-06-06 17:14:11 +0300
committerJeroen Bakker <jeroen@blender.org>2020-06-11 09:29:04 +0300
commite4ac4769f1cca1900f5dc626eb7eb312e1e93d3d (patch)
treee42ba8494e8f50222f1c8de03ce2810a2cac8054
parent864f8cbb860dc8b18971dcb9d240a5432994f0c8 (diff)
Fix T77456: Broken vertex paint undo on high-poly objects.
This is a critical fix that should also be backported to 2.83.1 Fairly stupid bug in fact, code detecting changes across undo steps was assuming that each BHEAD (a block of data in blendfiles) would not be larger than one memory chunk... Which is the case in alsmost every situation, besides some super-heavy geometries, and other similar things (images would also be affected e.g.).
-rw-r--r--source/blender/blenloader/intern/readfile.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 5511a27eba9..3c56ec966d5 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1222,6 +1222,10 @@ static int fd_read_from_memfile(FileData *filedata,
static MemFileChunk *chunk = NULL;
size_t chunkoffset, readsize, totread;
+ if (r_is_memchunck_identical != NULL) {
+ *r_is_memchunck_identical = true;
+ }
+
if (size == 0) {
return 0;
}
@@ -1272,13 +1276,13 @@ static int fd_read_from_memfile(FileData *filedata,
filedata->file_offset += readsize;
seek += readsize;
if (r_is_memchunck_identical != NULL) {
- /* `is_identical` of current chunk represent whether it changed compared to previous undo
+ /* `is_identical` of current chunk represents whether it changed compared to previous undo
* step. this is fine in redo case (filedata->undo_direction > 0), but not in undo case,
* where we need an extra flag defined when saving the next (future) step after the one we
* want to restore, as we are supposed to 'come from' that future undo step, and not the
* one before current one. */
- *r_is_memchunck_identical = filedata->undo_direction > 0 ? chunk->is_identical :
- chunk->is_identical_future;
+ *r_is_memchunck_identical &= filedata->undo_direction > 0 ? chunk->is_identical :
+ chunk->is_identical_future;
}
} while (totread < size);