diff options
-rw-r--r-- | source/blender/blenkernel/BKE_main.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/main.c | 21 |
2 files changed, 24 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h index 872cdc2bcd3..88387b88d96 100644 --- a/source/blender/blenkernel/BKE_main.h +++ b/source/blender/blenkernel/BKE_main.h @@ -41,6 +41,7 @@ struct BLI_mempool; struct BlendThumbnail; struct Depsgraph; struct GHash; +struct GSet; struct ImBuf; struct Library; struct MainLock; @@ -136,6 +137,8 @@ void BKE_main_unlock(struct Main *bmain); void BKE_main_relations_create(struct Main *bmain); void BKE_main_relations_free(struct Main *bmain); +struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset); + /* *** Generic utils to loop over whole Main database. *** */ /** \return false to stop iteration, true to keep going. */ typedef bool (*MainForeachIDCallback) (struct Main *bmain, struct ID *id, void *user_data); diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c index d5b9147b34f..37d812adfa2 100644 --- a/source/blender/blenkernel/intern/main.c +++ b/source/blender/blenkernel/intern/main.c @@ -209,6 +209,27 @@ void BKE_main_relations_free(Main *bmain) } } +static bool main_gset_create(Main *UNUSED(bmain), ID *id, void *user_data) +{ + GSet *gset = user_data; + BLI_gset_add(gset, id); + return true; +} + +/** + * Create a GSet storing all IDs present in given \a bmain, by their pointers. + * + * \param gset If not NULL, given GSet will be extended with IDs from given \a bmain, instead of creating a new one. + */ +GSet *BKE_main_gset_create(Main *bmain, GSet *gset) +{ + if (gset == NULL) { + gset = BLI_gset_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__); + } + BKE_main_foreach_id(bmain, false, main_gset_create, gset); + return gset; +} + /** * Call given callback over every IDs of given \a lb listbase (assumed to be part of given \a bmain). * |