[Bf-blender-cvs] [49b8f73715b] greasepencil-object: Fix: Version patching code was creating extra GP datablocks and throwing them away

Joshua Leung noreply at git.blender.org
Sat Nov 4 05:47:53 CET 2017


Commit: 49b8f73715b3b9f6e0f0c7ded91d46a79f480800
Author: Joshua Leung
Date:   Mon Oct 30 02:51:27 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rB49b8f73715b3b9f6e0f0c7ded91d46a79f480800

Fix: Version patching code was creating extra GP datablocks and throwing them away

After modifying the BKE_object_add() function to create a new GP datablock
by default, this change in behaviour would cause problems for the version
patching code fixing the old scene->gpd.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenloader/intern/versioning_280.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 5dcd22190ac..354a8b4fa7e 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -39,6 +39,7 @@ struct BaseLegacy;
 struct EvaluationContext;
 struct Scene;
 struct SceneLayer;
+struct ID;
 struct Object;
 struct BoundBox;
 struct View3D;
@@ -98,6 +99,9 @@ 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;
+struct Object *BKE_object_add_for_data(
+        struct Main *bmain, struct Scene *scene, struct SceneLayer *scene_layer,
+        int type, const char *name, struct ID *data, bool add_user) 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 0809a336123..f09c2d841e0 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -778,7 +778,7 @@ Object *BKE_object_add(
 /**
  * Add a new object, using another one as a reference
  *
- * /param ob_src object to use to determine the collections of the new object.
+ * \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,
@@ -796,6 +796,41 @@ Object *BKE_object_add_from(
 	return ob;
 }
 
+/**
+ * Add a new object, but assign the given datablock as the ob->data
+ * for the newly created object.
+ *
+ * \param data The datablock to assign as ob->data for the new object.
+ *             This is assumed to be of the correct type.
+ * \param add_user If true, id_us_plus() will be called on data when
+ *                 assigning it to the object.
+ */
+Object *BKE_object_add_for_data(
+        Main *bmain, Scene *scene, SceneLayer *scene_layer,
+        int type, const char *name, ID *data, bool add_user)
+{
+	Object *ob;
+	Base *base;
+	LayerCollection *layer_collection;
+
+	/* same as object_add_common, except we don't create new ob->data */
+	ob = BKE_object_add_only_object(bmain, type, name);
+	ob->data = data;
+	if (add_user) id_us_plus(data);
+	
+	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);
+
+	layer_collection = BKE_layer_collection_get_active_ensure(scene, scene_layer);
+	BKE_collection_object_add(scene, layer_collection->scene_collection, ob);
+
+	base = BKE_scene_layer_base_find(scene_layer, ob);
+	BKE_scene_layer_base_select(scene_layer, base);
+
+	return ob;
+}
+
+
 #ifdef WITH_GAMEENGINE
 
 void BKE_object_lod_add(Object *ob)
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 6064f3d05eb..84704e84673 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -431,12 +431,9 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 			if (scene->gpd) {
 				Object *ob;
 				SceneLayer *sl = scene->render_layers.first;
-
-				ob = BKE_object_add(main, scene, sl, OB_GPENCIL, "GP_Scene");
-				zero_v3(ob->loc);
 				
-				// FIXME: function above actually initialises a new db already, which we throw away...
-				ob->data = scene->gpd;
+				ob = BKE_object_add_for_data(main, scene, sl, OB_GPENCIL, "GP_Scene", &scene->gpd->id, false);
+				zero_v3(ob->loc);
 				scene->gpd = NULL;
 
 				/* set cache as dirty */



More information about the Bf-blender-cvs mailing list