diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 147 |
1 files changed, 129 insertions, 18 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 2648ebdc395..bfffcbdcae6 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -102,6 +102,10 @@ /* allow writefile to use deprecated functionality (for forward compatibility code) */ #define DNA_DEPRECATED_ALLOW +/* Allow using DNA struct members that are marked as private for read/write. + * Note: Each header that uses this needs to define its own way of handling + * it. There's no generic implementation, direct use does nothing. */ +#define DNA_PRIVATE_READ_WRITE_ALLOW #include "DNA_anim_types.h" #include "DNA_armature_types.h" @@ -120,6 +124,7 @@ #include "DNA_key_types.h" #include "DNA_lattice_types.h" #include "DNA_lamp_types.h" +#include "DNA_layer_types.h" #include "DNA_linestyle_types.h" #include "DNA_meta_types.h" #include "DNA_mesh_types.h" @@ -130,6 +135,7 @@ #include "DNA_object_force.h" #include "DNA_packedFile_types.h" #include "DNA_particle_types.h" +#include "DNA_lightprobe_types.h" #include "DNA_property_types.h" #include "DNA_rigidbody_types.h" #include "DNA_scene_types.h" @@ -146,6 +152,7 @@ #include "DNA_vfont_types.h" #include "DNA_world_types.h" #include "DNA_windowmanager_types.h" +#include "DNA_workspace_types.h" #include "DNA_movieclip_types.h" #include "DNA_mask_types.h" @@ -172,6 +179,7 @@ #include "BKE_fcurve.h" #include "BKE_pointcache.h" #include "BKE_mesh.h" +#include "BKE_workspace.h" #ifdef USE_NODE_COMPAT_CUSTOMNODES #include "NOD_socket.h" /* for sock->default_value data */ @@ -1076,10 +1084,13 @@ static void write_nodetree_nolib(WriteData *wd, bNodeTree *ntree) * Take care using 'use_active_win', since we wont want the currently active window * to change which scene renders (currently only used for undo). */ -static void current_screen_compat(Main *mainvar, bScreen **r_screen, bool use_active_win) +static void current_screen_compat( + Main *mainvar, bool use_active_win, + bScreen **r_screen, Scene **r_scene, SceneLayer **r_render_layer) { wmWindowManager *wm; wmWindow *window = NULL; + WorkSpace *workspace; /* find a global current screen in the first open window, to have * a reasonable default for reading in older versions */ @@ -1103,8 +1114,11 @@ static void current_screen_compat(Main *mainvar, bScreen **r_screen, bool use_ac window = wm->windows.first; } } + workspace = (window) ? BKE_workspace_active_get(window->workspace_hook) : NULL; - *r_screen = (window) ? window->screen : NULL; + *r_screen = (window) ? BKE_workspace_active_screen_get(window->workspace_hook) : NULL; + *r_scene = (window) ? window->scene : NULL; + *r_render_layer = (window) ? BKE_workspace_render_layer_get(workspace) : NULL; } typedef struct RenderInfo { @@ -1120,13 +1134,11 @@ static void write_renderinfo(WriteData *wd, Main *mainvar) { bScreen *curscreen; Scene *sce, *curscene = NULL; + SceneLayer *render_layer; RenderInfo data; /* XXX in future, handle multiple windows with multiple screens? */ - current_screen_compat(mainvar, &curscreen, false); - if (curscreen) { - curscene = curscreen->scene; - } + current_screen_compat(mainvar, false, &curscreen, &curscene, &render_layer); for (sce = mainvar->scene.first; sce; sce = sce->id.next) { if (sce->id.lib == NULL && (sce == curscene || (sce->r.scemode & R_BG_RENDER))) { @@ -1687,6 +1699,13 @@ static void write_defgroups(WriteData *wd, ListBase *defbase) } } +static void write_fmaps(WriteData *wd, ListBase *fbase) +{ + for (bFaceMap *fmap = fbase->first; fmap; fmap = fmap->next) { + writestruct(wd, DATA, bFaceMap, 1, fmap); + } +} + static void write_modifiers(WriteData *wd, ListBase *modbase) { ModifierData *md; @@ -1724,6 +1743,8 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) SmokeModifierData *smd = (SmokeModifierData *)md; if (smd->type & MOD_SMOKE_TYPE_DOMAIN) { + writestruct(wd, DATA, SmokeDomainSettings, 1, smd->domain); + if (smd->domain) { write_pointcaches(wd, &(smd->domain->ptcaches[0])); @@ -1737,11 +1758,8 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) if (smd->domain->coba) { writestruct(wd, DATA, ColorBand, 1, smd->domain->coba); } - } - writestruct(wd, DATA, SmokeDomainSettings, 1, smd->domain); - if (smd->domain) { /* cleanup the fake pointcache */ BKE_ptcache_free_list(&smd->domain->ptcaches[1]); smd->domain->point_cache[1] = NULL; @@ -1891,6 +1909,7 @@ static void write_object(WriteData *wd, Object *ob) write_pose(wd, ob->pose); write_defgroups(wd, &ob->defbase); + write_fmaps(wd, &ob->fmaps); write_constraints(wd, &ob->constraints); write_motionpath(wd, ob->mpath); @@ -2123,6 +2142,10 @@ static void write_customdata( else if (layer->type == CD_GRID_PAINT_MASK) { write_grid_paint_mask(wd, count, layer->data); } + else if (layer->type == CD_FACEMAP) { + const int *layer_data = layer->data; + writedata(wd, DATA, sizeof(*layer_data) * count, layer_data); + } else { CustomData_file_write_info(layer->type, &structname, &structnum); if (structnum) { @@ -2537,6 +2560,34 @@ static void write_paint(WriteData *wd, Paint *p) } } +static void write_scene_collection(WriteData *wd, SceneCollection *sc) +{ + writestruct(wd, DATA, SceneCollection, 1, sc); + + writelist(wd, DATA, LinkData, &sc->objects); + writelist(wd, DATA, LinkData, &sc->filter_objects); + + for (SceneCollection *nsc = sc->scene_collections.first; nsc; nsc = nsc->next) { + write_scene_collection(wd, nsc); + } +} + +static void write_layer_collections(WriteData *wd, ListBase *lb) +{ + for (LayerCollection *lc = lb->first; lc; lc = lc->next) { + writestruct(wd, DATA, LayerCollection, 1, lc); + + writelist(wd, DATA, LinkData, &lc->object_bases); + writelist(wd, DATA, CollectionOverride, &lc->overrides); + + if (lc->properties) { + IDP_WriteProperty(lc->properties, wd); + } + + write_layer_collections(wd, &lc->layer_collections); + } +} + static void write_scene(WriteData *wd, Scene *sce) { /* write LibData */ @@ -2549,8 +2600,8 @@ static void write_scene(WriteData *wd, Scene *sce) write_keyingsets(wd, &sce->keyingsets); /* direct data */ - for (Base *base = sce->base.first; base; base = base->next) { - writestruct(wd, DATA, Base, 1, base); + for (BaseLegacy *base = sce->base.first; base; base = base->next) { + writestruct(wd, DATA, BaseLegacy, 1, base); } ToolSettings *tos = sce->toolsettings; @@ -2697,11 +2748,6 @@ static void write_scene(WriteData *wd, Scene *sce) writestruct(wd, DATA, TimeMarker, 1, marker); } - /* writing dynamic list of TransformOrientations to the blend file */ - for (TransformOrientation *ts = sce->transform_spaces.first; ts; ts = ts->next) { - writestruct(wd, DATA, TransformOrientation, 1, ts); - } - for (SceneRenderLayer *srl = sce->r.layers.first; srl; srl = srl->next) { writestruct(wd, DATA, SceneRenderLayer, 1, srl); if (srl->prop) { @@ -2736,6 +2782,24 @@ static void write_scene(WriteData *wd, Scene *sce) write_previews(wd, sce->preview); write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve); + write_scene_collection(wd, sce->collection); + + for (SceneLayer *sl = sce->render_layers.first; sl; sl = sl->next) { + writestruct(wd, DATA, SceneLayer, 1, sl); + writelist(wd, DATA, Base, &sl->object_bases); + if (sl->properties) { + IDP_WriteProperty(sl->properties, wd); + } + write_layer_collections(wd, &sl->layer_collections); + } + + if (sce->layer_properties) { + IDP_WriteProperty(sce->layer_properties, wd); + } + + if (sce->collection_properties) { + IDP_WriteProperty(sce->collection_properties, wd); + } } static void write_gpencil(WriteData *wd, bGPdata *gpd) @@ -2777,8 +2841,19 @@ static void write_windowmanager(WriteData *wd, wmWindowManager *wm) write_iddata(wd, &wm->id); for (wmWindow *win = wm->windows.first; win; win = win->next) { + + /* update deprecated screen member (for so loading in 2.7x uses the correct screen) */ + win->screen = BKE_workspace_active_screen_get(win->workspace_hook); + if (win->screen) { + BLI_strncpy(win->screenname, win->screen->id.name + 2, sizeof(win->screenname)); + } + writestruct(wd, DATA, wmWindow, 1, win); + writestruct(wd, DATA, WorkSpaceInstanceHook, 1, win->workspace_hook); writestruct(wd, DATA, Stereo3dFormat, 1, win->stereo3d_format); + + /* data is written, clear deprecated data again */ + win->screen = NULL; } } @@ -2869,6 +2944,8 @@ static void write_screen(WriteData *wd, bScreen *sc) writestruct(wd, ID_SCRN, bScreen, 1, sc); write_iddata(wd, &sc->id); + write_previews(wd, sc->preview); + /* direct data */ for (ScrVert *sv = sc->vertbase.first; sv; sv = sv->next) { writestruct(wd, DATA, ScrVert, 1, sv); @@ -2917,6 +2994,7 @@ static void write_screen(WriteData *wd, bScreen *sc) View3D *v3d = (View3D *)sl; BGpic *bgpic; writestruct(wd, DATA, View3D, 1, v3d); + for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) { writestruct(wd, DATA, BGpic, 1, bgpic); } @@ -3117,6 +3195,19 @@ static void write_sound(WriteData *wd, bSound *sound) } } +static void write_probe(WriteData *wd, LightProbe *prb) +{ + if (prb->id.us > 0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_LP, LightProbe, 1, prb); + write_iddata(wd, &prb->id); + + if (prb->adt) { + write_animdata(wd, prb->adt); + } + } +} + static void write_group(WriteData *wd, Group *group) { if (group->id.us > 0 || wd->current) { @@ -3662,6 +3753,17 @@ static void write_cachefile(WriteData *wd, CacheFile *cache_file) } } +static void write_workspace(WriteData *wd, WorkSpace *workspace) +{ + ListBase *layouts = BKE_workspace_layouts_get(workspace); + ListBase *transform_orientations = BKE_workspace_transform_orientations_get(workspace); + + writestruct(wd, ID_WS, WorkSpace, 1, workspace); + writelist(wd, DATA, WorkSpaceLayout, layouts); + writelist(wd, DATA, WorkSpaceDataRelation, &workspace->hook_layout_relations); + writelist(wd, DATA, TransformOrientation, transform_orientations); +} + /* Keep it last of write_foodata functions. */ static void write_libraries(WriteData *wd, Main *main) { @@ -3731,6 +3833,8 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) const bool is_undo = (wd->current != NULL); FileGlobal fg; bScreen *screen; + Scene *scene; + SceneLayer *render_layer; char subvstr[8]; /* prevent mem checkers from complaining */ @@ -3738,11 +3842,12 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) memset(fg.filename, 0, sizeof(fg.filename)); memset(fg.build_hash, 0, sizeof(fg.build_hash)); - current_screen_compat(mainvar, &screen, is_undo); + current_screen_compat(mainvar, is_undo, &screen, &scene, &render_layer); /* XXX still remap G */ fg.curscreen = screen; - fg.curscene = screen ? screen->scene : NULL; + fg.curscene = scene; + fg.cur_render_layer = render_layer; /* prevent to save this, is not good convention, and feature with concerns... */ fg.fileflags = (fileflags & ~G_FILE_FLAGS_RUNTIME); @@ -3841,6 +3946,9 @@ static bool write_file_handle( case ID_WM: write_windowmanager(wd, (wmWindowManager *)id); break; + case ID_WS: + write_workspace(wd, (WorkSpace *)id); + break; case ID_SCR: write_screen(wd, (bScreen *)id); break; @@ -3886,6 +3994,9 @@ static bool write_file_handle( case ID_SPK: write_speaker(wd, (Speaker *)id); break; + case ID_LP: + write_probe(wd, (LightProbe *)id); + break; case ID_SO: write_sound(wd, (bSound *)id); break; |