diff options
Diffstat (limited to 'source/blender/blenloader/intern/readfile.c')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2340 |
1 files changed, 79 insertions, 2261 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 0d77965306f..b0f0a08651c 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -113,6 +113,7 @@ #include "BKE_action.h" #include "BKE_anim_data.h" +#include "BKE_animsys.h" #include "BKE_armature.h" #include "BKE_brush.h" #include "BKE_collection.h" @@ -126,8 +127,10 @@ #include "BKE_fcurve_driver.h" #include "BKE_fluid.h" #include "BKE_global.h" // for G +#include "BKE_gpencil.h" #include "BKE_gpencil_modifier.h" #include "BKE_hair.h" +#include "BKE_icons.h" #include "BKE_idprop.h" #include "BKE_idtype.h" #include "BKE_image.h" @@ -145,6 +148,7 @@ #include "BKE_nla.h" #include "BKE_node.h" // for tree type defines #include "BKE_object.h" +#include "BKE_packedFile.h" #include "BKE_paint.h" #include "BKE_particle.h" #include "BKE_pointcache.h" @@ -2246,35 +2250,10 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */ /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read Image Preview - * \{ */ - -static PreviewImage *direct_link_preview_image(BlendDataReader *reader, PreviewImage *old_prv) -{ - PreviewImage *prv = BLO_read_get_new_data_address(reader, old_prv); - - if (prv) { - for (int i = 0; i < NUM_ICON_SIZES; i++) { - if (prv->rect[i]) { - BLO_read_data_address(reader, &prv->rect[i]); - } - prv->gputexture[i] = NULL; - } - prv->icon_id = 0; - prv->tag = 0; - } - - return prv; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read ID * \{ */ static void lib_link_id(BlendLibReader *reader, ID *id); -static void lib_link_nodetree(BlendLibReader *reader, bNodeTree *ntree); static void lib_link_collection(BlendLibReader *reader, Collection *collection); static void lib_link_id_embedded_id(BlendLibReader *reader, ID *id) @@ -2284,7 +2263,7 @@ static void lib_link_id_embedded_id(BlendLibReader *reader, ID *id) bNodeTree *nodetree = ntreeFromID(id); if (nodetree != NULL) { lib_link_id(reader, &nodetree->id); - lib_link_nodetree(reader, nodetree); + ntreeBlendReadLib(reader, nodetree); } if (GS(id->name) == ID_SCE) { @@ -2338,7 +2317,6 @@ static void direct_link_id_override_property_cb(BlendDataReader *reader, void *d static void direct_link_id_common( BlendDataReader *reader, Library *current_library, ID *id, ID *id_old, const int tag); -static void direct_link_nodetree(BlendDataReader *reader, bNodeTree *ntree); static void direct_link_collection(BlendDataReader *reader, Collection *collection); static void direct_link_id_embedded_id(BlendDataReader *reader, @@ -2355,7 +2333,7 @@ static void direct_link_id_embedded_id(BlendDataReader *reader, (ID *)*nodetree, id_old != NULL ? (ID *)ntreeFromID(id_old) : NULL, 0); - direct_link_nodetree(reader, *nodetree); + ntreeBlendReadData(reader, *nodetree); } if (GS(id->name) == ID_SCE) { @@ -2501,157 +2479,6 @@ static void direct_link_id_common( /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read ID: Brush - * \{ */ - -/* library brush linking after fileread */ -static void lib_link_brush(BlendLibReader *reader, Brush *brush) -{ - /* brush->(mask_)mtex.obj is ignored on purpose? */ - BLO_read_id_address(reader, brush->id.lib, &brush->mtex.tex); - BLO_read_id_address(reader, brush->id.lib, &brush->mask_mtex.tex); - BLO_read_id_address(reader, brush->id.lib, &brush->clone.image); - BLO_read_id_address(reader, brush->id.lib, &brush->toggle_brush); - BLO_read_id_address(reader, brush->id.lib, &brush->paint_curve); - - /* link default grease pencil palette */ - if (brush->gpencil_settings != NULL) { - if (brush->gpencil_settings->flag & GP_BRUSH_MATERIAL_PINNED) { - BLO_read_id_address(reader, brush->id.lib, &brush->gpencil_settings->material); - - if (!brush->gpencil_settings->material) { - brush->gpencil_settings->flag &= ~GP_BRUSH_MATERIAL_PINNED; - } - } - else { - brush->gpencil_settings->material = NULL; - } - } -} - -static void direct_link_brush(BlendDataReader *reader, Brush *brush) -{ - /* brush itself has been read */ - - /* fallof curve */ - BLO_read_data_address(reader, &brush->curve); - - BLO_read_data_address(reader, &brush->gradient); - - if (brush->curve) { - BKE_curvemapping_blend_read(reader, brush->curve); - } - else { - BKE_brush_curve_preset(brush, CURVE_PRESET_SHARP); - } - - /* grease pencil */ - BLO_read_data_address(reader, &brush->gpencil_settings); - if (brush->gpencil_settings != NULL) { - BLO_read_data_address(reader, &brush->gpencil_settings->curve_sensitivity); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_strength); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_jitter); - - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_pressure); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_strength); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_uv); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_hue); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_saturation); - BLO_read_data_address(reader, &brush->gpencil_settings->curve_rand_value); - - if (brush->gpencil_settings->curve_sensitivity) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_sensitivity); - } - - if (brush->gpencil_settings->curve_strength) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_strength); - } - - if (brush->gpencil_settings->curve_jitter) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_jitter); - } - - if (brush->gpencil_settings->curve_rand_pressure) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_pressure); - } - - if (brush->gpencil_settings->curve_rand_strength) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_strength); - } - - if (brush->gpencil_settings->curve_rand_uv) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_uv); - } - - if (brush->gpencil_settings->curve_rand_hue) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_hue); - } - - if (brush->gpencil_settings->curve_rand_saturation) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_saturation); - } - - if (brush->gpencil_settings->curve_rand_value) { - BKE_curvemapping_blend_read(reader, brush->gpencil_settings->curve_rand_value); - } - } - - brush->preview = NULL; - brush->icon_imbuf = NULL; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Palette - * \{ */ - -static void lib_link_palette(BlendLibReader *UNUSED(reader), Palette *UNUSED(palette)) -{ -} - -static void direct_link_palette(BlendDataReader *reader, Palette *palette) -{ - - /* palette itself has been read */ - BLO_read_list(reader, &palette->colors); -} - -static void lib_link_paint_curve(BlendLibReader *UNUSED(reader), PaintCurve *UNUSED(pc)) -{ -} - -static void direct_link_paint_curve(BlendDataReader *reader, PaintCurve *pc) -{ - BLO_read_data_address(reader, &pc->points); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read PackedFile - * \{ */ - -static PackedFile *direct_link_packedfile(BlendDataReader *reader, PackedFile *pf) -{ - BLO_read_packed_address(reader, &pf); - - if (pf) { - BLO_read_packed_address(reader, &pf->data); - if (pf->data == NULL) { - /* We cannot allow a PackedFile with a NULL data field, - * the whole code assumes this is not possible. See T70315. */ - printf("%s: NULL packedfile data, cleaning up...\n", __func__); - MEM_SAFE_FREE(pf); - } - } - - return pf; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read Animation (legacy for version patching) * \{ */ @@ -2711,102 +2538,6 @@ static void lib_link_constraint_channels(BlendLibReader *reader, ID *id, ListBas /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read ID: Action - * \{ */ - -static void lib_link_action(BlendLibReader *reader, bAction *act) -{ - // XXX deprecated - old animation system <<< - LISTBASE_FOREACH (bActionChannel *, chan, &act->chanbase) { - BLO_read_id_address(reader, act->id.lib, &chan->ipo); - lib_link_constraint_channels(reader, &act->id, &chan->constraintChannels); - } - // >>> XXX deprecated - old animation system - - BKE_fcurve_blend_read_lib(reader, &act->id, &act->curves); - - LISTBASE_FOREACH (TimeMarker *, marker, &act->markers) { - if (marker->camera) { - BLO_read_id_address(reader, act->id.lib, &marker->camera); - } - } -} - -static void direct_link_action(BlendDataReader *reader, bAction *act) -{ - BLO_read_list(reader, &act->curves); - BLO_read_list(reader, &act->chanbase); // XXX deprecated - old animation system - BLO_read_list(reader, &act->groups); - BLO_read_list(reader, &act->markers); - - // XXX deprecated - old animation system <<< - LISTBASE_FOREACH (bActionChannel *, achan, &act->chanbase) { - BLO_read_data_address(reader, &achan->grp); - - BLO_read_list(reader, &achan->constraintChannels); - } - // >>> XXX deprecated - old animation system - - BKE_fcurve_blend_read_data(reader, &act->curves); - - LISTBASE_FOREACH (bActionGroup *, agrp, &act->groups) { - BLO_read_data_address(reader, &agrp->channels.first); - BLO_read_data_address(reader, &agrp->channels.last); - } -} - -/* ------- */ - -static void lib_link_keyingsets(BlendLibReader *reader, ID *id, ListBase *list) -{ - /* here, we're only interested in the ID pointer stored in some of the paths */ - LISTBASE_FOREACH (KeyingSet *, ks, list) { - LISTBASE_FOREACH (KS_Path *, ksp, &ks->paths) { - BLO_read_id_address(reader, id->lib, &ksp->id); - } - } -} - -/* NOTE: this assumes that BLO_read_list has already been called on the list */ -static void direct_link_keyingsets(BlendDataReader *reader, ListBase *list) -{ - /* link KeyingSet data to KeyingSet again (non ID-libs) */ - LISTBASE_FOREACH (KeyingSet *, ks, list) { - /* paths */ - BLO_read_list(reader, &ks->paths); - - LISTBASE_FOREACH (KS_Path *, ksp, &ks->paths) { - /* rna path */ - BLO_read_data_address(reader, &ksp->rna_path); - } - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: CacheFiles - * \{ */ - -static void lib_link_cachefiles(BlendLibReader *UNUSED(reader), CacheFile *UNUSED(cache_file)) -{ -} - -static void direct_link_cachefile(BlendDataReader *reader, CacheFile *cache_file) -{ - BLI_listbase_clear(&cache_file->object_paths); - cache_file->handle = NULL; - cache_file->handle_filepath[0] = '\0'; - cache_file->handle_readers = NULL; - - /* relink animdata */ - BLO_read_data_address(reader, &cache_file->adt); - BKE_animdata_blend_read_data(reader, cache_file->adt); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read ID: WorkSpace * \{ */ @@ -2878,246 +2609,6 @@ static void lib_link_workspace_instance_hook(BlendLibReader *reader, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read ID: Node Tree - * \{ */ - -static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSocket *sock) -{ - IDP_BlendReadLib(reader, sock->prop); - - switch ((eNodeSocketDatatype)sock->type) { - case SOCK_OBJECT: { - bNodeSocketValueObject *default_value = sock->default_value; - BLO_read_id_address(reader, lib, &default_value->value); - break; - } - case SOCK_IMAGE: { - bNodeSocketValueImage *default_value = sock->default_value; - BLO_read_id_address(reader, lib, &default_value->value); - break; - } - case SOCK_FLOAT: - case SOCK_VECTOR: - case SOCK_RGBA: - case SOCK_BOOLEAN: - case SOCK_INT: - case SOCK_STRING: - case __SOCK_MESH: - case SOCK_CUSTOM: - case SOCK_SHADER: - case SOCK_EMITTERS: - case SOCK_EVENTS: - case SOCK_FORCES: - case SOCK_CONTROL_FLOW: - break; - } -} - -static void lib_link_node_sockets(BlendLibReader *reader, Library *lib, ListBase *sockets) -{ - LISTBASE_FOREACH (bNodeSocket *, sock, sockets) { - lib_link_node_socket(reader, lib, sock); - } -} - -/* Single node tree (also used for material/scene trees), ntree is not NULL */ -static void lib_link_ntree(BlendLibReader *reader, Library *lib, bNodeTree *ntree) -{ - ntree->id.lib = lib; - - BLO_read_id_address(reader, lib, &ntree->gpd); - - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - /* Link ID Properties -- and copy this comment EXACTLY for easy finding - * of library blocks that implement this.*/ - IDP_BlendReadLib(reader, node->prop); - - BLO_read_id_address(reader, lib, &node->id); - - lib_link_node_sockets(reader, lib, &node->inputs); - lib_link_node_sockets(reader, lib, &node->outputs); - } - - lib_link_node_sockets(reader, lib, &ntree->inputs); - lib_link_node_sockets(reader, lib, &ntree->outputs); - - /* Set node->typeinfo pointers. This is done in lib linking, after the - * first versioning that can change types still without functions that - * update the typeinfo pointers. Versioning after lib linking needs - * these top be valid. */ - ntreeSetTypes(NULL, ntree); - - /* For nodes with static socket layout, add/remove sockets as needed - * to match the static layout. */ - if (!BLO_read_lib_is_undo(reader)) { - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - node_verify_socket_templates(ntree, node); - } - } -} - -/* library ntree linking after fileread */ -static void lib_link_nodetree(BlendLibReader *reader, bNodeTree *ntree) -{ - lib_link_ntree(reader, ntree->id.lib, ntree); -} - -static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock) -{ - BLO_read_data_address(reader, &sock->prop); - IDP_BlendDataRead(reader, &sock->prop); - - BLO_read_data_address(reader, &sock->link); - sock->typeinfo = NULL; - BLO_read_data_address(reader, &sock->storage); - BLO_read_data_address(reader, &sock->default_value); - sock->cache = NULL; -} - -/* ntree itself has been read! */ -static void direct_link_nodetree(BlendDataReader *reader, bNodeTree *ntree) -{ - /* note: writing and reading goes in sync, for speed */ - - ntree->init = 0; /* to set callbacks and force setting types */ - ntree->is_updating = false; - ntree->typeinfo = NULL; - ntree->interface_type = NULL; - - ntree->progress = NULL; - ntree->execdata = NULL; - - BLO_read_data_address(reader, &ntree->adt); - BKE_animdata_blend_read_data(reader, ntree->adt); - - BLO_read_list(reader, &ntree->nodes); - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - node->typeinfo = NULL; - - BLO_read_list(reader, &node->inputs); - BLO_read_list(reader, &node->outputs); - - BLO_read_data_address(reader, &node->prop); - IDP_BlendDataRead(reader, &node->prop); - - BLO_read_list(reader, &node->internal_links); - LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) { - BLO_read_data_address(reader, &link->fromnode); - BLO_read_data_address(reader, &link->fromsock); - BLO_read_data_address(reader, &link->tonode); - BLO_read_data_address(reader, &link->tosock); - } - - if (node->type == CMP_NODE_MOVIEDISTORTION) { - /* Do nothing, this is runtime cache and hence handled by generic code using - * `IDTypeInfo.foreach_cache` callback. */ - } - else { - BLO_read_data_address(reader, &node->storage); - } - - if (node->storage) { - /* could be handlerized at some point */ - switch (node->type) { - case SH_NODE_CURVE_VEC: - case SH_NODE_CURVE_RGB: - case CMP_NODE_TIME: - case CMP_NODE_CURVE_VEC: - case CMP_NODE_CURVE_RGB: - case CMP_NODE_HUECORRECT: - case TEX_NODE_CURVE_RGB: - case TEX_NODE_CURVE_TIME: { - BKE_curvemapping_blend_read(reader, node->storage); - break; - } - case SH_NODE_SCRIPT: { - NodeShaderScript *nss = (NodeShaderScript *)node->storage; - BLO_read_data_address(reader, &nss->bytecode); - break; - } - case SH_NODE_TEX_POINTDENSITY: { - NodeShaderTexPointDensity *npd = (NodeShaderTexPointDensity *)node->storage; - memset(&npd->pd, 0, sizeof(npd->pd)); - break; - } - case SH_NODE_TEX_IMAGE: { - NodeTexImage *tex = (NodeTexImage *)node->storage; - tex->iuser.ok = 1; - tex->iuser.scene = NULL; - break; - } - case SH_NODE_TEX_ENVIRONMENT: { - NodeTexEnvironment *tex = (NodeTexEnvironment *)node->storage; - tex->iuser.ok = 1; - tex->iuser.scene = NULL; - break; - } - case CMP_NODE_IMAGE: - case CMP_NODE_R_LAYERS: - case CMP_NODE_VIEWER: - case CMP_NODE_SPLITVIEWER: { - ImageUser *iuser = node->storage; - iuser->ok = 1; - iuser->scene = NULL; - break; - } - case CMP_NODE_CRYPTOMATTE: { - NodeCryptomatte *nc = (NodeCryptomatte *)node->storage; - BLO_read_data_address(reader, &nc->matte_id); - break; - } - case TEX_NODE_IMAGE: { - ImageUser *iuser = node->storage; - iuser->ok = 1; - iuser->scene = NULL; - break; - } - default: - break; - } - } - } - BLO_read_list(reader, &ntree->links); - - /* and we connect the rest */ - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - BLO_read_data_address(reader, &node->parent); - node->lasty = 0; - - LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { - direct_link_node_socket(reader, sock); - } - LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { - direct_link_node_socket(reader, sock); - } - } - - /* interface socket lists */ - BLO_read_list(reader, &ntree->inputs); - BLO_read_list(reader, &ntree->outputs); - LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs) { - direct_link_node_socket(reader, sock); - } - LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs) { - direct_link_node_socket(reader, sock); - } - - LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) { - BLO_read_data_address(reader, &link->fromnode); - BLO_read_data_address(reader, &link->tonode); - BLO_read_data_address(reader, &link->fromsock); - BLO_read_data_address(reader, &link->tosock); - } - - /* TODO, should be dealt by new generic cache handling of IDs... */ - ntree->previews = NULL; - - /* type verification is in lib-link */ -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read ID: Armature * \{ */ @@ -3275,117 +2766,6 @@ static void lib_link_pose(BlendLibReader *reader, Object *ob, bPose *pose) } } -static void lib_link_bones(BlendLibReader *reader, Bone *bone) -{ - IDP_BlendReadLib(reader, bone->prop); - - LISTBASE_FOREACH (Bone *, curbone, &bone->childbase) { - lib_link_bones(reader, curbone); - } -} - -static void lib_link_armature(BlendLibReader *reader, bArmature *arm) -{ - LISTBASE_FOREACH (Bone *, curbone, &arm->bonebase) { - lib_link_bones(reader, curbone); - } -} - -static void direct_link_bones(BlendDataReader *reader, Bone *bone) -{ - BLO_read_data_address(reader, &bone->parent); - BLO_read_data_address(reader, &bone->prop); - IDP_BlendDataRead(reader, &bone->prop); - - BLO_read_data_address(reader, &bone->bbone_next); - BLO_read_data_address(reader, &bone->bbone_prev); - - bone->flag &= ~(BONE_DRAW_ACTIVE | BONE_DRAW_LOCKED_WEIGHT); - - BLO_read_list(reader, &bone->childbase); - - LISTBASE_FOREACH (Bone *, child, &bone->childbase) { - direct_link_bones(reader, child); - } -} - -static void direct_link_armature(BlendDataReader *reader, bArmature *arm) -{ - BLO_read_list(reader, &arm->bonebase); - arm->bonehash = NULL; - arm->edbo = NULL; - /* Must always be cleared (armatures don't have their own edit-data). */ - arm->needs_flush_to_id = 0; - - BLO_read_data_address(reader, &arm->adt); - BKE_animdata_blend_read_data(reader, arm->adt); - - LISTBASE_FOREACH (Bone *, bone, &arm->bonebase) { - direct_link_bones(reader, bone); - } - - BLO_read_data_address(reader, &arm->act_bone); - arm->act_edbone = NULL; - - BKE_armature_bone_hash_make(arm); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Camera - * \{ */ - -static void lib_link_camera(BlendLibReader *reader, Camera *ca) -{ - BLO_read_id_address(reader, ca->id.lib, &ca->ipo); /* deprecated, for versioning */ - - BLO_read_id_address(reader, ca->id.lib, &ca->dof_ob); /* deprecated, for versioning */ - BLO_read_id_address(reader, ca->id.lib, &ca->dof.focus_object); - - LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) { - BLO_read_id_address(reader, ca->id.lib, &bgpic->ima); - BLO_read_id_address(reader, ca->id.lib, &bgpic->clip); - } -} - -static void direct_link_camera(BlendDataReader *reader, Camera *ca) -{ - BLO_read_data_address(reader, &ca->adt); - BKE_animdata_blend_read_data(reader, ca->adt); - - BLO_read_list(reader, &ca->bg_images); - - LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) { - bgpic->iuser.ok = 1; - bgpic->iuser.scene = NULL; - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Light - * \{ */ - -static void lib_link_light(BlendLibReader *reader, Light *la) -{ - BLO_read_id_address(reader, la->id.lib, &la->ipo); // XXX deprecated - old animation system -} - -static void direct_link_light(BlendDataReader *reader, Light *la) -{ - BLO_read_data_address(reader, &la->adt); - BKE_animdata_blend_read_data(reader, la->adt); - - BLO_read_data_address(reader, &la->curfalloff); - if (la->curfalloff) { - BKE_curvemapping_blend_read(reader, la->curfalloff); - } - - la->preview = direct_link_preview_image(reader, la->preview); -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -3400,371 +2780,6 @@ void blo_do_versions_key_uidgen(Key *key) } } -static void lib_link_key(BlendLibReader *reader, Key *key) -{ - BLI_assert((key->id.tag & LIB_TAG_EXTERN) == 0); - - BLO_read_id_address(reader, key->id.lib, &key->ipo); // XXX deprecated - old animation system - BLO_read_id_address(reader, key->id.lib, &key->from); -} - -static void switch_endian_keyblock(Key *key, KeyBlock *kb) -{ - int elemsize = key->elemsize; - char *data = kb->data; - - for (int a = 0; a < kb->totelem; a++) { - const char *cp = key->elemstr; - char *poin = data; - - while (cp[0]) { /* cp[0] == amount */ - switch (cp[1]) { /* cp[1] = type */ - case IPO_FLOAT: - case IPO_BPOINT: - case IPO_BEZTRIPLE: { - int b = cp[0]; - BLI_endian_switch_float_array((float *)poin, b); - poin += sizeof(float) * b; - break; - } - } - - cp += 2; - } - data += elemsize; - } -} - -static void direct_link_key(BlendDataReader *reader, Key *key) -{ - BLO_read_list(reader, &(key->block)); - - BLO_read_data_address(reader, &key->adt); - BKE_animdata_blend_read_data(reader, key->adt); - - BLO_read_data_address(reader, &key->refkey); - - LISTBASE_FOREACH (KeyBlock *, kb, &key->block) { - BLO_read_data_address(reader, &kb->data); - - if (BLO_read_requires_endian_switch(reader)) { - switch_endian_keyblock(key, kb); - } - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Meta Ball - * \{ */ - -static void lib_link_mball(BlendLibReader *reader, MetaBall *mb) -{ - for (int a = 0; a < mb->totcol; a++) { - BLO_read_id_address(reader, mb->id.lib, &mb->mat[a]); - } - - BLO_read_id_address(reader, mb->id.lib, &mb->ipo); // XXX deprecated - old animation system -} - -static void direct_link_mball(BlendDataReader *reader, MetaBall *mb) -{ - BLO_read_data_address(reader, &mb->adt); - BKE_animdata_blend_read_data(reader, mb->adt); - - BLO_read_pointer_array(reader, (void **)&mb->mat); - - BLO_read_list(reader, &(mb->elems)); - - BLI_listbase_clear(&mb->disp); - mb->editelems = NULL; - /* Must always be cleared (meta's don't have their own edit-data). */ - mb->needs_flush_to_id = 0; - /* mb->edit_elems.first= mb->edit_elems.last= NULL;*/ - mb->lastelem = NULL; - mb->batch_cache = NULL; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: World - * \{ */ - -static void lib_link_world(BlendLibReader *reader, World *wrld) -{ - BLO_read_id_address(reader, wrld->id.lib, &wrld->ipo); // XXX deprecated - old animation system -} - -static void direct_link_world(BlendDataReader *reader, World *wrld) -{ - BLO_read_data_address(reader, &wrld->adt); - BKE_animdata_blend_read_data(reader, wrld->adt); - - wrld->preview = direct_link_preview_image(reader, wrld->preview); - BLI_listbase_clear(&wrld->gpumaterial); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: VFont - * \{ */ - -static void lib_link_vfont(BlendLibReader *UNUSED(reader), VFont *UNUSED(vf)) -{ -} - -static void direct_link_vfont(BlendDataReader *reader, VFont *vf) -{ - vf->data = NULL; - vf->temp_pf = NULL; - vf->packedfile = direct_link_packedfile(reader, vf->packedfile); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Text - * \{ */ - -static void lib_link_text(BlendLibReader *UNUSED(reader), Text *UNUSED(text)) -{ -} - -static void direct_link_text(BlendDataReader *reader, Text *text) -{ - BLO_read_data_address(reader, &text->filepath); - - text->compiled = NULL; - -#if 0 - if (text->flags & TXT_ISEXT) { - BKE_text_reload(text); - } - /* else { */ -#endif - - BLO_read_list(reader, &text->lines); - - BLO_read_data_address(reader, &text->curl); - BLO_read_data_address(reader, &text->sell); - - LISTBASE_FOREACH (TextLine *, ln, &text->lines) { - BLO_read_data_address(reader, &ln->line); - ln->format = NULL; - - if (ln->len != (int)strlen(ln->line)) { - printf("Error loading text, line lengths differ\n"); - ln->len = strlen(ln->line); - } - } - - text->flags = (text->flags) & ~TXT_ISEXT; - - id_us_ensure_real(&text->id); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Image - * \{ */ - -static void lib_link_image(BlendLibReader *UNUSED(reader), Image *ima) -{ - /* Images have some kind of 'main' cache, when NULL we should also clear all others. */ - /* Needs to be done *after* cache pointers are restored (call to - * `foreach_cache`/`blo_cache_storage_entry_restore_in_new`), easier for now to do it in - * lib_link... */ - if (ima->cache == NULL) { - BKE_image_free_buffers(ima); - } -} - -static void direct_link_image(BlendDataReader *reader, Image *ima) -{ - BLO_read_list(reader, &ima->tiles); - - BLO_read_list(reader, &(ima->renderslots)); - if (!BLO_read_data_is_undo(reader)) { - /* We reset this last render slot index only when actually reading a file, not for undo. */ - ima->last_render_slot = ima->render_slot; - } - - BLO_read_list(reader, &(ima->views)); - BLO_read_list(reader, &(ima->packedfiles)); - - if (ima->packedfiles.first) { - LISTBASE_FOREACH (ImagePackedFile *, imapf, &ima->packedfiles) { - imapf->packedfile = direct_link_packedfile(reader, imapf->packedfile); - } - ima->packedfile = NULL; - } - else { - ima->packedfile = direct_link_packedfile(reader, ima->packedfile); - } - - BLI_listbase_clear(&ima->anims); - ima->preview = direct_link_preview_image(reader, ima->preview); - BLO_read_data_address(reader, &ima->stereo3d_format); - LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) { - tile->ok = IMA_OK; - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Curve - * \{ */ - -static void lib_link_curve(BlendLibReader *reader, Curve *cu) -{ - for (int a = 0; a < cu->totcol; a++) { - BLO_read_id_address(reader, cu->id.lib, &cu->mat[a]); - } - - BLO_read_id_address(reader, cu->id.lib, &cu->bevobj); - BLO_read_id_address(reader, cu->id.lib, &cu->taperobj); - BLO_read_id_address(reader, cu->id.lib, &cu->textoncurve); - BLO_read_id_address(reader, cu->id.lib, &cu->vfont); - BLO_read_id_address(reader, cu->id.lib, &cu->vfontb); - BLO_read_id_address(reader, cu->id.lib, &cu->vfonti); - BLO_read_id_address(reader, cu->id.lib, &cu->vfontbi); - - BLO_read_id_address(reader, cu->id.lib, &cu->ipo); // XXX deprecated - old animation system - BLO_read_id_address(reader, cu->id.lib, &cu->key); -} - -static void switch_endian_knots(Nurb *nu) -{ - if (nu->knotsu) { - BLI_endian_switch_float_array(nu->knotsu, KNOTSU(nu)); - } - if (nu->knotsv) { - BLI_endian_switch_float_array(nu->knotsv, KNOTSV(nu)); - } -} - -static void direct_link_curve(BlendDataReader *reader, Curve *cu) -{ - BLO_read_data_address(reader, &cu->adt); - BKE_animdata_blend_read_data(reader, cu->adt); - - /* Protect against integer overflow vulnerability. */ - CLAMP(cu->len_char32, 0, INT_MAX - 4); - - BLO_read_pointer_array(reader, (void **)&cu->mat); - - BLO_read_data_address(reader, &cu->str); - BLO_read_data_address(reader, &cu->strinfo); - BLO_read_data_address(reader, &cu->tb); - - if (cu->vfont == NULL) { - BLO_read_list(reader, &(cu->nurb)); - } - else { - cu->nurb.first = cu->nurb.last = NULL; - - TextBox *tb = MEM_calloc_arrayN(MAXTEXTBOX, sizeof(TextBox), "TextBoxread"); - if (cu->tb) { - memcpy(tb, cu->tb, cu->totbox * sizeof(TextBox)); - MEM_freeN(cu->tb); - cu->tb = tb; - } - else { - cu->totbox = 1; - cu->actbox = 1; - cu->tb = tb; - cu->tb[0].w = cu->linewidth; - } - if (cu->wordspace == 0.0f) { - cu->wordspace = 1.0f; - } - } - - cu->editnurb = NULL; - cu->editfont = NULL; - cu->batch_cache = NULL; - - LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) { - BLO_read_data_address(reader, &nu->bezt); - BLO_read_data_address(reader, &nu->bp); - BLO_read_data_address(reader, &nu->knotsu); - BLO_read_data_address(reader, &nu->knotsv); - if (cu->vfont == NULL) { - nu->charidx = 0; - } - - if (BLO_read_requires_endian_switch(reader)) { - switch_endian_knots(nu); - } - } - cu->texflag &= ~CU_AUTOSPACE_EVALUATED; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Texture - * \{ */ - -static void lib_link_texture(BlendLibReader *reader, Tex *tex) -{ - BLO_read_id_address(reader, tex->id.lib, &tex->ima); - BLO_read_id_address(reader, tex->id.lib, &tex->ipo); // XXX deprecated - old animation system -} - -static void direct_link_texture(BlendDataReader *reader, Tex *tex) -{ - BLO_read_data_address(reader, &tex->adt); - BKE_animdata_blend_read_data(reader, tex->adt); - - BLO_read_data_address(reader, &tex->coba); - - tex->preview = direct_link_preview_image(reader, tex->preview); - - tex->iuser.ok = 1; - tex->iuser.scene = NULL; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Material - * \{ */ - -static void lib_link_material(BlendLibReader *reader, Material *ma) -{ - BLO_read_id_address(reader, ma->id.lib, &ma->ipo); // XXX deprecated - old animation system - - /* relink grease pencil settings */ - if (ma->gp_style != NULL) { - MaterialGPencilStyle *gp_style = ma->gp_style; - if (gp_style->sima != NULL) { - BLO_read_id_address(reader, ma->id.lib, &gp_style->sima); - } - if (gp_style->ima != NULL) { - BLO_read_id_address(reader, ma->id.lib, &gp_style->ima); - } - } -} - -static void direct_link_material(BlendDataReader *reader, Material *ma) -{ - BLO_read_data_address(reader, &ma->adt); - BKE_animdata_blend_read_data(reader, ma->adt); - - ma->texpaintslot = NULL; - - ma->preview = direct_link_preview_image(reader, ma->preview); - BLI_listbase_clear(&ma->gpumaterial); - - BLO_read_data_address(reader, &ma->gp_style); -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -4989,7 +4004,8 @@ static void direct_link_object(BlendDataReader *reader, Object *ob) } } - ob->preview = direct_link_preview_image(reader, ob->preview); + BLO_read_data_address(reader, &ob->preview); + BKE_previewimg_blend_read(reader, ob->preview); } static void direct_link_view_settings(BlendDataReader *reader, @@ -5131,7 +4147,8 @@ static void direct_link_collection(BlendDataReader *reader, Collection *collecti BLO_read_list(reader, &collection->gobject); BLO_read_list(reader, &collection->children); - collection->preview = direct_link_preview_image(reader, collection->preview); + BLO_read_data_address(reader, &collection->preview); + BKE_previewimg_blend_read(reader, collection->preview); collection->flag &= ~COLLECTION_HAS_OBJECT_CACHE; collection->tag = 0; @@ -5315,7 +4332,7 @@ static bool scene_validate_setscene__liblink(Scene *sce, const int totscene) static void lib_link_scene(BlendLibReader *reader, Scene *sce) { - lib_link_keyingsets(reader, &sce->id, &sce->keyingsets); + BKE_keyingsets_blend_read_lib(reader, &sce->id, &sce->keyingsets); BLO_read_id_address(reader, sce->id.lib, &sce->camera); BLO_read_id_address(reader, sce->id.lib, &sce->world); @@ -5594,7 +4611,7 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) BKE_animdata_blend_read_data(reader, sce->adt); BLO_read_list(reader, &sce->keyingsets); - direct_link_keyingsets(reader, &sce->keyingsets); + BKE_keyingsets_blend_read_data(reader, &sce->keyingsets); BLO_read_data_address(reader, &sce->basact); @@ -5843,7 +4860,8 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) } } - sce->preview = direct_link_preview_image(reader, sce->preview); + BLO_read_data_address(reader, &sce->preview); + BKE_previewimg_blend_read(reader, sce->preview); BKE_curvemapping_blend_read(reader, &sce->r.mblur_shutter_curve); @@ -5882,107 +4900,6 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read ID: Grease Pencil - * \{ */ - -/* relink's grease pencil data's refs */ -static void lib_link_gpencil(BlendLibReader *reader, bGPdata *gpd) -{ - /* Relink all data-lock linked by GP data-lock */ - /* Layers */ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* Layer -> Parent References */ - BLO_read_id_address(reader, gpd->id.lib, &gpl->parent); - } - - /* materials */ - for (int a = 0; a < gpd->totcol; a++) { - BLO_read_id_address(reader, gpd->id.lib, &gpd->mat[a]); - } -} - -/* relinks grease-pencil data - used for direct_link and old file linkage */ -static void direct_link_gpencil(BlendDataReader *reader, bGPdata *gpd) -{ - /* we must firstly have some grease-pencil data to link! */ - if (gpd == NULL) { - return; - } - - /* relink animdata */ - BLO_read_data_address(reader, &gpd->adt); - BKE_animdata_blend_read_data(reader, gpd->adt); - - /* Ensure full objectmode for linked grease pencil. */ - if (gpd->id.lib != NULL) { - gpd->flag &= ~GP_DATA_STROKE_PAINTMODE; - gpd->flag &= ~GP_DATA_STROKE_EDITMODE; - gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE; - gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE; - gpd->flag &= ~GP_DATA_STROKE_VERTEXMODE; - } - - /* init stroke buffer */ - gpd->runtime.sbuffer = NULL; - gpd->runtime.sbuffer_used = 0; - gpd->runtime.sbuffer_size = 0; - gpd->runtime.tot_cp_points = 0; - - /* relink palettes (old palettes deprecated, only to convert old files) */ - BLO_read_list(reader, &gpd->palettes); - if (gpd->palettes.first != NULL) { - LISTBASE_FOREACH (Palette *, palette, &gpd->palettes) { - BLO_read_list(reader, &palette->colors); - } - } - - /* materials */ - BLO_read_pointer_array(reader, (void **)&gpd->mat); - - /* relink layers */ - BLO_read_list(reader, &gpd->layers); - - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - /* relink frames */ - BLO_read_list(reader, &gpl->frames); - - BLO_read_data_address(reader, &gpl->actframe); - - gpl->runtime.icon_id = 0; - - /* Relink masks. */ - BLO_read_list(reader, &gpl->mask_layers); - - LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) { - /* relink strokes (and their points) */ - BLO_read_list(reader, &gpf->strokes); - - LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - /* relink stroke points array */ - BLO_read_data_address(reader, &gps->points); - /* Relink geometry*/ - BLO_read_data_address(reader, &gps->triangles); - - /* relink stroke edit curve. */ - BLO_read_data_address(reader, &gps->editcurve); - if (gps->editcurve != NULL) { - /* relink curve point array */ - BLO_read_data_address(reader, &gps->editcurve->curve_points); - } - - /* relink weight data */ - if (gps->dvert) { - BLO_read_data_address(reader, &gps->dvert); - BKE_defvert_blend_read(reader, gps->totpoints, gps->dvert); - } - } - } - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read Screen Area/Region (Screen Data) * \{ */ @@ -6124,7 +5041,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area) if (v3d->gpd) { BLO_read_data_address(reader, &v3d->gpd); - direct_link_gpencil(reader, v3d->gpd); + BKE_gpencil_blend_read_data(reader, v3d->gpd); } BLO_read_data_address(reader, &v3d->localvd); @@ -6196,7 +5113,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area) #if 0 sima->gpd = newdataadr(fd, sima->gpd); if (sima->gpd) { - direct_link_gpencil(fd, sima->gpd); + BKE_gpencil_blend_read_data(fd, sima->gpd); } #endif } @@ -6205,7 +5122,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area) if (snode->gpd) { BLO_read_data_address(reader, &snode->gpd); - direct_link_gpencil(reader, snode->gpd); + BKE_gpencil_blend_read_data(reader, snode->gpd); } BLO_read_list(reader, &snode->treepath); @@ -6230,7 +5147,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area) #if 0 if (sseq->gpd) { sseq->gpd = newdataadr(fd, sseq->gpd); - direct_link_gpencil(fd, sseq->gpd); + BKE_gpencil_blend_read_data(fd, sseq->gpd); } #endif sseq->scopes.reference_ibuf = NULL; @@ -7154,7 +6071,8 @@ static bool direct_link_screen(BlendDataReader *reader, bScreen *screen) screen->context = NULL; screen->active_region = NULL; - screen->preview = direct_link_preview_image(reader, screen->preview); + BLO_read_data_address(reader, &screen->preview); + BKE_previewimg_blend_read(reader, screen->preview); if (!direct_link_area_map(reader, AREAMAP_FROM_SCREEN(screen))) { printf("Error reading Screen %s... removing it.\n", screen->id.name + 2); @@ -7212,7 +6130,7 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) // printf("direct_link_library: filepath_abs %s\n", lib->filepath_abs); BlendDataReader reader = {fd}; - lib->packedfile = direct_link_packedfile(&reader, lib->packedfile); + BKE_packedfile_blend_read(&reader, &lib->packedfile); /* new main */ newmain = BKE_main_new(); @@ -7261,619 +6179,6 @@ static void fix_relpaths_library(const char *basepath, Main *main) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read ID: Light Probe - * \{ */ - -static void lib_link_lightprobe(BlendLibReader *reader, LightProbe *prb) -{ - BLO_read_id_address(reader, prb->id.lib, &prb->visibility_grp); -} - -static void direct_link_lightprobe(BlendDataReader *reader, LightProbe *prb) -{ - BLO_read_data_address(reader, &prb->adt); - BKE_animdata_blend_read_data(reader, prb->adt); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Speaker - * \{ */ - -static void lib_link_speaker(BlendLibReader *reader, Speaker *spk) -{ - BLO_read_id_address(reader, spk->id.lib, &spk->sound); -} - -static void direct_link_speaker(BlendDataReader *reader, Speaker *spk) -{ - BLO_read_data_address(reader, &spk->adt); - BKE_animdata_blend_read_data(reader, spk->adt); - -#if 0 - spk->sound = newdataadr(fd, spk->sound); - direct_link_sound(fd, spk->sound); -#endif -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Sound - * \{ */ - -static void direct_link_sound(BlendDataReader *reader, bSound *sound) -{ - sound->tags = 0; - sound->handle = NULL; - sound->playback_handle = NULL; - - /* versioning stuff, if there was a cache, then we enable caching: */ - if (sound->cache) { - sound->flags |= SOUND_FLAGS_CACHING; - sound->cache = NULL; - } - - if (BLO_read_data_is_undo(reader)) { - sound->tags |= SOUND_TAGS_WAVEFORM_NO_RELOAD; - } - - sound->spinlock = MEM_mallocN(sizeof(SpinLock), "sound_spinlock"); - BLI_spin_init(sound->spinlock); - - /* clear waveform loading flag */ - sound->tags &= ~SOUND_TAGS_WAVEFORM_LOADING; - - sound->packedfile = direct_link_packedfile(reader, sound->packedfile); - sound->newpackedfile = direct_link_packedfile(reader, sound->newpackedfile); -} - -static void lib_link_sound(BlendLibReader *reader, bSound *sound) -{ - BLO_read_id_address( - reader, sound->id.lib, &sound->ipo); // XXX deprecated - old animation system -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Movie Clip - * \{ */ - -static void direct_link_movieReconstruction(BlendDataReader *reader, - MovieTrackingReconstruction *reconstruction) -{ - BLO_read_data_address(reader, &reconstruction->cameras); -} - -static void direct_link_movieTracks(BlendDataReader *reader, ListBase *tracksbase) -{ - BLO_read_list(reader, tracksbase); - - LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) { - BLO_read_data_address(reader, &track->markers); - } -} - -static void direct_link_moviePlaneTracks(BlendDataReader *reader, ListBase *plane_tracks_base) -{ - BLO_read_list(reader, plane_tracks_base); - - LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, plane_tracks_base) { - BLO_read_pointer_array(reader, (void **)&plane_track->point_tracks); - for (int i = 0; i < plane_track->point_tracksnr; i++) { - BLO_read_data_address(reader, &plane_track->point_tracks[i]); - } - - BLO_read_data_address(reader, &plane_track->markers); - } -} - -static void direct_link_movieclip(BlendDataReader *reader, MovieClip *clip) -{ - MovieTracking *tracking = &clip->tracking; - - BLO_read_data_address(reader, &clip->adt); - - direct_link_movieTracks(reader, &tracking->tracks); - direct_link_moviePlaneTracks(reader, &tracking->plane_tracks); - direct_link_movieReconstruction(reader, &tracking->reconstruction); - - BLO_read_data_address(reader, &clip->tracking.act_track); - BLO_read_data_address(reader, &clip->tracking.act_plane_track); - - clip->anim = NULL; - clip->tracking_context = NULL; - clip->tracking.stats = NULL; - - /* TODO we could store those in undo cache storage as well, and preserve them instead of - * re-creating them... */ - BLI_listbase_clear(&clip->runtime.gputextures); - - /* Needed for proper versioning, will be NULL for all newer files anyway. */ - BLO_read_data_address(reader, &clip->tracking.stabilization.rot_track); - - clip->tracking.dopesheet.ok = 0; - BLI_listbase_clear(&clip->tracking.dopesheet.channels); - BLI_listbase_clear(&clip->tracking.dopesheet.coverage_segments); - - BLO_read_list(reader, &tracking->objects); - - LISTBASE_FOREACH (MovieTrackingObject *, object, &tracking->objects) { - direct_link_movieTracks(reader, &object->tracks); - direct_link_moviePlaneTracks(reader, &object->plane_tracks); - direct_link_movieReconstruction(reader, &object->reconstruction); - } -} - -static void lib_link_movieTracks(BlendLibReader *reader, MovieClip *clip, ListBase *tracksbase) -{ - LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) { - BLO_read_id_address(reader, clip->id.lib, &track->gpd); - } -} - -static void lib_link_moviePlaneTracks(BlendLibReader *reader, - MovieClip *clip, - ListBase *tracksbase) -{ - LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, tracksbase) { - BLO_read_id_address(reader, clip->id.lib, &plane_track->image); - } -} - -static void lib_link_movieclip(BlendLibReader *reader, MovieClip *clip) -{ - MovieTracking *tracking = &clip->tracking; - - BLO_read_id_address(reader, clip->id.lib, &clip->gpd); - - lib_link_movieTracks(reader, clip, &tracking->tracks); - lib_link_moviePlaneTracks(reader, clip, &tracking->plane_tracks); - - LISTBASE_FOREACH (MovieTrackingObject *, object, &tracking->objects) { - lib_link_movieTracks(reader, clip, &object->tracks); - lib_link_moviePlaneTracks(reader, clip, &object->plane_tracks); - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Masks - * \{ */ - -static void direct_link_mask(BlendDataReader *reader, Mask *mask) -{ - BLO_read_data_address(reader, &mask->adt); - - BLO_read_list(reader, &mask->masklayers); - - LISTBASE_FOREACH (MaskLayer *, masklay, &mask->masklayers) { - /* can't use newdataadr since it's a pointer within an array */ - MaskSplinePoint *act_point_search = NULL; - - BLO_read_list(reader, &masklay->splines); - - LISTBASE_FOREACH (MaskSpline *, spline, &masklay->splines) { - MaskSplinePoint *points_old = spline->points; - - BLO_read_data_address(reader, &spline->points); - - for (int i = 0; i < spline->tot_point; i++) { - MaskSplinePoint *point = &spline->points[i]; - - if (point->tot_uw) { - BLO_read_data_address(reader, &point->uw); - } - } - - /* detect active point */ - if ((act_point_search == NULL) && (masklay->act_point >= points_old) && - (masklay->act_point < points_old + spline->tot_point)) { - act_point_search = &spline->points[masklay->act_point - points_old]; - } - } - - BLO_read_list(reader, &masklay->splines_shapes); - - LISTBASE_FOREACH (MaskLayerShape *, masklay_shape, &masklay->splines_shapes) { - BLO_read_data_address(reader, &masklay_shape->data); - - if (masklay_shape->tot_vert) { - if (BLO_read_requires_endian_switch(reader)) { - BLI_endian_switch_float_array(masklay_shape->data, - masklay_shape->tot_vert * sizeof(float) * - MASK_OBJECT_SHAPE_ELEM_SIZE); - } - } - } - - BLO_read_data_address(reader, &masklay->act_spline); - masklay->act_point = act_point_search; - } -} - -static void lib_link_mask_parent(BlendLibReader *reader, Mask *mask, MaskParent *parent) -{ - BLO_read_id_address(reader, mask->id.lib, &parent->id); -} - -static void lib_link_mask(BlendLibReader *reader, Mask *mask) -{ - LISTBASE_FOREACH (MaskLayer *, masklay, &mask->masklayers) { - MaskSpline *spline; - - spline = masklay->splines.first; - while (spline) { - for (int i = 0; i < spline->tot_point; i++) { - MaskSplinePoint *point = &spline->points[i]; - - lib_link_mask_parent(reader, mask, &point->parent); - } - - lib_link_mask_parent(reader, mask, &spline->parent); - - spline = spline->next; - } - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Line Style - * \{ */ - -static void lib_link_linestyle(BlendLibReader *reader, FreestyleLineStyle *linestyle) -{ - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->color_modifiers) { - switch (m->type) { - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleColorModifier_DistanceFromObject *cm = - (LineStyleColorModifier_DistanceFromObject *)m; - BLO_read_id_address(reader, linestyle->id.lib, &cm->target); - break; - } - } - } - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->alpha_modifiers) { - switch (m->type) { - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleAlphaModifier_DistanceFromObject *am = - (LineStyleAlphaModifier_DistanceFromObject *)m; - BLO_read_id_address(reader, linestyle->id.lib, &am->target); - break; - } - } - } - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->thickness_modifiers) { - switch (m->type) { - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleThicknessModifier_DistanceFromObject *tm = - (LineStyleThicknessModifier_DistanceFromObject *)m; - BLO_read_id_address(reader, linestyle->id.lib, &tm->target); - break; - } - } - } - for (int a = 0; a < MAX_MTEX; a++) { - MTex *mtex = linestyle->mtex[a]; - if (mtex) { - BLO_read_id_address(reader, linestyle->id.lib, &mtex->tex); - BLO_read_id_address(reader, linestyle->id.lib, &mtex->object); - } - } -} - -static void direct_link_linestyle_color_modifier(BlendDataReader *reader, - LineStyleModifier *modifier) -{ - switch (modifier->type) { - case LS_MODIFIER_ALONG_STROKE: { - LineStyleColorModifier_AlongStroke *m = (LineStyleColorModifier_AlongStroke *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_DISTANCE_FROM_CAMERA: { - LineStyleColorModifier_DistanceFromCamera *m = (LineStyleColorModifier_DistanceFromCamera *) - modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleColorModifier_DistanceFromObject *m = (LineStyleColorModifier_DistanceFromObject *) - modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_MATERIAL: { - LineStyleColorModifier_Material *m = (LineStyleColorModifier_Material *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_TANGENT: { - LineStyleColorModifier_Tangent *m = (LineStyleColorModifier_Tangent *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_NOISE: { - LineStyleColorModifier_Noise *m = (LineStyleColorModifier_Noise *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_CREASE_ANGLE: { - LineStyleColorModifier_CreaseAngle *m = (LineStyleColorModifier_CreaseAngle *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - case LS_MODIFIER_CURVATURE_3D: { - LineStyleColorModifier_Curvature_3D *m = (LineStyleColorModifier_Curvature_3D *)modifier; - BLO_read_data_address(reader, &m->color_ramp); - break; - } - } -} - -static void direct_link_linestyle_alpha_modifier(BlendDataReader *reader, - LineStyleModifier *modifier) -{ - switch (modifier->type) { - case LS_MODIFIER_ALONG_STROKE: { - LineStyleAlphaModifier_AlongStroke *m = (LineStyleAlphaModifier_AlongStroke *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_DISTANCE_FROM_CAMERA: { - LineStyleAlphaModifier_DistanceFromCamera *m = (LineStyleAlphaModifier_DistanceFromCamera *) - modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleAlphaModifier_DistanceFromObject *m = (LineStyleAlphaModifier_DistanceFromObject *) - modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_MATERIAL: { - LineStyleAlphaModifier_Material *m = (LineStyleAlphaModifier_Material *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_TANGENT: { - LineStyleAlphaModifier_Tangent *m = (LineStyleAlphaModifier_Tangent *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_NOISE: { - LineStyleAlphaModifier_Noise *m = (LineStyleAlphaModifier_Noise *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_CREASE_ANGLE: { - LineStyleAlphaModifier_CreaseAngle *m = (LineStyleAlphaModifier_CreaseAngle *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_CURVATURE_3D: { - LineStyleAlphaModifier_Curvature_3D *m = (LineStyleAlphaModifier_Curvature_3D *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - } -} - -static void direct_link_linestyle_thickness_modifier(BlendDataReader *reader, - LineStyleModifier *modifier) -{ - switch (modifier->type) { - case LS_MODIFIER_ALONG_STROKE: { - LineStyleThicknessModifier_AlongStroke *m = (LineStyleThicknessModifier_AlongStroke *) - modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_DISTANCE_FROM_CAMERA: { - LineStyleThicknessModifier_DistanceFromCamera *m = - (LineStyleThicknessModifier_DistanceFromCamera *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_DISTANCE_FROM_OBJECT: { - LineStyleThicknessModifier_DistanceFromObject *m = - (LineStyleThicknessModifier_DistanceFromObject *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_MATERIAL: { - LineStyleThicknessModifier_Material *m = (LineStyleThicknessModifier_Material *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_TANGENT: { - LineStyleThicknessModifier_Tangent *m = (LineStyleThicknessModifier_Tangent *)modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_CREASE_ANGLE: { - LineStyleThicknessModifier_CreaseAngle *m = (LineStyleThicknessModifier_CreaseAngle *) - modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - case LS_MODIFIER_CURVATURE_3D: { - LineStyleThicknessModifier_Curvature_3D *m = (LineStyleThicknessModifier_Curvature_3D *) - modifier; - BLO_read_data_address(reader, &m->curve); - BKE_curvemapping_blend_read(reader, m->curve); - break; - } - } -} - -static void direct_link_linestyle_geometry_modifier(BlendDataReader *UNUSED(reader), - LineStyleModifier *UNUSED(modifier)) -{ -} - -static void direct_link_linestyle(BlendDataReader *reader, FreestyleLineStyle *linestyle) -{ - BLO_read_data_address(reader, &linestyle->adt); - BKE_animdata_blend_read_data(reader, linestyle->adt); - BLO_read_list(reader, &linestyle->color_modifiers); - LISTBASE_FOREACH (LineStyleModifier *, modifier, &linestyle->color_modifiers) { - direct_link_linestyle_color_modifier(reader, modifier); - } - BLO_read_list(reader, &linestyle->alpha_modifiers); - LISTBASE_FOREACH (LineStyleModifier *, modifier, &linestyle->alpha_modifiers) { - direct_link_linestyle_alpha_modifier(reader, modifier); - } - BLO_read_list(reader, &linestyle->thickness_modifiers); - LISTBASE_FOREACH (LineStyleModifier *, modifier, &linestyle->thickness_modifiers) { - direct_link_linestyle_thickness_modifier(reader, modifier); - } - BLO_read_list(reader, &linestyle->geometry_modifiers); - LISTBASE_FOREACH (LineStyleModifier *, modifier, &linestyle->geometry_modifiers) { - direct_link_linestyle_geometry_modifier(reader, modifier); - } - for (int a = 0; a < MAX_MTEX; a++) { - BLO_read_data_address(reader, &linestyle->mtex[a]); - } -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Hair - * \{ */ - -static void lib_link_hair(BlendLibReader *reader, Hair *hair) -{ - for (int a = 0; a < hair->totcol; a++) { - BLO_read_id_address(reader, hair->id.lib, &hair->mat[a]); - } -} - -static void direct_link_hair(BlendDataReader *reader, Hair *hair) -{ - BLO_read_data_address(reader, &hair->adt); - BKE_animdata_blend_read_data(reader, hair->adt); - - /* Geometry */ - CustomData_blend_read(reader, &hair->pdata, hair->totpoint); - CustomData_blend_read(reader, &hair->cdata, hair->totcurve); - BKE_hair_update_customdata_pointers(hair); - - /* Materials */ - BLO_read_pointer_array(reader, (void **)&hair->mat); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Point Cloud - * \{ */ - -static void lib_link_pointcloud(BlendLibReader *reader, PointCloud *pointcloud) -{ - for (int a = 0; a < pointcloud->totcol; a++) { - BLO_read_id_address(reader, pointcloud->id.lib, &pointcloud->mat[a]); - } -} - -static void direct_link_pointcloud(BlendDataReader *reader, PointCloud *pointcloud) -{ - BLO_read_data_address(reader, &pointcloud->adt); - BKE_animdata_blend_read_data(reader, pointcloud->adt); - - /* Geometry */ - CustomData_blend_read(reader, &pointcloud->pdata, pointcloud->totpoint); - BKE_pointcloud_update_customdata_pointers(pointcloud); - - /* Materials */ - BLO_read_pointer_array(reader, (void **)&pointcloud->mat); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Volume - * \{ */ - -static void lib_link_volume(BlendLibReader *reader, Volume *volume) -{ - /* Needs to be done *after* cache pointers are restored (call to - * `foreach_cache`/`blo_cache_storage_entry_restore_in_new`), easier for now to do it in - * lib_link... */ - BKE_volume_init_grids(volume); - - for (int a = 0; a < volume->totcol; a++) { - BLO_read_id_address(reader, volume->id.lib, &volume->mat[a]); - } -} - -static void direct_link_volume(BlendDataReader *reader, Volume *volume) -{ - BLO_read_data_address(reader, &volume->adt); - BKE_animdata_blend_read_data(reader, volume->adt); - - volume->packedfile = direct_link_packedfile(reader, volume->packedfile); - volume->runtime.frame = 0; - - /* materials */ - BLO_read_pointer_array(reader, (void **)&volume->mat); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Simulation - * \{ */ - -static void lib_link_simulation(BlendLibReader *reader, Simulation *simulation) -{ - LISTBASE_FOREACH (SimulationDependency *, dependency, &simulation->dependencies) { - BLO_read_id_address(reader, simulation->id.lib, &dependency->id); - } -} - -static void direct_link_simulation(BlendDataReader *reader, Simulation *simulation) -{ - BLO_read_data_address(reader, &simulation->adt); - BKE_animdata_blend_read_data(reader, simulation->adt); - - BLO_read_list(reader, &simulation->states); - LISTBASE_FOREACH (SimulationState *, state, &simulation->states) { - BLO_read_data_address(reader, &state->name); - BLO_read_data_address(reader, &state->type); - if (STREQ(state->type, SIM_TYPE_NAME_PARTICLE_SIMULATION)) { - ParticleSimulationState *particle_state = (ParticleSimulationState *)state; - CustomData_blend_read(reader, &particle_state->attributes, particle_state->tot_particles); - } - } - - BLO_read_list(reader, &simulation->dependencies); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read Library Data Block * \{ */ @@ -8032,110 +6337,52 @@ static bool direct_link_id(FileData *fd, Main *main, const int tag, ID *id, ID * case ID_OB: direct_link_object(&reader, (Object *)id); break; - case ID_CU: - direct_link_curve(&reader, (Curve *)id); - break; - case ID_MB: - direct_link_mball(&reader, (MetaBall *)id); - break; - case ID_MA: - direct_link_material(&reader, (Material *)id); - break; - case ID_TE: - direct_link_texture(&reader, (Tex *)id); - break; - case ID_IM: - direct_link_image(&reader, (Image *)id); - break; - case ID_LA: - direct_link_light(&reader, (Light *)id); - break; - case ID_VF: - direct_link_vfont(&reader, (VFont *)id); - break; - case ID_TXT: - direct_link_text(&reader, (Text *)id); - break; case ID_IP: direct_link_ipo(&reader, (Ipo *)id); break; - case ID_KE: - direct_link_key(&reader, (Key *)id); - break; - case ID_WO: - direct_link_world(&reader, (World *)id); - break; case ID_LI: direct_link_library(fd, (Library *)id, main); break; - case ID_CA: - direct_link_camera(&reader, (Camera *)id); - break; - case ID_SPK: - direct_link_speaker(&reader, (Speaker *)id); - break; - case ID_SO: - direct_link_sound(&reader, (bSound *)id); - break; - case ID_LP: - direct_link_lightprobe(&reader, (LightProbe *)id); - break; case ID_GR: direct_link_collection(&reader, (Collection *)id); break; - case ID_AR: - direct_link_armature(&reader, (bArmature *)id); - break; - case ID_AC: - direct_link_action(&reader, (bAction *)id); - break; - case ID_NT: - direct_link_nodetree(&reader, (bNodeTree *)id); - break; - case ID_BR: - direct_link_brush(&reader, (Brush *)id); - break; case ID_PA: direct_link_particlesettings(&reader, (ParticleSettings *)id); break; - case ID_GD: - direct_link_gpencil(&reader, (bGPdata *)id); - break; - case ID_MC: - direct_link_movieclip(&reader, (MovieClip *)id); - break; - case ID_MSK: - direct_link_mask(&reader, (Mask *)id); + case ID_WS: + direct_link_workspace(&reader, (WorkSpace *)id, main); break; + case ID_ME: + case ID_LT: + case ID_AC: + case ID_NT: case ID_LS: - direct_link_linestyle(&reader, (FreestyleLineStyle *)id); - break; + case ID_TXT: + case ID_VF: + case ID_MC: case ID_PAL: - direct_link_palette(&reader, (Palette *)id); - break; case ID_PC: - direct_link_paint_curve(&reader, (PaintCurve *)id); - break; - case ID_CF: - direct_link_cachefile(&reader, (CacheFile *)id); - break; - case ID_WS: - direct_link_workspace(&reader, (WorkSpace *)id, main); - break; + case ID_BR: + case ID_IM: + case ID_LA: + case ID_MA: + case ID_MB: + case ID_CU: + case ID_CA: + case ID_WO: + case ID_MSK: + case ID_SPK: + case ID_AR: + case ID_LP: + case ID_KE: + case ID_TE: + case ID_GD: case ID_HA: - direct_link_hair(&reader, (Hair *)id); - break; case ID_PT: - direct_link_pointcloud(&reader, (PointCloud *)id); - break; case ID_VO: - direct_link_volume(&reader, (Volume *)id); - break; case ID_SIM: - direct_link_simulation(&reader, (Simulation *)id); - break; - case ID_ME: - case ID_LT: + case ID_SO: + case ID_CF: /* Do nothing. Handled by IDTypeInfo callback. */ break; } @@ -8741,9 +6988,6 @@ static void lib_link_all(FileData *fd, Main *bmain) * Please keep order of entries in that switch matching that order, it's easier to quickly see * whether something is wrong then. */ switch (GS(id->name)) { - case ID_MSK: - lib_link_mask(&reader, (Mask *)id); - break; case ID_WM: lib_link_windowmanager(&reader, (wmWindowManager *)id); break; @@ -8754,114 +6998,58 @@ static void lib_link_all(FileData *fd, Main *bmain) case ID_SCE: lib_link_scene(&reader, (Scene *)id); break; - case ID_LS: - lib_link_linestyle(&reader, (FreestyleLineStyle *)id); - break; case ID_OB: lib_link_object(&reader, (Object *)id); break; case ID_SCR: - /* DO NOT skip screens here, - * 3D viewport may contains pointers to other ID data (like bgpic)! See T41411. */ + /* DO NOT skip screens here, 3D viewport may contains pointers + * to other ID data (like #View3D.ob_center)! See T41411. */ lib_link_screen(&reader, (bScreen *)id); break; - case ID_MC: - lib_link_movieclip(&reader, (MovieClip *)id); - break; - case ID_WO: - lib_link_world(&reader, (World *)id); - break; - case ID_LP: - lib_link_lightprobe(&reader, (LightProbe *)id); - break; - case ID_SPK: - lib_link_speaker(&reader, (Speaker *)id); - break; case ID_PA: lib_link_particlesettings(&reader, (ParticleSettings *)id); break; - case ID_PC: - lib_link_paint_curve(&reader, (PaintCurve *)id); - break; - case ID_BR: - lib_link_brush(&reader, (Brush *)id); - break; case ID_GR: lib_link_collection(&reader, (Collection *)id); break; - case ID_SO: - lib_link_sound(&reader, (bSound *)id); - break; - case ID_TXT: - lib_link_text(&reader, (Text *)id); + case ID_IP: + /* XXX deprecated... still needs to be maintained for version patches still. */ + lib_link_ipo(&reader, (Ipo *)id); break; - case ID_CA: - lib_link_camera(&reader, (Camera *)id); + case ID_LI: + lib_link_library(&reader, (Library *)id); /* Only init users. */ break; + case ID_ME: + case ID_LT: + case ID_AC: + case ID_NT: + case ID_LS: + case ID_TXT: + case ID_VF: + case ID_MC: + case ID_PAL: + case ID_PC: + case ID_BR: + case ID_IM: case ID_LA: - lib_link_light(&reader, (Light *)id); - break; + case ID_MA: case ID_MB: - lib_link_mball(&reader, (MetaBall *)id); - break; case ID_CU: - lib_link_curve(&reader, (Curve *)id); - break; - case ID_CF: - lib_link_cachefiles(&reader, (CacheFile *)id); - break; + case ID_CA: + case ID_WO: + case ID_MSK: + case ID_SPK: case ID_AR: - lib_link_armature(&reader, (bArmature *)id); - break; - case ID_VF: - lib_link_vfont(&reader, (VFont *)id); - break; + case ID_LP: + case ID_KE: + case ID_TE: + case ID_GD: case ID_HA: - lib_link_hair(&reader, (Hair *)id); - break; case ID_PT: - lib_link_pointcloud(&reader, (PointCloud *)id); - break; case ID_VO: - lib_link_volume(&reader, (Volume *)id); - break; - case ID_MA: - lib_link_material(&reader, (Material *)id); - break; - case ID_TE: - lib_link_texture(&reader, (Tex *)id); - break; - case ID_IM: - lib_link_image(&reader, (Image *)id); - break; - case ID_NT: - /* Has to be done after node users (scene/materials/...), this will verify group nodes. */ - lib_link_nodetree(&reader, (bNodeTree *)id); - break; - case ID_GD: - lib_link_gpencil(&reader, (bGPdata *)id); - break; - case ID_PAL: - lib_link_palette(&reader, (Palette *)id); - break; - case ID_KE: - lib_link_key(&reader, (Key *)id); - break; - case ID_AC: - lib_link_action(&reader, (bAction *)id); - break; case ID_SIM: - lib_link_simulation(&reader, (Simulation *)id); - break; - case ID_IP: - /* XXX deprecated... still needs to be maintained for version patches still. */ - lib_link_ipo(&reader, (Ipo *)id); - break; - case ID_LI: - lib_link_library(&reader, (Library *)id); /* Only init users. */ - break; - case ID_ME: - case ID_LT: + case ID_SO: + case ID_CF: /* Do nothing. Handled by IDTypeInfo callback. */ break; } @@ -9445,7 +7633,6 @@ static void expand_constraint_channels(BlendExpander *expander, ListBase *chanba } static void expand_id(BlendExpander *expander, ID *id); -static void expand_nodetree(BlendExpander *expander, bNodeTree *ntree); static void expand_collection(BlendExpander *expander, Collection *collection); static void expand_id_embedded_id(BlendExpander *expander, ID *id) @@ -9454,7 +7641,7 @@ static void expand_id_embedded_id(BlendExpander *expander, ID *id) bNodeTree *nodetree = ntreeFromID(id); if (nodetree != NULL) { expand_id(expander, &nodetree->id); - expand_nodetree(expander, nodetree); + ntreeBlendReadExpand(expander, nodetree); } if (GS(id->name) == ID_SCE) { @@ -9483,35 +7670,6 @@ static void expand_id(BlendExpander *expander, ID *id) expand_id_embedded_id(expander, id); } -static void expand_action(BlendExpander *expander, bAction *act) -{ - // XXX deprecated - old animation system -------------- - LISTBASE_FOREACH (bActionChannel *, chan, &act->chanbase) { - BLO_expand(expander, chan->ipo); - expand_constraint_channels(expander, &chan->constraintChannels); - } - // --------------------------------------------------- - - /* F-Curves in Action */ - BKE_fcurve_blend_read_expand(expander, &act->curves); - - LISTBASE_FOREACH (TimeMarker *, marker, &act->markers) { - if (marker->camera) { - BLO_expand(expander, marker->camera); - } - } -} - -static void expand_keyingsets(BlendExpander *expander, ListBase *list) -{ - /* expand the ID-pointers in KeyingSets's paths */ - LISTBASE_FOREACH (KeyingSet *, ks, list) { - LISTBASE_FOREACH (KS_Path *, ksp, &ks->paths) { - BLO_expand(expander, ksp->id); - } - } -} - static void expand_particlesettings(BlendExpander *expander, ParticleSettings *part) { BLO_expand(expander, part->instance_object); @@ -9577,136 +7735,6 @@ static void expand_collection(BlendExpander *expander, Collection *collection) #endif } -static void expand_key(BlendExpander *expander, Key *key) -{ - BLO_expand(expander, key->ipo); // XXX deprecated - old animation system -} - -static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock) -{ - IDP_BlendReadExpand(expander, sock->prop); - - if (sock->default_value != NULL) { - - switch ((eNodeSocketDatatype)sock->type) { - case SOCK_OBJECT: { - bNodeSocketValueObject *default_value = sock->default_value; - BLO_expand(expander, default_value->value); - break; - } - case SOCK_IMAGE: { - bNodeSocketValueImage *default_value = sock->default_value; - BLO_expand(expander, default_value->value); - break; - } - case SOCK_FLOAT: - case SOCK_VECTOR: - case SOCK_RGBA: - case SOCK_BOOLEAN: - case SOCK_INT: - case SOCK_STRING: - case __SOCK_MESH: - case SOCK_CUSTOM: - case SOCK_SHADER: - case SOCK_EMITTERS: - case SOCK_EVENTS: - case SOCK_FORCES: - case SOCK_CONTROL_FLOW: - break; - } - } -} - -static void expand_node_sockets(BlendExpander *expander, ListBase *sockets) -{ - LISTBASE_FOREACH (bNodeSocket *, sock, sockets) { - expand_node_socket(expander, sock); - } -} - -static void expand_nodetree(BlendExpander *expander, bNodeTree *ntree) -{ - if (ntree->gpd) { - BLO_expand(expander, ntree->gpd); - } - - LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { - if (node->id && node->type != CMP_NODE_R_LAYERS) { - BLO_expand(expander, node->id); - } - - IDP_BlendReadExpand(expander, node->prop); - - expand_node_sockets(expander, &node->inputs); - expand_node_sockets(expander, &node->outputs); - } - - expand_node_sockets(expander, &ntree->inputs); - expand_node_sockets(expander, &ntree->outputs); -} - -static void expand_texture(BlendExpander *expander, Tex *tex) -{ - BLO_expand(expander, tex->ima); - BLO_expand(expander, tex->ipo); // XXX deprecated - old animation system -} - -static void expand_brush(BlendExpander *expander, Brush *brush) -{ - BLO_expand(expander, brush->mtex.tex); - BLO_expand(expander, brush->mask_mtex.tex); - BLO_expand(expander, brush->clone.image); - BLO_expand(expander, brush->paint_curve); - if (brush->gpencil_settings != NULL) { - BLO_expand(expander, brush->gpencil_settings->material); - } -} - -static void expand_material(BlendExpander *expander, Material *ma) -{ - BLO_expand(expander, ma->ipo); // XXX deprecated - old animation system - - if (ma->gp_style) { - MaterialGPencilStyle *gp_style = ma->gp_style; - BLO_expand(expander, gp_style->sima); - BLO_expand(expander, gp_style->ima); - } -} - -static void expand_light(BlendExpander *expander, Light *la) -{ - BLO_expand(expander, la->ipo); // XXX deprecated - old animation system -} - -static void expand_world(BlendExpander *expander, World *wrld) -{ - BLO_expand(expander, wrld->ipo); // XXX deprecated - old animation system -} - -static void expand_mball(BlendExpander *expander, MetaBall *mb) -{ - for (int a = 0; a < mb->totcol; a++) { - BLO_expand(expander, mb->mat[a]); - } -} - -static void expand_curve(BlendExpander *expander, Curve *cu) -{ - for (int a = 0; a < cu->totcol; a++) { - BLO_expand(expander, cu->mat[a]); - } - - BLO_expand(expander, cu->vfont); - BLO_expand(expander, cu->vfontb); - BLO_expand(expander, cu->vfonti); - BLO_expand(expander, cu->vfontbi); - BLO_expand(expander, cu->key); - BLO_expand(expander, cu->ipo); // XXX deprecated - old animation system - BLO_expand(expander, cu->bevobj); - BLO_expand(expander, cu->taperobj); - BLO_expand(expander, cu->textoncurve); -} - /* callback function used to expand constraint ID-links */ static void expand_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, @@ -9742,22 +7770,6 @@ static void expand_pose(BlendExpander *expander, bPose *pose) } } -static void expand_bones(BlendExpander *expander, Bone *bone) -{ - IDP_BlendReadExpand(expander, bone->prop); - - LISTBASE_FOREACH (Bone *, curBone, &bone->childbase) { - expand_bones(expander, curBone); - } -} - -static void expand_armature(BlendExpander *expander, bArmature *arm) -{ - LISTBASE_FOREACH (Bone *, curBone, &arm->bonebase) { - expand_bones(expander, curBone); - } -} - static void expand_object_expandModifiers(void *userData, Object *UNUSED(ob), ID **idpoin, @@ -9869,7 +7881,7 @@ static void expand_scene(BlendExpander *expander, Scene *sce) BLO_expand(expander, sce->camera); BLO_expand(expander, sce->world); - expand_keyingsets(expander, &sce->keyingsets); + BKE_keyingsets_blend_read_expand(expander, &sce->keyingsets); if (sce->set) { BLO_expand(expander, sce->set); @@ -9965,100 +7977,6 @@ static void expand_scene(BlendExpander *expander, Scene *sce) } } -static void expand_camera(BlendExpander *expander, Camera *ca) -{ - BLO_expand(expander, ca->ipo); // XXX deprecated - old animation system - - LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) { - if (bgpic->source == CAM_BGIMG_SOURCE_IMAGE) { - BLO_expand(expander, bgpic->ima); - } - else if (bgpic->source == CAM_BGIMG_SOURCE_MOVIE) { - BLO_expand(expander, bgpic->ima); - } - } -} - -static void expand_cachefile(BlendExpander *UNUSED(expander), CacheFile *UNUSED(cache_file)) -{ -} - -static void expand_speaker(BlendExpander *expander, Speaker *spk) -{ - BLO_expand(expander, spk->sound); -} - -static void expand_sound(BlendExpander *expander, bSound *snd) -{ - BLO_expand(expander, snd->ipo); // XXX deprecated - old animation system -} - -static void expand_lightprobe(BlendExpander *UNUSED(expander), LightProbe *UNUSED(prb)) -{ -} - -static void expand_movieclip(BlendExpander *UNUSED(expander), MovieClip *UNUSED(clip)) -{ -} - -static void expand_mask_parent(BlendExpander *expander, MaskParent *parent) -{ - if (parent->id) { - BLO_expand(expander, parent->id); - } -} - -static void expand_mask(BlendExpander *expander, Mask *mask) -{ - LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) { - LISTBASE_FOREACH (MaskSpline *, spline, &mask_layer->splines) { - for (int i = 0; i < spline->tot_point; i++) { - MaskSplinePoint *point = &spline->points[i]; - expand_mask_parent(expander, &point->parent); - } - - expand_mask_parent(expander, &spline->parent); - } - } -} - -static void expand_linestyle(BlendExpander *expander, FreestyleLineStyle *linestyle) -{ - for (int a = 0; a < MAX_MTEX; a++) { - if (linestyle->mtex[a]) { - BLO_expand(expander, linestyle->mtex[a]->tex); - BLO_expand(expander, linestyle->mtex[a]->object); - } - } - - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->color_modifiers) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - BLO_expand(expander, ((LineStyleColorModifier_DistanceFromObject *)m)->target); - } - } - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->alpha_modifiers) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - BLO_expand(expander, ((LineStyleAlphaModifier_DistanceFromObject *)m)->target); - } - } - LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->thickness_modifiers) { - if (m->type == LS_MODIFIER_DISTANCE_FROM_OBJECT) { - BLO_expand(expander, ((LineStyleThicknessModifier_DistanceFromObject *)m)->target); - } - } -} - -static void expand_gpencil(BlendExpander *expander, bGPdata *gpd) -{ - LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { - BLO_expand(expander, gpl->parent); - } - - for (int a = 0; a < gpd->totcol; a++) { - BLO_expand(expander, gpd->mat[a]); - } -} - static void expand_workspace(BlendExpander *expander, WorkSpace *workspace) { LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) { @@ -10066,34 +7984,6 @@ static void expand_workspace(BlendExpander *expander, WorkSpace *workspace) } } -static void expand_hair(BlendExpander *expander, Hair *hair) -{ - for (int a = 0; a < hair->totcol; a++) { - BLO_expand(expander, hair->mat[a]); - } -} - -static void expand_pointcloud(BlendExpander *expander, PointCloud *pointcloud) -{ - for (int a = 0; a < pointcloud->totcol; a++) { - BLO_expand(expander, pointcloud->mat[a]); - } -} - -static void expand_volume(BlendExpander *expander, Volume *volume) -{ - for (int a = 0; a < volume->totcol; a++) { - BLO_expand(expander, volume->mat[a]); - } -} - -static void expand_simulation(BlendExpander *expander, Simulation *simulation) -{ - LISTBASE_FOREACH (SimulationDependency *, dependency, &simulation->dependencies) { - BLO_expand(expander, dependency->id); - } -} - /** * Set the callback func used over all ID data found by \a BLO_expand_main func. * @@ -10140,93 +8030,21 @@ void BLO_expand_main(void *fdhandle, Main *mainvar) case ID_OB: expand_object(&expander, (Object *)id); break; - case ID_CU: - expand_curve(&expander, (Curve *)id); - break; - case ID_MB: - expand_mball(&expander, (MetaBall *)id); - break; case ID_SCE: expand_scene(&expander, (Scene *)id); break; - case ID_MA: - expand_material(&expander, (Material *)id); - break; - case ID_TE: - expand_texture(&expander, (Tex *)id); - break; - case ID_WO: - expand_world(&expander, (World *)id); - break; - case ID_LA: - expand_light(&expander, (Light *)id); - break; - case ID_KE: - expand_key(&expander, (Key *)id); - break; - case ID_CA: - expand_camera(&expander, (Camera *)id); - break; - case ID_SPK: - expand_speaker(&expander, (Speaker *)id); - break; - case ID_SO: - expand_sound(&expander, (bSound *)id); - break; - case ID_LP: - expand_lightprobe(&expander, (LightProbe *)id); - break; - case ID_AR: - expand_armature(&expander, (bArmature *)id); - break; - case ID_AC: - expand_action(&expander, (bAction *)id); // XXX deprecated - old animation system - break; case ID_GR: expand_collection(&expander, (Collection *)id); break; - case ID_NT: - expand_nodetree(&expander, (bNodeTree *)id); - break; - case ID_BR: - expand_brush(&expander, (Brush *)id); - break; case ID_IP: expand_ipo(&expander, (Ipo *)id); // XXX deprecated - old animation system break; case ID_PA: expand_particlesettings(&expander, (ParticleSettings *)id); break; - case ID_MC: - expand_movieclip(&expander, (MovieClip *)id); - break; - case ID_MSK: - expand_mask(&expander, (Mask *)id); - break; - case ID_LS: - expand_linestyle(&expander, (FreestyleLineStyle *)id); - break; - case ID_GD: - expand_gpencil(&expander, (bGPdata *)id); - break; - case ID_CF: - expand_cachefile(&expander, (CacheFile *)id); - break; case ID_WS: expand_workspace(&expander, (WorkSpace *)id); break; - case ID_HA: - expand_hair(&expander, (Hair *)id); - break; - case ID_PT: - expand_pointcloud(&expander, (PointCloud *)id); - break; - case ID_VO: - expand_volume(&expander, (Volume *)id); - break; - case ID_SIM: - expand_simulation(&expander, (Simulation *)id); - break; default: break; } |