Validate collection properties at readile
The alternative would be to do version bump + doversioning every time a new property is added.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 ***************** */
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user