97 .struct_size =
sizeof(
ID),
98 .name =
"LinkPlaceholder",
99 .name_plural =
"link_placeholders",
108 .foreach_cache =
NULL,
111 .blend_read_data =
NULL,
112 .blend_read_lib =
NULL,
113 .blend_read_expand =
NULL,
115 .blend_read_undo_preserve =
NULL,
117 .lib_override_apply_post =
NULL,
138 (
void *)bpath_user_data);
168 if (id_in_mainlist) {
215 id->lib->parent =
NULL;
243 if (
id->
us <= limit) {
246 "ID user count error: %s (from '%s')",
302 if (
id->
us <= limit) {
307 "ID user decrement error: %s (from '%s'): %d <= %d",
357 int const cb_flag = cb_data->
cb_flag;
381 if (*id_pointer && *id_pointer != id_self &&
415 bool is_local =
false, is_lib =
false;
430 if (lib_local || is_local) {
440 if (id_new !=
NULL) {
446 if (key && key_new) {
450 if (
ntree && ntree_new) {
455 *master_collection_new = ((
Scene *)id_new)->master_collection;
456 if (master_collection && master_collection_new) {
457 ID_NEW_SET(master_collection, master_collection_new);
491 if (idtype_info !=
NULL) {
520 ID *
id = *id_pointer;
521 const int cb_flag = cb_data->
cb_flag;
525 if (
id ==
data->id_src) {
527 id = *id_pointer =
data->id_dst;
540 #define LIB_ID_TYPES_NOCOPY \
541 ID_LI, ID_SCR, ID_WM, ID_WS, \
546 #undef LIB_ID_TYPES_NOCOPY
572 ID *newid = (r_newid !=
NULL) ? *r_newid :
NULL;
581 memset(newid, 0,
size);
592 if (idtype_info !=
NULL) {
622 newid->
lib =
id->lib;
625 if (r_newid !=
NULL) {
672 if (key_new !=
NULL) {
691 const size_t id_struct_size = id_type->
struct_size;
693 const ID id_a_back = *id_a;
694 const ID id_b_back = *id_b;
696 char *id_swap_buff = alloca(id_struct_size);
698 memcpy(id_swap_buff, id_a, id_struct_size);
699 memcpy(id_a, id_b, id_struct_size);
700 memcpy(id_b, id_swap_buff, id_struct_size);
731 id_swap(bmain, id_a, id_b,
false);
743 id_swap(bmain, id_a, id_b,
true);
788 const int cb_flag = cb_data->
cb_flag;
802 const int cb_flag = cb_data->
cb_flag;
900 const int ntag = ~tag;
946 const int nflag = ~
flag;
979 ID **id_array =
MEM_mallocN(
sizeof(*id_array) * lb_len, __func__);
988 for (i = 0; i < lb_len; i++) {
1028 if (id_type ==
NULL) {
1036 *name = id_type->
name;
1052 BLI_assert(!
"Request to allocate unknown data type");
1126 if (idtype_info !=
NULL) {
1214 ID *new_id = *r_newid;
1215 int flag = orig_flag;
1222 if (!is_private_id_data) {
1232 if ((bmain !=
NULL) && is_private_id_data) {
1260 const size_t id_offset =
sizeof(
ID);
1261 if ((
int)id_len - (int)id_offset > 0) {
1262 const char *cp = (
const char *)
id;
1263 char *cpn = (
char *)new_id;
1265 memcpy(cpn + id_offset, cp + id_offset, id_len - id_offset);
1268 new_id->
flag = (new_id->
flag & ~copy_idflag_mask) | (
id->
flag & copy_idflag_mask);
1350 #define ID_SORT_STEP_SIZE 512
1362 if (!
ELEM(id_sorting_hint,
NULL,
id)) {
1365 ID *id_sorting_hint_next = id_sorting_hint->
next;
1367 (id_sorting_hint_next ==
NULL ||
1373 ID *id_sorting_hint_prev = id_sorting_hint->
prev;
1375 (id_sorting_hint_prev ==
NULL ||
1383 int item_array_index;
1391 idtest = idtest->
prev, item_array_index--) {
1392 item_array[item_array_index] = idtest;
1393 if (item_array_index == 0) {
1409 for (item_array_index++; item_array_index <
ID_SORT_STEP_SIZE; item_array_index++) {
1410 idtest = item_array[item_array_index];
1417 if (idtest ==
NULL) {
1431 #undef ID_SORT_STEP_SIZE
1435 #define MAX_NUMBER 1000000000
1437 #define MIN_NUMBER 1
1441 #define MAX_NUMBERS_IN_USE 1024
1453 char number_str[11];
1459 if (base_name_len + number_str_len >=
MAX_ID_NAME - 2) {
1460 base_name_len =
MAX_ID_NAME - 2 - number_str_len - 1;
1465 base_name[base_name_len] =
'\0';
1472 name[base_name_len] =
'\0';
1477 BLI_strncpy(name + base_name_len, number_str, number_str_len + 1);
1493 *r_id_sorting_hint =
NULL;
1496 bool is_name_changed =
false;
1498 if (id_test ==
NULL) {
1499 return is_name_changed;
1502 const short id_type = (short)
GS(id_test->
name);
1506 static char prev_orig_base_name[
MAX_ID_NAME - 2] = {0};
1507 static char prev_final_base_name[
MAX_ID_NAME - 2] = {0};
1516 prev_number <
MAX_NUMBER - 1 && name[0] == prev_final_base_name[0]) {
1522 size_t prev_final_base_name_len = strlen(prev_final_base_name);
1523 size_t prev_orig_base_name_len = strlen(prev_orig_base_name);
1525 if (base_name_len == prev_orig_base_name_len &&
1526 STREQLEN(base_name, prev_orig_base_name, prev_orig_base_name_len)) {
1533 BLI_strncpy(final_name, prev_final_base_name, prev_final_base_name_len + 1);
1534 BLI_strncpy(prev_final_name, prev_final_base_name, prev_final_base_name_len + 1);
1536 if (
id_name_final_build(final_name, base_name, prev_final_base_name_len, prev_number + 1) &&
1542 for (id_test = lb->
first; id_test; id_test = id_test->
next) {
1544 if (id_test->
name[2] == final_name[0] &&
STREQ(final_name, id_test->
name + 2)) {
1551 if (!
is_valid && id_test->
name[2] == prev_final_name[0] &&
1552 STREQ(prev_final_name, id_test->
name + 2)) {
1554 *r_id_sorting_hint = id_test;
1564 strcpy(name, final_name);
1575 bool is_first_run =
true;
1584 strcpy(prev_orig_base_name, base_name);
1585 is_first_run =
false;
1595 bool is_orig_name_used =
false;
1596 for (id_test = lb->
first; id_test; id_test = id_test->
next) {
1599 if ((
id != id_test) && !
ID_IS_LINKED(id_test) && (name[0] == id_test->
name[2]) &&
1600 (
ELEM(id_test->
name[base_name_len + 2],
'.',
'\0')) &&
1606 if (!is_orig_name_used) {
1607 is_orig_name_used =
STREQ(name + base_name_len, id_test->
name + 2 + base_name_len);
1611 ids_in_use[number_test] = id_test;
1614 if (number <= number_test) {
1615 *r_id_sorting_hint = id_test;
1616 number = number_test + 1;
1625 if (!is_orig_name_used) {
1630 prev_final_base_name[0] =
'\0';
1634 *r_id_sorting_hint =
NULL;
1636 return is_name_changed;
1642 if (ids_in_use[i] ==
NULL) {
1645 *r_id_sorting_hint = ids_in_use[i - 1];
1657 is_name_changed =
true;
1663 memset(ids_in_use, 0,
sizeof(ids_in_use));
1670 prev_id_type = id_type;
1671 strcpy(prev_final_base_name, base_name);
1672 prev_number = number;
1674 return is_name_changed;
1677 #undef MAX_NUMBERS_IN_USE
1702 if (tname ==
NULL) {
1703 tname =
id->name + 2;
1708 if (name[0] ==
'\0') {
1718 ID *id_sorting_hint =
NULL;
1720 strcpy(
id->
name + 2, name);
1752 const int cb_flag = cb_data->
cb_flag;
1755 if (*id_pointer ==
NULL) {
1813 from_id_entry = from_id_entry->next) {
1820 ID *from_id = from_id_entry->id_pointer.from;
1826 from_id = ((
Key *)from_id)->from;
1881 GHash *old_to_new_ids,
1882 const bool untagged_only,
1883 const bool set_fake)
1900 printf(
"Pre-compute current ID relations: Done.\n");
1912 for (;
id;
id =
id->
next) {
1963 printf(
"Step 1: Detect data-blocks to make local: Done.\n");
1982 printf(
"Step 2: Check which data-blocks we can directly make local: Done.\n");
1989 for (
LinkNode *it = todo_ids, *it_next; it; it = it_next) {
2036 printf(
"Step 3: Make IDs local: Done.\n");
2060 if (old_to_new_ids) {
2073 printf(
"Step 4: Remap local usages of old (linked) ID to new (local) ID: Done.\n");
2089 bool is_local =
false, is_lib =
false;
2094 "proxy object %s will lose its link to %s, because the "
2095 "proxified object is local.",
2106 if (is_local || is_lib) {
2108 "made-local proxy object %s will lose its link to %s, "
2109 "because the linked-in proxy is referenced (is_local=%i, is_lib=%i).",
2129 printf(
"Step 5: Proxy 'remapping' hack: Done.\n");
2148 printf(
"Hack: Forcefully rebuild armature object poses: Done.\n");
2156 printf(
"Cleanup and finish: Done.\n");
2177 if (idtest !=
NULL) {
2207 strcpy(name,
id->
name + 2);
2210 const size_t idname_len = strlen(
id->
name + 2);
2211 const size_t libname_len = strlen(
id->
lib->
id.
name + 2);
2213 name[idname_len] = separator_char ? separator_char :
' ';
2214 name[idname_len + 1] =
'[';
2215 strcpy(name + idname_len + 2,
id->
lib->
id.
name + 2);
2216 name[idname_len + 2 + libname_len] =
']';
2217 name[idname_len + 2 + libname_len + 1] =
'\0';
2236 const bool add_lib_hint,
2237 char separator_char,
2269 const char ascii_len = strlen(
id->
lib->
id.
name + 2) + 32;
2321 if (order_a && order_b) {
2322 if (*order_a < *order_b) {
2325 if (*order_a > *order_b) {
2330 return strcmp(id_a->
name, id_b->
name);
2375 if (*
order > relative_order) {
2380 *id_order = relative_order + 1;
2386 if (*
order < relative_order) {
2391 *id_order = relative_order - 1;
2415 if (opop->subitem_reference_name) {
2418 if (opop->subitem_local_name) {
bool id_can_have_animdata(const struct ID *id)
struct AnimData * BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const int flag)
void BKE_animdata_duplicate_id_action(struct Main *bmain, struct ID *id, const uint duplicate_flags)
void BKE_pose_rebuild(struct Main *bmain, struct Object *ob, struct bArmature *arm, const bool do_id_user)
void BKE_asset_metadata_write(struct BlendWriter *writer, struct AssetMetaData *asset_data)
void BKE_bpath_traverse_id(struct Main *bmain, struct ID *id, BPathVisitor visit_cb, const int flag, void *bpath_user_data)
bool BKE_bpath_relocate_visitor(void *oldbasepath, char *path_dst, const char *path_src)
@ BKE_BPATH_TRAVERSE_SKIP_MULTIFILE
struct Main * CTX_data_main(const bContext *C)
void IDP_BlendWrite(struct BlendWriter *writer, const struct IDProperty *prop)
struct IDProperty * IDP_CopyProperty_ex(const struct IDProperty *prop, const int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
@ IDTYPE_FLAGS_NO_MAKELOCAL
@ IDTYPE_FLAGS_NO_LIBLINKING
bool BKE_idtype_idcode_is_linkable(const short idcode)
const struct IDTypeInfo * BKE_idtype_get_info_from_idcode(const short id_code)
const char * BKE_idtype_idcode_to_name(const short idcode)
const struct IDTypeInfo * BKE_idtype_get_info_from_id(const struct ID *id)
struct Key * BKE_key_from_id(struct ID *id)
@ LIB_ID_CREATE_NO_ALLOCATE
@ LIB_ID_COPY_NO_LIB_OVERRIDE
@ LIB_ID_COPY_SET_COPIED_ON_WRITE
@ LIB_ID_CREATE_NO_USER_REFCOUNT
@ LIB_ID_COPY_NO_ANIMDATA
@ LIB_ID_CREATE_NO_DEG_TAG
#define MAX_ID_FULL_NAME_UI
@ LIB_ID_MAKELOCAL_OBJECT_NO_PROXY_CLEARING
@ LIB_ID_MAKELOCAL_FULL_LIBRARY
#define MAIN_ID_SESSION_UUID_UNSET
void BKE_lib_override_library_make_local(struct ID *id)
void BKE_lib_override_library_copy(struct ID *dst_id, const struct ID *src_id, const bool do_full_copy)
void BKE_library_foreach_ID_link(struct Main *bmain, struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
void BKE_library_ID_test_usages(struct Main *bmain, void *idv, bool *is_used_local, bool *is_used_linked)
void void BKE_libblock_remap(struct Main *bmain, void *old_idv, void *new_idv, const short remap_flags) ATTR_NONNULL(1
void BKE_libblock_relink_ex(struct Main *bmain, void *idv, void *old_idv, void *new_idv, const short remap_flags) ATTR_NONNULL(1
@ ID_REMAP_SKIP_NEVER_NULL_USAGE
@ ID_REMAP_SKIP_INDIRECT_USAGE
#define FOREACH_MAIN_ID_END
void BKE_main_relations_create(struct Main *bmain, const short flag)
int set_listbasepointers(struct Main *main, struct ListBase *lb[])
void BKE_main_unlock(struct Main *bmain)
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
void BKE_main_lock(struct Main *bmain)
void BKE_main_relations_free(struct Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
struct ListBase * which_libbase(struct Main *bmain, short type)
struct bNodeTree * ntreeFromID(struct ID *id)
API for Blender-side Rigid Body stuff.
void BKE_rigidbody_ensure_local_object(struct Main *bmain, struct Object *ob)
GSet * BLI_gset_str_new_ex(const char *info, const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
unsigned int BLI_gset_len(GSet *gs) ATTR_WARN_UNUSED_RESULT
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_insert(GSet *gs, void *key)
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_gset_add(GSet *gs, void *key)
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp)
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_linklist_prepend_nlink(LinkNode **listp, void *ptr, LinkNode *nlink) ATTR_NONNULL(1
void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, struct MemArena *ma) ATTR_NONNULL(1
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
struct LinkData * BLI_genericNodeN(void *data)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1)
struct MemArena * BLI_memarena_new(const size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2) ATTR_MALLOC
size_t size_t char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
int BLI_strcasecmp(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
size_t BLI_snprintf_rlen(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
int BLI_utf8_invalid_strip(char *str, size_t length) ATTR_NONNULL()
size_t BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
#define STREQLEN(a, b, n)
#define POINTER_FROM_INT(i)
#define POINTER_AS_INT(i)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_write_struct_list(writer, struct_name, list_ptr)
#define BLT_I18NCONTEXT_ID_ID
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_id_type_tag(struct Main *bmain, short id_type)
void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_relations_tag_update(struct Main *bmain)
ID and Library types, which are fundamental for sdna.
#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id)
#define ID_FAKE_USERS(id)
@ ID_RECALC_COPY_ON_WRITE
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIB_TAG_NO_USER_REFCOUNT
@ LIB_TAG_COPIED_ON_WRITE
#define ID_IS_LINKED(_id)
@ LIB_EMBEDDED_DATA_LIB_OVERRIDE
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define ID_NEW_SET(_id, _idn)
#define ID_LINK_PLACEHOLDER
Object groups, one object can be in many groups at once.
@ GP_DATA_SHOW_ONIONSKINS
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint order
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
Utility defines for timing/benchmarks.
#define TIMEIT_START(var)
#define TIMEIT_VALUE_PRINT(var)
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE int32_t atomic_fetch_and_or_int32(int32_t *p, int32_t x)
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int32_t atomic_fetch_and_and_int32(int32_t *p, int32_t x)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static uint global_session_uuid
void BKE_libblock_init_empty(ID *id)
void id_lib_extern(ID *id)
void BKE_lib_libblock_session_uuid_renew(ID *id)
static int id_copy_libmanagement_cb(LibraryIDLinkCallbackData *cb_data)
#define ID_SORT_STEP_SIZE
static int * id_order_get(ID *id)
void * BKE_libblock_copy(Main *bmain, const ID *id)
void BKE_id_tag_clear_atomic(ID *id, int tag)
static void lib_id_clear_library_data_ex(Main *bmain, ID *id)
bool BKE_lib_id_make_local(Main *bmain, ID *id, const bool test, const int flags)
void * BKE_id_new_nomain(const short type, const char *name)
bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
void BKE_main_id_tag_all(struct Main *mainvar, const int tag, const bool value)
void BLI_libblock_ensure_unique_name(Main *bmain, const char *name)
void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char)
void BKE_lib_id_clear_library_data(Main *bmain, ID *id)
static int id_refcount_recompute_callback(LibraryIDLinkCallbackData *cb_data)
char * BKE_id_to_unique_string_key(const struct ID *id)
void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int orig_flag)
bool BKE_id_new_name_validate(ListBase *lb, ID *id, const char *tname)
size_t BKE_libblock_get_alloc_info(short type, const char **name)
static bool id_name_final_build(char *name, char *base_name, size_t base_name_len, int number)
void BKE_main_id_flag_listbase(ListBase *lb, const int flag, const bool value)
void id_sort_by_name(ListBase *lb, ID *id, ID *id_sorting_hint)
static void lib_id_library_local_paths(Main *bmain, Library *lib, ID *id)
void BKE_main_id_clear_newpoins(Main *bmain)
bool BKE_id_copy_is_allowed(const ID *id)
void BKE_libblock_management_main_remove(Main *bmain, void *idv)
static int libblock_management_us_plus(LibraryIDLinkCallbackData *cb_data)
static int id_order_compare(const void *a, const void *b)
void BKE_id_tag_set_atomic(ID *id, int tag)
#define LIB_ID_TYPES_NOCOPY
void id_fake_user_set(ID *id)
void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after)
void BKE_id_full_name_ui_prefix_get(char name[MAX_ID_FULL_NAME_UI], const ID *id, const bool add_lib_hint, char separator_char, int *r_prefix_len)
void * BKE_libblock_alloc_notest(short type)
void BKE_lib_id_swap(Main *bmain, ID *id_a, ID *id_b)
void BKE_main_id_flag_all(Main *bmain, const int flag, const bool value)
void * BKE_libblock_copy_for_localize(const ID *id)
void BKE_lib_id_expand_local(Main *bmain, ID *id)
static int lib_id_expand_local_cb(LibraryIDLinkCallbackData *cb_data)
void BKE_id_clear_newpoin(ID *id)
void * BKE_id_new(Main *bmain, const short type, const char *name)
void BKE_library_make_local(Main *bmain, const Library *lib, GHash *old_to_new_ids, const bool untagged_only, const bool set_fake)
void BKE_libblock_rename(Main *bmain, ID *id, const char *name)
#define MAX_NUMBERS_IN_USE
void id_us_ensure_real(ID *id)
void BKE_lib_id_make_local_generic(Main *bmain, ID *id, const int flags)
void id_fake_user_clear(ID *id)
void id_us_clear_real(ID *id)
void BKE_libblock_management_usercounts_set(Main *bmain, void *idv)
static bool check_for_dupid(ListBase *lb, ID *id, char *name, ID **r_id_sorting_hint)
void BKE_main_lib_objects_recalc_all(Main *bmain)
ID * BKE_id_copy(Main *bmain, const ID *id)
void BKE_main_id_repair_duplicate_names_listbase(ListBase *lb)
void id_us_plus_no_lib(ID *id)
ID * BKE_libblock_find_name(struct Main *bmain, const short type, const char *name)
static void library_make_local_copying_check(ID *id, GSet *loop_tags, MainIDRelations *id_relations, GSet *done_ids)
void BKE_main_id_tag_listbase(ListBase *lb, const int tag, const bool value)
void BKE_main_id_tag_idcode(struct Main *mainvar, const short type, const int tag, const bool value)
void id_lib_indirect_weak_link(ID *id)
IDTypeInfo IDType_ID_LINK_PLACEHOLDER
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag)
void BKE_main_id_refcount_recompute(struct Main *bmain, const bool do_linked_only)
static int lib_id_clear_library_data_users_update_cb(LibraryIDLinkCallbackData *cb_data)
static int libblock_management_us_min(LibraryIDLinkCallbackData *cb_data)
void BKE_id_ordered_list(ListBase *ordered_lb, const ListBase *lb)
void BKE_id_blend_write(BlendWriter *writer, ID *id)
void BKE_libblock_management_main_add(Main *bmain, void *idv)
ID * BKE_id_copy_for_duplicate(Main *bmain, ID *id, const eDupli_ID_Flags duplicate_flags)
static void id_swap(Main *bmain, ID *id_a, ID *id_b, const bool do_full_id)
void BKE_lib_libblock_session_uuid_ensure(ID *id)
void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv)
bool BKE_id_can_be_asset(const ID *id)
static void lib_id_copy_ensure_local(Main *bmain, const ID *old_id, ID *new_id)
bool BKE_id_is_in_global_main(ID *id)
void BKE_lib_id_swap_full(Main *bmain, ID *id_a, ID *id_b)
void * BKE_libblock_alloc(Main *bmain, short type, const char *name, const int flag)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value, ReportList *reports)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop_orig)
IDTypeCopyDataFunction copy_data
IDTypeInitDataFunction init_data
IDTypeMakeLocalFunction make_local
struct AssetMetaData * asset_data
IDOverrideLibrary * override_library
unsigned int session_uuid
struct MainIDRelationsEntryItem * from_ids
struct GHash * relations_from_pointers
char is_locked_for_linking
char is_memfile_undo_written
struct MainIDRelations * relations
struct Object * proxy_group
struct Object * proxy_from