[Bf-blender-cvs] [fc10484f7c5] blender2.8: Fix/properly implement: "make group proxy"

Dalai Felinto noreply at git.blender.org
Thu Oct 19 22:04:29 CEST 2017


Commit: fc10484f7c55d425f8374f2ea64f6b525cff2b7d
Author: Dalai Felinto
Date:   Thu Oct 19 18:01:41 2017 -0200
Branches: blender2.8
https://developer.blender.org/rBfc10484f7c55d425f8374f2ea64f6b525cff2b7d

Fix/properly implement: "make group proxy"

This was never correctly implemented. It now works as expected (ala 2.79 behaviour).
The proxy object is added to all the collections of the original empty.

Before not only this wasn't the case, but it would crash Blender.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/object/object_relations.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index ce6a95c682b..5dcd22190ac 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -91,9 +91,13 @@ struct Object *BKE_object_add_only_object(
         int type, const char *name)
         ATTR_NONNULL(1) ATTR_RETURNS_NONNULL;
 struct Object *BKE_object_add(
-        struct Main *bmain, struct Scene *scene, struct SceneLayer *sl,
+        struct Main *bmain, struct Scene *scene, struct SceneLayer *scene_layer,
         int type, const char *name)
         ATTR_NONNULL(1, 2, 3) ATTR_RETURNS_NONNULL;
+struct Object *BKE_object_add_from(
+        struct Main *bmain, struct Scene *scene, struct SceneLayer *scene_layer,
+        int type, const char *name, struct Object *ob_src)
+        ATTR_NONNULL(1, 2, 3, 6) ATTR_RETURNS_NONNULL;
 void *BKE_object_obdata_add_from_type(
         struct Main *bmain,
         int type, const char *name)
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a47e88a8e48..af27203d0cb 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -724,33 +724,66 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name)
 	return ob;
 }
 
-/* general add: to scene, with layer from area and default name */
+
+static Object *object_add_common(Main *bmain, SceneLayer *scene_layer, int type, const char *name)
+{
+	Object *ob;
+
+	ob = BKE_object_add_only_object(bmain, type, name);
+	ob->data = BKE_object_obdata_add_from_type(bmain, type, name);
+	BKE_scene_layer_base_deselect_all(scene_layer);
+
+	DEG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
+	return ob;
+}
+
+/**
+ * General add: to scene, with layer from area and default name
+ *
+ * Object is added to the active SceneCollection.
+ * If there is no linked collection to the active SceneLayer we create a new one.
+ */
 /* creates minimum required data, but without vertices etc. */
 Object *BKE_object_add(
-        Main *bmain, Scene *scene, SceneLayer *sl,
+        Main *bmain, Scene *scene, SceneLayer *scene_layer,
         int type, const char *name)
 {
 	Object *ob;
 	Base *base;
-	LayerCollection *lc;
+	LayerCollection *layer_collection;
 
-	ob = BKE_object_add_only_object(bmain, type, name);
+	ob = object_add_common(bmain, scene_layer, type, name);
 
-	ob->data = BKE_object_obdata_add_from_type(bmain, type, name);
+	layer_collection = BKE_layer_collection_get_active_ensure(scene, scene_layer);
+	BKE_collection_object_add(scene, layer_collection->scene_collection, ob);
 
-	lc = BKE_layer_collection_get_active_ensure(scene, sl);
+	base = BKE_scene_layer_base_find(scene_layer, ob);
+	BKE_scene_layer_base_select(scene_layer, base);
+
+	return ob;
+}
+
+/**
+ * Add a new object, using another one as a reference
+ *
+ * /param ob_src object to use to determine the collections of the new object.
+ */
+Object *BKE_object_add_from(
+        Main *bmain, Scene *scene, SceneLayer *scene_layer,
+        int type, const char *name, Object *ob_src)
+{
+	Object *ob;
+	Base *base;
 
-	BKE_collection_object_add(scene, lc->scene_collection, ob);
+	ob = object_add_common(bmain, scene_layer, type, name);
+	BKE_collection_object_add_from(scene, ob_src, ob);
 
-	base = BKE_scene_layer_base_find(sl, ob);
-	BKE_scene_layer_base_deselect_all(sl);
-	BKE_scene_layer_base_select(sl, base);
+	base = BKE_scene_layer_base_find(scene_layer, ob);
+	BKE_scene_layer_base_select(scene_layer, base);
 
-	DEG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 	return ob;
 }
 
-
 #ifdef WITH_GAMEENGINE
 
 void BKE_object_lod_add(Object *ob)
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index abc89d0e937..839f8094c43 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -341,7 +341,7 @@ static int make_proxy_exec(bContext *C, wmOperator *op)
 	Object *ob, *gob = ED_object_active_context(C);
 	GroupObject *go;
 	Scene *scene = CTX_data_scene(C);
-	SceneLayer *sl = CTX_data_scene_layer(C);
+	SceneLayer *scene_layer = CTX_data_scene_layer(C);
 
 	if (gob->dup_group != NULL) {
 		go = BLI_findlink(&gob->dup_group->gobject, RNA_enum_get(op->ptr, "object"));
@@ -354,16 +354,16 @@ static int make_proxy_exec(bContext *C, wmOperator *op)
 
 	if (ob) {
 		Object *newob;
-		BaseLegacy *newbase, *oldbase = BASACT_NEW(sl);
+		Base *newbase, *oldbase = BASACT_NEW(scene_layer);
 		char name[MAX_ID_NAME + 4];
 
 		BLI_snprintf(name, sizeof(name), "%s_proxy", ((ID *)(gob ? gob : ob))->name + 2);
 
 		/* Add new object for the proxy */
-		newob = BKE_object_add(bmain, scene, sl, OB_EMPTY, name);
+		newob = BKE_object_add_from(bmain, scene, scene_layer, OB_EMPTY, name, gob ? gob : ob);
 
 		/* set layers OK */
-		newbase = BASACT_NEW(sl);    /* BKE_object_add sets active... */
+		newbase = BASACT_NEW(scene_layer);    /* BKE_object_add sets active... */
 		newbase->lay = oldbase->lay;
 		newob->lay = newbase->lay;



More information about the Bf-blender-cvs mailing list