Commit: ef7dc52b537494166854faff96a6579637adb4fd
Author: Dalai Felinto
Date:   Tue Jan 17 17:42:32 2017 +0100
Branches: render-layers
https://developer.blender.org/rBef7dc52b537494166854faff96a6579637adb4fd

Link objects in scene using ObjectBase

===================================================================

M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/intern/layer.c
M       source/blender/editors/include/ED_object.h
M       source/blender/editors/object/object_relations.c
M       source/blender/editors/space_outliner/outliner_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index e2fade2457..bd925b735d 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -78,6 +78,8 @@ struct LayerCollection *BKE_collection_link(struct SceneLayer 
*sl, struct SceneC
 
 void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc);
 
+bool BKE_scene_has_object(struct Scene *scene, struct Object *ob);
+
 /* syncing */
 
 void BKE_layer_sync_new_scene_collection(struct Scene *scene, const struct 
SceneCollection *sc_parent, struct SceneCollection *sc);
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index 89a1a054ed..b92624e4c1 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -461,6 +461,23 @@ LayerCollection *layer_collection_add(SceneLayer *sl, 
ListBase *lb, SceneCollect
 
 
 /* ---------------------------------------------------------------------- */
+
+/**
+ * See if the object is in any of the scene layers of the scene
+ */
+bool BKE_scene_has_object(Scene *scene, Object *ob)
+{
+       for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+               ObjectBase *base = BKE_scene_layer_base_find(sl, ob);
+               if (base) {
+                       return true;
+               }
+       }
+       return false;
+}
+
+
+/* ---------------------------------------------------------------------- */
 /* Syncing */
 
 static LayerCollection 
*find_layer_collection_by_scene_collection(LayerCollection *lc, const 
SceneCollection *sc)
diff --git a/source/blender/editors/include/ED_object.h 
b/source/blender/editors/include/ED_object.h
index 6ffd22e2d9..996dcedb00 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -91,7 +91,6 @@ bool ED_object_parent_set(struct ReportList *reports, struct 
Main *bmain, struct
                           struct Object *par, int partype, const bool xmirror, 
const bool keep_transform,
                           const int vert_par[3]);
 void ED_object_parent_clear(struct Object *ob, const int type);
-struct Base *ED_object_scene_link(struct Scene *scene, struct Object *ob);
 
 void ED_keymap_proportional_cycle(struct wmKeyConfig *keyconf, struct wmKeyMap 
*keymap);
 void ED_keymap_proportional_obmode(struct wmKeyConfig *keyconf, struct 
wmKeyMap *keymap);
diff --git a/source/blender/editors/object/object_relations.c 
b/source/blender/editors/object/object_relations.c
index 4fe80c79e1..194991f6b6 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -1443,20 +1443,6 @@ static void link_to_scene(Main *UNUSED(bmain), unsigned 
short UNUSED(nr))
 }
 #endif
 
-Base *ED_object_scene_link(Scene *scene, Object *ob)
-{
-       Base *base;
-
-       if (BKE_scene_base_find(scene, ob)) {
-               return NULL;
-       }
-
-       base = BKE_scene_base_add(scene, ob);
-       id_us_plus(&ob->id);
-
-       return base;
-}
-
 static int make_links_scene_exec(bContext *C, wmOperator *op)
 {
        Scene *scene_to = BLI_findlink(&CTX_data_main(C)->scene, 
RNA_enum_get(op->ptr, "scene"));
@@ -1476,9 +1462,10 @@ static int make_links_scene_exec(bContext *C, wmOperator 
*op)
                return OPERATOR_CANCELLED;
        }
 
-       CTX_DATA_BEGIN (C, Base *, base, selected_bases)
+       SceneCollection *sc_to = BKE_collection_master(scene_to);
+       CTX_DATA_BEGIN (C, ObjectBase *, base, selected_bases)
        {
-               ED_object_scene_link(scene_to, base->object);
+               BKE_collection_object_add(scene_to, sc_to, base->object);
        }
        CTX_DATA_END;
 
diff --git a/source/blender/editors/space_outliner/outliner_edit.c 
b/source/blender/editors/space_outliner/outliner_edit.c
index e2f46ba115..365797501a 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -54,6 +54,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_global.h"
 #include "BKE_idcode.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
 #include "BKE_library_remap.h"
@@ -2170,8 +2171,6 @@ static int scene_drop_invoke(bContext *C, wmOperator *op, 
const wmEvent *event)
        te = outliner_dropzone_find(soops, fmval, false);
 
        if (te) {
-               Base *base;
-
                RNA_string_set(op->ptr, "scene", te->name);
                scene = (Scene *)BKE_libblock_find_name(ID_SCE, te->name);
 
@@ -2182,16 +2181,26 @@ static int scene_drop_invoke(bContext *C, wmOperator 
*op, const wmEvent *event)
                        return OPERATOR_CANCELLED;
                }
 
-               base = ED_object_scene_link(scene, ob);
-
-               if (base == NULL) {
+               if (BKE_scene_has_object(scene, ob)) {
                        return OPERATOR_CANCELLED;
                }
 
-               if (scene == CTX_data_scene(C)) {
-                       /* when linking to an inactive scene don't touch the 
layer */
-                       ob->lay = base->lay;
-                       ED_base_object_select(base, BA_SELECT);
+               SceneCollection *sc;
+               if (scene != CTX_data_scene(C)) {
+                       /* when linking to an inactive scene link to the master 
collection */
+                       sc = BKE_collection_master(scene);
+               }
+               else {
+                       sc = CTX_data_scene_collection(C);
+               }
+
+               BKE_collection_object_add(scene, sc, ob);
+
+               for (SceneLayer *sl = scene->render_layers.first; sl; sl = 
sl->next) {
+                       ObjectBase *base = BKE_scene_layer_base_find(sl, ob);
+                       if (base) {
+                               ED_object_base_select(base, BA_SELECT);
+                       }
                }
 
                DAG_relations_tag_update(bmain);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to