21 # include "winsock2.h"
28 #define DNA_DEPRECATED_ALLOW
108 #define U (*((const UserDef *)&U))
167 #define USE_BHEAD_READ_ON_DEMAND
170 #define USE_GHASH_BHEAD
173 #define USE_GHASH_RESTORE_POINTER
186 #ifdef USE_BHEAD_READ_ON_DEMAND
196 #define BHEADN_FROM_BHEAD(bh) ((BHeadN *)POINTER_OFFSET(bh, -(int)offsetof(BHeadN, bhead)))
202 #define BHEAD_USE_READ_ON_DEMAND(bhead) ((bhead)->code == DATA)
206 char fixed_buf[1024];
211 vsnprintf(fixed_buf,
sizeof(fixed_buf),
format, args);
214 fixed_buf[
sizeof(fixed_buf) - 1] =
'\0';
218 if (
G.background == 0) {
226 return lib->parent ?
lib->parent->filepath_abs :
"<direct>";
250 #define ENTRIES_CAPACITY(onm) (1ll << (onm)->capacity_exp)
251 #define MAP_CAPACITY(onm) (1ll << ((onm)->capacity_exp + 1))
252 #define SLOT_MASK(onm) (MAP_CAPACITY(onm) - 1)
253 #define DEFAULT_SIZE_EXP 6
254 #define PERTURB_SHIFT 5
257 #define ITER_SLOTS(onm, KEY, SLOT_NAME, INDEX_NAME) \
258 uint32_t hash = BLI_ghashutil_ptrhash(KEY); \
259 uint32_t mask = SLOT_MASK(onm); \
260 uint perturb = hash; \
261 int SLOT_NAME = mask & hash; \
262 int INDEX_NAME = onm->map[SLOT_NAME]; \
263 for (;; SLOT_NAME = mask & ((5 * SLOT_NAME) + 1 + perturb), \
264 perturb >>= PERTURB_SHIFT, \
265 INDEX_NAME = onm->map[SLOT_NAME])
270 if (stored_index == -1) {
271 onm->
map[slot] = index;
298 if (entry->
oldp == addr) {
319 for (
int i = 0; i < onm->
nentries; i++) {
328 memset(onm, 0x0,
sizeof(*onm));
348 if (oldaddr ==
NULL || newaddr ==
NULL) {
357 entry.
oldp = oldaddr;
358 entry.
newp = newaddr;
379 if (increase_users) {
405 for (
int i = 0; i < onm->
nentries; i++) {
407 if (entry->
nr == 0) {
426 #undef ENTRIES_CAPACITY
429 #undef DEFAULT_SIZE_EXP
444 if (
from->is_read_invalid) {
457 Main *tojoin, *mainl;
459 mainl = mainlist->
first;
467 while ((tojoin = mainl->
next)) {
477 for (
ID *
id = lb_src->
first, *idnext;
id;
id = idnext) {
484 Main *mainvar = lib_main_array[
id->lib->temp_index];
525 lib_main_array[i] = libmain;
536 split_libdata(lbarray[i], lib_main_array, lib_main_array_len);
578 main->curlib->versionfile =
main->versionfile;
579 main->curlib->subversionfile =
main->subversionfile;
587 return bhead->
code <= 0xFFFF;
596 const short id_type_code = bhead->
code & 0xFFFF;
600 #ifdef USE_GHASH_BHEAD
606 bool is_link =
false;
607 int code_prev =
ENDB;
611 if (code_prev != bhead->
code) {
612 code_prev = bhead->
code;
628 if (code_prev != bhead->
code) {
629 code_prev = bhead->
code;
656 for (m = mainlist->
first; m; m = m->
next) {
704 "A critical error happened (the blend file is likely corrupted): %s",
731 if ((bhead->
code & 0xFFFF) == 0) {
745 if ((bhead->
code & 0xFFFF) == 0) {
762 bhead4->
len = bhead8->
len;
768 if (do_endian_swap) {
774 memcpy(&old, &bhead8->
old, 8);
775 bhead4->
old = (int)(old >> 3);
778 bhead4->
nr = bhead8->
nr;
787 bhead8->
len = bhead4->
len;
790 bhead8->
old = bhead4->
old;
792 bhead8->
nr = bhead4->
nr;
818 readsize = fd->
file->
read(fd->
file, &bhead4,
sizeof(bhead4));
820 if (readsize ==
sizeof(bhead4) || bhead4.
code ==
ENDB) {
831 memcpy(&bhead, &bhead4,
MIN2(
sizeof(bhead),
sizeof(bhead4)));
841 readsize = fd->
file->
read(fd->
file, &bhead8,
sizeof(bhead8));
843 if (readsize ==
sizeof(bhead8) || bhead8.
code ==
ENDB) {
854 memcpy(&bhead, &bhead8,
MIN2(
sizeof(bhead),
sizeof(bhead8)));
874 #ifdef USE_BHEAD_READ_ON_DEMAND
883 new_bhead->
bhead = bhead;
885 if (seek_new == -1) {
901 #ifdef USE_BHEAD_READ_ON_DEMAND
906 new_bhead->
bhead = bhead;
910 if (readsize != bhead.
len) {
946 if (new_bhead ==
NULL) {
951 bhead = &new_bhead->
bhead;
976 new_bhead = new_bhead->
next;
977 if (new_bhead ==
NULL) {
985 bhead = &new_bhead->
bhead;
991 #ifdef USE_BHEAD_READ_ON_DEMAND
1009 if (fd->
file->
seek(fd->
file, offset_backup, SEEK_SET) == -1) {
1027 return &new_bhead_data->
bhead;
1050 readsize = fd->
file->
read(fd->
file, header,
sizeof(header));
1052 if (readsize ==
sizeof(header) &&
STREQLEN(header,
"BLENDER", 7) &&
ELEM(header[7],
'_',
'-') &&
1053 ELEM(header[8],
'v',
'V') &&
1054 (isdigit(header[9]) && isdigit(header[10]) && isdigit(header[11]))) {
1058 if (header[7] ==
'_') {
1060 if (
sizeof(
void *) != 4) {
1065 if (
sizeof(
void *) != 8) {
1078 memcpy(num, header + 9, 3);
1106 subversion = atoi(num);
1112 &bhead[1], bhead->
len, do_endian_swap,
true, r_error_message);
1122 fd->
filesdna,
"ID",
"AssetMetaData",
"*asset_data");
1134 *r_error_message =
"Missing DNA block";
1141 int *blend_thumb =
NULL;
1146 int *
data = (
int *)(bhead + 1);
1148 if (bhead->
len < (
sizeof(
int[2]))) {
1152 if (do_endian_swap) {
1207 if (bhead->code !=
GLOB) {
1216 char writer_ver_str[16];
1217 char min_reader_ver_str[16];
1226 writer_ver_str,
sizeof(writer_ver_str), (
short)(fd->
fileversion), -1);
1228 min_reader_ver_str,
sizeof(min_reader_ver_str), fg->
minversion, -1);
1232 TIP_(
"The file was saved by a newer version, open it with Blender %s or later"),
1233 min_reader_ver_str);
1235 "%s: File saved by a newer version of Blender (%s), Blender %s or later is "
1236 "needed to open it.",
1239 min_reader_ver_str);
1254 const char *error_message =
NULL;
1257 reports,
RPT_ERROR,
"Failed to read blend file '%s': %s", fd->
relabase, error_message);
1268 reports,
RPT_ERROR,
"Failed to read blend file '%s', not a blend file", fd->
relabase);
1286 if (rawfile ==
NULL || rawfile->
read(rawfile, header,
sizeof(header)) !=
sizeof(header)) {
1289 "Unable to read '%s': %s",
1291 errno ? strerror(errno) :
TIP_(
"insufficient content"));
1293 rawfile->
close(rawfile);
1302 rawfile->
seek(rawfile, 0, SEEK_SET);
1305 if (memcmp(header,
"BLENDER",
sizeof(header)) == 0) {
1328 if (rawfile !=
NULL) {
1329 rawfile->
close(rawfile);
1349 "Unable to open '%s': %s",
1351 errno ? strerror(errno) :
TIP_(
"unknown error reading file"));
1406 mem_file->
close(mem_file);
1481 #ifdef USE_GHASH_BHEAD
1499 const char *ext_test[4] = {
".blend",
".ble",
".blend.gz",
NULL};
1508 char *slash =
NULL, *prev_slash =
NULL,
c =
'\0';
1523 strcpy(r_dir, path);
1546 if (slash[1] !=
'\0') {
1549 *r_group = slash + 1;
1553 if (prev_slash && (prev_slash[1] !=
'\0')) {
1556 *r_name = prev_slash + 1;
1573 const int width = fd_data[0];
1574 const int height = fd_data[1];
1583 memcpy(
data->rect, &fd_data[2], data_size -
sizeof(*
data));
1646 entry->
nr =
GS(((
ID *)
new)->name);
1660 if (mainptr->curlib) {
1661 fd = mainptr->curlib->filedata;
1687 if (ima->packedfile) {
1692 if (imapf->packedfile) {
1699 if (vfont->packedfile) {
1705 if (sound->packedfile) {
1711 if (volume->packedfile) {
1717 if (
lib->packedfile) {
1729 if (entry->
nr > 0) {
1738 imapf->packedfile =
newpackedadr(fd, imapf->packedfile);
1743 vfont->packedfile =
newpackedadr(fd, vfont->packedfile);
1747 sound->packedfile =
newpackedadr(fd, sound->packedfile);
1755 volume->packedfile =
newpackedadr(fd, volume->packedfile);
1804 *storage_key = *key;
1806 sizeof(*storage_value));
1807 storage_value->
cache_v = *cache_p;
1818 if (cache_storage ==
NULL) {
1829 if (storage_value ==
NULL) {
1834 *cache_p = storage_value->
cache_v;
1842 void *cache_storage_v)
1847 if (storage_value ==
NULL) {
1942 int blocksize, nblocks;
1945 data = (
char *)(bhead + 1);
1948 nblocks = bhead->
nr;
1961 #ifdef USE_BHEAD_READ_ON_DEMAND
1962 BHead *bh_orig = bh;
1967 #ifdef USE_BHEAD_READ_ON_DEMAND
1981 #ifdef USE_BHEAD_READ_ON_DEMAND
1995 #ifdef USE_BHEAD_READ_ON_DEMAND
1997 memcpy(temp, (bh + 1), bh->
len);
2009 memcpy(temp, (bh + 1), bh->
len);
2014 #ifdef USE_BHEAD_READ_ON_DEMAND
2015 if (bh_orig != bh) {
2030 return (bhead->
len) ? (
const void *)(bhead + 1) :
NULL;
2075 if (nodetree !=
NULL) {
2140 if (nodetree !=
NULL && *nodetree !=
NULL) {
2157 id_old !=
NULL ? &((
Scene *)id_old)->master_collection->id :
NULL,
2176 const ID *id_target,
2177 const ID *id_current,
2178 const bool is_identical)
2183 int recalc = id_target->
recalc;
2185 if (id_current ==
NULL) {
2194 if (!is_identical) {
2203 recalc |= id_current->
recalc;
2234 id->lib = current_library;
2239 id->py_instance =
NULL;
2245 id->library_weak_reference =
NULL;
2284 id->recalc_after_undo_push = 0;
2288 id->recalc_after_undo_push = 0;
2298 id->override_library->runtime =
NULL;
2327 block->uid = key->
uidgen++;
2337 #ifdef USE_SETSCENE_CHECK
2341 static bool scene_validate_setscene__liblink(
Scene *sce,
const int totscene)
2350 for (
a = 0, sce_iter = sce; sce_iter->
set; sce_iter = sce_iter->
set,
a++) {
2375 #ifdef USE_SETSCENE_CHECK
2380 if (!scene_validate_setscene__liblink(sce, totscene)) {
2390 #undef USE_SETSCENE_CHECK
2415 #ifndef USE_GHASH_RESTORE_POINTER
2427 for (; idn; idn = idn->
next) {
2454 #ifdef USE_GHASH_RESTORE_POINTER
2466 return restore_pointer_by_name_main(mainp,
id, user);
2498 const int cb_flag = cb_data->
cb_flag;
2507 if (
GS((*id_pointer)->name) ==
ID_GR) {
2777 for (; path; path = path_next) {
2778 path_next = path->
next;
2838 ID *workspace_id = (
ID *)workspace;
2839 Scene *oldscene = win->scene;
2844 if (win->scene ==
NULL) {
2845 win->scene = curscene;
2849 STRNCPY(win->view_layer_name, cur_view_layer->
name);
2854 memcpy(&win->scene->cursor, &oldscene->
cursor,
sizeof(win->scene->cursor));
2898 TIP_(
"Library '%s', '%s' had multiple instances, save and reload!"),
2951 if (basepath ==
NULL || basepath[0] ==
'\0') {
2987 *((
short *)ph_id->
name) = idcode;
3014 ID *obdata = ob->data;
3025 return "Data from OB";
3027 return "Data from ME";
3029 return "Data from IP";
3031 return "Data from SCE";
3033 return "Data from MA";
3035 return "Data from TE";
3037 return "Data from CU";
3039 return "Data from GR";
3041 return "Data from AR";
3043 return "Data from AC";
3045 return "Data from LI";
3047 return "Data from MB";
3049 return "Data from IM";
3051 return "Data from LT";
3053 return "Data from LA";
3055 return "Data from CA";
3057 return "Data from KE";
3059 return "Data from WO";
3061 return "Data from SCR";
3063 return "Data from VF";
3065 return "Data from TXT";
3067 return "Data from SPK";
3069 return "Data from LP";
3071 return "Data from SO";
3073 return "Data from NT";
3075 return "Data from BR";
3077 return "Data from PA";
3079 return "Data from PAL";
3081 return "Data from PCRV";
3083 return "Data from GD";
3085 return "Data from WM";
3087 return "Data from MC";
3089 return "Data from MSK";
3091 return "Data from LS";
3093 return "Data from CF";
3095 return "Data from WS";
3097 return "Data from HA";
3099 return "Data from PT";
3101 return "Data from VO";
3103 return "Data from SIM";
3105 return "Data from Lib Block";
3128 bool success =
true;
3156 while (bhead && bhead->
code ==
DATA) {
3166 size_t allocname_size = strlen(allocname) + 1;
3167 char *allocname_buf = malloc(allocname_size);
3168 memcpy(allocname_buf, allocname, allocname_size);
3169 allocname = allocname_buf;
3195 while (bhead && bhead->
code ==
DATA) {
3221 for (libmain = libmain->
next; libmain; libmain = libmain->
next) {
3226 " compare with %s -> match",
3241 " compare with %s -> NO match",
3254 if (id_old !=
NULL) {
3257 " from %s (%s): found",
3258 main->curlib ?
main->curlib->id.name :
"<NULL>",
3259 main->curlib ?
main->curlib->filepath :
"<NULL>");
3262 if (id_old != bhead->
old) {
3273 " from %s (%s): NOT found",
3274 main->curlib ?
main->curlib->id.name :
"<NULL>",
3275 main->curlib ?
main->curlib->filepath :
"<NULL>");
3295 const short idcode =
GS(id_old->
name);
3390 "UNDO: read %s (uuid %u) -> keep identical datablock",
3410 if (id_old !=
NULL) {
3414 "UNDO: read %s (uuid %u) -> read to old existing address",
3438 const bool placeholder_set_indirect_extern,
3472 CLOG_WARN(&
LOG,
"Unknown id code '%c%c'", (idcode & 0xff), (idcode >> 8));
3487 ID *id_target = id_old ? id_old :
id;
3502 if (placeholder_set_indirect_extern) {
3522 const char *allocname =
dataname(idcode);
3668 main->is_locked_for_linking =
true;
3671 char build_commit_datetime[32];
3672 time_t temp_time =
main->build_commit_timestamp;
3673 struct tm *tm = (temp_time) ? gmtime(&temp_time) :
NULL;
3675 strftime(build_commit_datetime,
sizeof(build_commit_datetime),
"%Y-%m-%d %H:%M", tm);
3678 BLI_strncpy(build_commit_datetime,
"unknown",
sizeof(build_commit_datetime));
3684 " Version %d sub %d date %s hash %s",
3686 main->subversionfile,
3687 build_commit_datetime,
3691 if (!
main->is_read_invalid) {
3694 if (!
main->is_read_invalid) {
3697 if (!
main->is_read_invalid) {
3700 if (!
main->is_read_invalid) {
3703 if (!
main->is_read_invalid) {
3706 if (!
main->is_read_invalid) {
3709 if (!
main->is_read_invalid) {
3712 if (!
main->is_read_invalid) {
3721 main->is_locked_for_linking =
false;
3728 "Processing %s (%s), %d.%d",
3729 main->curlib ?
main->curlib->filepath :
main->filepath,
3730 main->curlib ?
"LIB" :
"MAIN",
3732 main->subversionfile);
3735 main->is_locked_for_linking =
true;
3737 if (!
main->is_read_invalid) {
3740 if (!
main->is_read_invalid) {
3743 if (!
main->is_read_invalid) {
3746 if (!
main->is_read_invalid) {
3749 if (!
main->is_read_invalid) {
3752 if (!
main->is_read_invalid) {
3755 if (!
main->is_read_invalid) {
3759 main->is_locked_for_linking =
false;
3894 keymap->modal_items =
NULL;
3895 keymap->poll =
NULL;
3905 if (kmdi->remove_item) {
3908 if (kmdi->add_item) {
4009 switch (bhead->
code) {
4172 if (x1->
old >
x2->old) {
4175 if (x1->
old <
x2->old) {
4257 #ifdef USE_GHASH_BHEAD
4261 *((
short *)idname_full) = idcode;
4262 BLI_strncpy(idname_full + 2, name,
sizeof(idname_full) - 2);
4272 if (
STREQ(idname_test + 2, name)) {
4287 #ifdef USE_GHASH_BHEAD
4326 if (bheadlib ==
NULL) {
4338 TIP_(
"LIB: Data refers to main .blend file: '%s' from %s"),
4391 printf(
"expand_doit: already linked: %s lib: %s\n",
id->
name,
lib->filepath);
4441 if (nodetree !=
NULL) {
4520 Main *mainl,
FileData *fd,
const short idcode,
const char *name,
const int flag)
4554 else if (use_placeholders) {
4592 const char *filepath,
4593 const int id_tag_extra)
4602 (*fd)->id_tag_extra = id_tag_extra;
4615 #ifdef USE_GHASH_BHEAD
4625 const int id_tag_extra)
4630 params->id_tag_extra = id_tag_extra;
4636 const int id_tag_extra,
4640 const struct View3D *v3d)
4645 params->context.view_layer = view_layer;
4646 params->context.v3d = v3d;
4651 const char *filepath,
4712 mainvar = (*fd)->mainlist->first;
4733 for (mainvar = ((
Main *)(*fd)->mainlist->first)->
next; mainvar; mainvar = mainvar->
next) {
4749 mainvar = (*fd)->mainlist->first;
4837 TIP_(
"LIB: %s: '%s' is directly linked from '%s' (parent '%s'), but is a "
4838 "non-linkable data type"),
4856 TIP_(
"LIB: %s: '%s' missing from '%s', parent '%s'"),
4965 TIP_(
"Read packed library: '%s', parent '%s'"),
4977 TIP_(
"Read library: '%s', '%s', parent '%s'"),
5004 #ifdef USE_GHASH_BHEAD
5045 for (
Main *mainptr = mainl->
next; mainptr; mainptr = mainptr->
next) {
5050 "Reading linked data-blocks from %s (%s)",
5051 mainptr->curlib->id.name,
5052 mainptr->curlib->filepath);
5060 if (mainptr->id_map ==
NULL) {
5076 for (
Main *mainptr = mainl->
next; mainptr; mainptr = mainptr->
next) {
5084 for (
Main *mainptr = mainl->
next; mainptr; mainptr = mainptr->
next) {
5088 if (mainptr->versionfile) {
5094 if (mainptr->curlib->filedata) {
5095 do_versions(mainptr->curlib->filedata, mainptr->curlib, main_newid);
5105 if (mainptr->curlib->filedata) {
5115 if (mainptr->curlib->filedata) {
5118 mainptr->curlib->filedata =
NULL;
5221 for (
int i = 0; i < array_size; i++) {
5228 for (
int i = 0; i < array_size; i++) {
5240 for (
int i = 0; i < array_size; i++) {
5250 if (orig_array ==
NULL) {
5261 void *final_array =
NULL;
5263 if (file_pointer_size == current_pointer_size) {
5265 final_array = orig_array;
5267 else if (file_pointer_size == 8 && current_pointer_size == 4) {
5274 else if (file_pointer_size == 4 && current_pointer_size == 8) {
5285 *ptr_p = final_array;
5315 return reader->
main;
void BKE_animdata_blend_read_lib(struct BlendLibReader *reader, struct ID *id, struct AnimData *adt)
void BKE_animdata_blend_read_expand(struct BlendExpander *expander, struct AnimData *adt)
struct AnimData * BKE_animdata_from_id(const struct ID *id)
void BKE_asset_metadata_read(struct BlendDataReader *reader, struct AssetMetaData *asset_data)
void BKE_blender_version_blendfile_string_from_values(char *str_buff, const size_t str_buff_len, const short file_version, const short file_subversion)
#define BLENDER_FILE_SUBVERSION
#define BLENDER_FILE_VERSION
void BKE_collection_blend_read_data(struct BlendDataReader *reader, struct Collection *collection)
void BKE_collection_blend_read_lib(struct BlendLibReader *reader, struct Collection *collection)
void BKE_collection_blend_read_expand(struct BlendExpander *expander, struct Collection *collection)
void BKE_collections_after_lib_link(struct Main *bmain)
void BKE_main_collections_parent_relations_rebuild(struct Main *bmain)
void IDP_BlendReadExpand(struct BlendExpander *expander, struct IDProperty *prop)
#define IDP_BlendDataRead(reader, prop)
void IDP_BlendReadLib(struct BlendLibReader *reader, struct Library *lib, struct IDProperty *prop)
const char * BKE_idtype_idcode_to_name(short idcode)
bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v)
void BKE_idtype_id_foreach_cache(struct ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data)
bool BKE_idtype_idcode_is_linkable(short idcode)
const struct IDTypeInfo * BKE_idtype_get_info_from_id(const struct ID *id)
uint BKE_idtype_cache_key_hash(const void *key_v)
bool BKE_idtype_idcode_is_valid(short idcode)
@ IDTYPE_CACHE_CB_FLAGS_PERSISTENT
struct ViewLayer * BKE_view_layer_find(const struct Scene *scene, const char *layer_name)
void BKE_lib_libblock_session_uuid_ensure(struct ID *id)
void BKE_main_id_tag_all(struct Main *mainvar, int tag, bool value)
void * BKE_libblock_alloc(struct Main *bmain, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
void BKE_main_id_refcount_recompute(struct Main *bmain, bool do_linked_only)
void * BKE_libblock_alloc_notest(short type) ATTR_WARN_UNUSED_RESULT
void BKE_lib_id_swap_full(struct Main *bmain, struct ID *id_a, struct ID *id_b)
void BKE_id_free(struct Main *bmain, void *idv)
void BKE_libblock_init_empty(struct ID *id) ATTR_NONNULL(1)
void id_us_ensure_real(struct ID *id)
#define MAIN_ID_SESSION_UUID_UNSET
void id_sort_by_name(struct ListBase *lb, struct ID *id, struct ID *id_sorting_hint)
struct ID * BKE_libblock_find_name(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_lib_override_library_main_update(struct Main *bmain)
void BKE_lib_override_library_main_validate(struct Main *bmain, struct ReportList *reports)
void BKE_library_foreach_ID_link(struct Main *bmain, struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
#define FOREACH_MAIN_ID_END
struct Main * BKE_main_new(void)
#define FOREACH_MAIN_LISTBASE_ID_END
int set_listbasepointers(struct Main *main, struct ListBase *lb[])
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
#define FOREACH_MAIN_LISTBASE_END
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
#define MAIN_VERSION_FILE_OLDER_OR_EQUAL(main, ver, subver)
#define BLEN_THUMB_MEMSIZE(_x, _y)
struct ListBase * which_libbase(struct Main *bmain, short type)
#define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y)
bool BKE_main_is_empty(struct Main *bmain)
void BKE_main_free(struct Main *mainvar)
const char * BKE_main_blendfile_path_from_global(void)
struct IDNameLib_Map * BKE_main_idmap_create(struct Main *bmain, bool create_valid_ids_set, struct Main *old_bmain, int idmap_types) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
struct ID struct ID struct ID * BKE_main_idmap_lookup_uuid(struct IDNameLib_Map *id_map, uint session_uuid) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BKE_main_idmap_destroy(struct IDNameLib_Map *id_map) ATTR_NONNULL()
struct Main * BKE_main_idmap_main_get(struct IDNameLib_Map *id_map) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_main_idmap_remove_id(struct IDNameLib_Map *id_map, struct ID *id) ATTR_NONNULL()
struct ID * BKE_main_idmap_lookup_name(struct IDNameLib_Map *id_map, short id_type, const char *name, const struct Library *lib) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void BKE_main_idmap_insert_id(struct IDNameLib_Map *id_map, struct ID *id) ATTR_NONNULL()
struct ID struct ID * BKE_main_idmap_lookup_id(struct IDNameLib_Map *id_map, const struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
General operations, lookup, etc. for materials.
void BKE_object_materials_test(struct Main *bmain, struct Object *ob, struct ID *id)
struct bNodeTree * ntreeFromID(struct ID *id)
void ntreeBlendReadData(struct BlendDataReader *reader, struct bNodeTree *ntree)
void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree)
struct bNodeTree ** BKE_ntree_ptr_from_id(struct ID *id)
void ntreeBlendReadExpand(struct BlendExpander *expander, struct bNodeTree *ntree)
void ntreeUpdateAllNew(struct Main *main)
General operations, lookup, etc. for blender objects.
void BKE_packedfile_blend_read(struct BlendDataReader *reader, struct PackedFile **pf_p)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
const char * BKE_report_type_str(eReportType type)
void BKE_report(ReportList *reports, eReportType type, const char *message)
bool BKE_screen_blend_read_data(struct BlendDataReader *reader, struct bScreen *screen)
struct WorkSpace * BKE_workspace_active_get(struct WorkSpaceInstanceHook *hook) GETTER_ATTRS
struct bScreen * BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS
void BKE_workspace_active_set(struct WorkSpaceInstanceHook *hook, struct WorkSpace *workspace) SETTER_ATTRS
struct bScreen * BKE_workspace_layout_screen_get(const struct WorkSpaceLayout *layout) GETTER_ATTRS
#define BLI_assert_unreachable()
#define BLI_STATIC_ASSERT(a, msg)
BLI_INLINE void BLI_endian_switch_uint64(uint64_t *val) ATTR_NONNULL(1)
void BLI_endian_switch_float_array(float *val, int size) ATTR_NONNULL(1)
BLI_INLINE void BLI_endian_switch_int32(int *val) ATTR_NONNULL(1)
void BLI_endian_switch_int32_array(int *val, int size) ATTR_NONNULL(1)
void BLI_endian_switch_uint32_array(unsigned int *val, int size) ATTR_NONNULL(1)
void BLI_endian_switch_double_array(double *val, int size) ATTR_NONNULL(1)
bool BLI_file_magic_is_gzip(const char header[4])
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_file_magic_is_zstd(const char header[4])
bool BLI_is_dir(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_open(const char *filepath, int oflag, int pmode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
FileReader * BLI_filereader_new_file(int filedes) ATTR_WARN_UNUSED_RESULT
FileReader * BLI_filereader_new_zstd(FileReader *base) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
FileReader * BLI_filereader_new_gzip(FileReader *base) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
FileReader * BLI_filereader_new_memory(const void *data, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
FileReader * BLI_filereader_new_mmap(int filedes) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_haskey(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
bool BLI_remlink_safe(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) 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)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT 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(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
#define BLI_MEMARENA_STD_BUFSIZE
void * BLI_memarena_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter) ATTR_NONNULL()
void * BLI_mempool_iterstep(BLI_mempool_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_path_extension_check_array(const char *str, const char **ext_array) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
const char * BLI_path_basename(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
bool BLI_path_is_rel(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
void BLI_path_normalize(const char *relabase, char *path) ATTR_NONNULL(2)
void BLI_path_rel(char *file, const char *relfile) ATTR_NONNULL()
const char * BLI_path_slash_rfind(const char *string) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
#define STRNCPY(dst, src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
#define STREQLEN(a, b, n)
#define UNUSED_VARS_NDEBUG(...)
#define POINTER_OFFSET(v, ofs)
Compatibility-like things for windows.
defines for blend-file codes.
#define BLEN_THUMB_MEMSIZE_FILE(_x, _y)
Utilities ensuring .blend file (i.e. Main) is in valid state during write and/or read process.
bool BLO_main_validate_shapekeys(struct Main *bmain, struct ReportList *reports)
void BLO_main_validate_embedded_liboverrides(struct Main *bmain, struct ReportList *reports)
#define BLO_read_data_address(reader, ptr_p)
void(* BlendReadListFn)(BlendDataReader *reader, void *data)
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
external readfile function prototypes.
void(* BLOExpandDoitCallback)(void *fdhandle, struct Main *mainvar, void *idv)
@ BLO_LIBLINK_USE_PLACEHOLDERS
@ BLO_LIBLINK_FORCE_INDIRECT
@ BLO_READ_SKIP_UNDO_OLD_MAIN
struct BlendHandle BlendHandle
#define BLO_EMBEDDED_STARTUP_BLEND
FileReader * BLO_memfile_new_filereader(MemFile *memfile, int undo_direction)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
#define ID_FAKE_USERS(id)
@ ID_RECALC_COPY_ON_WRITE
#define ID_IS_LINKED(_id)
@ LIB_TAG_UNDO_OLD_ID_REUSED
@ LIB_TAG_ID_LINK_PLACEHOLDER
#define ID_LINK_PLACEHOLDER
@ SACTION_RUNTIME_FLAG_NEED_CHAN_SYNC
Object groups, one object can be in many groups at once.
blenloader genfile private function prototypes
void DNA_sdna_free(struct SDNA *sdna)
struct SDNA * DNA_sdna_from_data(const void *data, int data_len, bool do_endian_swap, bool data_alloc, const char **r_error_message)
struct DNA_ReconstructInfo * DNA_reconstruct_info_create(const struct SDNA *oldsdna, const struct SDNA *newsdna, const char *compare_flags)
void DNA_struct_switch_endian(const struct SDNA *sdna, int struct_nr, char *data)
void * DNA_struct_reconstruct(const struct DNA_ReconstructInfo *reconstruct_info, int old_struct_nr, int blocks, const void *old_blocks)
const char * DNA_struct_get_compareflags(const struct SDNA *sdna, const struct SDNA *newsdna)
void DNA_reconstruct_info_free(struct DNA_ReconstructInfo *reconstruct_info)
const struct SDNA * DNA_sdna_current_get(void)
int DNA_elem_offset(struct SDNA *sdna, const char *stype, const char *vartype, const char *name)
#define TSE_IS_REAL_ID(_tse)
#define SCE_READFILE_LIBLINK_NEED_SETSCENE_CHECK
@ SPREADSHEET_CONTEXT_OBJECT
#define SCRIPT_SET_NULL(_script)
@ FILE_TAG_REBUILD_MAIN_FILES
@ SIPO_RUNTIME_FLAG_NEED_CHAN_SYNC_COLOR
@ USER_MENU_TYPE_OPERATOR
struct DrawDataList * DRW_drawdatalist_from_id(struct ID *id)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_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 const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble x2
_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 width
_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 const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
Platform independent time functions.
int main(int argc, char *argv[])
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ListBase seqbase_clipboard
DEGForeachIDComponentCallback callback
SyclQueue void void * src
#define pf(_x, _i)
Prefetch 64.
void SEQ_for_each_callback(ListBase *seqbase, SeqForEachFunc callback, void *user_data)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
size_t(* MEM_allocN_len)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static void area(int d1, int d2, int e1, int e2, float weights[2])
SymEdge< T > * prev(const SymEdge< T > *se)
static const pxr::TfToken st("st", pxr::TfToken::Immortal)
void blo_do_versions_oldnewmap_insert(OldNewMap *onm, const void *oldaddr, void *newaddr, int nr)
void BLO_read_float3_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_expand_main(void *fdhandle, Main *mainvar)
static void read_libraries(FileData *basefd, ListBase *mainlist)
static BHead * read_libblock(FileData *fd, Main *main, BHead *bhead, const int tag, const bool placeholder_set_indirect_extern, ID **r_id)
void blo_make_packed_pointer_map(FileData *fd, Main *oldmain)
static void lib_link_scenes_check_set(Main *bmain)
struct BlendLibReader BlendLibReader
static void link_glob_list(FileData *fd, ListBase *lb)
static void bh8_from_bh4(BHead *bhead, BHead4 *bhead4)
static BHead * blo_bhead_read_full(FileData *fd, BHead *thisblock)
static FileData * blo_filedata_from_file_open(const char *filepath, BlendFileReadReport *reports)
static void lib_link_all(FileData *fd, Main *bmain)
void blo_cache_storage_end(FileData *fd)
static void convert_pointer_array_32_to_64(BlendDataReader *UNUSED(reader), uint array_size, const uint32_t *src, uint64_t *dst)
static void restore_pointer_user(ID *id, ID *newid, ePointerUserMode user)
static void oldnewmap_clear_map(OldNewMap *onm)
BlendFileReadReport * BLO_read_data_reports(BlendDataReader *reader)
void BLO_expand_id(BlendExpander *expander, ID *id)
static void after_liblink_merged_bmain_process(Main *bmain)
FileData * blo_filedata_from_memfile(MemFile *memfile, const struct BlendFileReadParams *params, BlendFileReadReport *reports)
static FileData * filedata_new(BlendFileReadReport *reports)
static void direct_link_library(FileData *fd, Library *lib, Main *main)
static void direct_link_id_override_property_cb(BlendDataReader *reader, void *data)
void BLO_library_link_end(Main *mainl, BlendHandle **bh, const struct LibraryLink_Params *params)
BlendFileData * blo_read_file_internal(FileData *fd, const char *filepath)
static void oldnewmap_init_data(OldNewMap *onm, const int capacity_exp)
static ID * link_named_part(Main *mainl, FileData *fd, const short idcode, const char *name, const int flag)
static void convert_pointer_array_64_to_32(BlendDataReader *reader, uint array_size, const uint64_t *src, uint32_t *dst)
static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, ViewLayer *view_layer)
static void blo_cache_storage_entry_clear_in_old(ID *UNUSED(id), const IDCacheKey *key, void **cache_p, uint UNUSED(flags), void *cache_storage_v)
static void read_file_bhead_idname_map_create(FileData *fd)
static int direct_link_id_restore_recalc_exceptions(const ID *id_current)
struct BLOCacheStorage BLOCacheStorage
static int lib_link_main_data_restore_cb(LibraryIDLinkCallbackData *cb_data)
struct BlendExpander BlendExpander
BlendFileReadReport * BLO_read_lib_reports(BlendLibReader *reader)
static void split_main_newid(Main *mainptr, Main *main_newid)
static void link_global(FileData *fd, BlendFileData *bfd)
void * BLO_read_get_new_packed_address(BlendDataReader *reader, const void *old_address)
void BLO_library_link_params_init(struct LibraryLink_Params *params, struct Main *bmain, const int flag, const int id_tag_extra)
static bool read_libblock_is_identical(FileData *fd, BHead *bhead)
void * BLO_read_get_new_data_address_no_us(BlendDataReader *reader, const void *old_address)
static BLOExpandDoitCallback expand_doit
void blo_lib_link_restore(Main *oldmain, Main *newmain, wmWindowManager *curwm, Scene *curscene, ViewLayer *cur_view_layer)
static int direct_link_id_restore_recalc(const FileData *fd, const ID *id_target, const ID *id_current, const bool is_identical)
static void lib_link_clipboard_restore(struct IDNameLib_Map *id_map)
static ID * create_placeholder(Main *mainvar, const short idcode, const char *idname, const int tag)
static void * read_struct(FileData *fd, BHead *bh, const char *blockname)
void BLO_library_link_params_init_with_context(struct LibraryLink_Params *params, struct Main *bmain, const int flag, const int id_tag_extra, struct Scene *scene, struct ViewLayer *view_layer, const struct View3D *v3d)
Main * BLO_library_link_begin(BlendHandle **bh, const char *filepath, const struct LibraryLink_Params *params)
static void do_versions_userdef(FileData *UNUSED(fd), BlendFileData *bfd)
static bool blo_bhead_is_id(const BHead *bhead)
static FileData * blo_decode_and_check(FileData *fd, ReportList *reports)
static void * restore_pointer_by_name(struct IDNameLib_Map *id_map, ID *id, ePointerUserMode user)
static void direct_link_id_embedded_id(BlendDataReader *reader, Library *current_library, ID *id, ID *id_old)
void BLO_read_glob_list(BlendDataReader *reader, ListBase *list)
static int has_linked_ids_to_read(Main *mainvar)
static bool direct_link_id(FileData *fd, Main *main, const int tag, ID *id, ID *id_old)
static void library_link_end(Main *mainl, FileData **fd, const int flag)
static void split_libdata(ListBase *lb_src, Main **lib_main_array, const uint lib_main_array_len)
FileData * blo_filedata_from_file(const char *filepath, BlendFileReadReport *reports)
static bool lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
void BLO_read_double_array(BlendDataReader *reader, int array_size, double **ptr_p)
static void add_main_to_main(Main *mainvar, Main *from)
bool BLO_read_data_is_undo(BlendDataReader *reader)
static void direct_link_id_common(BlendDataReader *reader, Library *current_library, ID *id, ID *id_old, const int tag)
static void * oldnewmap_lookup_and_inc(OldNewMap *onm, const void *addr, bool increase_users)
static void do_versions_after_linking(FileData *fd, Main *main)
#define ENTRIES_CAPACITY(onm)
static BHead * find_bhead(FileData *fd, void *old)
void BLO_read_float_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_read_int32_array(BlendDataReader *reader, int array_size, int32_t **ptr_p)
static const char * dataname(short id_code)
void BLO_main_expander(BLOExpandDoitCallback expand_doit_func)
static void lib_link_main_data_restore(struct IDNameLib_Map *id_map, Main *newmain)
static void oldnewmap_lib_insert(FileData *fd, const void *oldaddr, ID *newaddr, int nr)
static BHead * find_bhead_from_idname(FileData *fd, const char *idname)
static Main * library_link_begin(Main *mainvar, FileData **fd, const char *filepath, const int id_tag_extra)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
static void * newdataadr_no_us(FileData *fd, const void *adr)
struct OldNewMap OldNewMap
struct BlendDataReader BlendDataReader
void * blo_do_versions_newlibadr(FileData *fd, const void *lib, const void *adr)
static void sort_bhead_old_map(FileData *fd)
static bool read_libblock_undo_restore_linked(FileData *fd, Main *main, const ID *id, BHead *bhead)
static void fix_relpaths_library(const char *basepath, Main *main)
static BHead * find_previous_lib(FileData *fd, BHead *bhead)
struct BLOCacheStorageValue BLOCacheStorageValue
static void expand_doit_library(void *fdhandle, Main *mainvar, void *old)
static void * newdataadr(FileData *fd, const void *adr)
static bool read_libblock_undo_restore(FileData *fd, Main *main, BHead *bhead, const int tag, ID **r_id_old)
bool BLO_read_lib_is_undo(BlendLibReader *reader)
static void expand_id_embedded_id(BlendExpander *expander, ID *id)
static FileData * blo_filedata_from_file_descriptor(const char *filepath, BlendFileReadReport *reports, int filedes)
static FileData * read_library_file_data(FileData *basefd, ListBase *mainlist, Main *mainl, Main *mainptr)
void * BLO_read_get_new_data_address(BlendDataReader *reader, const void *old_address)
static bool read_libblock_undo_restore_library(FileData *fd, Main *main, const ID *id)
static void oldnewmap_free(OldNewMap *onm)
static void * oldnewmap_liblookup(OldNewMap *onm, const void *addr, const void *lib)
static void blo_cache_storage_entry_register(ID *id, const IDCacheKey *key, void **cache_p, uint UNUSED(flags), void *cache_storage_v)
static void lib_link_id_embedded_id(BlendLibReader *reader, ID *id)
void BLO_read_uint32_array(BlendDataReader *reader, int array_size, uint32_t **ptr_p)
static OldNewMap * oldnewmap_new(void)
static void expand_id(BlendExpander *expander, ID *id)
static void oldnewmap_insert(OldNewMap *onm, const void *oldaddr, void *newaddr, int nr)
static int * read_file_thumbnail(FileData *fd)
void BLO_read_data_globmap_add(BlendDataReader *reader, void *oldaddr, void *newaddr)
static BHead * read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
static void * newpackedadr(FileData *fd, const void *adr)
BlendThumbnail * BLO_thumbnail_from_file(const char *filepath)
ID * BLO_read_get_new_id_address(BlendLibReader *reader, Library *lib, ID *id)
static void read_library_linked_id(FileData *basefd, FileData *fd, Main *mainvar, ID *id, ID **r_id)
static void read_library_linked_ids(FileData *basefd, FileData *fd, ListBase *mainlist, Main *mainvar)
void BLO_read_list_cb(BlendDataReader *reader, ListBase *list, BlendReadListFn callback)
static void do_versions(FileData *fd, Library *lib, Main *main)
#define ITER_SLOTS(onm, KEY, SLOT_NAME, INDEX_NAME)
#define BHEADN_FROM_BHEAD(bh)
BHead * blo_bhead_first(FileData *fd)
static void change_link_placeholder_to_real_ID_pointer_fd(FileData *fd, const void *old, void *new)
AssetMetaData * blo_bhead_id_asset_data_address(const FileData *fd, const BHead *bhead)
bool BLO_library_path_explode(const char *path, char *r_dir, char **r_group, char **r_name)
bool BLO_read_requires_endian_switch(BlendDataReader *reader)
static void direct_link_keymapitem(BlendDataReader *reader, wmKeyMapItem *kmi)
void * BLO_library_read_struct(FileData *fd, BHead *bh, const char *blockname)
void blo_split_main(ListBase *mainlist, Main *main)
static int verg_bheadsort(const void *v1, const void *v2)
static bool read_file_dna(FileData *fd, const char **r_error_message)
void blo_do_versions_key_uidgen(Key *key)
BHead * blo_bhead_next(FileData *fd, BHead *thisblock)
static void placeholders_ensure_valid(Main *bmain)
static BHead * find_bhead_from_code_name(FileData *fd, const short idcode, const char *name)
void blo_cache_storage_init(FileData *fd, Main *bmain)
void blo_make_old_idmap_from_main(FileData *fd, Main *bmain)
static BHeadN * get_bhead(FileData *fd)
Main * BLO_read_lib_get_main(BlendLibReader *reader)
static void oldnewmap_clear(OldNewMap *onm)
const char * blo_bhead_id_name(const FileData *fd, const BHead *bhead)
static void oldnewmap_insert_or_replace(OldNewMap *onm, OldNew entry)
static void decode_blender_header(FileData *fd)
static void read_libblock_undo_restore_at_old_address(FileData *fd, Main *main, ID *id, ID *id_old)
static void bh4_from_bh8(BHead *bhead, BHead8 *bhead8, bool do_endian_swap)
void BLO_reportf_wrap(BlendFileReadReport *reports, eReportType type, const char *format,...)
void blo_end_packed_pointer_map(FileData *fd, Main *oldmain)
static void lib_link_library(BlendLibReader *UNUSED(reader), Library *UNUSED(lib))
#define MAP_CAPACITY(onm)
#define BHEAD_USE_READ_ON_DEMAND(bhead)
static void read_library_clear_weak_links(FileData *basefd, ListBase *mainlist, Main *mainvar)
static void change_link_placeholder_to_real_ID_pointer(ListBase *mainlist, FileData *basefd, void *old, void *new)
bool BLO_has_bfile_extension(const char *str)
static bool is_minversion_older_than_blender(FileData *fd, ReportList *reports)
static void lib_link_id(BlendLibReader *reader, ID *id)
BHead * blo_bhead_prev(FileData *UNUSED(fd), BHead *thisblock)
static ID * is_yet_read(FileData *fd, Main *mainvar, BHead *bhead)
static void lib_link_seq_clipboard_pt_restore(ID *id, struct IDNameLib_Map *id_map)
static void switch_endian_bh4(BHead4 *bhead)
void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p)
static OldNew * oldnewmap_lookup_entry(const OldNewMap *onm, const void *addr)
static void * newlibadr(FileData *fd, const void *lib, const void *adr)
static BHead * read_global(BlendFileData *bfd, FileData *fd, BHead *bhead)
static void switch_endian_bh8(BHead8 *bhead)
static bool blo_bhead_read_data(FileData *fd, BHead *thisblock, void *buf)
static Main * blo_find_main(FileData *fd, const char *filepath, const char *relabase)
ID * BLO_library_link_named_part(Main *mainl, BlendHandle **bh, const short idcode, const char *name, const struct LibraryLink_Params *params)
static void switch_endian_structs(const struct SDNA *filesdna, BHead *bhead)
void blo_filedata_free(FileData *fd)
static void lib_link_wm_xr_data_restore(struct IDNameLib_Map *id_map, wmXrData *xr_data)
static void insert_packedmap(FileData *fd, PackedFile *pf)
static bool blo_bhead_is_id_valid_type(const BHead *bhead)
static void oldnewmap_insert_index_in_map(OldNewMap *onm, const void *ptr, int index)
static const char * library_parent_filepath(Library *lib)
static void read_libblock_undo_restore_identical(FileData *fd, Main *main, const ID *UNUSED(id), ID *id_old, const int tag)
void blo_readfile_invalidate(FileData *fd, Main *bmain, const char *message)
static void read_file_version(FileData *fd, Main *main)
void blo_cache_storage_old_bmain_clear(FileData *fd, Main *bmain_old)
static CLG_LogRef LOG_UNDO
static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map, Main *newmain, WorkSpaceLayout *layout)
BHead * blo_read_asset_data_block(FileData *fd, BHead *bhead, AssetMetaData **r_asset_data)
void blo_add_library_pointer_map(ListBase *old_mainlist, FileData *fd)
static FileData * blo_filedata_from_file_minimal(const char *filepath)
void blo_join_main(ListBase *mainlist)
void * blo_read_get_new_globaldata_address(FileData *fd, const void *adr)
static BHead * read_data_into_datamap(FileData *fd, BHead *bhead, const char *allocname)
static void direct_link_id_override_property_operation_cb(BlendDataReader *reader, void *data)
FileData * blo_filedata_from_memory(const void *mem, int memsize, BlendFileReadReport *reports)
static void oldnewmap_increase_size(OldNewMap *onm)
static void blo_cache_storage_entry_restore_in_new(ID *UNUSED(id), const IDCacheKey *key, void **cache_p, uint flags, void *cache_storage_v)
static void file_global_minversion_hotfix(FileGlobal *fg)
static const void * peek_struct_undo(FileData *fd, BHead *bhead)
void do_versions_after_linking_250(struct Main *bmain)
void do_versions_after_linking_300(struct FileData *fd, struct Main *bmain)
void blo_do_versions_300(struct FileData *fd, struct Library *lib, struct Main *bmain)
@ FD_FLAGS_FILE_POINTSIZE_IS_4
@ FD_FLAGS_POINTSIZE_DIFFERS
void blo_do_versions_pre250(struct FileData *fd, struct Library *lib, struct Main *bmain)
void blo_do_versions_250(struct FileData *fd, struct Library *lib, struct Main *bmain)
void blo_do_versions_dna(struct SDNA *sdna, int versionfile, int subversionfile)
void blo_do_versions_cycles(struct FileData *fd, struct Library *lib, struct Main *bmain)
void do_versions_after_linking_270(struct Main *bmain)
void do_versions_after_linking_260(struct Main *bmain)
void blo_do_versions_260(struct FileData *fd, struct Library *lib, struct Main *bmain)
void do_versions_after_linking_290(struct FileData *fd, struct Main *bmain)
void blo_do_versions_290(struct FileData *fd, struct Library *lib, struct Main *bmain)
void do_versions_after_linking_cycles(struct Main *bmain)
void blo_do_versions_270(struct FileData *fd, struct Library *lib, struct Main *bmain)
#define SIZEOFBLENDERHEADER
void do_versions_after_linking_280(struct FileData *fd, struct Main *bmain)
void blo_do_versions_userdef(struct UserDef *userdef)
void blo_do_versions_280(struct FileData *fd, struct Library *lib, struct Main *bmain)
unsigned __int64 uint64_t
bool is_memchunk_identical
unsigned short local_view_bits
struct bScreen * curscreen
struct ViewLayer * cur_view_layer
struct ReportList * reports
struct BlendFileReadReport::@134 count
struct BlendFileReadReport::@133 duration
struct DNA_ReconstructInfo * reconstruct_info
struct OldNewMap * globmap
struct BlendFileReadReport * reports
struct OldNewMap * libmap
const struct SDNA * memsdna
struct OldNewMap * datamap
struct GHash * bhead_idname_hash
struct OldNewMap * packedmap
struct BLOCacheStorage * cache_storage
struct BHeadSort * bheadmap
struct IDNameLib_Map * old_idmap
struct ViewLayer * cur_view_layer
uint64_t build_commit_timestamp
struct bScreen * curscreen
unsigned int id_session_uuid
char * subitem_local_name
char * subitem_reference_name
struct ID * hierarchy_root
IDTypeBlendReadUndoPreserve blend_read_undo_preserve
IDTypeBlendReadExpandFunction blend_read_expand
struct AssetTypeInfo * asset_type_info
IDTypeForeachCacheFunction foreach_cache
IDTypeBlendReadDataFunction blend_read_data
IDTypeBlendReadLibFunction blend_read_lib
struct AssetMetaData * asset_data
int recalc_after_undo_push
IDOverrideLibrary * override_library
unsigned int session_uuid
int recalc_up_to_undo_push
struct LibraryWeakReference * library_weak_reference
struct PackedFile * packedfile
struct FileData * filedata
bool has_forward_compatibility_issues
BlendThumbnail * blen_thumb
uint64_t build_commit_timestamp
struct IDNameLib_Map * id_map
struct RegionView3D * localvd
struct Collection * master_collection
struct Object * scene_camera
SpaceAction_Runtime runtime
struct MovieClipScopes scopes
SpaceGraph_Runtime runtime
struct bNodeTree * edittree
struct bNodeTree * nodetree
struct TreeStoreElem search_tse
struct BLI_mempool * treestore
struct ListBase user_keymaps
struct ListBase autoexec_paths
struct ListBase user_keyconfig_prefs
struct ListBase user_menus
struct ListBase asset_libraries
unsigned short local_view_uuid
struct Object * ob_center
Object * base_pose_object
struct Collection * filter_grp
struct bNodeTree * nodetree
struct bNodeTreePath * next
struct WorkSpaceInstanceHook * workspace_hook
XrSessionSettings session_settings
double PIL_check_seconds_timer(void)