Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2017-06-14 17:56:21 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2017-06-14 17:59:52 +0300
commitdbca1afefa700f25198761624cdb9f1fd21095d2 (patch)
treea8f0ae0c23c7d62f426aa5096962d0020b6cac6f
parentc59abb4c9a371e709c4904ce87d74c5c6c8a0792 (diff)
Add an option to free scene without doing id-counters
This is similar to some other datablocks. Mainly applies to collections, so freeing scene does not involve changing any non-directly owned data. There are two main usecases foreseen for the future: - Less CPU ticks on bmain free, where everything is freed anyway and there is no need to preserve id counters. - Easier freeing of temporary data, including data which is used by depsgraph's copy-on-write mechanism. Neither of those are currently implemented, but will be shortly.
-rw-r--r--source/blender/blenkernel/BKE_collection.h2
-rw-r--r--source/blender/blenkernel/BKE_scene.h1
-rw-r--r--source/blender/blenkernel/intern/collection.c24
-rw-r--r--source/blender/blenkernel/intern/scene.c9
4 files changed, 22 insertions, 14 deletions
diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 35d8f336207..0adac4500f8 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -46,7 +46,7 @@ struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneColl
bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
struct SceneCollection *BKE_collection_master(const struct Scene *scene);
void BKE_collection_rename(const struct Scene *scene, struct SceneCollection *sc, const char *name);
-void BKE_collection_master_free(struct Scene *scene);
+void BKE_collection_master_free(struct Scene *scene, const bool do_id_user);
void BKE_collection_object_add(const struct Scene *scene, struct SceneCollection *sc, struct Object *object);
void BKE_collection_object_add_from(struct Scene *scene, struct Object *ob_src, struct Object *ob_dst);
void BKE_collection_object_remove(struct Main *bmain, const struct Scene *scene, struct SceneCollection *sc, struct Object *object, const bool free_us);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index cd59ef98903..5047070012c 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -71,6 +71,7 @@ struct Base *_setlooper_base_step(struct Scene **sce_iter, struct Base *base);
void free_avicodecdata(struct AviCodecData *acd);
void free_qtcodecdata(struct QuicktimeCodecData *acd);
+void BKE_scene_free_ex(struct Scene *sce, const bool do_id_user);
void BKE_scene_free(struct Scene *sce);
void BKE_scene_init(struct Scene *sce);
struct Scene *BKE_scene_add(struct Main *bmain, const char *name);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 507ae1a4e70..3bf3a5ce5a4 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -75,20 +75,22 @@ SceneCollection *BKE_collection_add(Scene *scene, SceneCollection *sc_parent, co
/**
* Free the collection items recursively
*/
-static void collection_free(SceneCollection *sc)
+static void collection_free(SceneCollection *sc, const bool do_id_user)
{
- for (LinkData *link = sc->objects.first; link; link = link->next) {
- id_us_min(link->data);
+ if (do_id_user) {
+ for (LinkData *link = sc->objects.first; link; link = link->next) {
+ id_us_min(link->data);
+ }
+ for (LinkData *link = sc->filter_objects.first; link; link = link->next) {
+ id_us_min(link->data);
+ }
}
- BLI_freelistN(&sc->objects);
- for (LinkData *link = sc->filter_objects.first; link; link = link->next) {
- id_us_min(link->data);
- }
+ BLI_freelistN(&sc->objects);
BLI_freelistN(&sc->filter_objects);
for (SceneCollection *nsc = sc->scene_collections.first; nsc; nsc = nsc->next) {
- collection_free(nsc);
+ collection_free(nsc, do_id_user);
}
BLI_freelistN(&sc->scene_collections);
}
@@ -160,7 +162,7 @@ bool BKE_collection_remove(Scene *scene, SceneCollection *sc)
}
/* clear the collection items */
- collection_free(sc);
+ collection_free(sc, true);
/* check all layers that use this collection and clear them */
for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
@@ -218,9 +220,9 @@ void BKE_collection_rename(const Scene *scene, SceneCollection *sc, const char *
* Free (or release) any data used by the master collection (does not free the master collection itself).
* Used only to clear the entire scene data since it's not doing re-syncing of the LayerCollection tree
*/
-void BKE_collection_master_free(Scene *scene)
+void BKE_collection_master_free(Scene *scene, const bool do_id_user)
{
- collection_free(BKE_collection_master(scene));
+ collection_free(BKE_collection_master(scene), do_id_user);
}
static void collection_object_add(const Scene *scene, SceneCollection *sc, Object *ob)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index d2e6450f0de..94372588957 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -482,7 +482,7 @@ void BKE_scene_make_local(Main *bmain, Scene *sce, const bool lib_local)
}
/** Free (or release) any data used by this scene (does not free the scene itself). */
-void BKE_scene_free(Scene *sce)
+void BKE_scene_free_ex(Scene *sce, const bool do_id_user)
{
SceneRenderLayer *srl;
@@ -590,7 +590,7 @@ void BKE_scene_free(Scene *sce)
}
/* Master Collection */
- BKE_collection_master_free(sce);
+ BKE_collection_master_free(sce, do_id_user);
MEM_freeN(sce->collection);
sce->collection = NULL;
@@ -609,6 +609,11 @@ void BKE_scene_free(Scene *sce)
}
}
+void BKE_scene_free(Scene *sce)
+{
+ return BKE_scene_free_ex(sce, true);
+}
+
void BKE_scene_init(Scene *sce)
{
ParticleEditSettings *pset;