From 0b3183d13cdbdcb06317fd1dd9b04ccd93a767c1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 12 Jul 2016 11:48:04 +1000 Subject: writefile: remove SDNA last-hit, optimize DNA reconstruct - Move last-hit index out of SDNA struct (allows for access by multiple threads). - Replace O(n^2) search with hash lookup in DNA reconstruction. --- source/blender/blenloader/intern/readfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 68cc060b010..27a119a4532 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1844,7 +1844,7 @@ void blo_add_library_pointer_map(ListBase *old_mainlist, FileData *fd) /* ********** END OLD POINTERS ****************** */ /* ********** READ FILE ****************** */ -static void switch_endian_structs(struct SDNA *filesdna, BHead *bhead) +static void switch_endian_structs(const struct SDNA *filesdna, BHead *bhead) { int blocksize, nblocks; char *data; -- cgit v1.2.3 From 4db1db327a0613abee950ffe12b013afdec2c111 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 12 Jul 2016 12:23:48 +1000 Subject: readfile: report SDNA decoding errors on file read This was printed to the stdout, however the error case wasn't checked or well supported. Also, errors decoding SDNA would sometimes call exit(1). --- source/blender/blenloader/intern/readfile.c | 25 ++++++++++++++++++------- source/blender/blenloader/intern/writefile.c | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 27a119a4532..eeb8a5d8dbd 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -909,7 +909,10 @@ static void decode_blender_header(FileData *fd) } } -static int read_file_dna(FileData *fd) +/** + * \return Success if the file is read correctly, else set \a r_error_message. + */ +static bool read_file_dna(FileData *fd, const char **r_error_message) { BHead *bhead; @@ -917,20 +920,25 @@ static int read_file_dna(FileData *fd) if (bhead->code == DNA1) { const bool do_endian_swap = (fd->flags & FD_FLAGS_SWITCH_ENDIAN) != 0; - fd->filesdna = DNA_sdna_from_data(&bhead[1], bhead->len, do_endian_swap, true); + fd->filesdna = DNA_sdna_from_data(&bhead[1], bhead->len, do_endian_swap, true, r_error_message); if (fd->filesdna) { fd->compflags = DNA_struct_get_compareflags(fd->filesdna, fd->memsdna); /* used to retrieve ID names from (bhead+1) */ fd->id_name_offs = DNA_elem_offset(fd->filesdna, "ID", "char", "name[]"); + + return true; + } + else { + return false; } - return 1; } else if (bhead->code == ENDB) break; } - return 0; + *r_error_message = "Missing DNA block"; + return false; } static int *read_file_thumbnail(FileData *fd) @@ -1077,7 +1085,7 @@ static FileData *filedata_new(void) * but it keeps us re-entrant, remove once we have * a lib that provides a nice lock. - zr */ - fd->memsdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false); + fd->memsdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false, NULL); fd->datamap = oldnewmap_new(); fd->globmap = oldnewmap_new(); @@ -1091,8 +1099,11 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports) decode_blender_header(fd); if (fd->flags & FD_FLAGS_FILE_OK) { - if (!read_file_dna(fd)) { - BKE_reportf(reports, RPT_ERROR, "Failed to read blend file '%s', incomplete", fd->relabase); + const char *error_message = NULL; + if (read_file_dna(fd, &error_message) == false) { + BKE_reportf(reports, RPT_ERROR, + "Failed to read blend file '%s': %s", + fd->relabase, error_message); blo_freefiledata(fd); fd = NULL; } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index bd19f2aeb74..f898eea566d 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -325,7 +325,7 @@ static WriteData *writedata_new(WriteWrap *ww) { WriteData *wd = MEM_callocN(sizeof(*wd), "writedata"); - wd->sdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false); + wd->sdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false, NULL); wd->ww = ww; -- cgit v1.2.3 From 0708b9aba8f7da87c4cf97b96c0bc9229fa9689c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 12 Jul 2016 12:53:49 +1000 Subject: writefile: reuse SDNA between writes Avoids decoding the SDNA string every undo step. --- source/blender/blenloader/intern/readfile.c | 14 ++++---------- source/blender/blenloader/intern/readfile.h | 2 +- source/blender/blenloader/intern/writefile.c | 6 ++---- 3 files changed, 7 insertions(+), 15 deletions(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index eeb8a5d8dbd..059dce2459e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1080,13 +1080,9 @@ static FileData *filedata_new(void) fd->filedes = -1; fd->gzfiledes = NULL; - - /* XXX, this doesn't need to be done all the time, - * but it keeps us re-entrant, remove once we have - * a lib that provides a nice lock. - zr - */ - fd->memsdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false, NULL); - + + fd->memsdna = DNA_sdna_current_get(); + fd->datamap = oldnewmap_new(); fd->globmap = oldnewmap_new(); fd->libmap = oldnewmap_new(); @@ -1280,9 +1276,7 @@ void blo_freefiledata(FileData *fd) // Free all BHeadN data blocks BLI_freelistN(&fd->listbase); - - if (fd->memsdna) - DNA_sdna_free(fd->memsdna); + if (fd->filesdna) DNA_sdna_free(fd->filesdna); if (fd->compflags) diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index 42728fd406f..b054cd0031d 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -74,7 +74,7 @@ typedef struct FileData { // general reading variables struct SDNA *filesdna; - struct SDNA *memsdna; + const struct SDNA *memsdna; char *compflags; /* array of eSDNA_StructCompare */ int fileversion; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index f898eea566d..88f1c4d5e4a 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -303,7 +303,7 @@ static void ww_handle_init(eWriteWrapType ww_type, WriteWrap *r_ww) typedef struct { - struct SDNA *sdna; + const struct SDNA *sdna; unsigned char *buf; MemFile *compare, *current; @@ -325,7 +325,7 @@ static WriteData *writedata_new(WriteWrap *ww) { WriteData *wd = MEM_callocN(sizeof(*wd), "writedata"); - wd->sdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false, NULL); + wd->sdna = DNA_sdna_current_get(); wd->ww = ww; @@ -357,8 +357,6 @@ static void writedata_do_write(WriteData *wd, const void *mem, int memlen) static void writedata_free(WriteData *wd) { - DNA_sdna_free(wd->sdna); - MEM_freeN(wd->buf); MEM_freeN(wd); } -- cgit v1.2.3 From 51812fb502c0a3034055df2c7b80e77dba5e91c3 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 12 Jul 2016 17:49:30 +0200 Subject: Fix 48831, Step I: Mismatch issues bewteen ID icon and preview system. - icon_id from ID and PreviewImage were not guaranteed to be in sync. - PreviewImage one was not reset on file read. - Through RNA e.g., it was possible to ensure an ID icon via its preview image, which was running code designed for custom previews/icons system, instead of generating correct 'auto ID icon'. --- source/blender/blenloader/intern/readfile.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 059dce2459e..4ef30fe0f3b 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2144,6 +2144,7 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p } prv->gputexture[i] = NULL; } + prv->icon_id = 0; } return prv; -- cgit v1.2.3 From 2aa056986152c7e17a4c85b4dafb7c16bd692ed1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 13 Jul 2016 17:45:55 +1000 Subject: Boolean Modifier: Add back BMesh option There are still issues with overlapping geometry, however some of the issues reported are are causing problems, or fail entirely with Carve too. --- source/blender/blenloader/intern/versioning_270.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index b7b6ace3c1a..ac2811aeb06 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1212,5 +1212,18 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main) } } } + + if (!DNA_struct_elem_find(fd->filesdna, "BooleanModifierData", "float", "double_threshold")) { + Object *ob; + for (ob = main->object.first; ob; ob = ob->id.next) { + ModifierData *md; + for (md = ob->modifiers.first; md; md = md->next) { + if (md->type == eModifierType_Boolean) { + BooleanModifierData *bmd = (BooleanModifierData *)md; + bmd->double_threshold = 1e-6f; + } + } + } + } } } -- cgit v1.2.3 From 018d336cbd51a9e4b75f8270e90397d35192496f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 14 Jul 2016 15:32:25 +0200 Subject: Cleanup: use BKE's ntreeFromID in readfile instead of local same function. Also, no need to set ntree->id.lib to NULL after BKE_libblock_copy_nolib(), generic datablock copy function always make copy local. --- source/blender/blenloader/intern/readfile.c | 34 +++++++---------------------- 1 file changed, 8 insertions(+), 26 deletions(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4ef30fe0f3b..79cd8a7fe6e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2756,22 +2756,6 @@ static void lib_link_nodetree(FileData *fd, Main *main) } } -/* get node tree stored locally in other IDs */ -static bNodeTree *nodetree_from_id(ID *id) -{ - if (!id) - return NULL; - switch (GS(id->name)) { - case ID_SCE: return ((Scene *)id)->nodetree; - case ID_MA: return ((Material *)id)->nodetree; - case ID_WO: return ((World *)id)->nodetree; - case ID_LA: return ((Lamp *)id)->nodetree; - case ID_TE: return ((Tex *)id)->nodetree; - case ID_LS: return ((FreestyleLineStyle *)id)->nodetree; - } - return NULL; -} - /* updates group node socket identifier so that * external links to/from the group node are preserved. */ @@ -6350,11 +6334,9 @@ static void lib_link_screen(FileData *fd, Main *main) snode->id = newlibadr(fd, sc->id.lib, snode->id); snode->from = newlibadr(fd, sc->id.lib, snode->from); - ntree = nodetree_from_id(snode->id); - if (ntree) - snode->nodetree = ntree; - else { - snode->nodetree = newlibadr_us(fd, sc->id.lib, snode->nodetree); + if (snode->id) { + ntree = ntreeFromID(snode->id); + snode->nodetree = ntree ? ntree : newlibadr_us(fd, sc->id.lib, snode->nodetree); } for (path = snode->treepath.first; path; path = path->next) { @@ -6734,11 +6716,11 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc snode->id = restore_pointer_by_name(id_map, snode->id, USER_REAL); snode->from = restore_pointer_by_name(id_map, snode->from, USER_IGNORE); - ntree = nodetree_from_id(snode->id); - if (ntree) - snode->nodetree = ntree; - else - snode->nodetree = restore_pointer_by_name(id_map, (ID*)snode->nodetree, USER_REAL); + if (snode->id) { + ntree = ntreeFromID(snode->id); + snode->nodetree = ntree ? ntree : + restore_pointer_by_name(id_map, (ID *)snode->nodetree, USER_REAL); + } for (path = snode->treepath.first; path; path = path->next) { if (path == snode->treepath.first) { -- cgit v1.2.3 From bcfd8d9ab82501047f11da8c3f039142dfd9e8f8 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 14 Jul 2016 18:16:05 +0200 Subject: Correct recent own fix to id_clear_lib_data_ex(). Datablocks' nodetree are *never* in main, while shapekeys are... --- source/blender/blenloader/intern/readfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 79cd8a7fe6e..a25b56b9cf1 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2713,7 +2713,7 @@ static void lib_link_node_socket(FileData *fd, ID *UNUSED(id), bNodeSocket *sock IDP_LibLinkProperty(sock->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd); } -/* singe node tree (also used for material/scene trees), ntree is not NULL */ +/* Single node tree (also used for material/scene trees), ntree is not NULL */ static void lib_link_ntree(FileData *fd, ID *id, bNodeTree *ntree) { bNode *node; -- cgit v1.2.3 From c885cea7bbfbbb8f1815cf5bc1f3ecc532c309ad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 16 Jul 2016 17:48:57 +1000 Subject: Cleanup: spelling --- source/blender/blenloader/intern/writefile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 88f1c4d5e4a..ba783e08b39 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2268,7 +2268,7 @@ static void write_meshes(WriteData *wd, ListBase *idbase) mesh->edit_btmesh = NULL; /* now fill in polys to mfaces */ - /* XXX This breaks writing desing, by using temp allocated memory, which will likely generate + /* XXX This breaks writing design, by using temp allocated memory, which will likely generate * duplicates in stored 'old' addresses. * This is very bad, but do not see easy way to avoid this, aside from generating those data * outside of save process itself. -- cgit v1.2.3