diff options
author | YimingWu <xp8110@outlook.com> | 2020-02-01 05:35:40 +0300 |
---|---|---|
committer | YimingWu <xp8110@outlook.com> | 2020-02-01 05:35:40 +0300 |
commit | f7770cb97bb9d19d0806f67da9377129fd4d09b0 (patch) | |
tree | 2cd22d612ffba3a509d5548332c9cc8a06a1a638 /source/blender/blenloader/intern | |
parent | b47883a990ee68e659a8a8b44729be9b8e0d002f (diff) | |
parent | dc3f073d1c5255e79763dfff3ef17f6216f1b391 (diff) |
Merge remote-tracking branch 'origin/master' into temp-lanpr-review
Diffstat (limited to 'source/blender/blenloader/intern')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 51 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 103 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_cycles.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_defaults.c | 11 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_userdef.c | 11 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 148 |
6 files changed, 210 insertions, 116 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 597cd0adabc..ebe0c27331e 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1911,11 +1911,9 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain) if (ima->cache) { oldnewmap_insert(fd->imamap, ima->cache, ima->cache, 0); } - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - for (a = 0; a < TEXTARGET_COUNT; a++) { - if (tile->gputexture[a] != NULL) { - oldnewmap_insert(fd->imamap, tile->gputexture[a], tile->gputexture[a], 0); - } + for (a = 0; a < TEXTARGET_COUNT; a++) { + if (ima->gputexture[a] != NULL) { + oldnewmap_insert(fd->imamap, ima->gputexture[a], ima->gputexture[a], 0); } } if (ima->rr) { @@ -1959,10 +1957,8 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) if (ima->cache == NULL) { ima->gpuflag = 0; ima->gpuframenr = INT_MAX; - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - for (i = 0; i < TEXTARGET_COUNT; i++) { - tile->gputexture[i] = NULL; - } + for (i = 0; i < TEXTARGET_COUNT; i++) { + ima->gputexture[i] = NULL; } ima->rr = NULL; } @@ -1970,10 +1966,8 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) slot->render = newimaadr(fd, slot->render); } - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - for (i = 0; i < TEXTARGET_COUNT; i++) { - tile->gputexture[i] = newimaadr(fd, tile->gputexture[i]); - } + for (i = 0; i < TEXTARGET_COUNT; i++) { + ima->gputexture[i] = newimaadr(fd, ima->gputexture[i]); } ima->rr = newimaadr(fd, ima->rr); } @@ -3378,6 +3372,11 @@ static void lib_link_workspaces(FileData *fd, Main *bmain) } } } + else { + /* If we're reading a layout without screen stored, it's useless and we shouldn't keep it + * around. */ + BKE_workspace_layout_remove(bmain, workspace, layout); + } } id->tag &= ~LIB_TAG_NEED_LINK; @@ -3876,7 +3875,7 @@ static void direct_link_bones(FileData *fd, Bone *bone) bone->bbone_next = newdataadr(fd, bone->bbone_next); bone->bbone_prev = newdataadr(fd, bone->bbone_prev); - bone->flag &= ~BONE_DRAW_ACTIVE; + bone->flag &= ~(BONE_DRAW_ACTIVE | BONE_DRAW_LOCKED_WEIGHT); link_list(fd, &bone->childbase); @@ -4270,18 +4269,14 @@ static void direct_link_image(FileData *fd, Image *ima) if (!ima->cache) { ima->gpuflag = 0; ima->gpuframenr = INT_MAX; - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - for (int i = 0; i < TEXTARGET_COUNT; i++) { - tile->gputexture[i] = NULL; - } + for (int i = 0; i < TEXTARGET_COUNT; i++) { + ima->gputexture[i] = NULL; } ima->rr = NULL; } else { - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - for (int i = 0; i < TEXTARGET_COUNT; i++) { - tile->gputexture[i] = newimaadr(fd, tile->gputexture[i]); - } + for (int i = 0; i < TEXTARGET_COUNT; i++) { + ima->gputexture[i] = newimaadr(fd, ima->gputexture[i]); } ima->rr = newimaadr(fd, ima->rr); } @@ -6226,8 +6221,6 @@ static void direct_link_object(FileData *fd, Object *ob) BKE_object_empty_draw_type_set(ob, ob->empty_drawtype); } - ob->derivedDeform = NULL; - ob->derivedFinal = NULL; BKE_object_runtime_reset(ob); link_list(fd, &ob->pc_ids); @@ -9343,6 +9336,9 @@ static BHead *read_libblock(FileData *fd, ID *id; ListBase *lb; const char *allocname; + + /* XXX Very weakly handled currently, see comment at the end of this function before trying to + * use it for anything new. */ bool wrong_id = false; /* In undo case, most libs and linked data should be kept as is from previous state @@ -9598,7 +9594,14 @@ static BHead *read_libblock(FileData *fd, oldnewmap_clear(fd->datamap); if (wrong_id) { + /* XXX This is probably working OK currently given the very limited scope of that flag. + * However, it is absolutely **not** handled correctly: it is freeing an ID pointer that has + * been added to the fd->libmap mapping, which in theory could lead to nice crashes... + * This should be properly solved at some point. */ BKE_id_free(main, id); + if (r_id != NULL) { + *r_id = NULL; + } } return (bhead); diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index dc8e5e9f97e..3c4b153d2ed 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -636,6 +636,29 @@ static ARegion *do_versions_add_region(int regiontype, const char *name) return ar; } +static void do_versions_area_ensure_tool_region(Main *bmain, + const short space_type, + const short region_flag) +{ + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == space_type) { + ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS); + if (!ar) { + ARegion *header = BKE_area_find_region_type(sa, RGN_TYPE_HEADER); + ar = do_versions_add_region(RGN_TYPE_TOOLS, "tools region"); + BLI_insertlinkafter(regionbase, header, ar); + ar->alignment = RGN_ALIGN_LEFT; + ar->flag = region_flag; + } + } + } + } + } +} + static void do_version_bones_split_bbone_scale(ListBase *lb) { for (Bone *bone = lb->first; bone; bone = bone->next) { @@ -1034,7 +1057,7 @@ static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMa /* Free Style */ LISTBASE_FOREACH (struct FreestyleLineStyle *, linestyle, &bmain->linestyles) { - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->thickness_modifiers) { + LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->alpha_modifiers) { switch (m->type) { case LS_MODIFIER_ALONG_STROKE: callback(((LineStyleAlphaModifier_AlongStroke *)m)->curve); @@ -1091,6 +1114,18 @@ static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMa } } +static void do_version_fcurve_hide_viewport_fix(struct ID *UNUSED(id), + struct FCurve *fcu, + void *UNUSED(user_data)) +{ + if (strcmp(fcu->rna_path, "hide")) { + return; + } + + MEM_freeN(fcu->rna_path); + fcu->rna_path = BLI_strdupn("hide_viewport", 13); +} + void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports)) { bool use_collection_compat_28 = true; @@ -1524,6 +1559,25 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports)) } } } + + /** + * Versioning code until next subversion bump goes here. + * + * \note Be sure to check when bumping the version: + * - "versioning_userdef.c", #BLO_version_defaults_userpref_blend + * - "versioning_userdef.c", #do_versions_theme + * + * \note Keep this message at the bottom of the function. + */ + { + /* Keep this block, even when empty. */ + + /* During development of Blender 2.80 the "Object.hide" property was + * removed, and reintroduced in 5e968a996a53 as "Object.hide_viewport". */ + LISTBASE_FOREACH (Object *, ob, &bmain->objects) { + BKE_fcurves_id_cb(&ob->id, do_version_fcurve_hide_viewport_fix, NULL); + } + } } /* NOTE: This version patch is intended for versions < 2.52.2, @@ -2797,6 +2851,35 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + /* Files stored pre 2.5 (possibly re-saved with newer versions) may have non-visible + * spaces without a header (visible/active ones are properly versioned). + * Multiple version patches below assume there's always a header though. So inserting this + * patch in-between older ones to add a header when needed. + * + * From here on it should be fine to assume there always is a header. + */ + if (!MAIN_VERSION_ATLEAST(bmain, 283, 1)) { + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + ARegion *ar_header = do_versions_find_region_or_null(regionbase, RGN_TYPE_HEADER); + + if (!ar_header) { + /* Headers should always be first in the region list, except if there's also a + * tool-header. These were only introduced in later versions though, so should be + * fine to always insert headers first. */ + BLI_assert(!do_versions_find_region_or_null(regionbase, RGN_TYPE_TOOL_HEADER)); + + ARegion *ar = do_versions_add_region(RGN_TYPE_HEADER, "header 2.83.1 versioning"); + ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP; + BLI_addhead(regionbase, ar); + } + } + } + } + } + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { @@ -3678,7 +3761,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; /* All spaces that use tools must be eventually added. */ ARegion *ar = NULL; - if (ELEM(sl->spacetype, SPACE_VIEW3D, SPACE_IMAGE) && + if (ELEM(sl->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_SEQ) && ((ar = do_versions_find_region_or_null(regionbase, RGN_TYPE_TOOL_HEADER)) == NULL)) { /* Add tool header. */ ar = do_versions_add_region(RGN_TYPE_TOOL_HEADER, "tool header"); @@ -4291,6 +4374,9 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) { /* Keep this block, even when empty. */ + /* Sequencer Tool region */ + do_versions_area_ensure_tool_region(bmain, SPACE_SEQ, RGN_FLAG_HIDDEN); + /* Cloth internal springs */ for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) { for (ModifierData *md = ob->modifiers.first; md; md = md->next) { @@ -4330,5 +4416,18 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } } + + /* Brush cursor alpha */ + for (Brush *br = bmain->brushes.first; br; br = br->id.next) { + br->add_col[3] = 0.9f; + br->sub_col[3] = 0.9f; + } + + /* Pose brush IK segments. */ + for (Brush *br = bmain->brushes.first; br; br = br->id.next) { + if (br->pose_ik_segments == 0) { + br->pose_ik_segments = 1; + } + } } }
\ No newline at end of file diff --git a/source/blender/blenloader/intern/versioning_cycles.c b/source/blender/blenloader/intern/versioning_cycles.c index a4ad954254a..466dd02b3b3 100644 --- a/source/blender/blenloader/intern/versioning_cycles.c +++ b/source/blender/blenloader/intern/versioning_cycles.c @@ -1219,7 +1219,7 @@ static void update_noise_and_wave_distortion(bNodeTree *ntree) bNodeSocket *sockDistortion = nodeFindSocket(node, SOCK_IN, "Distortion"); float *distortion = cycles_node_socket_float_value(sockDistortion); - if (socket_is_used(sockDistortion)) { + if (socket_is_used(sockDistortion) && sockDistortion->link != NULL) { bNode *distortionInputNode = sockDistortion->link->fromnode; bNodeSocket *distortionInputSock = sockDistortion->link->fromsock; diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index bc43d9605e2..8c7a0c4f7b2 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -207,13 +207,20 @@ static void blo_update_defaults_screen(bScreen *screen, } } - /* Show top-bar by default. */ + /* Show tool-header by default (for most cases at least, hide for others). */ + const bool hide_image_tool_header = STREQ(workspace_name, "Rendering"); for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + for (ARegion *ar = regionbase->first; ar; ar = ar->next) { if (ar->regiontype == RGN_TYPE_TOOL_HEADER) { - ar->flag &= ~(RGN_FLAG_HIDDEN | RGN_FLAG_HIDDEN_BY_USER); + if ((sl->spacetype == SPACE_IMAGE) && hide_image_tool_header) { + ar->flag |= RGN_FLAG_HIDDEN; + } + else { + ar->flag &= ~(RGN_FLAG_HIDDEN | RGN_FLAG_HIDDEN_BY_USER); + } } } } diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c index b1f70848bdc..94ee8d46675 100644 --- a/source/blender/blenloader/intern/versioning_userdef.c +++ b/source/blender/blenloader/intern/versioning_userdef.c @@ -164,6 +164,17 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) FROM_DEFAULT_V4_UCHAR(space_view3d.face_front); } + if (!USER_VERSION_ATLEAST(283, 1)) { + FROM_DEFAULT_V4_UCHAR(space_view3d.bone_locked_weight); + } + + if (!USER_VERSION_ATLEAST(283, 2)) { + FROM_DEFAULT_V4_UCHAR(space_info.info_property); + FROM_DEFAULT_V4_UCHAR(space_info.info_property_text); + FROM_DEFAULT_V4_UCHAR(space_info.info_operator); + FROM_DEFAULT_V4_UCHAR(space_info.info_operator_text); + } + /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 2ad9ec9cae3..74258aeaa7a 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2067,9 +2067,7 @@ static void write_customdata(WriteData *wd, int count, CustomData *data, CustomDataLayer *layers, - CustomDataMask cddata_mask, - int partial_type, - int partial_count) + CustomDataMask cddata_mask) { int i; @@ -2106,16 +2104,7 @@ static void write_customdata(WriteData *wd, else { CustomData_file_write_info(layer->type, &structname, &structnum); if (structnum) { - /* when using partial visibility, the MEdge and MFace layers - * are smaller than the original, so their type and count is - * passed to make this work */ - if (layer->type != partial_type) { - datasize = structnum * count; - } - else { - datasize = structnum * partial_count; - } - + datasize = structnum * count; writestruct_id(wd, DATA, structname, datasize, layer->data); } else { @@ -2134,85 +2123,70 @@ static void write_customdata(WriteData *wd, static void write_mesh(WriteData *wd, Mesh *mesh) { - CustomDataLayer *vlayers = NULL, vlayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *elayers = NULL, elayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *flayers = NULL, flayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *llayers = NULL, llayers_buff[CD_TEMP_CHUNK_SIZE]; - CustomDataLayer *players = NULL, players_buff[CD_TEMP_CHUNK_SIZE]; - if (mesh->id.us > 0 || wd->use_memfile) { - /* write LibData */ - { - /* write a copy of the mesh, don't modify in place because it is - * not thread safe for threaded renders that are reading this */ - Mesh *old_mesh = mesh; - Mesh copy_mesh = *mesh; - mesh = ©_mesh; - - /* cache only - don't write */ - mesh->mface = NULL; - mesh->totface = 0; - memset(&mesh->fdata, 0, sizeof(mesh->fdata)); - - /** - * Those calls: - * - Reduce mesh->xdata.totlayer to number of layers to write. - * - Fill xlayers with those layers to be written. - * Note that mesh->xdata is from now on invalid for Blender, - * but this is why the whole mesh is a temp local copy! - */ - CustomData_file_write_prepare( - &mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); - CustomData_file_write_prepare( - &mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); - flayers = flayers_buff; - CustomData_file_write_prepare( - &mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); - CustomData_file_write_prepare( - &mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); - - writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); - write_iddata(wd, &mesh->id); - - /* direct data */ - if (mesh->adt) { - write_animdata(wd, mesh->adt); - } + /* Write a copy of the mesh with possibly reduced number of data layers. + * Don't edit the original since other threads might be reading it. */ + Mesh *old_mesh = mesh; + Mesh copy_mesh = *mesh; + mesh = ©_mesh; + + /* cache only - don't write */ + mesh->mface = NULL; + mesh->totface = 0; + memset(&mesh->fdata, 0, sizeof(mesh->fdata)); + + /* Reduce xdata layers, fill xlayers with layers to be written. + * This makes xdata invalid for Blender, which is why we made a + * temporary local copy. */ + CustomDataLayer *vlayers = NULL, vlayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *elayers = NULL, elayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *flayers = NULL, flayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *llayers = NULL, llayers_buff[CD_TEMP_CHUNK_SIZE]; + CustomDataLayer *players = NULL, players_buff[CD_TEMP_CHUNK_SIZE]; + + CustomData_file_write_prepare(&mesh->vdata, &vlayers, vlayers_buff, ARRAY_SIZE(vlayers_buff)); + CustomData_file_write_prepare(&mesh->edata, &elayers, elayers_buff, ARRAY_SIZE(elayers_buff)); + flayers = flayers_buff; + CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff)); + CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff)); + + writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh); + write_iddata(wd, &mesh->id); - writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); - writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); + /* direct data */ + if (mesh->adt) { + write_animdata(wd, mesh->adt); + } - write_customdata( - wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, CD_MASK_MESH.vmask, -1, 0); - write_customdata( - wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, CD_MASK_MESH.emask, -1, 0); - /* fdata is really a dummy - written so slots align */ - write_customdata( - wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, CD_MASK_MESH.fmask, -1, 0); - write_customdata( - wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, CD_MASK_MESH.lmask, -1, 0); - write_customdata( - wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, CD_MASK_MESH.pmask, -1, 0); + writedata(wd, DATA, sizeof(void *) * mesh->totcol, mesh->mat); + writedata(wd, DATA, sizeof(MSelect) * mesh->totselect, mesh->mselect); - /* restore pointer */ - mesh = old_mesh; - } - } + write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, vlayers, CD_MASK_MESH.vmask); + write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, elayers, CD_MASK_MESH.emask); + /* fdata is really a dummy - written so slots align */ + write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, flayers, CD_MASK_MESH.fmask); + write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, CD_MASK_MESH.lmask); + write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, CD_MASK_MESH.pmask); - if (vlayers && vlayers != vlayers_buff) { - MEM_freeN(vlayers); - } - if (elayers && elayers != elayers_buff) { - MEM_freeN(elayers); - } - if (flayers && flayers != flayers_buff) { - MEM_freeN(flayers); - } - if (llayers && llayers != llayers_buff) { - MEM_freeN(llayers); - } - if (players && players != players_buff) { - MEM_freeN(players); + /* restore pointer */ + mesh = old_mesh; + + /* free temporary data */ + if (vlayers && vlayers != vlayers_buff) { + MEM_freeN(vlayers); + } + if (elayers && elayers != elayers_buff) { + MEM_freeN(elayers); + } + if (flayers && flayers != flayers_buff) { + MEM_freeN(flayers); + } + if (llayers && llayers != llayers_buff) { + MEM_freeN(llayers); + } + if (players && players != players_buff) { + MEM_freeN(players); + } } } |