From 2a8608294597f82add9c69b64bc11b9c492d46ac Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 3 May 2017 11:38:17 +0200 Subject: Validate collection properties at readile The alternative would be to do version bump + doversioning every time a new property is added. --- source/blender/blenkernel/BKE_layer.h | 3 ++ source/blender/blenkernel/intern/blender.c | 3 ++ source/blender/blenkernel/intern/layer.c | 57 +++++++++++++++++++++++ source/blender/blenloader/intern/readfile.c | 1 + source/blender/blenloader/intern/versioning_280.c | 8 ---- 5 files changed, 64 insertions(+), 8 deletions(-) (limited to 'source') 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) -- cgit v1.2.3