53 library->runtime = MEM_new<LibraryRuntime>(__func__);
67 std::optional<Library *> owner_library,
73 BLI_assert(!owner_library || *owner_library ==
nullptr);
76 const Library *library_src =
reinterpret_cast<const Library *
>(id_src);
87 library_dst->
runtime = MEM_new<LibraryRuntime>(__func__, *library_src->
runtime);
88 library_dst->
runtime->filedata =
nullptr;
89 library_dst->
runtime->name_map =
nullptr;
104 if (
lib->packedfile !=
138 lib->runtime = MEM_new<LibraryRuntime>(__func__);
175 if (
lib->filepath != filepath) {
179 STRNCPY(
lib->runtime->filepath_abs, filepath);
202 Library *best_parent_lib =
nullptr;
203 bool do_break =
false;
214 ID *from_id = item->id_pointer.from;
220 if (from_id_lib ==
lib) {
223 if (directly_used_libs.
contains(from_id_lib)) {
225 BLI_assert(best_parent_lib ==
nullptr || best_parent_lib->
runtime->temp_index > 0);
226 best_parent_lib = from_id_lib;
230 if (!from_id_lib->
runtime->parent) {
233 if (!best_parent_lib ||
234 best_parent_lib->
runtime->temp_index > from_id_lib->
runtime->temp_index)
236 best_parent_lib = from_id_lib;
237 if (best_parent_lib->
runtime->temp_index == 0) {
259 if (best_parent_lib) {
260 lib->runtime->parent = best_parent_lib;
261 lib->runtime->temp_index = best_parent_lib->
runtime->temp_index + 1;
264 lib->runtime->parent =
nullptr;
265 lib->runtime->temp_index = 0;
266 directly_used_libs.
add(
lib);
277 lib_iter->runtime->temp_index = 0;
295 directly_used_libs.
add(id_iter->
lib);
305 if (directly_used_libs.
contains(lib_iter)) {
306 BLI_assert(lib_iter->runtime->temp_index == 0);
312 if (lib_iter->runtime->parent) {
313 if (lib_iter->runtime->temp_index > 0) {
317 for (
Library *parent_lib_iter = lib_iter;
318 parent_lib_iter && parent_lib_iter->
runtime->temp_index == 0;
319 parent_lib_iter = parent_lib_iter->runtime->parent)
321 parent_libraries.
append(parent_lib_iter);
323 int parent_temp_index = parent_libraries.
last()->runtime->temp_index +
324 int(parent_libraries.
size()) - 1;
325 for (
Library *parent_lib_iter : parent_libraries) {
327 parent_lib_iter->runtime->temp_index == parent_temp_index);
328 parent_lib_iter->runtime->temp_index = parent_temp_index--;
342 if (directly_used_libs.
contains(lib_iter)) {
343 BLI_assert(lib_iter->runtime->temp_index == 0);
347 if (lib_iter->runtime->parent) {
348 BLI_assert(lib_iter->runtime->temp_index > 0);
351 BLI_assert(lib_iter->runtime->temp_index == 0);
363 if (filepath_abs == lib_iter->runtime->filepath_abs) {
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
@ IDTYPE_FLAGS_NO_ANIMDATA
@ IDTYPE_FLAGS_NO_LIBLINKING
@ IDTYPE_FLAGS_NEVER_UNUSED
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_LISTBASE_ID_END
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
#define FOREACH_MAIN_LISTBASE_END
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
void BKE_main_relations_create(Main *bmain, short flag)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_main_relations_free(Main *bmain)
void BKE_main_namemap_destroy(UniqueName_Map **r_name_map) ATTR_NONNULL()
PackedFile * BKE_packedfile_duplicate(const PackedFile *pf_src)
void BKE_packedfile_free(PackedFile *pf)
void BKE_packedfile_blend_write(BlendWriter *writer, const PackedFile *pf)
#define BLI_assert_unreachable()
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
#define LISTBASE_FOREACH(type, var, list)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
char * STRNCPY(char(&dst)[N], const char *src)
#define UNUSED_VARS_NDEBUG(...)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLT_I18NCONTEXT_ID_LIBRARY
#define CLOG_INFO(clg_ref, level,...)
ID and Library types, which are fundamental for SDNA.
BMesh const char void * data
bool contains(const Key &key) const
void append(const T &value)
const T & last(const int64_t n=0) const
#define ID_IS_LINKED(_id)
void BKE_library_filepath_set(Main *bmain, Library *lib, const char *filepath)
void BKE_library_main_rebuild_hierarchy(Main *bmain)
static void library_runtime_reset(Library *lib)
static void rebuild_hierarchy_best_parent_find(Main *bmain, blender::Set< Library * > &directly_used_libs, Library *lib)
static void library_blend_read_data(BlendDataReader *, ID *id)
static void library_foreach_path(ID *id, BPathForeachPathData *bpath_data)
static void library_blend_write_data(BlendWriter *writer, ID *id, const void *id_address)
static void library_foreach_id(ID *id, LibraryForeachIDData *data)
static void library_init_data(ID *id)
static void library_copy_data(Main *bmain, std::optional< Library * > owner_library, ID *id_dst, const ID *id_src, int)
static void library_free_data(ID *id)
Library * search_filepath_abs(ListBase *libraries, blender::StringRef filepath_abs)
struct PackedFile * packedfile
LibraryRuntimeHandle * runtime
MainIDRelationsEntryItem * next
MainIDRelationsEntryItem * from_ids
GHash * relations_from_pointers
MainIDRelations * relations
static DynamicLibrary lib