[Bf-blender-cvs] [d772b1d934e] greasepencil-object: Fix crashes when loading old GP files from 2.79
Joshua Leung
noreply at git.blender.org
Thu Nov 16 13:17:27 CET 2017
Commit: d772b1d934ed9d3c9ec55ac250b29f6107eea025
Author: Joshua Leung
Date: Fri Nov 17 01:16:40 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rBd772b1d934ed9d3c9ec55ac250b29f6107eea025
Fix crashes when loading old GP files from 2.79
Moved all the datablock-twiddling version patching magic to the
"after_liblink" version patching function. Apparently the problem
was that many of the old pointers had not been fixed up at that point,
causing problems if relying on accessing their contents.
===================================================================
M source/blender/blenloader/intern/versioning_280.c
===================================================================
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 3ff2c5e7f8e..4dc772b9ff6 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -475,6 +475,60 @@ void do_versions_after_linking_280(Main *main)
if (!MAIN_VERSION_ATLEAST(main, 280, 1)) {
do_version_workspaces_after_lib_link(main);
}
+
+ /* Grease Pencil Object */
+ if (!MAIN_VERSION_ATLEAST(main, 280, 2)) {
+ /* Convert grease pencil datablock to GP object */
+ for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+ if (scene->gpd) {
+ Object *ob;
+ SceneLayer *scene_layer = BKE_scene_layer_from_scene_get(scene);
+ if (scene_layer == NULL) {
+ scene_layer = BKE_scene_layer_add(scene, "Viewport");
+ printf("added scene layer again - %p\n", scene_layer);
+ }
+
+ ob = BKE_object_add_for_data(main, scene, scene_layer, OB_GPENCIL, "GP_Scene", &scene->gpd->id, false);
+ zero_v3(ob->loc);
+ scene->gpd = NULL;
+
+ /* set cache as dirty */
+ BKE_gpencil_batch_cache_dirty(ob->data);
+ }
+ }
+ }
+
+ /* XXX: Merge back into previous case... leaving like this so the Hero animatic/production files so far don't break */
+ if (!MAIN_VERSION_ATLEAST(main, 280, 3)) {
+ /* Handle object-linked grease pencil datablocks */
+ for (Object *ob = main->object.first; ob; ob = ob->id.next) {
+ if (ob->gpd) {
+ if (ob->type == OB_GPENCIL) {
+ /* GP Object - remap the links */
+ ob->data = ob->gpd;
+ ob->gpd = NULL;
+ }
+ else if (ob->type == OB_EMPTY) {
+ /* Empty with GP data - This should be able to be converted
+ * to a GP object with little data loss
+ */
+ ob->data = ob->gpd;
+ ob->gpd = NULL;
+ ob->type = OB_GPENCIL;
+ }
+ else {
+ /* FIXME: What to do in this case?
+ *
+ * We cannot create new objects for these, as we don't have a scene & scene layer
+ * to put them into from here...
+ */
+ printf("WARNING: Old Grease Pencil data ('%s') still exists on Object '%s'\n",
+ ob->gpd->id.name+2, ob->id.name+2);
+ }
+ }
+ }
+ }
+
}
static void do_version_layer_collections_idproperties(ListBase *lb)
@@ -567,23 +621,10 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
}
if (!MAIN_VERSION_ATLEAST(main, 280, 2)) {
- /* Convert grease pencil datablock to GP object */
- for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
- if (scene->gpd) {
- Object *ob;
- SceneLayer *scene_layer = BKE_scene_layer_from_scene_get(scene);
- if (scene_layer == NULL) {
- scene_layer = BKE_scene_layer_add(scene, "Viewport");
- }
-
- ob = BKE_object_add_for_data(main, scene, scene_layer, OB_GPENCIL, "GP_Scene", &scene->gpd->id, false);
- zero_v3(ob->loc);
- scene->gpd = NULL;
-
- /* set cache as dirty */
- BKE_gpencil_batch_cache_dirty(ob->data);
- }
- }
+ /* NOTE: See also do_versions_after_linking_280()
+ * Some GP datablock link changes happen there instead, otherwise we get weird
+ * crashes and corrupt data when trying to move linked datablocks around.
+ */
/* Convert grease pencil palettes to blender palettes */
if (!DNA_struct_elem_find(fd->filesdna, "bGPDstroke", "Palette", "*palette")) {
@@ -624,7 +665,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
}
}
}
- gpd->id.tag &= ~LIB_TAG_NEED_LINK;
+ gpd->id.tag &= ~LIB_TAG_NEED_LINK; // XXX: WHY?!
}
}
@@ -696,37 +737,6 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
}
}
}
-
- /* XXX: Merge back into previous case... leaving like this so the Hero animatic/production files so far don't break */
- if (!MAIN_VERSION_ATLEAST(main, 280, 3)) {
- /* Handle object-linked grease pencil datablocks */
- for (Object *ob = main->object.first; ob; ob = ob->id.next) {
- if (ob->gpd) {
- if (ob->type == OB_GPENCIL) {
- /* GP Object - remap the links */
- ob->data = ob->gpd;
- ob->gpd = NULL;
- }
- else if (ob->type == OB_EMPTY) {
- /* Empty with GP data - This should be able to be converted
- * to a GP object with little data loss
- */
- ob->data = ob->gpd;
- ob->gpd = NULL;
- ob->type = OB_GPENCIL;
- }
- else {
- /* FIXME: What to do in this case?
- *
- * We cannot create new objects for these, as we don't have a scene & scene layer
- * to put them into from here...
- */
- printf("WARNING: Old Grease Pencil data ('%s') still exists on Object '%s'\n",
- ob->gpd->id.name+2, ob->id.name+2);
- }
- }
- }
- }
{
if (!DNA_struct_elem_find(fd->filesdna, "View3D", "short", "custom_orientation_index")) {
More information about the Bf-blender-cvs
mailing list