85 const char *ext_test[4] = {
".blend",
".ble",
".blend.gz",
nullptr};
97 char *slash =
nullptr, *prev_slash =
nullptr, c =
'\0';
135 if (slash[1] !=
'\0') {
138 *r_group = slash + 1;
142 if (prev_slash && (prev_slash[1] !=
'\0')) {
145 *r_name = prev_slash + 1;
155 readfile_reports.
reports = reports;
172 size_t path_dst_maxncpy,
173 const char *path_src)
177 return !
STREQ(path_dst, path_src);
184 foreach_path_data.
bmain = bmain;
187 foreach_path_data.user_data =
nullptr;
199 if (win->scene == scene) {
267 if (reuse_data->
remapper ==
nullptr) {
268 reuse_data->
remapper = MEM_new<id::IDRemapper>(__func__);
278 if (
STREQ(old_lib_iter->runtime.filepath_abs, new_bmain->
filepath)) {
279 remapper.
add(&old_lib_iter->id,
nullptr);
288 if (!
STREQ(old_lib_iter->runtime.filepath_abs, new_lib_iter->runtime.filepath_abs)) {
292 remapper.
add(&old_lib_iter->id, &new_lib_iter->id);
310 "There should never be a non-mappable (i.e. null) input here.");
318 const bool reuse_existing)
326 if (reuse_existing) {
331 if (!
ELEM(id_iter->lib, id->lib,
lib)) {
334 if (!
STREQ(id_iter->name + 2, id->name + 2)) {
338 remapper.
add(
id, id_iter);
358 remapper.
add(
id,
id);
420 if (id->lib ==
nullptr) {
422 remapper.
add(
id,
nullptr);
429 remapper.
add(
id,
nullptr);
439 if (old_id_new_lib ==
nullptr) {
440 remapper.
add(
id,
nullptr);
494 if (old_id_new_lib ==
nullptr) {
495 remapper.
add(old_id_iter,
nullptr);
523 const Brush *brush =
reinterpret_cast<Brush *
>(old_id_iter);
562 std::swap(*new_lb, *old_lb);
576 ID *discarded_id_iter =
static_cast<ID *
>(old_lb->
first);
577 ID *reused_id_iter =
static_cast<ID *
>(new_lb->
first);
578 while (!
ELEM(
nullptr, discarded_id_iter, reused_id_iter)) {
579 const int strcmp_result = strcmp(discarded_id_iter->
name + 2, reused_id_iter->
name + 2);
580 if (strcmp_result == 0) {
582 remapper.
add(discarded_id_iter, reused_id_iter);
584 discarded_id_iter =
static_cast<ID *
>(discarded_id_iter->
next);
585 reused_id_iter =
static_cast<ID *
>(reused_id_iter->
next);
587 else if (strcmp_result < 0) {
589 remapper.
add(discarded_id_iter,
nullptr);
591 discarded_id_iter =
static_cast<ID *
>(discarded_id_iter->
next);
594 reused_id_iter =
static_cast<ID *
>(reused_id_iter->
next);
598 for (; discarded_id_iter !=
nullptr;
599 discarded_id_iter =
static_cast<ID *
>(discarded_id_iter->
next))
601 remapper.
add(discarded_id_iter,
nullptr);
634 if (old_wm ==
nullptr) {
642 if (load_ui && new_wm !=
nullptr) {
657 std::swap<wmWindowManager *>(old_wm, new_wm);
665 remapper.
add(&old_wm->
id, &new_wm->
id);
671 old_wm->
init_flag &= ~WM_INIT_FLAG_WINDOW;
697 remapper.
add(
id, id_new);
809 v3d->
camera = scene->camera;
826 if (base !=
nullptr) {
837 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase;
855 if (curwm ==
nullptr) {
860 if (win->scene ==
nullptr) {
861 win->scene = cur_scene;
864 STRNCPY(win->view_layer_name, cur_view_layer->
name);
904 "This file is managed by the asset system, you cannot overwrite it (using \"Save "
905 "As\" is possible)");
909 bfd->
fileflags &= ~G_FILE_ASSET_EDIT_FILE;
927 if (mode != LOAD_UNDO) {
932 if (mode != LOAD_UNDO) {
945 if (mode != LOAD_UNDO) {
950 if (mode != LOAD_UI) {
952 for (
auto id_code : ui_id_codes) {
963 if (mode != LOAD_UI) {
964 for (
auto id_code : ui_id_codes) {
976 for (
short idtype_index = 0; idtype_index <
INDEX_ID_MAX; idtype_index++) {
984 if (mode != LOAD_UI) {
1001 bool track_undo_scene =
false;
1011 if (curscene ==
nullptr) {
1015 if (curscene ==
nullptr) {
1018 if (cur_view_layer ==
nullptr) {
1025 if (mode != LOAD_UI) {
1030 track_undo_scene = (mode == LOAD_UNDO && curscreen && curscene && bfd->
main->
wm.
first);
1032 if (track_undo_scene) {
1039 win->
scene = curscene;
1047 if (reuse_data.
remapper !=
nullptr) {
1069 if (mode == LOAD_UNDO) {
1084 if (mode != LOAD_UI) {
1086 curscene = win->
scene;
1089 if (track_undo_scene) {
1094 win->
scene = curscene;
1114 bfd->
main =
nullptr;
1120 if (mode == LOAD_UI) {
1134 G.fileflags = (
G.fileflags & fileflags_keep) | (bfd->
fileflags & ~fileflags_keep);
1152 if (mode != LOAD_UNDO) {
1162 if (
params->is_startup) {
1174 if (mode == LOAD_UI) {
1188 if (mode != LOAD_UNDO) {
1194 if (mode != LOAD_UNDO) {
1223 if (mode != LOAD_UNDO) {
1225 int missing_linked_ids_num = 0;
1228 missing_linked_ids_num++;
1231 RPT_(
"LIB: %s: '%s' missing from '%s', parent '%s'"),
1266 "File written by newer Blender binary (%d.%d), expect loss of data!",
1268 main->subversionfile);
1278 const bool startup_update_defaults,
1279 const char *startup_app_template)
1283 "File could not be read, critical data corruption detected");
1288 if (startup_update_defaults) {
1310 if (
params->is_startup ==
false) {
1312 printf(
"Read blend: \"%s\"\n", filepath);
1361 if (bfd ==
nullptr) {
1419 blend_file_read_reports.
reports = reports;
1425 userdef = bfd->
user;
1445 userdef = bfd->
user;
1460 *userdef = blender::dna::shallow_copy(
U_default);
1464 const char *addons[] = {
1467 "io_mesh_uv_layout",
1474 for (
int i = 0; i <
ARRAY_SIZE(addons); i++) {
1489#ifdef WITH_PYTHON_SECURITY
1494 userdef->
flag &= ~USER_SCRIPT_AUTOEXEC_DISABLE;
1530 userdef,
"VIEW3D_AST_brush_sculpt",
"Brushes/Mesh Sculpt/General");
1532 userdef,
"VIEW3D_AST_brush_sculpt",
"Brushes/Mesh Sculpt/Paint");
1534 userdef,
"VIEW3D_AST_brush_sculpt",
"Brushes/Mesh Sculpt/Simulation");
1537 userdef,
"VIEW3D_AST_brush_gpencil_paint",
"Brushes/Grease Pencil Draw/Draw");
1539 userdef,
"VIEW3D_AST_brush_gpencil_paint",
"Brushes/Grease Pencil Draw/Erase");
1541 userdef,
"VIEW3D_AST_brush_gpencil_paint",
"Brushes/Grease Pencil Draw/Utilities");
1544 userdef,
"VIEW3D_AST_brush_gpencil_sculpt",
"Brushes/Grease Pencil Sculpt/Contrast");
1546 userdef,
"VIEW3D_AST_brush_gpencil_sculpt",
"Brushes/Grease Pencil Sculpt/Transform");
1548 userdef,
"VIEW3D_AST_brush_gpencil_sculpt",
"Brushes/Grease Pencil Sculpt/Utilities");
1556 Main *mainb = MEM_cnew<Main>(
"empty main");
1560 params.use_userdef =
true;
1580 if (userdef_default ==
nullptr) {
1595 std::optional<std::string> cfgdir;
1603 printf(
"Writing userprefs: \"%s\" ", filepath);
1605 if (use_template_userpref) {
1630 if (use_template_userpref) {
1636 printf(
"Writing userprefs app-template: \"%s\" ", filepath);
1657 U.runtime.is_dirty =
false;
1669 const void *file_buf,
1678 blend_file_read_reports.
reports = reports;
1686 workspace_config = MEM_cnew<WorkspaceConfigFileData>(__func__);
1687 workspace_config->
main = bfd->
main;
1698 return workspace_config;
1718 : reference_root_filepath_(reference_root_filepath)
1721 if (!reference_root_filepath_.empty()) {
1739void PartialWriteContext::preempt_session_uid(
ID *ctx_id,
uint session_uid)
1744 if (matching_ctx_id == ctx_id) {
1749 if (matching_ctx_id !=
nullptr) {
1754 "Different matching IDs sharing the same session UID in the partial write context.");
1764 if (matching_ctx_id) {
1767 "Non-matching IDs sharing the same session UID in the partial write context.");
1770 matching_ctx_id->
tag &= ~ID_TAG_TEMP_MAIN;
1779void PartialWriteContext::process_added_id(
ID *ctx_id,
1782 const bool set_fake_user = (operations &
SET_FAKE_USER) != 0;
1785 if (set_fake_user) {
1794 if (set_clipboard_mark) {
1799ID *PartialWriteContext::id_add_copy(
const ID *
id,
const bool regenerate_session_uid)
1801 ID *ctx_root_id =
nullptr;
1806 ctx_root_id =
BKE_id_copy_in_lib(
nullptr, id->lib,
id,
nullptr,
nullptr, copy_flags);
1808 if (regenerate_session_uid) {
1814 this->preempt_session_uid(ctx_root_id, id->session_uid);
1823void PartialWriteContext::make_local(
ID *ctx_id,
const int make_local_flags)
1832 this->preempt_session_uid(ctx_id, ctx_id_session_uid);
1837Library *PartialWriteContext::ensure_library(
ID *ctx_id)
1845 ctx_lib =
reinterpret_cast<Library *
>(id_add_copy(&ctx_id->
lib->
id,
true));
1846 this->libraries_map_.
add(lib_path, ctx_lib);
1848 ctx_id->
lib = ctx_lib;
1856 ctx_lib =
static_cast<Library *
>(
1860 this->libraries_map_.
add(library_absolute_path, ctx_lib);
1870 dependencies_filter_cb)
1878 BLI_assert(clear_dependencies || add_dependencies || dependencies_filter_cb);
1879 BLI_assert(!clear_dependencies || !(add_dependencies || duplicate_dependencies));
1893 this->process_added_id(ctx_root_id,
options.operations);
1907 ctx_root_id = id_add_copy(
id,
false);
1909 local_ctx_id_map.
add(
id, ctx_root_id);
1910 post_process_ids_todo.
append({ctx_root_id,
options.operations});
1911 this->process_added_id(ctx_root_id,
options.operations);
1914 auto dependencies_cb = [
this,
1918 &post_process_ids_todo,
1921 const ID *orig_deps_id = *id_ptr;
1926 if (!orig_deps_id) {
1938 if (dependencies_filter_cb) {
1948 BLI_assert(clear_dependencies || add_dependencies);
1949 BLI_assert(!clear_dependencies || !(add_dependencies || duplicate_dependencies));
1952 if (clear_dependencies) {
1955 "Clearing a 'never null' ID usage of '%s' by '%s', this is likely not a "
1967 ID *ctx_deps_id =
nullptr;
1968 if (duplicate_dependencies) {
1969 ctx_deps_id = local_ctx_id_map.
lookup(orig_deps_id);
1983 "First dependency to ID '%s' found through a 'loopback' usage from ID '%s', "
1984 "this should never happen",
1990 ctx_deps_id = this->id_add_copy(orig_deps_id, duplicate_dependencies);
1991 local_ctx_id_map.
add(orig_deps_id, ctx_deps_id);
1992 ids_to_process.add(ctx_deps_id);
1993 post_process_ids_todo.
append({ctx_deps_id, operations_final});
1995 if (duplicate_dependencies) {
2001 this->process_added_id(ctx_deps_id, operations_final);
2003 *id_ptr = ctx_deps_id;
2006 while (!ids_to_process.is_empty()) {
2007 ID *ctx_id = ids_to_process.pop();
2015 for (
auto [ctx_id, options_final] : post_process_ids_todo) {
2016 const bool do_make_local = (options_final &
MAKE_LOCAL) != 0;
2017 if (do_make_local) {
2018 this->make_local(ctx_id, make_local_flags);
2021 this->ensure_library(ctx_id);
2033 Library *ctx_library =
nullptr;
2037 ID *ctx_id =
static_cast<ID *
>(
2041 this->process_added_id(ctx_id,
options.operations);
2062 if (clear_extra_user) {
2073 "Removing %d unused IDs from current partial write context",
2101 ids_in_context.
add(id_iter);
2113 auto id_validate_dependencies_cb = [&ids_in_context,
2115 ID **id_p = cb_data->id_pointer;
2116 ID *owner_id = cb_data->owner_id;
2117 ID *self_id = cb_data->self_id;
2125 if (*id_p && !ids_in_context.
contains(*id_p)) {
2126 if (owner_id != self_id) {
2129 "ID %s (used by ID '%s', embedded ID '%s') is not in current partial write context",
2136 "ID %s (used by ID '%s') is not in current partial write context",
2154 const int write_flags,
2155 const int remap_mode,
2159 "A library blendfile should not overwrite currently edited blendfile");
2163 Library *make_local_lib =
nullptr;
2165 if (
STREQ(write_filepath, library->runtime.filepath_abs)) {
2166 make_local_lib = library;
2169 if (make_local_lib) {
2172 make_local_lib =
nullptr;
2180 &this->
bmain, write_filepath, write_flags, &blend_file_write_params, &reports);
struct bAddon * BKE_addon_new(void)
#define BLENDER_USERPREF_FILE
bool BKE_appdir_app_template_has_userpref(const char *app_template) ATTR_NONNULL(1)
bool BKE_appdir_font_folder_default(char *dir, size_t dir_maxncpy)
std::optional< std::string > BKE_appdir_folder_id_create(int folder_id, const char *subfolder) ATTR_WARN_UNUSED_RESULT
void BKE_blender_globals_main_replace(Main *bmain)
void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
#define BLENDER_FILE_SUBVERSION
#define BLENDER_FILE_VERSION
@ BKE_BPATH_FOREACH_PATH_SKIP_MULTIFILE
void BKE_bpath_foreach_path_main(BPathForeachPathData *bpath_data)
void BKE_colorband_init(ColorBand *coba, bool rangetype)
void CTX_data_main_set(bContext *C, Main *bmain)
bScreen * CTX_wm_screen(const bContext *C)
bool CTX_py_init_get(bContext *C)
void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
wmWindow * CTX_wm_window(const bContext *C)
void CTX_wm_screen_set(bContext *C, bScreen *screen)
void CTX_data_scene_set(bContext *C, Scene *scene)
Main * CTX_data_main(const bContext *C)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
wmWindowManager * CTX_wm_manager(const bContext *C)
void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup)
#define G_FLAG_ALL_READFILE
#define G_FILE_FLAG_ALL_RUNTIME
#define G_FLAG_ALL_RUNTIME
const IDTypeInfo * BKE_idtype_get_info_from_idtype_index(const int idtype_index)
const char * BKE_idtype_idcode_to_name(short idcode)
ViewLayer * BKE_view_layer_default_view(const Scene *scene)
ViewLayer * BKE_view_layer_find(const Scene *scene, const char *layer_name)
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
IDNewNameResult BKE_id_new_name_validate(Main &bmain, ListBase &lb, ID &id, const char *newname, IDNewNameMode mode, bool do_linked_data)
void size_t BKE_id_multi_tagged_delete(Main *bmain) ATTR_NONNULL()
@ LIB_ID_COPY_ASSET_METADATA
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
void BKE_library_make_local(Main *bmain, const Library *lib, GHash *old_to_new_ids, bool untagged_only, bool set_fake, bool clear_asset_data)
void id_fake_user_set(ID *id)
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int flag)
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
void id_us_ensure_real(ID *id)
void id_us_clear_real(ID *id)
void BKE_lib_id_swap_full(Main *bmain, ID *id_a, ID *id_b, const bool do_self_remap, const int self_remap_flags)
@ LIB_ID_MAKELOCAL_INDIRECT
@ LIB_ID_MAKELOCAL_FORCE_LOCAL
@ LIB_ID_MAKELOCAL_LIBOVERRIDE_CLEAR
void BKE_libblock_management_main_add(Main *bmain, void *idv)
void BKE_main_id_refcount_recompute(Main *bmain, bool do_linked_only)
void BKE_lib_libblock_session_uid_renew(ID *id)
void BKE_lib_override_library_free(IDOverrideLibrary **liboverride, bool do_id_user)
void BKE_lib_override_library_main_resync(Main *bmain, Scene *scene, ViewLayer *view_layer, BlendFileReadReport *reports)
void BKE_lib_override_library_main_operations_create(Main *bmain, bool force_auto, int *r_report_flags)
@ IDWALK_RET_STOP_RECURSION
void BKE_lib_query_unused_ids_tag(Main *bmain, int tag, LibQueryUnusedIDsData ¶meters)
@ IDWALK_CB_EMBEDDED_NOT_OWNING
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, int flag)
@ IDWALK_DO_LIBRARY_POINTER
@ IDWALK_DO_INTERNAL_RUNTIME_POINTERS
void BKE_libblock_remap_multiple_raw(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_SKIP_USER_REFCOUNT
@ ID_REMAP_SKIP_NEVER_NULL_USAGE
@ ID_REMAP_FORCE_UI_POINTERS
@ ID_REMAP_SKIP_UPDATE_TAGGING
@ ID_REMAP_RESULT_SOURCE_REMAPPED
@ ID_REMAP_RESULT_SOURCE_UNASSIGNED
@ ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE
@ ID_REMAP_RESULT_SOURCE_UNAVAILABLE
#define FOREACH_MAIN_ID_END
ListBase * which_libbase(Main *bmain, short type)
void BKE_main_clear(Main &bmain)
#define FOREACH_MAIN_LISTBASE_ID_END
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
#define FOREACH_MAIN_LISTBASE_END
void BKE_main_destroy(Main &bmain)
void BKE_main_init(Main &bmain)
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
void BKE_main_free(Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
ID ID ID * BKE_main_idmap_lookup_uid(IDNameLib_Map *id_map, uint session_uid) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDNameLib_Map * BKE_main_idmap_create(Main *bmain, bool create_valid_ids_set, Main *old_bmain, int idmap_types) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BKE_main_idmap_remove_id(IDNameLib_Map *id_map, const ID *id) ATTR_NONNULL()
void BKE_main_idmap_destroy(IDNameLib_Map *id_map) ATTR_NONNULL()
void BKE_main_idmap_insert_id(IDNameLib_Map *id_map, ID *id) ATTR_NONNULL()
void BKE_main_idmap_clear(IDNameLib_Map &id_map)
ID ID * BKE_main_idmap_lookup_id(IDNameLib_Map *id_map, const ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void BKE_main_namemap_remove_name(Main *bmain, ID *id, const char *name) ATTR_NONNULL()
void BKE_main_namemap_clear(Main *bmain) ATTR_NONNULL()
bool BKE_main_namemap_validate(Main *bmain) ATTR_NONNULL()
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL()
void BKE_preferences_extension_repo_add_defaults_all(UserDef *userdef)
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef, const char *shelf_idname, const char *catalog_path)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_reports_prependf(ReportList *reports, const char *prepend_format,...) ATTR_PRINTF_FORMAT(2
void BKE_report(ReportList *reports, eReportType type, const char *message)
void void BKE_reports_prepend(ReportList *reports, const char *prepend)
Scene * BKE_scene_add(Main *bmain, const char *name)
void BKE_scene_set_background(Main *bmain, Scene *sce)
ScrArea ScrArea void BKE_screen_gizmo_tag_refresh(bScreen *screen)
void BKE_screen_view3d_scene_sync(bScreen *screen, Scene *scene)
void BKE_screen_runtime_refresh_for_blendfile(bScreen *screen)
void BKE_studiolight_default(SolidLight lights[4], float light_ambient[3])
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_is_dir(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
bool BLI_remlink_safe(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count_at_most(const struct ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT 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)
MINLINE int min_ii(int a, int b)
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check_array(const char *path, const char **ext_array) ATTR_NONNULL(1
void BLI_path_slash_native(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
int BLI_path_slash_ensure(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
const char * BLI_path_slash_rfind(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define STRNCPY(dst, src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
int BLI_system_memory_max_in_megabytes_int(void)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define UNUSED_VARS_NDEBUG(...)
void BLO_reportf_wrap(BlendFileReadReport *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
external readfile function prototypes.
#define BLO_EMBEDDED_STARTUP_BLEND
BlendHandle * BLO_blendhandle_from_file(const char *filepath, BlendFileReadReport *reports)
void BLO_blendhandle_close(BlendHandle *bh) ATTR_NONNULL(1)
BlendFileData * BLO_read_from_memfile(Main *oldmain, const char *filepath, MemFile *memfile, const BlendFileReadParams *params, ReportList *reports)
BlendFileData * BLO_read_from_memory(const void *mem, int memsize, eBLOReadSkip skip_flags, ReportList *reports)
#define BLO_READ_SKIP_ALL
void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
BlendFileData * BLO_read_from_file(const char *filepath, eBLOReadSkip skip_flags, BlendFileReadReport *reports)
void BLO_read_do_version_after_setup(Main *new_bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport *reports)
void BLO_blendfiledata_free(BlendFileData *bfd)
const bTheme U_theme_default
external writefile.cc function prototypes.
bool BLO_write_file(Main *mainvar, const char *filepath, int write_flags, const BlendFileWriteParams *params, ReportList *reports)
@ BLO_WRITE_PATH_REMAP_RELATIVE
void BPY_context_update(bContext *C)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
#define CLOG_FATAL(clg_ref,...)
#define ID_TYPE_SUPPORTS_ASSET_EDITABLE(id_type)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_LINKED(_id)
@ LIBRARY_ASSET_FILE_WRITABLE
#define FILE_MAX_LIBEXTRA
@ USER_SCRIPT_AUTOEXEC_DISABLE
#define USER_EXPERIMENTAL_TEST(userdef, member)
void IMB_colormanagement_check_file_config(Main *bmain)
Read Guarded memory(de)allocation.
void BKE_blendfile_read_setup_undo(bContext *C, BlendFileData *bfd, const BlendFileReadParams *params, BlendFileReadReport *reports)
static void view3d_data_consistency_ensure(wmWindow *win, Scene *scene, ViewLayer *view_layer)
void BKE_blendfile_read_setup_readfile(bContext *C, BlendFileData *bfd, const BlendFileReadParams *params, BlendFileReadWMSetupData *wm_setup_data, BlendFileReadReport *reports, const bool startup_update_defaults, const char *startup_app_template)
bool BKE_blendfile_userdef_write_all(ReportList *reports)
static void wm_data_consistency_ensure(wmWindowManager *curwm, Scene *cur_scene, ViewLayer *cur_view_layer)
static int swap_old_bmain_data_for_blendfile_dependencies_process_cb(LibraryIDLinkCallbackData *cb_data)
static void handle_subversion_warning(Main *main, BlendFileReadReport *reports)
WorkspaceConfigFileData * BKE_blendfile_workspace_config_read(const char *filepath, const void *file_buf, int file_buf_size, ReportList *reports)
bool BKE_blendfile_userdef_write(const char *filepath, ReportList *reports)
static void setup_app_data(bContext *C, BlendFileData *bfd, const BlendFileReadParams *params, BlendFileReadWMSetupData *wm_setup_data, BlendFileReadReport *reports)
static bool reuse_bmain_data_remapper_is_id_remapped(id::IDRemapper &remapper, ID *id)
static void reuse_bmain_data_invalid_local_usages_fix(ReuseOldBMainData *reuse_data)
void BKE_blendfile_read_make_empty(bContext *C)
static void swap_wm_data_for_blendfile(ReuseOldBMainData *reuse_data, const bool load_ui)
bool BKE_blendfile_library_path_explode(const char *path, char *r_dir, char **r_group, char **r_name)
bool BKE_blendfile_extension_check(const char *str)
static bool reuse_editable_asset_needed(ReuseOldBMainData *reuse_data)
static void swap_old_bmain_data_dependencies_process(ReuseOldBMainData *reuse_data, const short id_code)
void BKE_blendfile_workspace_config_data_free(WorkspaceConfigFileData *workspace_config)
UserDef * BKE_blendfile_userdef_from_defaults()
static Library * reuse_bmain_data_dependencies_new_library_get(ReuseOldBMainData *reuse_data, Library *old_lib)
static id::IDRemapper & reuse_bmain_data_remapper_ensure(ReuseOldBMainData *reuse_data)
UserDef * BKE_blendfile_userdef_read(const char *filepath, ReportList *reports)
static void clean_paths(Main *bmain)
BlendFileData * BKE_blendfile_read_from_memfile(Main *bmain, MemFile *memfile, const BlendFileReadParams *params, ReportList *reports)
static int reuse_bmain_data_invalid_local_usages_fix_cb(LibraryIDLinkCallbackData *cb_data)
static void reuse_editable_asset_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, const short idcode)
static void swap_old_bmain_data_for_blendfile(ReuseOldBMainData *reuse_data, const short id_code)
UserDef * BKE_blendfile_userdef_read_from_memory(const void *file_buf, int file_buf_size, ReportList *reports)
BlendFileData * BKE_blendfile_read(const char *filepath, const BlendFileReadParams *params, BlendFileReadReport *reports)
BlendFileData * BKE_blendfile_read_from_memory(const void *file_buf, int file_buf_size, const BlendFileReadParams *params, ReportList *reports)
static void setup_app_blend_file_data(bContext *C, BlendFileData *bfd, const BlendFileReadParams *params, BlendFileReadWMSetupData *wm_setup_data, BlendFileReadReport *reports)
static bool wm_scene_is_visible(wmWindowManager *wm, Scene *scene)
static bool foreach_path_clean_cb(BPathForeachPathData *, char *path_dst, size_t path_dst_maxncpy, const char *path_src)
static bool reuse_bmain_move_id(ReuseOldBMainData *reuse_data, ID *id, Library *lib, const bool reuse_existing)
bool BKE_blendfile_userdef_write_app_template(const char *filepath, ReportList *reports)
static CLG_LogRef LOG_PARTIALWRITE
bool BKE_blendfile_is_readable(const char *path, ReportList *reports)
static void setup_app_userdef(BlendFileData *bfd)
static void unpin_file_local_grease_pencil_brush_materials(const ReuseOldBMainData *reuse_data)
static int reuse_editable_asset_bmain_data_dependencies_process_cb(LibraryIDLinkCallbackData *cb_data)
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
Value lookup_default(const Key &key, const Value &default_value) const
bool contains(const Key &key) const
constexpr const char * c_str() const
void append(const T &value)
void id_delete(const ID *id)
void remove_unused(bool clear_extra_user=false)
ID * id_add(const ID *id, IDAddOptions options, blender::FunctionRef< IDAddOperations(LibraryIDLinkCallbackData *cb_data, IDAddOptions options)> dependencies_filter_cb=nullptr)
bool write(const char *write_filepath, int write_flags, int remap_mode, ReportList &reports)
ID * id_create(short id_type, StringRefNull id_name, Library *library, IDAddOptions options)
PartialWriteContext()=delete
IDRemapperApplyResult get_mapping_result(ID *id, IDRemapperApplyOptions options, const ID *id_self) const
IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self=nullptr) const
void add(ID *old_id, ID *new_id)
void add_overwrite(ID *old_id, ID *new_id)
std::string id_name(void *id)
CCL_NAMESPACE_BEGIN struct Options options
double parameters[NUM_PARAMETERS]
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void RE_FreeAllPersistentData()
void RE_FreeAllRenderResults()
unsigned short local_view_bits
ViewLayer * cur_view_layer
struct BlendFileReadReport::@127 duration
struct BlendFileReadReport::@128 count
double lib_overrides_resync
eBLO_WritePathRemap remap_mode
struct Material * material
struct BrushGpencilSettings * gpencil_settings
IDOverrideLibrary * override_library
struct Library_Runtime runtime
struct RegionView3D * localvd
BlendFileReadWMSetupData * wm_setup_data
bool is_libraries_remapped
id::IDRemapper * remapper
struct SolidLight light_param[4]
struct ColorBand coba_weight
unsigned short local_view_uid
struct WorkSpaceInstanceHook * workspace_hook
static DynamicLibrary lib