Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenloader/intern/readfile.cc
| Show First 20 Lines • Show All 2,509 Lines • ▼ Show 20 Lines | LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void lib_link_restore_viewer_path(struct IDNameLib_Map *id_map, ViewerPath *viewer_path) | |||||
| { | |||||
| LISTBASE_FOREACH (ViewerPathElem *, elem, &viewer_path->path) { | |||||
| if (elem->type == VIEWER_PATH_ELEM_TYPE_ID) { | |||||
| auto typed_elem = reinterpret_cast<IDViewerPathElem *>(elem); | |||||
| typed_elem->id = static_cast<ID *>( | |||||
| restore_pointer_by_name(id_map, (ID *)typed_elem->id, USER_IGNORE)); | |||||
| } | |||||
| } | |||||
| } | |||||
| static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map, | static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map, | ||||
| Main *newmain, | Main *newmain, | ||||
| WorkSpaceLayout *layout) | WorkSpaceLayout *layout) | ||||
| { | { | ||||
| bScreen *screen = BKE_workspace_layout_screen_get(layout); | bScreen *screen = BKE_workspace_layout_screen_get(layout); | ||||
| /* avoid conflicts with 2.8x branch */ | /* avoid conflicts with 2.8x branch */ | ||||
| { | { | ||||
| LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { | LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { | ||||
| LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { | LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { | ||||
| if (sl->spacetype == SPACE_VIEW3D) { | if (sl->spacetype == SPACE_VIEW3D) { | ||||
| View3D *v3d = (View3D *)sl; | View3D *v3d = (View3D *)sl; | ||||
| v3d->camera = static_cast<Object *>( | v3d->camera = static_cast<Object *>( | ||||
| restore_pointer_by_name(id_map, (ID *)v3d->camera, USER_REAL)); | restore_pointer_by_name(id_map, (ID *)v3d->camera, USER_REAL)); | ||||
| v3d->ob_center = static_cast<Object *>( | v3d->ob_center = static_cast<Object *>( | ||||
| restore_pointer_by_name(id_map, (ID *)v3d->ob_center, USER_REAL)); | restore_pointer_by_name(id_map, (ID *)v3d->ob_center, USER_REAL)); | ||||
| lib_link_restore_viewer_path(id_map, &v3d->viewer_path); | |||||
| } | } | ||||
| else if (sl->spacetype == SPACE_GRAPH) { | else if (sl->spacetype == SPACE_GRAPH) { | ||||
| SpaceGraph *sipo = (SpaceGraph *)sl; | SpaceGraph *sipo = (SpaceGraph *)sl; | ||||
| bDopeSheet *ads = sipo->ads; | bDopeSheet *ads = sipo->ads; | ||||
| if (ads) { | if (ads) { | ||||
| ads->source = static_cast<ID *>( | ads->source = static_cast<ID *>( | ||||
| restore_pointer_by_name(id_map, (ID *)ads->source, USER_REAL)); | restore_pointer_by_name(id_map, (ID *)ads->source, USER_REAL)); | ||||
| ▲ Show 20 Lines • Show All 193 Lines • ▼ Show 20 Lines | #endif | ||||
| restore_pointer_by_name(id_map, (ID *)sclip->clip, USER_REAL)); | restore_pointer_by_name(id_map, (ID *)sclip->clip, USER_REAL)); | ||||
| sclip->mask_info.mask = static_cast<Mask *>( | sclip->mask_info.mask = static_cast<Mask *>( | ||||
| restore_pointer_by_name(id_map, (ID *)sclip->mask_info.mask, USER_REAL)); | restore_pointer_by_name(id_map, (ID *)sclip->mask_info.mask, USER_REAL)); | ||||
| sclip->scopes.ok = 0; | sclip->scopes.ok = 0; | ||||
| } | } | ||||
| else if (sl->spacetype == SPACE_SPREADSHEET) { | else if (sl->spacetype == SPACE_SPREADSHEET) { | ||||
| SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; | SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; | ||||
| lib_link_restore_viewer_path(id_map, &sspreadsheet->viewer_path); | |||||
| LISTBASE_FOREACH (SpreadsheetContext *, context, &sspreadsheet->context_path) { | |||||
| if (context->type == SPREADSHEET_CONTEXT_OBJECT) { | |||||
| SpreadsheetContextObject *object_context = (SpreadsheetContextObject *)context; | |||||
| object_context->object = static_cast<Object *>( | |||||
| restore_pointer_by_name(id_map, (ID *)object_context->object, USER_IGNORE)); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void blo_lib_link_restore(Main *oldmain, | void blo_lib_link_restore(Main *oldmain, | ||||
| Main *newmain, | Main *newmain, | ||||
| wmWindowManager *curwm, | wmWindowManager *curwm, | ||||
| Scene *curscene, | Scene *curscene, | ||||
| ViewLayer *cur_view_layer) | ViewLayer *cur_view_layer) | ||||
| { | { | ||||
| struct IDNameLib_Map *id_map = BKE_main_idmap_create( | struct IDNameLib_Map *id_map = BKE_main_idmap_create( | ||||
| newmain, true, oldmain, MAIN_IDMAP_TYPE_NAME); | newmain, true, oldmain, MAIN_IDMAP_TYPE_NAME); | ||||
| LISTBASE_FOREACH (WorkSpace *, workspace, &newmain->workspaces) { | LISTBASE_FOREACH (WorkSpace *, workspace, &newmain->workspaces) { | ||||
| LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) { | LISTBASE_FOREACH (WorkSpaceLayout *, layout, &workspace->layouts) { | ||||
| lib_link_workspace_layout_restore(id_map, newmain, layout); | lib_link_workspace_layout_restore(id_map, newmain, layout); | ||||
| } | } | ||||
| workspace->pin_scene = static_cast<Scene *>( | workspace->pin_scene = static_cast<Scene *>( | ||||
| restore_pointer_by_name(id_map, (ID *)workspace->pin_scene, USER_IGNORE)); | restore_pointer_by_name(id_map, (ID *)workspace->pin_scene, USER_IGNORE)); | ||||
| lib_link_restore_viewer_path(id_map, &workspace->viewer_path); | |||||
| } | } | ||||
| LISTBASE_FOREACH (wmWindow *, win, &curwm->windows) { | LISTBASE_FOREACH (wmWindow *, win, &curwm->windows) { | ||||
| WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); | WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); | ||||
| ID *workspace_id = (ID *)workspace; | ID *workspace_id = (ID *)workspace; | ||||
| Scene *oldscene = win->scene; | Scene *oldscene = win->scene; | ||||
| workspace = static_cast<WorkSpace *>(restore_pointer_by_name(id_map, workspace_id, USER_REAL)); | workspace = static_cast<WorkSpace *>(restore_pointer_by_name(id_map, workspace_id, USER_REAL)); | ||||
| ▲ Show 20 Lines • Show All 2,431 Lines • Show Last 20 Lines | |||||