Commit: 0aac74f18f2d4de1cdde6ca9bf4f8b9a97085d28 Author: Brecht Van Lommel Date: Fri Apr 3 13:34:12 2020 +0200 Branches: master https://developer.blender.org/rB0aac74f18f2d4de1cdde6ca9bf4f8b9a97085d28
Cleanup: split off direct_link_id() function Differential Revision: https://developer.blender.org/D7324 =================================================================== M source/blender/blenloader/intern/readfile.c =================================================================== diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 07cd39e2559..3c5908efa3f 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -470,8 +470,9 @@ static void *oldnewmap_liblookup(OldNewMap *onm, const void *addr, const void *l return NULL; } -static void oldnewmap_free_unused(OldNewMap *onm) +static void oldnewmap_clear(OldNewMap *onm) { + /* Free unused data. */ for (int i = 0; i < onm->nentries; i++) { OldNew *entry = &onm->entries[i]; if (entry->nr == 0) { @@ -479,10 +480,7 @@ static void oldnewmap_free_unused(OldNewMap *onm) entry->newp = NULL; } } -} -static void oldnewmap_clear(OldNewMap *onm) -{ onm->capacity_exp = DEFAULT_SIZE_EXP; oldnewmap_clear_map(onm); onm->nentries = 0; @@ -2768,7 +2766,7 @@ static void direct_link_id_override_property_cb(FileData *fd, void *data) link_list_ex(fd, &op->operations, direct_link_id_override_property_operation_cb); } -static void direct_link_id(FileData *fd, ID *id, ID *id_old); +static void direct_link_id_common(FileData *fd, ID *id, ID *id_old, const int tag); static void direct_link_nodetree(FileData *fd, bNodeTree *ntree); static void direct_link_collection(FileData *fd, Collection *collection); @@ -2778,7 +2776,8 @@ static void direct_link_id_private_id(FileData *fd, ID *id, ID *id_old) bNodeTree **nodetree = BKE_ntree_ptr_from_id(id); if (nodetree != NULL && *nodetree != NULL) { *nodetree = newdataadr(fd, *nodetree); - direct_link_id(fd, (ID *)*nodetree, id_old != NULL ? (ID *)ntreeFromID(id_old) : NULL); + direct_link_id_common( + fd, (ID *)*nodetree, id_old != NULL ? (ID *)ntreeFromID(id_old) : NULL, 0); direct_link_nodetree(fd, *nodetree); } @@ -2786,15 +2785,16 @@ static void direct_link_id_private_id(FileData *fd, ID *id, ID *id_old) Scene *scene = (Scene *)id; if (scene->master_collection != NULL) { scene->master_collection = newdataadr(fd, scene->master_collection); - direct_link_id(fd, - &scene->master_collection->id, - id_old != NULL ? &((Scene *)id_old)->master_collection->id : NULL); + direct_link_id_common(fd, + &scene->master_collection->id, + id_old != NULL ? &((Scene *)id_old)->master_collection->id : NULL, + 0); direct_link_collection(fd, scene->master_collection); } } } -static void direct_link_id(FileData *fd, ID *id, ID *id_old) +static void direct_link_id_common(FileData *fd, ID *id, ID *id_old, const int tag) { /*link direct data of ID properties*/ if (id->properties) { @@ -2804,10 +2804,8 @@ static void direct_link_id(FileData *fd, ID *id, ID *id_old) } id->py_instance = NULL; - /* That way data-lock reading not going through main read_libblock() - * function are still in a clear tag state. - * (glowering at certain nodetree fake data-lock here...). */ - id->tag = 0; + /* Initialize with provided tag. */ + id->tag = tag; id->flag &= ~LIB_INDIRECT_WEAK_LINK; /* NOTE: It is important to not clear the recalc flags for undo/redo. @@ -8378,7 +8376,7 @@ void blo_do_versions_view3d_split_250(View3D *v3d, ListBase *regions) static bool direct_link_screen(FileData *fd, bScreen *screen) { - bool wrong_id = false; + bool success = true; screen->regionbase.first = screen->regionbase.last = NULL; screen->context = NULL; @@ -8388,10 +8386,10 @@ static bool direct_link_screen(FileData *fd, bScreen *screen) if (!direct_link_area_map(fd, AREAMAP_FROM_SCREEN(screen))) { printf("Error reading Screen %s... removing it.\n", screen->id.name + 2); - wrong_id = true; + success = false; } - return wrong_id; + return success; } /** \} */ @@ -9227,6 +9225,158 @@ static const char *dataname(short id_code) return "Data from Lib Block"; } +static bool direct_link_id(FileData *fd, Main *main, const int tag, ID *id, ID *id_old) +{ + if (fd->memfile == NULL) { + /* When actually reading a file , we do want to reset/re-generate session uuids. + * In undo case, we want to re-use existing ones. */ + id->session_uuid = MAIN_ID_SESSION_UUID_UNSET; + } + + BKE_lib_libblock_session_uuid_ensure(id); + + id->lib = main->curlib; + id->us = ID_FAKE_USERS(id); + id->icon_id = 0; + id->newid = NULL; /* Needed because .blend may have been saved with crap value here... */ + id->orig_id = NULL; + + if (tag & LIB_TAG_ID_LINK_PLACEHOLDER) { + /* For placeholder we only need to set the tag, no further data to read. */ + id->tag = tag; + return true; + } + + /* Read part of datablock that is common between real and embedded datablocks. */ + direct_link_id_common(fd, id, id_old, tag); + + /* XXX Very weakly handled currently, see comment in read_libblock() before trying to + * use it for anything new. */ + bool success = true; + + switch (GS(id->name)) { + case ID_WM: + direct_link_windowmanager(fd, (wmWindowManager *)id); + break; + case ID_SCR: + success = direct_link_screen(fd, (bScreen *)id); + break; + case ID_SCE: + direct_link_scene(fd, (Scene *)id); + break; + case ID_OB: + direct_link_object(fd, (Object *)id); + break; + case ID_ME: + direct_link_mesh(fd, (Mesh *)id); + break; + case ID_CU: + direct_link_curve(fd, (Curve *)id); + break; + case ID_MB: + direct_link_mball(fd, (MetaBall *)id); + break; + case ID_MA: + direct_link_material(fd, (Material *)id); + break; + case ID_TE: + direct_link_texture(fd, (Tex *)id); + break; + case ID_IM: + direct_link_image(fd, (Image *)id); + break; + case ID_LA: + direct_link_light(fd, (Light *)id); + break; + case ID_VF: + direct_link_vfont(fd, (VFont *)id); + break; + case ID_TXT: + direct_link_text(fd, (Text *)id); + break; + case ID_IP: + direct_link_ipo(fd, (Ipo *)id); + break; + case ID_KE: + direct_link_key(fd, (Key *)id); + break; + case ID_LT: + direct_link_latt(fd, (Lattice *)id); + break; + case ID_WO: + direct_link_world(fd, (World *)id); + break; + case ID_LI: + direct_link_library(fd, (Library *)id, main); + break; + case ID_CA: + direct_link_camera(fd, (Camera *)id); + break; + case ID_SPK: + direct_link_speaker(fd, (Speaker *)id); + break; + case ID_SO: + direct_link_sound(fd, (bSound *)id); + break; + case ID_LP: + direct_link_lightprobe(fd, (LightProbe *)id); + break; + case ID_GR: + direct_link_collection(fd, (Collection *)id); + break; + case ID_AR: + direct_link_armature(fd, (bArmature *)id); + break; + case ID_AC: + direct_link_action(fd, (bAction *)id); + break; + case ID_NT: + direct_link_nodetree(fd, (bNodeTree *)id); + break; + case ID_BR: + direct_link_brush(fd, (Brush *)id); + break; + case ID_PA: + direct_link_particlesettings(fd, (ParticleSettings *)id); + break; + case ID_GD: + direct_link_gpencil(fd, (bGPdata *)id); + break; + case ID_MC: + direct_link_movieclip(fd, (MovieClip *)id); + break; + case ID_MSK: + direct_link_mask(fd, (Mask *)id); + break; + case ID_LS: + direct_link_linestyle(fd, (FreestyleLineStyle *)id); + break; + case ID_PAL: + direct_link_palette(fd, (Palette *)id); + break; + case ID_PC: + direct_link_paint_curve(fd, (PaintCurve *)id); + break; + case ID_CF: + direct_link_cachefile(fd, (CacheFile *)id); + break; + case ID_WS: + direct_link_workspace(fd, (WorkSpace *)id, main); + break; + case ID_HA: + direct_link_hair(fd, (Hair *)id); + break; + case ID_PT: + direct_link_pointcloud(fd, (PointCloud *)id); + break; + case ID_VO: + direct_link_volume(fd, (Volume *)id); + break; + } + + return success; +} + static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, const char *allocname) { bhead = blo_bhead_next(fd, bhead); @@ -9261,15 +9411,8 @@ static BHead *read_libblock(FileData *fd, const bool placeholder_set_indirect_extern, ID **r_id) { - /* this routine reads a libblock and its direct data. Use link functions to connect it all - */ - 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; + /* This routine reads a libblock and its direct data. Lib link functions will + * set points between datablocks. */ /* In undo case, most libs and linked data should be kept as is from previous state * (see BLO_read_from_memfile). @@ -9314,7 +9457,8 @@ static BHead *read_libblock(FileData *fd, DEBUG_PRINTF("... in %s (%s): ", main->curlib ? main->curlib->id.name : "<NULL>", main->curlib ? main->curlib->name : "<NULL>"); - if ((id = BKE_libblock_find_name(main, GS(idname), idname + 2))) { + ID *id = BKE_libblock_find_name(main, GS(idname), idname + 2); + if (id != NULL) { DEBUG_PRINTF("FOUND!\n"); /* Even though we found our linked ID, * there is no guarantee its address is still the same. */ @@ -9335,7 +9479,7 @@ static BHead *read_libblock(FileData *fd, /* read libblock */ fd->are_memchunks_identical = true; - id = read_struct(fd, bhead, "lib block"); + ID *id = read_struct(fd, bhead, "lib block"); const short idcode = id != NULL ? GS(id->name) : 0; BHead *id_bhead = bhead; @@ -9348,7 +9492,7 @@ static BHead *read_libblock(FileData *fd, if (id_bhead->code != ID_LINK_PLACEHOLDER) { /* need a name for the mallocN, just for debugging and sane prints on leaks */ - allocname = dataname(idcode); + const char *allocname = dataname(idcode); /* read all data into fd->datamap */ /* TODO: ins @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
