[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