diff options
Diffstat (limited to 'source/blender/blenloader/intern/readfile.c')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 154 |
1 files changed, 150 insertions, 4 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 9976594ad0b..8c3f3c4f513 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -58,6 +58,7 @@ #include "DNA_armature_types.h" #include "DNA_actuator_types.h" #include "DNA_brush_types.h" +#include "DNA_cache_library_types.h" #include "DNA_camera_types.h" #include "DNA_cloth_types.h" #include "DNA_controller_types.h" @@ -114,6 +115,7 @@ #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_brush.h" +#include "BKE_cache_library.h" #include "BKE_cloth.h" #include "BKE_constraint.h" #include "BKE_context.h" @@ -123,6 +125,7 @@ #include "BKE_fcurve.h" #include "BKE_global.h" // for G #include "BKE_group.h" +#include "BKE_key.h" #include "BKE_library.h" // for which_libbase #include "BKE_idcode.h" #include "BKE_material.h" @@ -1983,7 +1986,6 @@ static void direct_link_paint_curve(FileData *fd, PaintCurve *pc) pc->points = newdataadr(fd, pc->points); } - static void direct_link_script(FileData *UNUSED(fd), Script *script) { script->id.us = 1; @@ -1991,6 +1993,96 @@ static void direct_link_script(FileData *UNUSED(fd), Script *script) } +/* ************ READ CacheLibrary *************** */ + +static void lib_link_cache_modifiers_cb(void *userData, CacheLibrary *cachelib, CacheModifier *UNUSED(md), ID **idpoin) +{ + FileData *fd = userData; + + *idpoin = newlibadr(fd, cachelib->id.lib, *idpoin); + /* hardcoded bad exception; non-object modifier data gets user count (texture, displace) */ + if (*idpoin && GS((*idpoin)->name)!=ID_OB) + (*idpoin)->us++; +} +static void lib_link_cache_modifiers(FileData *fd, CacheLibrary *cachelib) +{ + CacheModifier *md; + for (md = cachelib->modifiers.first; md; md = md->next) { + BKE_cache_modifier_foreachIDLink(cachelib, md, lib_link_cache_modifiers_cb, fd); + + /* special cases */ + switch (md->type) { + case eCacheModifierType_StrandsKey: { + StrandsKeyCacheModifier *skmd = (StrandsKeyCacheModifier *)md; + /* Key is a local ID block, not handled by foreachIDLink */ + skmd->key = newlibadr_us(fd, cachelib->id.lib, skmd->key); + break; + } + } + } +} + +static void lib_link_cache_library(FileData *fd, Main *main) +{ + CacheLibrary *cachelib; + + for (cachelib = main->cache_library.first; cachelib; cachelib = cachelib->id.next) { + if (cachelib->id.flag & LIB_NEED_LINK) { + cachelib->id.flag -= LIB_NEED_LINK; + + cachelib->filter_group = newlibadr_us(fd, cachelib->id.lib, cachelib->filter_group); + + lib_link_cache_modifiers(fd, cachelib); + } + } +} + +static void direct_link_cache_modifiers(FileData *fd, ListBase *modifiers) +{ + CacheModifier *md; + + link_list(fd, modifiers); + + for (md = modifiers->first; md; md = md->next) { + /* if modifiers disappear, or for upward compatibility */ + if (md->type >= NUM_CACHE_MODIFIER_TYPES) + md->type = eCacheModifierType_None; + + + switch (md->type) { + case eCacheModifierType_HairSimulation: { + HairSimCacheModifier *hsmd = (HairSimCacheModifier *)md; + hsmd->sim_params.effector_weights = newdataadr(fd, hsmd->sim_params.effector_weights); + hsmd->sim_params.goal_stiffness_mapping = newdataadr(fd, hsmd->sim_params.goal_stiffness_mapping); + if (hsmd->sim_params.goal_stiffness_mapping) + direct_link_curvemapping(fd, hsmd->sim_params.goal_stiffness_mapping); + hsmd->sim_params.bend_stiffness_mapping = newdataadr(fd, hsmd->sim_params.bend_stiffness_mapping); + if (hsmd->sim_params.bend_stiffness_mapping) + direct_link_curvemapping(fd, hsmd->sim_params.bend_stiffness_mapping); + break; + } + case eCacheModifierType_ForceField: { + ForceFieldCacheModifier *ffmd = (ForceFieldCacheModifier *)md; + ffmd->vertex_cache = NULL; + break; + } + case eCacheModifierType_StrandsKey: { + StrandsKeyCacheModifier *skmd = (StrandsKeyCacheModifier *)md; + skmd->edit = NULL; + break; + } + } + } +} + +static void direct_link_cache_library(FileData *fd, CacheLibrary *cachelib) +{ + direct_link_cache_modifiers(fd, &cachelib->modifiers); + + cachelib->archive_info = NULL; /* runtime */ +} + + /* ************ READ PACKEDFILE *************** */ static PackedFile *direct_link_packedfile(FileData *fd, PackedFile *oldpf) @@ -2805,6 +2897,10 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) NodeShaderScript *nss = (NodeShaderScript *) node->storage; nss->bytecode = newdataadr(fd, nss->bytecode); } + else if (node->type==SH_NODE_OPENVDB) { + NodeShaderOpenVDB *vdb = (NodeShaderOpenVDB *)node->storage; + link_list(fd, &vdb->grid_info); + } } else if (ntree->type==NTREE_COMPOSIT) { if (ELEM(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) @@ -3173,6 +3269,10 @@ static void lib_link_key(FileData *fd, Main *main) key->ipo = newlibadr_us(fd, key->id.lib, key->ipo); // XXX deprecated - old animation system key->from = newlibadr(fd, key->id.lib, key->from); + /* versioning: initialize extra owner info */ + if (!key->fromtype && key->from) { + BKE_key_set_from_id(key, key->from); + } key->id.flag -= LIB_NEED_LINK; } @@ -3216,7 +3316,7 @@ static void direct_link_key(FileData *fd, Key *key) key->adt = newdataadr(fd, key->adt); direct_link_animdata(fd, key->adt); - + key->refkey= newdataadr(fd, key->refkey); for (kb = key->block.first; kb; kb = kb->next) { @@ -3956,6 +4056,8 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase BLI_remlink(particles, psys); MEM_freeN(psys); } + + psys->key = newlibadr_us(fd, id->lib, psys->key); } } static void direct_link_particlesystems(FileData *fd, ListBase *particles) @@ -4001,6 +4103,7 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles) psys->edit = NULL; psys->free_edit = NULL; + psys->hairedit = NULL; psys->pathcache = NULL; psys->childcache = NULL; BLI_listbase_clear(&psys->pathcachebufs); @@ -4437,6 +4540,7 @@ static void lib_link_object(FileData *fd, Main *main) ob->track = newlibadr(fd, ob->id.lib, ob->track); ob->poselib = newlibadr_us(fd, ob->id.lib, ob->poselib); ob->dup_group = newlibadr_us(fd, ob->id.lib, ob->dup_group); + ob->cache_library = newlibadr_us(fd, ob->id.lib, ob->cache_library); ob->proxy = newlibadr_us(fd, ob->id.lib, ob->proxy); if (ob->proxy) { @@ -4809,6 +4913,16 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) BLI_listbase_clear(&smd->domain->ptcaches[1]); smd->domain->point_cache[1] = NULL; } + + { + OpenVDBCache *cache; + + link_list(fd, &smd->domain->vdb_caches); + for (cache = smd->domain->vdb_caches.first; cache; cache = cache->next) { + cache->reader = NULL; + cache->writer = NULL; + } + } } else if (smd->type == MOD_SMOKE_TYPE_FLOW) { smd->domain = NULL; @@ -5020,7 +5134,7 @@ static void direct_link_object(FileData *fd, Object *ob) * See [#34776, #42780] for more information. */ if (fd->memfile || (ob->id.flag & (LIB_EXTERN | LIB_INDIRECT))) { - ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT); + ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT | OB_MODE_HAIR_EDIT); if (!fd->memfile) { ob->mode &= ~OB_MODE_POSE; } @@ -5037,6 +5151,7 @@ static void direct_link_object(FileData *fd, Object *ob) direct_link_motionpath(fd, ob->mpath); link_list(fd, &ob->defbase); + link_list(fd, &ob->fmaps); // XXX deprecated - old animation system <<< direct_link_nlastrips(fd, &ob->nlastrips); link_list(fd, &ob->constraintChannels); @@ -5049,6 +5164,8 @@ static void direct_link_object(FileData *fd, Object *ob) /* do it here, below old data gets converted */ direct_link_modifiers(fd, &ob->modifiers); + ob->dup_cache = NULL; + link_list(fd, &ob->effect); paf= ob->effect.first; while (paf) { @@ -5356,6 +5473,14 @@ static void lib_link_scene(FileData *fd, Main *main) sce->toolsettings->particle.shape_object = newlibadr(fd, sce->id.lib, sce->toolsettings->particle.shape_object); + { + HairEditSettings *hair_edit = &sce->toolsettings->hair_edit; + if (hair_edit->brush) + hair_edit->brush = newlibadr(fd, sce->id.lib, hair_edit->brush); + if (hair_edit->shape_object) + hair_edit->shape_object = newlibadr(fd, sce->id.lib, hair_edit->shape_object); + } + for (base = sce->base.first; base; base = next) { next = base->next; @@ -5610,7 +5735,8 @@ static void direct_link_scene(FileData *fd, Scene *sce) sce->toolsettings->particle.paintcursor = NULL; sce->toolsettings->particle.scene = NULL; sce->toolsettings->particle.object = NULL; - + sce->toolsettings->hair_edit.paint_cursor = NULL; + /* in rare cases this is needed, see [#33806] */ if (sce->toolsettings->vpaint) { sce->toolsettings->vpaint->vpaint_prev = NULL; @@ -5981,6 +6107,7 @@ static void lib_link_screen(FileData *fd, Main *main) ads->source = newlibadr(fd, sc->id.lib, ads->source); ads->filter_grp = newlibadr(fd, sc->id.lib, ads->filter_grp); } + sipo->backdrop_camera = newlibadr(fd, sc->id.lib, sipo->backdrop_camera); } else if (sl->spacetype == SPACE_BUTS) { SpaceButs *sbuts = (SpaceButs *)sl; @@ -6308,6 +6435,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc if (ads->filter_grp) ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE); } + sipo->backdrop_camera = restore_pointer_by_name(newmain, (ID *)sipo->backdrop_camera, USER_IGNORE); /* force recalc of list of channels (i.e. includes calculating F-Curve colors) * thus preventing the "black curves" problem post-undo @@ -6541,6 +6669,7 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype) BLI_listbase_clear(&ar->panels_category); BLI_listbase_clear(&ar->handlers); BLI_listbase_clear(&ar->uiblocks); + BLI_listbase_clear(&ar->widgetmaps); ar->headerstr = NULL; ar->swinid = 0; ar->type = NULL; @@ -6676,6 +6805,7 @@ static bool direct_link_screen(FileData *fd, bScreen *sc) } v3d->localvd = newdataadr(fd, v3d->localvd); BLI_listbase_clear(&v3d->afterdraw_transp); + BLI_listbase_clear(&v3d->afterdraw_nodepth); BLI_listbase_clear(&v3d->afterdraw_xray); BLI_listbase_clear(&v3d->afterdraw_xraytransp); v3d->properties_storage = NULL; @@ -7514,6 +7644,7 @@ static const char *dataname(short id_code) case ID_MC: return "Data from MC"; case ID_MSK: return "Data from MSK"; case ID_LS: return "Data from LS"; + case ID_CL: return "Data from CL"; } return "Data from Lib Block"; @@ -7700,6 +7831,9 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID case ID_PC: direct_link_paint_curve(fd, (PaintCurve *)id); break; + case ID_CL: + direct_link_cache_library(fd, (CacheLibrary *)id); + break; } oldnewmap_free_unused(fd->datamap); @@ -7893,6 +8027,7 @@ static void lib_link_all(FileData *fd, Main *main) lib_link_mask(fd, main); lib_link_linestyle(fd, main); lib_link_gpencil(fd, main); + lib_link_cache_library(fd, main); lib_link_mesh(fd, main); /* as last: tpage images with users at zero */ @@ -8769,6 +8904,8 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) if (ob->dup_group) expand_doit(fd, mainvar, ob->dup_group); + if (ob->cache_library) + expand_doit(fd, mainvar, ob->cache_library); if (ob->proxy) expand_doit(fd, mainvar, ob->proxy); @@ -9043,6 +9180,12 @@ static void expand_gpencil(FileData *fd, Main *mainvar, bGPdata *gpd) expand_animdata(fd, mainvar, gpd->adt); } +static void expand_cache_library(FileData *fd, Main *mainvar, CacheLibrary *cachelib) +{ + if (cachelib->filter_group) + expand_doit(fd, mainvar, cachelib->filter_group); +} + void BLO_main_expander(void (*expand_doit_func)(void *, Main *, void *)) { expand_doit = expand_doit_func; @@ -9140,6 +9283,9 @@ void BLO_expand_main(void *fdhandle, Main *mainvar) case ID_GD: expand_gpencil(fd, mainvar, (bGPdata *)id); break; + case ID_CL: + expand_cache_library(fd, mainvar, (CacheLibrary *)id); + break; } do_it = true; |