diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2017-06-01 21:41:18 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2017-06-01 21:46:18 +0300 |
commit | 46fc0bb87ebda166d08b23cbcca799acb2c54158 (patch) | |
tree | 1566d535d93c4fb81b962cdbc1346ca8242460f2 /source/blender/blenloader | |
parent | 7f564d74f9edaaa41ce27c6e854869096f70b4da (diff) |
Move custom transform orientations to workspace
This commit moves the list of transform orientations from scenes to workspaces.
Main reasons for this are:
* Transform orientations are UI data and should not be stored in the scene.
* Introducion of workspaces caused some (expected) glitches with transform orientations. Mainly when removing one.
* Improves code.
More technically speaking, this commit does:
* Move list of custom transform orientations from Scene to WorkSpace struct.
* Store active transform orientation index separate from View3D.twmode (twmode can only be set to preprocessor defined values now).
* Display custom transform orientation name in header when transforming in it (used to show "global" which isn't really correct).
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 12 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 22 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 7 |
3 files changed, 32 insertions, 9 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 966cbce62db..8e89c61d9f7 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2820,6 +2820,7 @@ static void direct_link_workspace(FileData *fd, WorkSpace *workspace, const Main { link_list(fd, BKE_workspace_layouts_get(workspace)); link_list(fd, &workspace->hook_layout_relations); + link_list(fd, BKE_workspace_transform_orientations_get(workspace)); for (WorkSpaceDataRelation *relation = workspace->hook_layout_relations.first; relation; @@ -2835,7 +2836,7 @@ static void direct_link_workspace(FileData *fd, WorkSpace *workspace, const Main BKE_workspace_render_layer_set(workspace, NULL); } - /* Same issue/fix as in direct_link_scene_update_screen_data: Can't read workspace data + /* Same issue/fix as in direct_link_workspace_link_scene_data: Can't read workspace data * when reading windows, so have to update windows after/when reading workspaces. */ for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) { for (wmWindow *win = wm->windows.first; win; win = win->next) { @@ -6057,7 +6058,10 @@ static void direct_link_layer_collections(FileData *fd, ListBase *lb) } } -static void direct_link_scene_update_screen_data( +/** + * Workspaces store a render layer pointer which can only be read after scene is read. + */ +static void direct_link_workspace_link_scene_data( FileData *fd, const Scene *scene, const ListBase *workspaces) { for (WorkSpace *workspace = workspaces->first; workspace; workspace = workspace->id.next) { @@ -6285,7 +6289,7 @@ static void direct_link_scene(FileData *fd, Scene *sce, Main *bmain) } link_list(fd, &(sce->markers)); - link_list(fd, &(sce->transform_spaces)); + link_list(fd, &(sce->transform_spaces)); /* only for old files */ link_list(fd, &(sce->r.layers)); link_list(fd, &(sce->r.views)); @@ -6371,7 +6375,7 @@ static void direct_link_scene(FileData *fd, Scene *sce, Main *bmain) BKE_layer_collection_engine_settings_validate_scene(sce); BKE_scene_layer_engine_settings_validate_scene(sce); - direct_link_scene_update_screen_data(fd, sce, &bmain->workspaces); + direct_link_workspace_link_scene_data(fd, sce, &bmain->workspaces); } /* ************ READ WM ***************** */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 2d14238eb6f..13da6e5d407 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -36,6 +36,7 @@ #include "DNA_mesh_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_view3d_types.h" #include "DNA_genfile.h" #include "BKE_collection.h" @@ -77,6 +78,7 @@ static void do_version_workspaces_create_from_screens(Main *bmain) for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) { const bScreen *screen_parent = screen_parent_find(screen); WorkSpace *workspace; + ListBase *transform_orientations; if (screen_parent) { /* fullscreen with "Back to Previous" option, don't create @@ -89,6 +91,9 @@ static void do_version_workspaces_create_from_screens(Main *bmain) } BKE_workspace_layout_add(workspace, screen, screen->id.name + 2); BKE_workspace_render_layer_set(workspace, screen->scene->render_layers.first); + + transform_orientations = BKE_workspace_transform_orientations_get(workspace); + BLI_duplicatelist(transform_orientations, &screen->scene->transform_spaces); } } @@ -129,6 +134,7 @@ static void do_version_workspaces_after_lib_link(Main *bmain) for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) { /* Deprecated from now on! */ + BLI_freelistN(&screen->scene->transform_spaces); screen->scene = NULL; } } @@ -373,5 +379,21 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) } } } + + if (!DNA_struct_elem_find(fd->filesdna, "View3D", "short", "custom_orientation_index")) { + for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) { + for (ScrArea *area = screen->areabase.first; area; area = area->next) { + for (SpaceLink *sl = area->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + if (v3d->twmode >= V3D_MANIP_CUSTOM) { + v3d->custom_orientation_index = v3d->twmode - V3D_MANIP_CUSTOM; + v3d->twmode = V3D_MANIP_CUSTOM; + } + } + } + } + } + } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 82d2e37dce0..c1628575398 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2754,11 +2754,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) { @@ -3754,10 +3749,12 @@ 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. */ |