[Bf-blender-cvs] [2a860829459] blender2.8: Validate collection properties at readile

Dalai Felinto noreply at git.blender.org
Wed May 3 11:52:04 CEST 2017


Commit: 2a8608294597f82add9c69b64bc11b9c492d46ac
Author: Dalai Felinto
Date:   Wed May 3 11:38:17 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB2a8608294597f82add9c69b64bc11b9c492d46ac

Validate collection properties at readile

The alternative would be to do version bump + doversioning every
time a new property is added.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/blender.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index c75f9fb818d..a54cce73c7f 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -57,6 +57,8 @@ struct Scene;
 struct SceneCollection;
 struct SceneLayer;
 
+void BKE_layer_exit(void);
+
 struct SceneLayer *BKE_scene_layer_render_active(const struct Scene *scene);
 struct SceneLayer *BKE_scene_layer_context_active(const struct Scene *scene);
 struct SceneLayer *BKE_scene_layer_add(struct Scene *scene, const char *name);
@@ -113,6 +115,7 @@ struct IDProperty *BKE_scene_collection_engine_get(struct Scene *scene, const in
 void BKE_layer_collection_engine_settings_callback_register(struct Main *bmain, const char *engine_name, CollectionEngineSettingsCB func);
 void BKE_layer_collection_engine_settings_callback_free(void);
 void BKE_layer_collection_engine_settings_create(struct IDProperty *root);
+void BKE_layer_collection_engine_settings_validate(struct Scene *scene);
 
 void BKE_collection_engine_property_add_float(struct IDProperty *props, const char *name, float value);
 void BKE_collection_engine_property_add_int(struct IDProperty *props, const char *name, int value);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index e85cb5d0ab6..ebb10c02683 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -54,6 +54,7 @@
 #include "BKE_global.h"
 #include "BKE_idprop.h"
 #include "BKE_image.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_node.h"
 #include "BKE_report.h"
@@ -97,6 +98,8 @@ void BKE_blender_free(void)
 
 	BKE_sequencer_cache_destruct();
 	IMB_moviecache_destruct();
+
+	BKE_layer_exit();
 	
 	free_nodesystem();
 }
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index b74b6ac7e6b..d9398ae83c7 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -1253,6 +1253,55 @@ void BKE_layer_collection_engine_settings_create(IDProperty *root)
 	collection_engine_settings_init(root, true);
 }
 
+/**
+ * Reference of IDProperty group scene collection settings
+ * Used when reading blendfiles, to see if there is any missing settings.
+ */
+static IDProperty *root_reference = NULL;
+
+/**
+ * Free the reference scene collection settings IDProperty group.
+ */
+static void layer_collection_engine_settings_validate_init(void)
+{
+	if (root_reference == NULL) {
+		IDPropertyTemplate val = {0};
+		root_reference = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+		BKE_layer_collection_engine_settings_create(root_reference);
+	}
+}
+
+/**
+ * Free the reference scene collection settings IDProperty group.
+ */
+static void layer_collection_engine_settings_validate_free(void)
+{
+	if (root_reference != NULL) {
+		IDP_FreeProperty(root_reference);
+		MEM_freeN(root_reference);
+		root_reference = NULL;
+	}
+}
+
+/**
+ * Make sure Scene has all required collection settings.
+ */
+void BKE_layer_collection_engine_settings_validate(Scene *scene)
+{
+	if (root_reference == NULL) {
+		layer_collection_engine_settings_validate_init();
+	}
+
+	if (scene->collection_properties == NULL) {
+		IDPropertyTemplate val = {0};
+		scene->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
+		BKE_layer_collection_engine_settings_create(scene->collection_properties);
+	}
+	else {
+		IDP_MergeGroup(scene->collection_properties, root_reference, false);
+	}
+}
+
 /* ---------------------------------------------------------------------- */
 /* Iterators */
 
@@ -1464,3 +1513,11 @@ void BKE_layer_eval_layer_collection_post(struct EvaluationContext *UNUSED(eval_
 		}
 	}
 }
+
+/**
+ * Free any static allocated memory.
+ */
+void BKE_layer_exit()
+{
+	layer_collection_engine_settings_validate_free();
+}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index b7a8e85a93d..4cb0595dde9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6297,6 +6297,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
 
 	sce->collection_properties = newdataadr(fd, sce->collection_properties);
 	IDP_DirectLinkGroup_OrFree(&sce->collection_properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+	BKE_layer_collection_engine_settings_validate(sce);
 }
 
 /* ************ READ WM ***************** */
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 476439dfe77..70c35788527 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -212,14 +212,6 @@ void do_versions_after_linking_280(Main *main)
 			}
 		}
 	}
-
-	if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
-		IDPropertyTemplate val = {0};
-		for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
-			scene->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP);
-			BKE_layer_collection_engine_settings_create(scene->collection_properties);
-		}
-	}
 }
 
 static void do_version_layer_collections_idproperties(ListBase *lb)




More information about the Bf-blender-cvs mailing list