diff options
author | Jacques Lucke <jacques@blender.org> | 2020-10-30 18:40:41 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-10-30 18:40:41 +0300 |
commit | 1103809fabe9da4a13755480e19b13d56cd27843 (patch) | |
tree | 99d975d7d24ded60fb7f083e0758a3950e8696b0 /source/blender/blenloader | |
parent | 5b89d49b0d297a33271a311f80ff503b3412686a (diff) | |
parent | 62e532785dfd5bd25fb6b1269ec41ea81a32c4c9 (diff) |
Merge branch 'master' into geometry-nodes
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/BLO_read_write.h | 12 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1115 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.h | 1 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_250.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 435 |
5 files changed, 59 insertions, 1506 deletions
diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h index 5d685cc6687..3600ae504a1 100644 --- a/source/blender/blenloader/BLO_read_write.h +++ b/source/blender/blenloader/BLO_read_write.h @@ -52,6 +52,8 @@ typedef struct BlendExpander BlendExpander; typedef struct BlendLibReader BlendLibReader; typedef struct BlendWriter BlendWriter; +struct Main; + /* Blend Write API * =============== * @@ -106,6 +108,14 @@ void BLO_write_struct_at_address_by_id(BlendWriter *writer, BLO_write_struct_at_address_by_id( \ writer, BLO_get_struct_id(writer, struct_name), address, data_ptr) +/* Write single struct at address and specify a filecode. */ +void BLO_write_struct_at_address_by_id_with_filecode( + BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr); +#define BLO_write_struct_at_address_with_filecode( \ + writer, filecode, struct_name, address, data_ptr) \ + BLO_write_struct_at_address_by_id_with_filecode( \ + writer, filecode, BLO_get_struct_id(writer, struct_name), address, data_ptr) + /* Write struct array. */ void BLO_write_struct_array_by_name(BlendWriter *writer, const char *struct_name, @@ -177,6 +187,7 @@ bool BLO_write_is_undo(BlendWriter *writer); */ void *BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address); +void *BLO_read_get_new_data_address_no_us(BlendDataReader *reader, const void *old_address); void *BLO_read_get_new_packed_address(BlendDataReader *reader, const void *old_address); #define BLO_read_data_address(reader, ptr_p) \ @@ -214,6 +225,7 @@ ID *BLO_read_get_new_id_address(BlendLibReader *reader, struct Library *lib, str /* Misc. */ bool BLO_read_lib_is_undo(BlendLibReader *reader); +struct Main *BLO_read_lib_get_main(BlendLibReader *reader); /* Blend Expand API * =================== diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 5ff3d383a72..32056d03509 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -267,10 +267,6 @@ static BHead *find_bhead_from_code_name(FileData *fd, const short idcode, const static BHead *find_bhead_from_idname(FileData *fd, const char *idname); static bool library_link_idcode_needs_tag_check(const short idcode, const int flag); -#ifdef USE_COLLECTION_COMPAT_28 -static void expand_scene_collection(BlendExpander *expander, SceneCollection *sc); -#endif - typedef struct BHeadN { struct BHeadN *next, *prev; #ifdef USE_BHEAD_READ_ON_DEMAND @@ -2261,7 +2257,6 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */ * \{ */ static void lib_link_id(BlendLibReader *reader, ID *id); -static void lib_link_collection(BlendLibReader *reader, Collection *collection); static void lib_link_id_embedded_id(BlendLibReader *reader, ID *id) { @@ -2277,7 +2272,7 @@ static void lib_link_id_embedded_id(BlendLibReader *reader, ID *id) Scene *scene = (Scene *)id; if (scene->master_collection != NULL) { lib_link_id(reader, &scene->master_collection->id); - lib_link_collection(reader, scene->master_collection); + BKE_collection_blend_read_lib(reader, scene->master_collection); } } } @@ -2324,7 +2319,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_collection(BlendDataReader *reader, Collection *collection); static void direct_link_id_embedded_id(BlendDataReader *reader, Library *current_library, @@ -2352,7 +2346,7 @@ static void direct_link_id_embedded_id(BlendDataReader *reader, &scene->master_collection->id, id_old != NULL ? &((Scene *)id_old)->master_collection->id : NULL, 0); - direct_link_collection(reader, scene->master_collection); + BKE_collection_blend_read_data(reader, scene->master_collection); } } } @@ -2574,69 +2568,6 @@ static void lib_link_constraint_channels(BlendLibReader *reader, ID *id, ListBas /** \name Read ID: WorkSpace * \{ */ -static void lib_link_workspaces(BlendLibReader *reader, WorkSpace *workspace) -{ - ID *id = (ID *)workspace; - - /* Restore proper 'parent' pointers to relevant data, and clean up unused/invalid entries. */ - LISTBASE_FOREACH_MUTABLE (WorkSpaceDataRelation *, relation, &workspace->hook_layout_relations) { - relation->parent = NULL; - LISTBASE_FOREACH (wmWindowManager *, wm, &reader->main->wm) { - LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { - if (win->winid == relation->parentid) { - relation->parent = win->workspace_hook; - } - } - } - if (relation->parent == NULL) { - BLI_freelinkN(&workspace->hook_layout_relations, relation); - } - } - - LISTBASE_FOREACH_MUTABLE (WorkSpaceLayout *, layout, &workspace->layouts) { - BLO_read_id_address(reader, id->lib, &layout->screen); - - if (layout->screen) { - if (ID_IS_LINKED(id)) { - layout->screen->winid = 0; - if (layout->screen->temp) { - /* delete temp layouts when appending */ - BKE_workspace_layout_remove(reader->main, workspace, layout); - } - } - } - else { - /* If we're reading a layout without screen stored, it's useless and we shouldn't keep it - * around. */ - BKE_workspace_layout_remove(reader->main, workspace, layout); - } - } -} - -static void direct_link_workspace(BlendDataReader *reader, WorkSpace *workspace) -{ - BLO_read_list(reader, &workspace->layouts); - BLO_read_list(reader, &workspace->hook_layout_relations); - BLO_read_list(reader, &workspace->owner_ids); - BLO_read_list(reader, &workspace->tools); - - LISTBASE_FOREACH (WorkSpaceDataRelation *, relation, &workspace->hook_layout_relations) { - /* parent pointer does not belong to workspace data and is therefore restored in lib_link step - * of window manager.*/ - BLO_read_data_address(reader, &relation->value); - } - - LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) { - tref->runtime = NULL; - BLO_read_data_address(reader, &tref->properties); - IDP_BlendDataRead(reader, &tref->properties); - } - - workspace->status_text = NULL; - - id_us_ensure_real(&workspace->id); -} - static void lib_link_workspace_instance_hook(BlendLibReader *reader, WorkSpaceInstanceHook *hook, ID *id) @@ -2910,132 +2841,6 @@ static void direct_link_pointcache_list(BlendDataReader *reader, } } -static void lib_link_partdeflect(BlendLibReader *reader, ID *id, PartDeflect *pd) -{ - if (pd && pd->tex) { - BLO_read_id_address(reader, id->lib, &pd->tex); - } - if (pd && pd->f_source) { - BLO_read_id_address(reader, id->lib, &pd->f_source); - } -} - -static void lib_link_particlesettings(BlendLibReader *reader, ParticleSettings *part) -{ - BLO_read_id_address( - reader, part->id.lib, &part->ipo); /* XXX deprecated - old animation system */ - - BLO_read_id_address(reader, part->id.lib, &part->instance_object); - BLO_read_id_address(reader, part->id.lib, &part->instance_collection); - BLO_read_id_address(reader, part->id.lib, &part->force_group); - BLO_read_id_address(reader, part->id.lib, &part->bb_ob); - BLO_read_id_address(reader, part->id.lib, &part->collision_group); - - lib_link_partdeflect(reader, &part->id, part->pd); - lib_link_partdeflect(reader, &part->id, part->pd2); - - if (part->effector_weights) { - BLO_read_id_address(reader, part->id.lib, &part->effector_weights->group); - } - else { - part->effector_weights = BKE_effector_add_weights(part->force_group); - } - - if (part->instance_weights.first && part->instance_collection) { - LISTBASE_FOREACH (ParticleDupliWeight *, dw, &part->instance_weights) { - BLO_read_id_address(reader, part->id.lib, &dw->ob); - } - } - else { - BLI_listbase_clear(&part->instance_weights); - } - - if (part->boids) { - LISTBASE_FOREACH (BoidState *, state, &part->boids->states) { - LISTBASE_FOREACH (BoidRule *, rule, &state->rules) { - switch (rule->type) { - case eBoidRuleType_Goal: - case eBoidRuleType_Avoid: { - BoidRuleGoalAvoid *brga = (BoidRuleGoalAvoid *)rule; - BLO_read_id_address(reader, part->id.lib, &brga->ob); - break; - } - case eBoidRuleType_FollowLeader: { - BoidRuleFollowLeader *brfl = (BoidRuleFollowLeader *)rule; - BLO_read_id_address(reader, part->id.lib, &brfl->ob); - break; - } - } - } - } - } - - for (int a = 0; a < MAX_MTEX; a++) { - MTex *mtex = part->mtex[a]; - if (mtex) { - BLO_read_id_address(reader, part->id.lib, &mtex->tex); - BLO_read_id_address(reader, part->id.lib, &mtex->object); - } - } -} - -static void direct_link_partdeflect(PartDeflect *pd) -{ - if (pd) { - pd->rng = NULL; - } -} - -static void direct_link_particlesettings(BlendDataReader *reader, ParticleSettings *part) -{ - BLO_read_data_address(reader, &part->adt); - BLO_read_data_address(reader, &part->pd); - BLO_read_data_address(reader, &part->pd2); - - BKE_animdata_blend_read_data(reader, part->adt); - direct_link_partdeflect(part->pd); - direct_link_partdeflect(part->pd2); - - BLO_read_data_address(reader, &part->clumpcurve); - if (part->clumpcurve) { - BKE_curvemapping_blend_read(reader, part->clumpcurve); - } - BLO_read_data_address(reader, &part->roughcurve); - if (part->roughcurve) { - BKE_curvemapping_blend_read(reader, part->roughcurve); - } - BLO_read_data_address(reader, &part->twistcurve); - if (part->twistcurve) { - BKE_curvemapping_blend_read(reader, part->twistcurve); - } - - BLO_read_data_address(reader, &part->effector_weights); - if (!part->effector_weights) { - part->effector_weights = BKE_effector_add_weights(part->force_group); - } - - BLO_read_list(reader, &part->instance_weights); - - BLO_read_data_address(reader, &part->boids); - BLO_read_data_address(reader, &part->fluid); - - if (part->boids) { - BLO_read_list(reader, &part->boids->states); - - LISTBASE_FOREACH (BoidState *, state, &part->boids->states) { - BLO_read_list(reader, &state->rules); - BLO_read_list(reader, &state->conditions); - BLO_read_list(reader, &state->actions); - } - } - for (int a = 0; a < MAX_MTEX; a++) { - BLO_read_data_address(reader, &part->mtex[a]); - } - - /* Protect against integer overflow vulnerability. */ - CLAMP(part->trail_count, 1, 100000); -} - static void lib_link_particlesystems(BlendLibReader *reader, Object *ob, ID *id, @@ -3361,7 +3166,7 @@ static void lib_link_object(BlendLibReader *reader, Object *ob) /* texture field */ if (ob->pd) { - lib_link_partdeflect(reader, &ob->id, ob->pd); + BKE_particle_partdeflect_blend_read_lib(reader, &ob->id, ob->pd); } if (ob->soft) { @@ -3945,7 +3750,7 @@ static void direct_link_object(BlendDataReader *reader, Object *ob) } BLO_read_data_address(reader, &ob->pd); - direct_link_partdeflect(ob->pd); + BKE_particle_partdeflect_blend_read_data(reader, ob->pd); BLO_read_data_address(reader, &ob->soft); if (ob->soft) { SoftBody *sb = ob->soft; @@ -4061,187 +3866,6 @@ static void direct_link_view_settings(BlendDataReader *reader, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read View Layer (Collection Data) - * \{ */ - -static void direct_link_layer_collections(BlendDataReader *reader, ListBase *lb, bool master) -{ - BLO_read_list(reader, lb); - LISTBASE_FOREACH (LayerCollection *, lc, lb) { -#ifdef USE_COLLECTION_COMPAT_28 - BLO_read_data_address(reader, &lc->scene_collection); -#endif - - /* Master collection is not a real data-lock. */ - if (master) { - BLO_read_data_address(reader, &lc->collection); - } - - direct_link_layer_collections(reader, &lc->layer_collections, false); - } -} - -static void direct_link_view_layer(BlendDataReader *reader, ViewLayer *view_layer) -{ - view_layer->stats = NULL; - BLO_read_list(reader, &view_layer->object_bases); - BLO_read_data_address(reader, &view_layer->basact); - - direct_link_layer_collections(reader, &view_layer->layer_collections, true); - BLO_read_data_address(reader, &view_layer->active_collection); - - BLO_read_data_address(reader, &view_layer->id_properties); - IDP_BlendDataRead(reader, &view_layer->id_properties); - - BLO_read_list(reader, &(view_layer->freestyle_config.modules)); - BLO_read_list(reader, &(view_layer->freestyle_config.linesets)); - - BLI_listbase_clear(&view_layer->drawdata); - view_layer->object_bases_array = NULL; - view_layer->object_bases_hash = NULL; -} - -static void lib_link_layer_collection(BlendLibReader *reader, - Library *lib, - LayerCollection *layer_collection, - bool master) -{ - /* Master collection is not a real data-lock. */ - if (!master) { - BLO_read_id_address(reader, lib, &layer_collection->collection); - } - - LISTBASE_FOREACH ( - LayerCollection *, layer_collection_nested, &layer_collection->layer_collections) { - lib_link_layer_collection(reader, lib, layer_collection_nested, false); - } -} - -static void lib_link_view_layer(BlendLibReader *reader, Library *lib, ViewLayer *view_layer) -{ - LISTBASE_FOREACH (FreestyleModuleConfig *, fmc, &view_layer->freestyle_config.modules) { - BLO_read_id_address(reader, lib, &fmc->script); - } - - LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) { - BLO_read_id_address(reader, lib, &fls->linestyle); - BLO_read_id_address(reader, lib, &fls->group); - } - - for (Base *base = view_layer->object_bases.first, *base_next = NULL; base; base = base_next) { - base_next = base->next; - - /* we only bump the use count for the collection objects */ - BLO_read_id_address(reader, lib, &base->object); - - if (base->object == NULL) { - /* Free in case linked object got lost. */ - BLI_freelinkN(&view_layer->object_bases, base); - if (view_layer->basact == base) { - view_layer->basact = NULL; - } - } - } - - LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) { - lib_link_layer_collection(reader, lib, layer_collection, true); - } - - BLO_read_id_address(reader, lib, &view_layer->mat_override); - - IDP_BlendReadLib(reader, view_layer->id_properties); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ -/** \name Read ID: Collection - * \{ */ - -#ifdef USE_COLLECTION_COMPAT_28 -static void direct_link_scene_collection(BlendDataReader *reader, SceneCollection *sc) -{ - BLO_read_list(reader, &sc->objects); - BLO_read_list(reader, &sc->scene_collections); - - LISTBASE_FOREACH (SceneCollection *, nsc, &sc->scene_collections) { - direct_link_scene_collection(reader, nsc); - } -} - -static void lib_link_scene_collection(BlendLibReader *reader, Library *lib, SceneCollection *sc) -{ - LISTBASE_FOREACH (LinkData *, link, &sc->objects) { - BLO_read_id_address(reader, lib, &link->data); - BLI_assert(link->data); - } - - LISTBASE_FOREACH (SceneCollection *, nsc, &sc->scene_collections) { - lib_link_scene_collection(reader, lib, nsc); - } -} -#endif - -static void direct_link_collection(BlendDataReader *reader, Collection *collection) -{ - BLO_read_list(reader, &collection->gobject); - BLO_read_list(reader, &collection->children); - - BLO_read_data_address(reader, &collection->preview); - BKE_previewimg_blend_read(reader, collection->preview); - - collection->flag &= ~COLLECTION_HAS_OBJECT_CACHE; - collection->tag = 0; - BLI_listbase_clear(&collection->object_cache); - BLI_listbase_clear(&collection->parents); - -#ifdef USE_COLLECTION_COMPAT_28 - /* This runs before the very first doversion. */ - BLO_read_data_address(reader, &collection->collection); - if (collection->collection != NULL) { - direct_link_scene_collection(reader, collection->collection); - } - - BLO_read_data_address(reader, &collection->view_layer); - if (collection->view_layer != NULL) { - direct_link_view_layer(reader, collection->view_layer); - } -#endif -} - -static void lib_link_collection_data(BlendLibReader *reader, Library *lib, Collection *collection) -{ - LISTBASE_FOREACH_MUTABLE (CollectionObject *, cob, &collection->gobject) { - BLO_read_id_address(reader, lib, &cob->ob); - - if (cob->ob == NULL) { - BLI_freelinkN(&collection->gobject, cob); - } - } - - LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { - BLO_read_id_address(reader, lib, &child->collection); - } -} - -static void lib_link_collection(BlendLibReader *reader, Collection *collection) -{ -#ifdef USE_COLLECTION_COMPAT_28 - if (collection->collection) { - lib_link_scene_collection(reader, collection->id.lib, collection->collection); - } - - if (collection->view_layer) { - lib_link_view_layer(reader, collection->id.lib, collection->view_layer); - } -#endif - - lib_link_collection_data(reader, collection->id.lib, collection); -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name Read ID: Scene * \{ */ @@ -4322,14 +3946,6 @@ static void direct_link_lightcache(BlendDataReader *reader, LightCache *cache) BLO_read_data_address(reader, &cache->grid_data); } -static void direct_link_view3dshading(BlendDataReader *reader, View3DShading *shading) -{ - if (shading->prop) { - BLO_read_data_address(reader, &shading->prop); - IDP_BlendDataRead(reader, &shading->prop); - } -} - /* check for cyclic set-scene, * libs can cause this case which is normally prevented, see (T#####) */ #define USE_SETSCENE_CHECK @@ -4527,12 +4143,12 @@ static void lib_link_scene(BlendLibReader *reader, Scene *sce) #ifdef USE_COLLECTION_COMPAT_28 if (sce->collection) { - lib_link_scene_collection(reader, sce->id.lib, sce->collection); + BKE_collection_compat_blend_read_lib(reader, sce->id.lib, sce->collection); } #endif LISTBASE_FOREACH (ViewLayer *, view_layer, &sce->view_layers) { - lib_link_view_layer(reader, sce->id.lib, view_layer); + BKE_view_layer_blend_read_lib(reader, sce->id.lib, view_layer); } if (sce->r.bake.cage_object) { @@ -4916,14 +4532,14 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) /* this runs before the very first doversion */ if (sce->collection) { BLO_read_data_address(reader, &sce->collection); - direct_link_scene_collection(reader, sce->collection); + BKE_collection_compat_blend_read_data(reader, sce->collection); } #endif /* insert into global old-new map for reading without UI (link_global accesses it again) */ link_glob_list(reader->fd, &sce->view_layers); LISTBASE_FOREACH (ViewLayer *, view_layer, &sce->view_layers) { - direct_link_view_layer(reader, view_layer); + BKE_view_layer_blend_read_data(reader, view_layer); } if (BLO_read_data_is_undo(reader)) { @@ -4938,7 +4554,7 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) } EEVEE_lightcache_info_update(&sce->eevee); - direct_link_view3dshading(reader, &sce->display.shading); + BKE_screen_view3d_shading_blend_read_data(reader, &sce->display.shading); BLO_read_data_address(reader, &sce->layer_properties); IDP_BlendDataRead(reader, &sce->layer_properties); @@ -4947,540 +4563,12 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Read Screen Area/Region (Screen Data) - * \{ */ - -static void direct_link_panel_list(BlendDataReader *reader, ListBase *lb) -{ - BLO_read_list(reader, lb); - - LISTBASE_FOREACH (Panel *, panel, lb) { - panel->runtime_flag = 0; - panel->activedata = NULL; - panel->type = NULL; - panel->runtime.custom_data_ptr = NULL; - direct_link_panel_list(reader, &panel->children); - } -} - -static void direct_link_region(BlendDataReader *reader, ARegion *region, int spacetype) -{ - direct_link_panel_list(reader, ®ion->panels); - - BLO_read_list(reader, ®ion->panels_category_active); - - BLO_read_list(reader, ®ion->ui_lists); - - /* The area's search filter is runtime only, so we need to clear the active flag on read. */ - region->flag &= ~RGN_FLAG_SEARCH_FILTER_ACTIVE; - - LISTBASE_FOREACH (uiList *, ui_list, ®ion->ui_lists) { - ui_list->type = NULL; - ui_list->dyn_data = NULL; - BLO_read_data_address(reader, &ui_list->properties); - IDP_BlendDataRead(reader, &ui_list->properties); - } - - BLO_read_list(reader, ®ion->ui_previews); - - if (spacetype == SPACE_EMPTY) { - /* unknown space type, don't leak regiondata */ - region->regiondata = NULL; - } - else if (region->flag & RGN_FLAG_TEMP_REGIONDATA) { - /* Runtime data, don't use. */ - region->regiondata = NULL; - } - else { - BLO_read_data_address(reader, ®ion->regiondata); - if (region->regiondata) { - if (spacetype == SPACE_VIEW3D) { - RegionView3D *rv3d = region->regiondata; - - BLO_read_data_address(reader, &rv3d->localvd); - BLO_read_data_address(reader, &rv3d->clipbb); - - rv3d->depths = NULL; - rv3d->render_engine = NULL; - rv3d->sms = NULL; - rv3d->smooth_timer = NULL; - - rv3d->rflag &= ~(RV3D_NAVIGATING | RV3D_PAINTING); - rv3d->runtime_viewlock = 0; - } - } - } - - region->v2d.sms = NULL; - region->v2d.alpha_hor = region->v2d.alpha_vert = 255; /* visible by default */ - BLI_listbase_clear(®ion->panels_category); - BLI_listbase_clear(®ion->handlers); - BLI_listbase_clear(®ion->uiblocks); - region->headerstr = NULL; - region->visible = 0; - region->type = NULL; - region->do_draw = 0; - region->gizmo_map = NULL; - region->regiontimer = NULL; - region->draw_buffer = NULL; - memset(®ion->drawrct, 0, sizeof(region->drawrct)); -} - -static void direct_link_area(BlendDataReader *reader, ScrArea *area) -{ - BLO_read_list(reader, &(area->spacedata)); - BLO_read_list(reader, &(area->regionbase)); - - BLI_listbase_clear(&area->handlers); - area->type = NULL; /* spacetype callbacks */ - - /* Should always be unset so that rna_Area_type_get works correctly. */ - area->butspacetype = SPACE_EMPTY; - - area->region_active_win = -1; - - area->flag &= ~AREA_FLAG_ACTIVE_TOOL_UPDATE; - - BLO_read_data_address(reader, &area->global); - - /* if we do not have the spacetype registered we cannot - * free it, so don't allocate any new memory for such spacetypes. */ - if (!BKE_spacetype_exists(area->spacetype)) { - /* Hint for versioning code to replace deprecated space types. */ - area->butspacetype = area->spacetype; - - area->spacetype = SPACE_EMPTY; - } - - LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { - direct_link_region(reader, region, area->spacetype); - } - - /* accident can happen when read/save new file with older version */ - /* 2.50: we now always add spacedata for info */ - if (area->spacedata.first == NULL) { - SpaceInfo *sinfo = MEM_callocN(sizeof(SpaceInfo), "spaceinfo"); - area->spacetype = sinfo->spacetype = SPACE_INFO; - BLI_addtail(&area->spacedata, sinfo); - } - /* add local view3d too */ - else if (area->spacetype == SPACE_VIEW3D) { - blo_do_versions_view3d_split_250(area->spacedata.first, &area->regionbase); - } - - LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { - BLO_read_list(reader, &(sl->regionbase)); - - /* if we do not have the spacetype registered we cannot - * free it, so don't allocate any new memory for such spacetypes. */ - if (!BKE_spacetype_exists(sl->spacetype)) { - sl->spacetype = SPACE_EMPTY; - } - - LISTBASE_FOREACH (ARegion *, region, &sl->regionbase) { - direct_link_region(reader, region, sl->spacetype); - } - - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - - v3d->flag |= V3D_INVALID_BACKBUF; - - if (v3d->gpd) { - BLO_read_data_address(reader, &v3d->gpd); - BKE_gpencil_blend_read_data(reader, v3d->gpd); - } - BLO_read_data_address(reader, &v3d->localvd); - - /* Runtime data */ - v3d->runtime.properties_storage = NULL; - v3d->runtime.flag = 0; - - /* render can be quite heavy, set to solid on load */ - if (v3d->shading.type == OB_RENDER) { - v3d->shading.type = OB_SOLID; - } - v3d->shading.prev_type = OB_SOLID; - - direct_link_view3dshading(reader, &v3d->shading); - - blo_do_versions_view3d_split_250(v3d, &sl->regionbase); - } - else if (sl->spacetype == SPACE_GRAPH) { - SpaceGraph *sipo = (SpaceGraph *)sl; - - BLO_read_data_address(reader, &sipo->ads); - BLI_listbase_clear(&sipo->runtime.ghost_curves); - } - else if (sl->spacetype == SPACE_NLA) { - SpaceNla *snla = (SpaceNla *)sl; - - BLO_read_data_address(reader, &snla->ads); - } - else if (sl->spacetype == SPACE_OUTLINER) { - SpaceOutliner *space_outliner = (SpaceOutliner *)sl; - - /* use newdataadr_no_us and do not free old memory avoiding double - * frees and use of freed memory. this could happen because of a - * bug fixed in revision 58959 where the treestore memory address - * was not unique */ - TreeStore *ts = newdataadr_no_us(reader->fd, space_outliner->treestore); - space_outliner->treestore = NULL; - if (ts) { - TreeStoreElem *elems = newdataadr_no_us(reader->fd, ts->data); - - space_outliner->treestore = BLI_mempool_create( - sizeof(TreeStoreElem), ts->usedelem, 512, BLI_MEMPOOL_ALLOW_ITER); - if (ts->usedelem && elems) { - for (int i = 0; i < ts->usedelem; i++) { - TreeStoreElem *new_elem = BLI_mempool_alloc(space_outliner->treestore); - *new_elem = elems[i]; - } - } - /* we only saved what was used */ - space_outliner->storeflag |= SO_TREESTORE_CLEANUP; /* at first draw */ - } - space_outliner->treehash = NULL; - space_outliner->tree.first = space_outliner->tree.last = NULL; - } - else if (sl->spacetype == SPACE_IMAGE) { - SpaceImage *sima = (SpaceImage *)sl; - - sima->iuser.scene = NULL; - sima->iuser.ok = 1; - sima->scopes.waveform_1 = NULL; - sima->scopes.waveform_2 = NULL; - sima->scopes.waveform_3 = NULL; - sima->scopes.vecscope = NULL; - sima->scopes.ok = 0; - - /* WARNING: gpencil data is no longer stored directly in sima after 2.5 - * so sacrifice a few old files for now to avoid crashes with new files! - * committed: r28002 */ -#if 0 - sima->gpd = newdataadr(fd, sima->gpd); - if (sima->gpd) { - BKE_gpencil_blend_read_data(fd, sima->gpd); - } -#endif - } - else if (sl->spacetype == SPACE_NODE) { - SpaceNode *snode = (SpaceNode *)sl; - - if (snode->gpd) { - BLO_read_data_address(reader, &snode->gpd); - BKE_gpencil_blend_read_data(reader, snode->gpd); - } - - BLO_read_list(reader, &snode->treepath); - snode->edittree = NULL; - snode->iofsd = NULL; - BLI_listbase_clear(&snode->linkdrag); - } - else if (sl->spacetype == SPACE_TEXT) { - SpaceText *st = (SpaceText *)sl; - memset(&st->runtime, 0, sizeof(st->runtime)); - } - else if (sl->spacetype == SPACE_SEQ) { - SpaceSeq *sseq = (SpaceSeq *)sl; - - /* grease pencil data is not a direct data and can't be linked from direct_link* - * functions, it should be linked from lib_link* functions instead - * - * otherwise it'll lead to lost grease data on open because it'll likely be - * read from file after all other users of grease pencil and newdataadr would - * simple return NULL here (sergey) - */ -#if 0 - if (sseq->gpd) { - sseq->gpd = newdataadr(fd, sseq->gpd); - BKE_gpencil_blend_read_data(fd, sseq->gpd); - } -#endif - sseq->scopes.reference_ibuf = NULL; - sseq->scopes.zebra_ibuf = NULL; - sseq->scopes.waveform_ibuf = NULL; - sseq->scopes.sep_waveform_ibuf = NULL; - sseq->scopes.vector_ibuf = NULL; - sseq->scopes.histogram_ibuf = NULL; - } - else if (sl->spacetype == SPACE_PROPERTIES) { - SpaceProperties *sbuts = (SpaceProperties *)sl; - - sbuts->path = NULL; - sbuts->texuser = NULL; - sbuts->mainbo = sbuts->mainb; - sbuts->mainbuser = sbuts->mainb; - sbuts->runtime = NULL; - } - else if (sl->spacetype == SPACE_CONSOLE) { - SpaceConsole *sconsole = (SpaceConsole *)sl; - - BLO_read_list(reader, &sconsole->scrollback); - BLO_read_list(reader, &sconsole->history); - - /* comma expressions, (e.g. expr1, expr2, expr3) evaluate each expression, - * from left to right. the right-most expression sets the result of the comma - * expression as a whole*/ - LISTBASE_FOREACH_MUTABLE (ConsoleLine *, cl, &sconsole->history) { - BLO_read_data_address(reader, &cl->line); - if (cl->line) { - /* the allocted length is not written, so reset here */ - cl->len_alloc = cl->len + 1; - } - else { - BLI_remlink(&sconsole->history, cl); - MEM_freeN(cl); - } - } - } - else if (sl->spacetype == SPACE_FILE) { - SpaceFile *sfile = (SpaceFile *)sl; - - /* this sort of info is probably irrelevant for reloading... - * plus, it isn't saved to files yet! - */ - sfile->folders_prev = sfile->folders_next = NULL; - sfile->files = NULL; - sfile->layout = NULL; - sfile->op = NULL; - sfile->previews_timer = NULL; - BLO_read_data_address(reader, &sfile->params); - } - else if (sl->spacetype == SPACE_CLIP) { - SpaceClip *sclip = (SpaceClip *)sl; - - sclip->scopes.track_search = NULL; - sclip->scopes.track_preview = NULL; - sclip->scopes.ok = 0; - } - } - - BLI_listbase_clear(&area->actionzones); - - BLO_read_data_address(reader, &area->v1); - BLO_read_data_address(reader, &area->v2); - BLO_read_data_address(reader, &area->v3); - BLO_read_data_address(reader, &area->v4); -} - -static void lib_link_area(BlendLibReader *reader, ID *parent_id, ScrArea *area) -{ - BLO_read_id_address(reader, parent_id->lib, &area->full); - - memset(&area->runtime, 0x0, sizeof(area->runtime)); - - LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { - switch (sl->spacetype) { - case SPACE_VIEW3D: { - View3D *v3d = (View3D *)sl; - - BLO_read_id_address(reader, parent_id->lib, &v3d->camera); - BLO_read_id_address(reader, parent_id->lib, &v3d->ob_center); - - if (v3d->localvd) { - BLO_read_id_address(reader, parent_id->lib, &v3d->localvd->camera); - } - break; - } - case SPACE_GRAPH: { - SpaceGraph *sipo = (SpaceGraph *)sl; - bDopeSheet *ads = sipo->ads; - - if (ads) { - BLO_read_id_address(reader, parent_id->lib, &ads->source); - BLO_read_id_address(reader, parent_id->lib, &ads->filter_grp); - } - break; - } - case SPACE_PROPERTIES: { - SpaceProperties *sbuts = (SpaceProperties *)sl; - BLO_read_id_address(reader, parent_id->lib, &sbuts->pinid); - if (sbuts->pinid == NULL) { - sbuts->flag &= ~SB_PIN_CONTEXT; - } - break; - } - case SPACE_FILE: - break; - case SPACE_ACTION: { - SpaceAction *saction = (SpaceAction *)sl; - bDopeSheet *ads = &saction->ads; - - if (ads) { - BLO_read_id_address(reader, parent_id->lib, &ads->source); - BLO_read_id_address(reader, parent_id->lib, &ads->filter_grp); - } - - BLO_read_id_address(reader, parent_id->lib, &saction->action); - break; - } - case SPACE_IMAGE: { - SpaceImage *sima = (SpaceImage *)sl; - - BLO_read_id_address(reader, parent_id->lib, &sima->image); - BLO_read_id_address(reader, parent_id->lib, &sima->mask_info.mask); - - /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data - * so fingers crossed this works fine! - */ - BLO_read_id_address(reader, parent_id->lib, &sima->gpd); - break; - } - case SPACE_SEQ: { - SpaceSeq *sseq = (SpaceSeq *)sl; - - /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data - * so fingers crossed this works fine! - */ - BLO_read_id_address(reader, parent_id->lib, &sseq->gpd); - break; - } - case SPACE_NLA: { - SpaceNla *snla = (SpaceNla *)sl; - bDopeSheet *ads = snla->ads; - - if (ads) { - BLO_read_id_address(reader, parent_id->lib, &ads->source); - BLO_read_id_address(reader, parent_id->lib, &ads->filter_grp); - } - break; - } - case SPACE_TEXT: { - SpaceText *st = (SpaceText *)sl; - - BLO_read_id_address(reader, parent_id->lib, &st->text); - break; - } - case SPACE_SCRIPT: { - SpaceScript *scpt = (SpaceScript *)sl; - /*scpt->script = NULL; - 2.45 set to null, better re-run the script */ - if (scpt->script) { - BLO_read_id_address(reader, parent_id->lib, &scpt->script); - if (scpt->script) { - SCRIPT_SET_NULL(scpt->script); - } - } - break; - } - case SPACE_OUTLINER: { - SpaceOutliner *space_outliner = (SpaceOutliner *)sl; - BLO_read_id_address(reader, NULL, &space_outliner->search_tse.id); - - if (space_outliner->treestore) { - TreeStoreElem *tselem; - BLI_mempool_iter iter; - - BLI_mempool_iternew(space_outliner->treestore, &iter); - while ((tselem = BLI_mempool_iterstep(&iter))) { - BLO_read_id_address(reader, NULL, &tselem->id); - } - if (space_outliner->treehash) { - /* rebuild hash table, because it depends on ids too */ - space_outliner->storeflag |= SO_TREESTORE_REBUILD; - } - } - break; - } - case SPACE_NODE: { - SpaceNode *snode = (SpaceNode *)sl; - - /* node tree can be stored locally in id too, link this first */ - BLO_read_id_address(reader, parent_id->lib, &snode->id); - BLO_read_id_address(reader, parent_id->lib, &snode->from); - - bNodeTree *ntree = snode->id ? ntreeFromID(snode->id) : NULL; - if (ntree) { - snode->nodetree = ntree; - } - else { - BLO_read_id_address(reader, parent_id->lib, &snode->nodetree); - } - - bNodeTreePath *path; - for (path = snode->treepath.first; path; path = path->next) { - if (path == snode->treepath.first) { - /* first nodetree in path is same as snode->nodetree */ - path->nodetree = snode->nodetree; - } - else { - BLO_read_id_address(reader, parent_id->lib, &path->nodetree); - } - - if (!path->nodetree) { - break; - } - } - - /* remaining path entries are invalid, remove */ - bNodeTreePath *path_next; - for (; path; path = path_next) { - path_next = path->next; - - BLI_remlink(&snode->treepath, path); - MEM_freeN(path); - } - - /* edittree is just the last in the path, - * set this directly since the path may have been shortened above */ - if (snode->treepath.last) { - path = snode->treepath.last; - snode->edittree = path->nodetree; - } - else { - snode->edittree = NULL; - } - break; - } - case SPACE_CLIP: { - SpaceClip *sclip = (SpaceClip *)sl; - BLO_read_id_address(reader, parent_id->lib, &sclip->clip); - BLO_read_id_address(reader, parent_id->lib, &sclip->mask_info.mask); - break; - } - default: - break; - } - } -} - -/** - * \return false on error. - */ -static bool direct_link_area_map(BlendDataReader *reader, ScrAreaMap *area_map) -{ - BLO_read_list(reader, &area_map->vertbase); - BLO_read_list(reader, &area_map->edgebase); - BLO_read_list(reader, &area_map->areabase); - LISTBASE_FOREACH (ScrArea *, area, &area_map->areabase) { - direct_link_area(reader, area); - } - - /* edges */ - LISTBASE_FOREACH (ScrEdge *, se, &area_map->edgebase) { - BLO_read_data_address(reader, &se->v1); - BLO_read_data_address(reader, &se->v2); - BKE_screen_sort_scrvert(&se->v1, &se->v2); - - if (se->v1 == NULL) { - BLI_remlink(&area_map->edgebase, se); - - return false; - } - } - - return true; -} - -/** \} */ - -/* -------------------------------------------------------------------- */ /** \name XR-data * \{ */ static void direct_link_wm_xr_data(BlendDataReader *reader, wmXrData *xr_data) { - direct_link_view3dshading(reader, &xr_data->session_settings.shading); + BKE_screen_view3d_shading_blend_read_data(reader, &xr_data->session_settings.shading); } static void lib_link_wm_xr_data(BlendLibReader *reader, ID *parent_id, wmXrData *xr_data) @@ -5517,7 +4605,7 @@ static void direct_link_windowmanager(BlendDataReader *reader, wmWindowManager * win->workspace_hook->temp_layout_store = NULL; } - direct_link_area_map(reader, &win->global_areas); + BKE_screen_area_map_blend_read_data(reader, &win->global_areas); win->ghostwin = NULL; win->gpuctx = NULL; @@ -5588,7 +4676,7 @@ static void lib_link_windowmanager(BlendLibReader *reader, wmWindowManager *wm) BLO_read_id_address(reader, NULL, &win->screen); LISTBASE_FOREACH (ScrArea *, area, &win->global_areas.areabase) { - lib_link_area(reader, &wm->id, area); + BKE_screen_area_blend_read_lib(reader, &wm->id, area); } lib_link_wm_xr_data(reader, &wm->id, &wm->xr); @@ -5601,22 +4689,6 @@ static void lib_link_windowmanager(BlendLibReader *reader, wmWindowManager *wm) /** \name Read ID: Screen * \{ */ -/* note: file read without screens option G_FILE_NO_UI; - * check lib pointers in call below */ -static void lib_link_screen(BlendLibReader *reader, bScreen *screen) -{ - /* deprecated, but needed for versioning (will be NULL'ed then) */ - BLO_read_id_address(reader, screen->id.lib, &screen->scene); - - screen->animtimer = NULL; /* saved in rare cases */ - screen->tool_tip = NULL; - screen->scrubbing = false; - - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - lib_link_area(reader, &screen->id, area); - } -} - /* how to handle user count on pointer restore */ typedef enum ePointerUserMode { USER_IGNORE = 0, /* ignore user count */ @@ -6093,29 +5165,6 @@ void blo_lib_link_restore(Main *oldmain, BKE_main_idmap_destroy(id_map); } -/* for the saved 2.50 files without regiondata */ -/* and as patch for 2.48 and older */ -void blo_do_versions_view3d_split_250(View3D *v3d, ListBase *regions) -{ - LISTBASE_FOREACH (ARegion *, region, regions) { - if (region->regiontype == RGN_TYPE_WINDOW && region->regiondata == NULL) { - RegionView3D *rv3d; - - rv3d = region->regiondata = MEM_callocN(sizeof(RegionView3D), "region v3d patch"); - rv3d->persp = (char)v3d->persp; - rv3d->view = (char)v3d->view; - rv3d->dist = v3d->dist; - copy_v3_v3(rv3d->ofs, v3d->ofs); - copy_qt_qt(rv3d->viewquat, v3d->viewquat); - } - } - - /* this was not initialized correct always */ - if (v3d->gridsubdiv == 0) { - v3d->gridsubdiv = 10; - } -} - static bool direct_link_screen(BlendDataReader *reader, bScreen *screen) { bool success = true; @@ -6127,7 +5176,7 @@ static bool direct_link_screen(BlendDataReader *reader, bScreen *screen) BLO_read_data_address(reader, &screen->preview); BKE_previewimg_blend_read(reader, screen->preview); - if (!direct_link_area_map(reader, AREAMAP_FROM_SCREEN(screen))) { + if (!BKE_screen_area_map_blend_read_data(reader, AREAMAP_FROM_SCREEN(screen))) { printf("Error reading Screen %s... removing it.\n", screen->id.name + 2); success = false; } @@ -6396,15 +5445,9 @@ static bool direct_link_id(FileData *fd, Main *main, const int tag, ID *id, ID * case ID_LI: direct_link_library(fd, (Library *)id, main); break; - case ID_GR: - direct_link_collection(&reader, (Collection *)id); - break; - case ID_PA: - direct_link_particlesettings(&reader, (ParticleSettings *)id); - break; case ID_WS: - direct_link_workspace(&reader, (WorkSpace *)id); - break; + case ID_PA: + case ID_GR: case ID_ME: case ID_LT: case ID_AC: @@ -7023,27 +6066,12 @@ static void lib_link_all(FileData *fd, Main *bmain) case ID_WM: lib_link_windowmanager(&reader, (wmWindowManager *)id); break; - case ID_WS: - /* Could we skip WS in undo case? */ - lib_link_workspaces(&reader, (WorkSpace *)id); - break; case ID_SCE: lib_link_scene(&reader, (Scene *)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 #View3D.ob_center)! See T41411. */ - lib_link_screen(&reader, (bScreen *)id); - break; - case ID_PA: - lib_link_particlesettings(&reader, (ParticleSettings *)id); - break; - case ID_GR: - lib_link_collection(&reader, (Collection *)id); - break; case ID_IP: /* XXX deprecated... still needs to be maintained for version patches still. */ lib_link_ipo(&reader, (Ipo *)id); @@ -7051,6 +6079,10 @@ static void lib_link_all(FileData *fd, Main *bmain) case ID_LI: lib_link_library(&reader, (Library *)id); /* Only init users. */ break; + case ID_WS: + case ID_SCR: + case ID_PA: + case ID_GR: case ID_ME: case ID_LT: case ID_AC: @@ -7665,7 +6697,6 @@ static void expand_constraint_channels(BlendExpander *expander, ListBase *chanba } static void expand_id(BlendExpander *expander, ID *id); -static void expand_collection(BlendExpander *expander, Collection *collection); static void expand_id_embedded_id(BlendExpander *expander, ID *id) { @@ -7680,7 +6711,7 @@ static void expand_id_embedded_id(BlendExpander *expander, ID *id) Scene *scene = (Scene *)id; if (scene->master_collection != NULL) { expand_id(expander, &scene->master_collection->id); - expand_collection(expander, scene->master_collection); + BKE_collection_blend_read_expand(expander, scene->master_collection); } } } @@ -7702,71 +6733,6 @@ static void expand_id(BlendExpander *expander, ID *id) expand_id_embedded_id(expander, id); } -static void expand_particlesettings(BlendExpander *expander, ParticleSettings *part) -{ - BLO_expand(expander, part->instance_object); - BLO_expand(expander, part->instance_collection); - BLO_expand(expander, part->force_group); - BLO_expand(expander, part->bb_ob); - BLO_expand(expander, part->collision_group); - - for (int a = 0; a < MAX_MTEX; a++) { - if (part->mtex[a]) { - BLO_expand(expander, part->mtex[a]->tex); - BLO_expand(expander, part->mtex[a]->object); - } - } - - if (part->effector_weights) { - BLO_expand(expander, part->effector_weights->group); - } - - if (part->pd) { - BLO_expand(expander, part->pd->tex); - BLO_expand(expander, part->pd->f_source); - } - if (part->pd2) { - BLO_expand(expander, part->pd2->tex); - BLO_expand(expander, part->pd2->f_source); - } - - if (part->boids) { - LISTBASE_FOREACH (BoidState *, state, &part->boids->states) { - LISTBASE_FOREACH (BoidRule *, rule, &state->rules) { - if (rule->type == eBoidRuleType_Avoid) { - BoidRuleGoalAvoid *gabr = (BoidRuleGoalAvoid *)rule; - BLO_expand(expander, gabr->ob); - } - else if (rule->type == eBoidRuleType_FollowLeader) { - BoidRuleFollowLeader *flbr = (BoidRuleFollowLeader *)rule; - BLO_expand(expander, flbr->ob); - } - } - } - } - - LISTBASE_FOREACH (ParticleDupliWeight *, dw, &part->instance_weights) { - BLO_expand(expander, dw->ob); - } -} - -static void expand_collection(BlendExpander *expander, Collection *collection) -{ - LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { - BLO_expand(expander, cob->ob); - } - - LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { - BLO_expand(expander, child->collection); - } - -#ifdef USE_COLLECTION_COMPAT_28 - if (collection->collection != NULL) { - expand_scene_collection(expander, collection->collection); - } -#endif -} - /* callback function used to expand constraint ID-links */ static void expand_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, @@ -7892,19 +6858,6 @@ static void expand_object(BlendExpander *expander, Object *ob) } } -#ifdef USE_COLLECTION_COMPAT_28 -static void expand_scene_collection(BlendExpander *expander, SceneCollection *sc) -{ - LISTBASE_FOREACH (LinkData *, link, &sc->objects) { - BLO_expand(expander, link->data); - } - - LISTBASE_FOREACH (SceneCollection *, nsc, &sc->scene_collections) { - expand_scene_collection(expander, nsc); - } -} -#endif - static void expand_scene(BlendExpander *expander, Scene *sce) { LISTBASE_FOREACH (Base *, base_legacy, &sce->base) { @@ -8002,7 +6955,7 @@ static void expand_scene(BlendExpander *expander, Scene *sce) #ifdef USE_COLLECTION_COMPAT_28 if (sce->collection) { - expand_scene_collection(expander, sce->collection); + BKE_collection_compat_blend_read_expand(expander, sce->collection); } #endif @@ -8011,13 +6964,6 @@ static void expand_scene(BlendExpander *expander, Scene *sce) } } -static void expand_workspace(BlendExpander *expander, WorkSpace *workspace) -{ - LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) { - BLO_expand(expander, BKE_workspace_layout_screen_get(layout)); - } -} - /** * Set the callback func used over all ID data found by \a BLO_expand_main func. * @@ -8067,18 +7013,9 @@ void BLO_expand_main(void *fdhandle, Main *mainvar) case ID_SCE: expand_scene(&expander, (Scene *)id); break; - case ID_GR: - expand_collection(&expander, (Collection *)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_WS: - expand_workspace(&expander, (WorkSpace *)id); - break; default: break; } @@ -9039,6 +7976,11 @@ void *BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_add return newdataadr(reader->fd, old_address); } +void *BLO_read_get_new_data_address_no_us(BlendDataReader *reader, const void *old_address) +{ + return newdataadr_no_us(reader->fd, old_address); +} + void *BLO_read_get_new_packed_address(BlendDataReader *reader, const void *old_address) { return newpackedadr(reader->fd, old_address); @@ -9209,6 +8151,11 @@ bool BLO_read_lib_is_undo(BlendLibReader *reader) return reader->fd->memfile != NULL; } +Main *BLO_read_lib_get_main(BlendLibReader *reader) +{ + return reader->main; +} + void BLO_expand_id(BlendExpander *expander, ID *id) { expand_doit(expander->fd, expander->main, id); diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index 4fa41731454..57d6779d1cb 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -187,7 +187,6 @@ void *blo_do_versions_newlibadr_us(struct FileData *fd, const void *lib, const v struct PartEff *blo_do_version_give_parteff_245(struct Object *ob); void blo_do_version_old_trackto_to_constraints(struct Object *ob); -void blo_do_versions_view3d_split_250(struct View3D *v3d, struct ListBase *regions); void blo_do_versions_key_uidgen(struct Key *key); void blo_do_versions_userdef(struct UserDef *userdef); diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index f7592308023..1988b2e1f33 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -266,7 +266,7 @@ static void area_add_window_regions(ScrArea *area, SpaceLink *sl, ListBase *lb) /* and we split view3d */ switch (sl->spacetype) { case SPACE_VIEW3D: - blo_do_versions_view3d_split_250((View3D *)sl, lb); + BKE_screen_view3d_do_versions_250((View3D *)sl, lb); break; case SPACE_OUTLINER: { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index a37ec2d9f0a..835e2f92c7c 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -155,6 +155,7 @@ #include "BKE_packedFile.h" #include "BKE_pointcache.h" #include "BKE_report.h" +#include "BKE_screen.h" #include "BKE_sequencer.h" #include "BKE_shader_fx.h" #include "BKE_subsurf.h" @@ -804,41 +805,6 @@ static void write_userdef(BlendWriter *writer, const UserDef *userdef) } } -static void write_boid_state(BlendWriter *writer, BoidState *state) -{ - BLO_write_struct(writer, BoidState, state); - - LISTBASE_FOREACH (BoidRule *, rule, &state->rules) { - switch (rule->type) { - case eBoidRuleType_Goal: - case eBoidRuleType_Avoid: - BLO_write_struct(writer, BoidRuleGoalAvoid, rule); - break; - case eBoidRuleType_AvoidCollision: - BLO_write_struct(writer, BoidRuleAvoidCollision, rule); - break; - case eBoidRuleType_FollowLeader: - BLO_write_struct(writer, BoidRuleFollowLeader, rule); - break; - case eBoidRuleType_AverageSpeed: - BLO_write_struct(writer, BoidRuleAverageSpeed, rule); - break; - case eBoidRuleType_Fight: - BLO_write_struct(writer, BoidRuleFight, rule); - break; - default: - BLO_write_struct(writer, BoidRule, rule); - break; - } - } -#if 0 - BoidCondition *cond = state->conditions.first; - for (; cond; cond = cond->next) { - BLO_write_struct(writer, BoidCondition, cond); - } -#endif -} - /* update this also to readfile.c */ static const char *ptcache_data_struct[] = { "", // BPHYS_DATA_INDEX @@ -889,68 +855,6 @@ static void write_pointcaches(BlendWriter *writer, ListBase *ptcaches) } } -static void write_particlesettings(BlendWriter *writer, - ParticleSettings *part, - const void *id_address) -{ - if (part->id.us > 0 || BLO_write_is_undo(writer)) { - /* write LibData */ - BLO_write_id_struct(writer, ParticleSettings, id_address, &part->id); - BKE_id_blend_write(writer, &part->id); - - if (part->adt) { - BKE_animdata_blend_write(writer, part->adt); - } - BLO_write_struct(writer, PartDeflect, part->pd); - BLO_write_struct(writer, PartDeflect, part->pd2); - BLO_write_struct(writer, EffectorWeights, part->effector_weights); - - if (part->clumpcurve) { - BKE_curvemapping_blend_write(writer, part->clumpcurve); - } - if (part->roughcurve) { - BKE_curvemapping_blend_write(writer, part->roughcurve); - } - if (part->twistcurve) { - BKE_curvemapping_blend_write(writer, part->twistcurve); - } - - LISTBASE_FOREACH (ParticleDupliWeight *, dw, &part->instance_weights) { - /* update indices, but only if dw->ob is set (can be NULL after loading e.g.) */ - if (dw->ob != NULL) { - dw->index = 0; - if (part->instance_collection) { /* can be NULL if lining fails or set to None */ - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (part->instance_collection, object) { - if (object == dw->ob) { - break; - } - dw->index++; - } - FOREACH_COLLECTION_OBJECT_RECURSIVE_END; - } - } - BLO_write_struct(writer, ParticleDupliWeight, dw); - } - - if (part->boids && part->phystype == PART_PHYS_BOIDS) { - BLO_write_struct(writer, BoidSettings, part->boids); - - LISTBASE_FOREACH (BoidState *, state, &part->boids->states) { - write_boid_state(writer, state); - } - } - if (part->fluid && part->phystype == PART_PHYS_FLUID) { - BLO_write_struct(writer, SPHFluidSettings, part->fluid); - } - - for (int a = 0; a < MAX_MTEX; a++) { - if (part->mtex[a]) { - BLO_write_struct(writer, MTex, part->mtex[a]); - } - } - } -} - static void write_particlesystems(BlendWriter *writer, ListBase *particles) { LISTBASE_FOREACH (ParticleSystem *, psys, particles) { @@ -1384,37 +1288,6 @@ static void write_object(BlendWriter *writer, Object *ob, const void *id_address } } -static void write_collection_nolib(BlendWriter *writer, Collection *collection) -{ - /* Shared function for collection data-blocks and scene master collection. */ - BKE_previewimg_blend_write(writer, collection->preview); - - LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { - BLO_write_struct(writer, CollectionObject, cob); - } - - LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { - BLO_write_struct(writer, CollectionChild, child); - } -} - -static void write_collection(BlendWriter *writer, Collection *collection, const void *id_address) -{ - if (collection->id.us > 0 || BLO_write_is_undo(writer)) { - /* Clean up, important in undo case to reduce false detection of changed data-blocks. */ - collection->flag &= ~COLLECTION_HAS_OBJECT_CACHE; - collection->tag = 0; - BLI_listbase_clear(&collection->object_cache); - BLI_listbase_clear(&collection->parents); - - /* write LibData */ - BLO_write_id_struct(writer, Collection, id_address, &collection->id); - BKE_id_blend_write(writer, &collection->id); - - write_collection_nolib(writer, collection); - } -} - static void write_sequence_modifiers(BlendWriter *writer, ListBase *modbase) { LISTBASE_FOREACH (SequenceModifierData *, smd, modbase) { @@ -1447,13 +1320,6 @@ static void write_view_settings(BlendWriter *writer, ColorManagedViewSettings *v } } -static void write_view3dshading(BlendWriter *writer, View3DShading *shading) -{ - if (shading->prop) { - IDP_BlendWrite(writer, shading->prop); - } -} - static void write_paint(BlendWriter *writer, Paint *p) { if (p->cavity_curve) { @@ -1745,7 +1611,7 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) if (sce->master_collection) { BLO_write_struct(writer, Collection, sce->master_collection); - write_collection_nolib(writer, sce->master_collection); + BKE_collection_blend_write_nolib(writer, sce->master_collection); } /* Eevee Lightcache */ @@ -1754,7 +1620,7 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) write_lightcache(writer, sce->eevee.light_cache_data); } - write_view3dshading(writer, &sce->display.shading); + BKE_screen_view3d_shading_blend_write(writer, &sce->display.shading); /* Freed on doversion. */ BLI_assert(sce->layer_properties == NULL); @@ -1762,245 +1628,7 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) static void write_wm_xr_data(BlendWriter *writer, wmXrData *xr_data) { - write_view3dshading(writer, &xr_data->session_settings.shading); -} - -static void write_region(BlendWriter *writer, ARegion *region, int spacetype) -{ - BLO_write_struct(writer, ARegion, region); - - if (region->regiondata) { - if (region->flag & RGN_FLAG_TEMP_REGIONDATA) { - return; - } - - switch (spacetype) { - case SPACE_VIEW3D: - if (region->regiontype == RGN_TYPE_WINDOW) { - RegionView3D *rv3d = region->regiondata; - BLO_write_struct(writer, RegionView3D, rv3d); - - if (rv3d->localvd) { - BLO_write_struct(writer, RegionView3D, rv3d->localvd); - } - if (rv3d->clipbb) { - BLO_write_struct(writer, BoundBox, rv3d->clipbb); - } - } - else { - printf("regiondata write missing!\n"); - } - break; - default: - printf("regiondata write missing!\n"); - } - } -} - -static void write_uilist(BlendWriter *writer, uiList *ui_list) -{ - BLO_write_struct(writer, uiList, ui_list); - - if (ui_list->properties) { - IDP_BlendWrite(writer, ui_list->properties); - } -} - -static void write_space_outliner(BlendWriter *writer, SpaceOutliner *space_outliner) -{ - BLI_mempool *ts = space_outliner->treestore; - - if (ts) { - SpaceOutliner space_outliner_flat = *space_outliner; - - int elems = BLI_mempool_len(ts); - /* linearize mempool to array */ - TreeStoreElem *data = elems ? BLI_mempool_as_arrayN(ts, "TreeStoreElem") : NULL; - - if (data) { - /* In this block we use the memory location of the treestore - * but _not_ its data, the addresses in this case are UUID's, - * since we can't rely on malloc giving us different values each time. - */ - TreeStore ts_flat = {0}; - - /* we know the treestore is at least as big as a pointer, - * so offsetting works to give us a UUID. */ - void *data_addr = (void *)POINTER_OFFSET(ts, sizeof(void *)); - - ts_flat.usedelem = elems; - ts_flat.totelem = elems; - ts_flat.data = data_addr; - - BLO_write_struct(writer, SpaceOutliner, space_outliner); - - BLO_write_struct_at_address(writer, TreeStore, ts, &ts_flat); - BLO_write_struct_array_at_address(writer, TreeStoreElem, elems, data_addr, data); - - MEM_freeN(data); - } - else { - space_outliner_flat.treestore = NULL; - BLO_write_struct_at_address(writer, SpaceOutliner, space_outliner, &space_outliner_flat); - } - } - else { - BLO_write_struct(writer, SpaceOutliner, space_outliner); - } -} - -static void write_panel_list(BlendWriter *writer, ListBase *lb) -{ - LISTBASE_FOREACH (Panel *, panel, lb) { - BLO_write_struct(writer, Panel, panel); - write_panel_list(writer, &panel->children); - } -} - -static void write_area_regions(BlendWriter *writer, ScrArea *area) -{ - LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { - write_region(writer, region, area->spacetype); - write_panel_list(writer, ®ion->panels); - - LISTBASE_FOREACH (PanelCategoryStack *, pc_act, ®ion->panels_category_active) { - BLO_write_struct(writer, PanelCategoryStack, pc_act); - } - - LISTBASE_FOREACH (uiList *, ui_list, ®ion->ui_lists) { - write_uilist(writer, ui_list); - } - - LISTBASE_FOREACH (uiPreview *, ui_preview, ®ion->ui_previews) { - BLO_write_struct(writer, uiPreview, ui_preview); - } - } - - LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { - LISTBASE_FOREACH (ARegion *, region, &sl->regionbase) { - write_region(writer, region, sl->spacetype); - } - - if (sl->spacetype == SPACE_VIEW3D) { - View3D *v3d = (View3D *)sl; - BLO_write_struct(writer, View3D, v3d); - - if (v3d->localvd) { - BLO_write_struct(writer, View3D, v3d->localvd); - } - - write_view3dshading(writer, &v3d->shading); - } - else if (sl->spacetype == SPACE_GRAPH) { - SpaceGraph *sipo = (SpaceGraph *)sl; - ListBase tmpGhosts = sipo->runtime.ghost_curves; - - /* temporarily disable ghost curves when saving */ - BLI_listbase_clear(&sipo->runtime.ghost_curves); - - BLO_write_struct(writer, SpaceGraph, sl); - if (sipo->ads) { - BLO_write_struct(writer, bDopeSheet, sipo->ads); - } - - /* reenable ghost curves */ - sipo->runtime.ghost_curves = tmpGhosts; - } - else if (sl->spacetype == SPACE_PROPERTIES) { - BLO_write_struct(writer, SpaceProperties, sl); - } - else if (sl->spacetype == SPACE_FILE) { - SpaceFile *sfile = (SpaceFile *)sl; - - BLO_write_struct(writer, SpaceFile, sl); - if (sfile->params) { - BLO_write_struct(writer, FileSelectParams, sfile->params); - } - } - else if (sl->spacetype == SPACE_SEQ) { - BLO_write_struct(writer, SpaceSeq, sl); - } - else if (sl->spacetype == SPACE_OUTLINER) { - SpaceOutliner *space_outliner = (SpaceOutliner *)sl; - write_space_outliner(writer, space_outliner); - } - else if (sl->spacetype == SPACE_IMAGE) { - BLO_write_struct(writer, SpaceImage, sl); - } - else if (sl->spacetype == SPACE_TEXT) { - BLO_write_struct(writer, SpaceText, sl); - } - else if (sl->spacetype == SPACE_SCRIPT) { - SpaceScript *scr = (SpaceScript *)sl; - scr->but_refs = NULL; - BLO_write_struct(writer, SpaceScript, sl); - } - else if (sl->spacetype == SPACE_ACTION) { - BLO_write_struct(writer, SpaceAction, sl); - } - else if (sl->spacetype == SPACE_NLA) { - SpaceNla *snla = (SpaceNla *)sl; - - BLO_write_struct(writer, SpaceNla, snla); - if (snla->ads) { - BLO_write_struct(writer, bDopeSheet, snla->ads); - } - } - else if (sl->spacetype == SPACE_NODE) { - SpaceNode *snode = (SpaceNode *)sl; - BLO_write_struct(writer, SpaceNode, snode); - - LISTBASE_FOREACH (bNodeTreePath *, path, &snode->treepath) { - BLO_write_struct(writer, bNodeTreePath, path); - } - } - else if (sl->spacetype == SPACE_CONSOLE) { - SpaceConsole *con = (SpaceConsole *)sl; - - LISTBASE_FOREACH (ConsoleLine *, cl, &con->history) { - /* 'len_alloc' is invalid on write, set from 'len' on read */ - BLO_write_struct(writer, ConsoleLine, cl); - BLO_write_raw(writer, (size_t)cl->len + 1, cl->line); - } - BLO_write_struct(writer, SpaceConsole, sl); - } -#ifdef WITH_GLOBAL_AREA_WRITING - else if (sl->spacetype == SPACE_TOPBAR) { - BLO_write_struct(writer, SpaceTopBar, sl); - } - else if (sl->spacetype == SPACE_STATUSBAR) { - BLO_write_struct(writer, SpaceStatusBar, sl); - } -#endif - else if (sl->spacetype == SPACE_USERPREF) { - BLO_write_struct(writer, SpaceUserPref, sl); - } - else if (sl->spacetype == SPACE_CLIP) { - BLO_write_struct(writer, SpaceClip, sl); - } - else if (sl->spacetype == SPACE_INFO) { - BLO_write_struct(writer, SpaceInfo, sl); - } - } -} - -static void write_area_map(BlendWriter *writer, ScrAreaMap *area_map) -{ - BLO_write_struct_list(writer, ScrVert, &area_map->vertbase); - BLO_write_struct_list(writer, ScrEdge, &area_map->edgebase); - LISTBASE_FOREACH (ScrArea *, area, &area_map->areabase) { - area->butspacetype = area->spacetype; /* Just for compatibility, will be reset below. */ - - BLO_write_struct(writer, ScrArea, area); - -#ifdef WITH_GLOBAL_AREA_WRITING - BLO_write_struct(writer, ScrGlobalAreaData, area->global); -#endif - - write_area_regions(writer, area); - - area->butspacetype = SPACE_EMPTY; /* Unset again, was changed above. */ - } + BKE_screen_view3d_shading_blend_write(writer, &xr_data->session_settings.shading); } static void write_windowmanager(BlendWriter *writer, wmWindowManager *wm, const void *id_address) @@ -2024,7 +1652,7 @@ static void write_windowmanager(BlendWriter *writer, wmWindowManager *wm, const BLO_write_struct(writer, Stereo3dFormat, win->stereo3d_format); #ifdef WITH_GLOBAL_AREA_WRITING - write_area_map(writer, &win->global_areas); + BKE_screen_area_map_blend_write(writer, &win->global_areas); #else win->global_areas = global_areas; #endif @@ -2034,37 +1662,6 @@ static void write_windowmanager(BlendWriter *writer, wmWindowManager *wm, const } } -static void write_screen(BlendWriter *writer, bScreen *screen, const void *id_address) -{ - /* Screens are reference counted, only saved if used by a workspace. */ - if (screen->id.us > 0 || BLO_write_is_undo(writer)) { - /* write LibData */ - /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */ - writestruct_at_address(writer->wd, ID_SCRN, bScreen, 1, id_address, screen); - BKE_id_blend_write(writer, &screen->id); - - BKE_previewimg_blend_write(writer, screen->preview); - - /* direct data */ - write_area_map(writer, AREAMAP_FROM_SCREEN(screen)); - } -} - -static void write_workspace(BlendWriter *writer, WorkSpace *workspace, const void *id_address) -{ - BLO_write_id_struct(writer, WorkSpace, id_address, &workspace->id); - BKE_id_blend_write(writer, &workspace->id); - BLO_write_struct_list(writer, WorkSpaceLayout, &workspace->layouts); - BLO_write_struct_list(writer, WorkSpaceDataRelation, &workspace->hook_layout_relations); - BLO_write_struct_list(writer, wmOwnerID, &workspace->owner_ids); - BLO_write_struct_list(writer, bToolRef, &workspace->tools); - LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) { - if (tref->properties) { - IDP_BlendWrite(writer, tref->properties); - } - } -} - /* Keep it last of write_foodata functions. */ static void write_libraries(WriteData *wd, Main *main) { @@ -2326,24 +1923,16 @@ static bool write_file_handle(Main *mainvar, case ID_WM: write_windowmanager(&writer, (wmWindowManager *)id_buffer, id); break; - case ID_WS: - write_workspace(&writer, (WorkSpace *)id_buffer, id); - break; - case ID_SCR: - write_screen(&writer, (bScreen *)id_buffer, id); - break; case ID_SCE: write_scene(&writer, (Scene *)id_buffer, id); break; - case ID_GR: - write_collection(&writer, (Collection *)id_buffer, id); - break; case ID_OB: write_object(&writer, (Object *)id_buffer, id); break; + case ID_WS: + case ID_SCR: case ID_PA: - write_particlesettings(&writer, (ParticleSettings *)id_buffer, id); - break; + case ID_GR: case ID_ME: case ID_LT: case ID_AC: @@ -2678,7 +2267,13 @@ void BLO_write_struct_at_address_by_id(BlendWriter *writer, const void *address, const void *data_ptr) { - writestruct_at_address_nr(writer->wd, DATA, struct_id, 1, address, data_ptr); + BLO_write_struct_at_address_by_id_with_filecode(writer, DATA, struct_id, address, data_ptr); +} + +void BLO_write_struct_at_address_by_id_with_filecode( + BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr) +{ + writestruct_at_address_nr(writer->wd, filecode, struct_id, 1, address, data_ptr); } void BLO_write_struct_array_by_id(BlendWriter *writer, |