Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / library_query.c
index 8d92ddcb053b21deeb04d759eec9cb01da5bd26a..0f83dfe7ecfc9989e5679eb89148fa191e071620 100644 (file)
@@ -52,6 +52,7 @@
 #include "DNA_mask_types.h"
 #include "DNA_node_types.h"
 #include "DNA_object_force_types.h"
+#include "DNA_lightprobe_types.h"
 #include "DNA_rigidbody_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sensor_types.h"
@@ -61,6 +62,8 @@
 #include "DNA_sound_types.h"
 #include "DNA_text_types.h"
 #include "DNA_vfont_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_workspace_types.h"
 #include "DNA_world_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_linklist_stack.h"
 
 #include "BKE_animsys.h"
+#include "BKE_collection.h"
 #include "BKE_constraint.h"
 #include "BKE_fcurve.h"
+#include "BKE_group.h"
 #include "BKE_idprop.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
@@ -82,6 +87,7 @@
 #include "BKE_sca.h"
 #include "BKE_sequencer.h"
 #include "BKE_tracking.h"
+#include "BKE_workspace.h"
 
 
 #define FOREACH_FINALIZE _finalize
@@ -368,6 +374,10 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
 #define CALLBACK_INVOKE(check_id_super, cb_flag) \
        FOREACH_CALLBACK_INVOKE(&data, check_id_super, cb_flag)
 
+       if (id->override_static != NULL) {
+               CALLBACK_INVOKE_ID(id->override_static->reference, IDWALK_CB_USER | IDWALK_CB_STATIC_OVERRIDE_REFERENCE);
+       }
+
        for (; id != NULL; id = (flag & IDWALK_RECURSE) ? BLI_LINKSTACK_POP(data.ids_todo) : NULL) {
                data.self_id = id;
                data.cb_flag = ID_IS_LINKED(id) ? IDWALK_CB_INDIRECT_USAGE : 0;
@@ -402,8 +412,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                        {
                                Scene *scene = (Scene *) id;
                                ToolSettings *toolsett = scene->toolsettings;
-                               SceneRenderLayer *srl;
-                               Base *base;
 
                                CALLBACK_INVOKE(scene->camera, IDWALK_CB_NOP);
                                CALLBACK_INVOKE(scene->world, IDWALK_CB_USER);
@@ -417,31 +425,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                 * since basact is just a pointer to one of those items. */
                                CALLBACK_INVOKE(scene->obedit, IDWALK_CB_NOP);
 
-                               for (srl = scene->r.layers.first; srl; srl = srl->next) {
-                                       FreestyleModuleConfig *fmc;
-                                       FreestyleLineSet *fls;
-
-                                       if (srl->mat_override) {
-                                               CALLBACK_INVOKE(srl->mat_override, IDWALK_CB_USER);
-                                       }
-                                       if (srl->light_override) {
-                                               CALLBACK_INVOKE(srl->light_override, IDWALK_CB_USER);
-                                       }
-                                       for (fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) {
-                                               if (fmc->script) {
-                                                       CALLBACK_INVOKE(fmc->script, IDWALK_CB_NOP);
-                                               }
-                                       }
-                                       for (fls = srl->freestyleConfig.linesets.first; fls; fls = fls->next) {
-                                               if (fls->group) {
-                                                       CALLBACK_INVOKE(fls->group, IDWALK_CB_USER);
-                                               }
-                                               if (fls->linestyle) {
-                                                       CALLBACK_INVOKE(fls->linestyle, IDWALK_CB_USER);
-                                               }
-                                       }
-                               }
-
                                if (scene->ed) {
                                        Sequence *seq;
                                        SEQP_BEGIN(scene->ed, seq)
@@ -461,8 +444,35 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
 
                                CALLBACK_INVOKE(scene->gpd, IDWALK_CB_USER);
 
-                               for (base = scene->base.first; base; base = base->next) {
-                                       CALLBACK_INVOKE(base->object, IDWALK_CB_USER);
+                               FOREACH_SCENE_COLLECTION(scene, sc)
+                               {
+                                       for (LinkData *link = sc->objects.first; link; link = link->next) {
+                                               CALLBACK_INVOKE_ID(link->data, IDWALK_CB_USER);
+                                       }
+                               }
+                               FOREACH_SCENE_COLLECTION_END
+
+                               ViewLayer *view_layer;
+                               for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
+                                       for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+                                               CALLBACK_INVOKE(base->object, IDWALK_NOP);
+                                       }
+
+                                       for (FreestyleModuleConfig  *fmc = view_layer->freestyle_config.modules.first; fmc; fmc = fmc->next) {
+                                               if (fmc->script) {
+                                                       CALLBACK_INVOKE(fmc->script, IDWALK_CB_NOP);
+                                               }
+                                       }
+
+                                       for (FreestyleLineSet *fls = view_layer->freestyle_config.linesets.first; fls; fls = fls->next) {
+                                               if (fls->group) {
+                                                       CALLBACK_INVOKE(fls->group, IDWALK_CB_USER);
+                                               }
+
+                                               if (fls->linestyle) {
+                                                       CALLBACK_INVOKE(fls->linestyle, IDWALK_CB_USER);
+                                               }
+                                       }
                                }
 
                                for (TimeMarker *marker = scene->markers.first; marker; marker = marker->next) {
@@ -624,31 +634,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                for (i = 0; i < mesh->totcol; i++) {
                                        CALLBACK_INVOKE(mesh->mat[i], IDWALK_CB_USER);
                                }
-
-                               /* XXX Really not happy with this - probably texface should rather use some kind of
-                                * 'texture slots' and just set indices in each poly/face item - would also save some memory.
-                                * Maybe a nice TODO for blender2.8? */
-                               if (mesh->mtface || mesh->mtpoly) {
-                                       for (i = 0; i < mesh->pdata.totlayer; i++) {
-                                               if (mesh->pdata.layers[i].type == CD_MTEXPOLY) {
-                                                       MTexPoly *txface = (MTexPoly *)mesh->pdata.layers[i].data;
-
-                                                       for (int j = 0; j < mesh->totpoly; j++, txface++) {
-                                                               CALLBACK_INVOKE(txface->tpage, IDWALK_CB_USER_ONE);
-                                                       }
-                                               }
-                                       }
-
-                                       for (i = 0; i < mesh->fdata.totlayer; i++) {
-                                               if (mesh->fdata.layers[i].type == CD_MTFACE) {
-                                                       MTFace *tface = (MTFace *)mesh->fdata.layers[i].data;
-
-                                                       for (int j = 0; j < mesh->totface; j++, tface++) {
-                                                               CALLBACK_INVOKE(tface->tpage, IDWALK_CB_USER_ONE);
-                                                       }
-                                               }
-                                       }
-                               }
                                break;
                        }
 
@@ -691,6 +676,7 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                        library_foreach_ID_as_subdata_link((ID **)&material->nodetree, callback, user_data, flag, &data);
                                }
                                CALLBACK_INVOKE(material->group, IDWALK_CB_USER);
+                               CALLBACK_INVOKE(material->edit_image, IDWALK_CB_USER);
                                break;
                        }
 
@@ -751,13 +737,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                break;
                        }
 
-                       case ID_SCR:
-                       {
-                               bScreen *screen = (bScreen *) id;
-                               CALLBACK_INVOKE(screen->scene, IDWALK_CB_USER_ONE);
-                               break;
-                       }
-
                        case ID_WO:
                        {
                                World *world = (World *) id;
@@ -780,13 +759,21 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                break;
                        }
 
+                       case ID_LP:
+                       {
+                               LightProbe *probe = (LightProbe *) id;
+                               CALLBACK_INVOKE(probe->image, IDWALK_CB_USER);
+                               break;
+                       }
+
                        case ID_GR:
                        {
                                Group *group = (Group *) id;
-                               GroupObject *gob;
-                               for (gob = group->gobject.first; gob; gob = gob->next) {
-                                       CALLBACK_INVOKE(gob->ob, IDWALK_CB_USER_ONE);
+                               FOREACH_GROUP_BASE(group, base)
+                               {
+                                       CALLBACK_INVOKE(base->object, IDWALK_CB_USER_ONE);
                                }
+                               FOREACH_GROUP_BASE_END
                                break;
                        }
 
@@ -968,6 +955,40 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                                }
                                break;
                        }
+
+                       case ID_WM:
+                       {
+                               wmWindowManager *wm = (wmWindowManager *)id;
+
+                               for (wmWindow *win = wm->windows.first; win; win = win->next) {
+                                       ID *workspace = (ID *)BKE_workspace_active_get(win->workspace_hook);
+
+                                       CALLBACK_INVOKE(win->scene, IDWALK_CB_USER_ONE);
+
+                                       CALLBACK_INVOKE_ID(workspace, IDWALK_CB_NOP);
+                                       /* allow callback to set a different workspace */
+                                       BKE_workspace_active_set(win->workspace_hook, (WorkSpace *)workspace);
+                               }
+                               break;
+                       }
+
+                       case ID_WS:
+                       {
+                               WorkSpace *workspace = (WorkSpace *)id;
+                               ListBase *layouts = BKE_workspace_layouts_get(workspace);
+
+                               for (WorkSpaceLayout *layout = layouts->first; layout; layout = layout->next) {
+                                       bScreen *screen = BKE_workspace_layout_screen_get(layout);
+
+                                       /* CALLBACK_INVOKE expects an actual pointer, not a variable holding the pointer.
+                                        * However we can't acess layout->screen here since we are outside the workspace project. */
+                                       CALLBACK_INVOKE(screen, IDWALK_CB_NOP);
+                                       /* allow callback to set a different screen */
+                                       BKE_workspace_layout_screen_set(layout, screen);
+                               }
+
+                               break;
+                       }
                        case ID_GD:
                        {
                                bGPdata *gpencil = (bGPdata *) id;
@@ -979,11 +1000,11 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
                        }
 
                        /* Nothing needed for those... */
+                       case ID_SCR:
                        case ID_IM:
                        case ID_VF:
                        case ID_TXT:
                        case ID_SO:
-                       case ID_WM:
                        case ID_PAL:
                        case ID_PC:
                        case ID_CF:
@@ -1111,6 +1132,9 @@ bool BKE_library_id_can_use_idtype(ID *id_owner, const short id_type_used)
                        return ELEM(id_type_used, ID_MC);  /* WARNING! mask->parent.id, not typed. */
                case ID_LS:
                        return (ELEM(id_type_used, ID_TE, ID_OB));
+               case ID_LP:
+                       return ELEM(id_type_used, ID_IM);
+               case ID_WS:
                case ID_IM:
                case ID_VF:
                case ID_TXT: