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:
Diffstat (limited to 'source/blender/blenloader/intern/readfile.c')
-rw-r--r--source/blender/blenloader/intern/readfile.c154
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;