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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to