Blender V4.3
BKE_main.hh File Reference
#include "DNA_listBase.h"
#include "BLI_compiler_attrs.h"
#include "BLI_sys_types.h"

Go to the source code of this file.

Classes

struct  BlendThumbnail
 
struct  MainIDRelationsEntryItem
 
struct  MainIDRelationsEntry
 
struct  MainIDRelations
 
struct  Main
 
struct  MainMergeReport
 

Macros

#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
 
#define FOREACH_MAIN_LISTBASE_ID_END
 
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
 
#define FOREACH_MAIN_LISTBASE_END
 
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
 
#define FOREACH_MAIN_ID_END
 
#define MAIN_VERSION_FILE_ATLEAST(main, ver, subver)
 
#define MAIN_VERSION_FILE_OLDER(main, ver, subver)
 
#define MAIN_VERSION_FILE_OLDER_OR_EQUAL(main, ver, subver)
 
#define LIBRARY_VERSION_FILE_ATLEAST(lib, ver, subver)
 
#define BLEN_THUMB_SIZE   128
 
#define BLEN_THUMB_MEMSIZE(_x, _y)    (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))
 
#define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y)    (((_x) > 0 && (_y) > 0) && ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))
 

Enumerations

enum  eMainIDRelationsEntryTags {
  MAINIDRELATIONS_ENTRY_TAGS_DOIT = 1 << 0 , MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_TO = 1 << 4 , MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_FROM = 1 << 5 , MAINIDRELATIONS_ENTRY_TAGS_PROCESSED ,
  MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_TO = 1 << 8 , MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_FROM = 1 << 9 , MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS
}
 
enum  { MAINIDRELATIONS_INCLUDE_UI = 1 << 0 }
 

Functions

MainBKE_main_new (void)
 
void BKE_main_init (Main &bmain)
 
void BKE_main_clear (Main &bmain)
 
void BKE_main_destroy (Main &bmain)
 
void BKE_main_free (Main *bmain)
 
void BKE_main_merge (Main *bmain_dst, Main **r_bmain_src, MainMergeReport &reports)
 
bool BKE_main_is_empty (Main *bmain)
 
bool BKE_main_has_issues (const Main *bmain)
 
bool BKE_main_needs_overwrite_confirm (const Main *bmain)
 
void BKE_main_lock (Main *bmain)
 
void BKE_main_unlock (Main *bmain)
 
void BKE_main_relations_create (Main *bmain, short flag)
 
void BKE_main_relations_free (Main *bmain)
 
void BKE_main_relations_tag_set (Main *bmain, eMainIDRelationsEntryTags tag, bool value)
 
GSetBKE_main_gset_create (Main *bmain, GSet *gset)
 
MainLibraryWeakReferenceMapBKE_main_library_weak_reference_create (Main *bmain) ATTR_NONNULL()
 
void BKE_main_library_weak_reference_destroy (MainLibraryWeakReferenceMap *library_weak_reference_mapping) ATTR_NONNULL()
 
IDBKE_main_library_weak_reference_search_item (MainLibraryWeakReferenceMap *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name) ATTR_NONNULL()
 
void BKE_main_library_weak_reference_add_item (MainLibraryWeakReferenceMap *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *new_id) ATTR_NONNULL()
 
void BKE_main_library_weak_reference_update_item (MainLibraryWeakReferenceMap *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *old_id, ID *new_id) ATTR_NONNULL()
 
void BKE_main_library_weak_reference_remove_item (MainLibraryWeakReferenceMap *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *old_id) ATTR_NONNULL()
 
BlendThumbnailBKE_main_thumbnail_from_buffer (Main *bmain, const uint8_t *rect, const int size[2])
 
BlendThumbnailBKE_main_thumbnail_from_imbuf (Main *bmain, ImBuf *img)
 
ImBufBKE_main_thumbnail_to_imbuf (Main *bmain, BlendThumbnail *data)
 
void BKE_main_thumbnail_create (Main *bmain)
 
const char * BKE_main_blendfile_path (const Main *bmain) ATTR_NONNULL()
 
const char * BKE_main_blendfile_path_from_global ()
 
ListBasewhich_libbase (Main *bmain, short type)
 
int set_listbasepointers (Main *bmain, ListBase *lb[])
 

Detailed Description

Main struct

Main is the root of the 'data-base' of a Blender context. All data is put into lists, and all these lists are stored here.

Note
A Blender file is not much more than a binary dump of these lists. This list of lists is not serialized itself.
BKE_main files are for operations over the Main database itself, or generating extra temp data to help working with it. Those should typically not affect the data-blocks themselves.

Names

  • BKE_main_ should be used for functions in that file.

Definition in file BKE_main.hh.

Macro Definition Documentation

◆ BLEN_THUMB_MEMSIZE

#define BLEN_THUMB_MEMSIZE ( _x,
_y )    (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))

◆ BLEN_THUMB_MEMSIZE_IS_VALID

#define BLEN_THUMB_MEMSIZE_IS_VALID ( _x,
_y )    (((_x) > 0 && (_y) > 0) && ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))

Protect against buffer overflow vulnerability & negative sizes.

Definition at line 600 of file BKE_main.hh.

Referenced by blo_read_file_internal(), BLO_thumbnail_from_file(), and read_file_thumbnail().

◆ BLEN_THUMB_SIZE

#define BLEN_THUMB_SIZE   128

The size of thumbnails (optionally) stored in the .blend files header.

NOTE(@ideasman42): This is kept small as it's stored uncompressed in the .blend file, where a larger size would increase the size of every .blend file unreasonably. If we wanted to increase the size, we'd want to use compression (JPEG or similar).

Definition at line 595 of file BKE_main.hh.

Referenced by BKE_main_thumbnail_create(), blend_file_thumb_from_camera(), and blend_file_thumb_from_screenshot().

◆ FOREACH_MAIN_ID_BEGIN

#define FOREACH_MAIN_ID_BEGIN ( _bmain,
_id )
Value:
{ \
ListBase *_lb; \
FOREACH_MAIN_LISTBASE_BEGIN ((_bmain), _lb) { \
FOREACH_MAIN_LISTBASE_ID_BEGIN (_lb, (_id))

Top level foreach-like macro allowing to loop over all IDs in a given Main data-base.

NOTE: Order tries to go from 'user IDs' to 'used IDs' (e.g. collections will be processed before objects, which will be processed before obdata types, etc.).

WARNING: DO NOT use break statement with that macro, use #FOREACH_MAIN_LISTBASE and #FOREACH_MAIN_LISTBASE_ID instead if you need that kind of control flow.

Definition at line 494 of file BKE_main.hh.

Referenced by blender::bke::asset_main_create_from_ID(), BKE_blendfile_library_relocate(), BKE_blendfile_override(), BKE_bpath_foreach_path_main(), BKE_collection_duplicate(), BKE_id_multi_tagged_delete(), BKE_lib_id_clear_library_data(), BKE_lib_override_library_create_from_id(), BKE_lib_override_library_create_from_tag(), BKE_lib_override_library_delete(), BKE_lib_override_library_id_hierarchy_reset(), BKE_lib_override_library_main_hierarchy_root_ensure(), BKE_lib_override_library_main_operations_create(), BKE_lib_override_library_main_operations_restore(), BKE_lib_override_library_main_tag(), BKE_lib_override_library_main_unused_cleanup(), BKE_lib_override_library_main_update(), BKE_lib_override_library_main_validate(), BKE_lib_override_library_operations_store_finalize(), BKE_lib_override_library_proxy_convert(), BKE_library_main_rebuild_hierarchy(), BKE_library_unused_linked_data_set_tag(), BKE_main_gset_create(), BKE_main_id_newptr_and_tag_clear(), BKE_main_id_refcount_recompute(), BKE_main_idmap_create(), BKE_main_is_empty(), BKE_main_merge(), BKE_main_relations_create(), BKE_object_duplicate(), BKE_scene_duplicate(), blo_do_versions_280(), blo_do_versions_300(), BLO_expand_main(), BLO_main_validate_embedded_flag(), BLO_main_validate_embedded_liboverrides(), blo_read_file_internal(), blender::ed::object::copy_object_set_idnew(), do_versions_after_linking_250(), do_versions_after_linking_300(), do_versions_idproperty_ui_data(), filelist_readjob_main_assets_add_items(), blender::ed::outliner::id_override_library_create_hierarchy(), blender::ed::outliner::id_override_library_create_hierarchy_process(), blender::bke::blendfile::PartialWriteContext::is_valid(), blender::bke::greasepencil::convert::legacy_gpencil_sanitize_annotations(), lib_link_all(), lib_override_libraries_index_define(), lib_override_library_main_resync_on_library_indirect_level(), lib_override_library_resync(), lib_override_library_resync_build_missing_ids_data(), lib_override_prefill_newid_from_existing_overrides(), lib_override_resync_tagging_finalize(), lib_query_unused_ids_tag(), libblock_remap_data(), main_namemap_populate(), blender::ed::object::make_override_library_exec(), memfile_undosys_step_decode(), blender::ed::outliner::outliner_clear_newid_from_main(), blender::ed::asset::pre_save_assets(), read_undo_move_libmain_data(), read_undo_remap_noundo_data(), blender::bke::blendfile::PartialWriteContext::remove_unused(), reuse_bmain_data_invalid_local_usages_fix(), setup_app_data(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), version_legacy_actions_to_layered(), version_nla_action_strip_hold(), version_nla_tweakmode_incomplete(), and write_file_handle().

◆ FOREACH_MAIN_ID_END

#define FOREACH_MAIN_ID_END
Value:
} \
} \
((void)0)
#define FOREACH_MAIN_LISTBASE_ID_END
Definition BKE_main.hh:469
#define FOREACH_MAIN_LISTBASE_END
Definition BKE_main.hh:481

Definition at line 500 of file BKE_main.hh.

Referenced by blender::bke::asset_main_create_from_ID(), BKE_blendfile_library_relocate(), BKE_blendfile_override(), BKE_bpath_foreach_path_main(), BKE_collection_duplicate(), BKE_id_multi_tagged_delete(), BKE_lib_id_clear_library_data(), BKE_lib_override_library_create_from_id(), BKE_lib_override_library_create_from_tag(), BKE_lib_override_library_delete(), BKE_lib_override_library_id_hierarchy_reset(), BKE_lib_override_library_main_hierarchy_root_ensure(), BKE_lib_override_library_main_operations_create(), BKE_lib_override_library_main_operations_restore(), BKE_lib_override_library_main_tag(), BKE_lib_override_library_main_unused_cleanup(), BKE_lib_override_library_main_update(), BKE_lib_override_library_main_validate(), BKE_lib_override_library_operations_store_finalize(), BKE_lib_override_library_proxy_convert(), BKE_library_main_rebuild_hierarchy(), BKE_library_unused_linked_data_set_tag(), BKE_main_gset_create(), BKE_main_id_newptr_and_tag_clear(), BKE_main_id_refcount_recompute(), BKE_main_idmap_create(), BKE_main_is_empty(), BKE_main_merge(), BKE_main_relations_create(), BKE_object_duplicate(), BKE_scene_duplicate(), blo_do_versions_280(), blo_do_versions_300(), BLO_expand_main(), BLO_main_validate_embedded_flag(), BLO_main_validate_embedded_liboverrides(), blo_read_file_internal(), blender::ed::object::copy_object_set_idnew(), do_versions_after_linking_250(), do_versions_after_linking_300(), do_versions_idproperty_ui_data(), filelist_readjob_main_assets_add_items(), blender::ed::outliner::id_override_library_create_hierarchy(), blender::ed::outliner::id_override_library_create_hierarchy_process(), blender::bke::blendfile::PartialWriteContext::is_valid(), blender::bke::greasepencil::convert::legacy_gpencil_sanitize_annotations(), lib_link_all(), lib_override_libraries_index_define(), lib_override_library_main_resync_on_library_indirect_level(), lib_override_library_resync(), lib_override_library_resync_build_missing_ids_data(), lib_override_prefill_newid_from_existing_overrides(), lib_override_resync_tagging_finalize(), lib_query_unused_ids_tag(), libblock_remap_data(), main_namemap_populate(), blender::ed::object::make_override_library_exec(), memfile_undosys_step_decode(), blender::ed::outliner::outliner_clear_newid_from_main(), blender::ed::asset::pre_save_assets(), read_undo_move_libmain_data(), read_undo_remap_noundo_data(), blender::bke::blendfile::PartialWriteContext::remove_unused(), reuse_bmain_data_invalid_local_usages_fix(), setup_app_data(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), blender::bke::tests::TEST(), version_legacy_actions_to_layered(), version_nla_action_strip_hold(), version_nla_tweakmode_incomplete(), and write_file_handle().

◆ FOREACH_MAIN_LISTBASE_BEGIN

◆ FOREACH_MAIN_LISTBASE_END

◆ FOREACH_MAIN_LISTBASE_ID_BEGIN

◆ FOREACH_MAIN_LISTBASE_ID_END

◆ LIBRARY_VERSION_FILE_ATLEAST

#define LIBRARY_VERSION_FILE_ATLEAST ( lib,
ver,
subver )
Value:
((lib)->runtime.versionfile > (ver) || \
((lib)->runtime.versionfile == (ver) && (lib)->runtime.subversionfile >= (subver)))
static DynamicLibrary lib

Definition at line 584 of file BKE_main.hh.

Referenced by blendfile_or_libraries_versions_atleast().

◆ MAIN_VERSION_FILE_ATLEAST

◆ MAIN_VERSION_FILE_OLDER

#define MAIN_VERSION_FILE_OLDER ( main,
ver,
subver )
Value:
((main)->versionfile < (ver) || \
((main)->versionfile == (ver) && (main)->subversionfile < (subver)))

Definition at line 576 of file BKE_main.hh.

Referenced by blo_do_versions_260(), and blo_do_versions_290().

◆ MAIN_VERSION_FILE_OLDER_OR_EQUAL

#define MAIN_VERSION_FILE_OLDER_OR_EQUAL ( main,
ver,
subver )
Value:
((main)->versionfile < (ver) || \
((main)->versionfile == (ver) && (main)->subversionfile <= (subver)))

Definition at line 580 of file BKE_main.hh.

Referenced by blo_split_main(), and read_global().

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
MAINIDRELATIONS_INCLUDE_UI 

Definition at line 117 of file BKE_main.hh.

◆ eMainIDRelationsEntryTags

MainIDRelationsEntry.tags

Enumerator
MAINIDRELATIONS_ENTRY_TAGS_DOIT 
MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_TO 
MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_FROM 
MAINIDRELATIONS_ENTRY_TAGS_PROCESSED 
MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_TO 
MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_FROM 
MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS 

Definition at line 79 of file BKE_main.hh.

Function Documentation

◆ BKE_main_blendfile_path()

const char * BKE_main_blendfile_path ( const Main * bmain)

Return file-path of given main.

Definition at line 832 of file main.cc.

References Main::filepath.

Referenced by blender::ed::object::bake_targets_output_external(), BKE_blendfile_read_from_memfile(), BKE_bpath_missing_files_find(), BKE_image_save_options_init(), BKE_library_filepath_set(), BKE_main_blendfile_path_from_global(), BKE_memfile_undo_decode(), BKE_movieclip_file_add(), BKE_movieclip_file_add_exists_ex(), BKE_packedfile_pack_all(), BKE_packedfile_pack_all_libraries(), BKE_packedfile_unpack(), BKE_packedfile_unpack_all_libraries(), BKE_scene_set_name(), BKE_sound_new_file(), BKE_sound_new_file_exists_ex(), BKE_vfont_load(), BKE_vfont_load_exists_ex(), BLO_memfile_main_get(), block_create__close_file_dialog(), block_create_save_file_overwrite_dialog(), bookmark_select_exec(), bpy_lib_load(), BPY_modules_load_user(), blender::io::hydra::cache_or_get_image_file(), cachefile_layer_open_invoke(), cachefile_open_invoke(), blender::ed::object::collection_exporter_export(), copy_material_exec(), detect_clip_source(), do_write_image_or_movie(), blender::nodes::draw_common_bake_settings(), draw_seq_in_view(), ED_fileselect_ensure_default_filepath(), file_browse_exec(), file_directory_enter_handle(), file_execute(), file_expand_directory(), file_filename_enter_handle(), file_operator_to_sfile(), file_parent_exec(), file_select_do(), file_sfile_to_operator_ex(), filelist_contains_main(), filelist_readjob_start(), blender::bke::bake::get_blend_file_name(), image_abs_path(), image_file_browse_exec(), image_file_browse_invoke(), image_open_exec(), image_save_options_from_op(), lib_id_library_local_paths(), library_link_begin(), library_link_end(), load_data_init_from_operator(), blender::io::obj::load_image_at_path(), make_paths_absolute_exec(), make_paths_relative_exec(), blender::ed::object::multires_external_save_exec(), blender::ed::outliner::namebutton_fn(), blender::ed::outliner::outliner_id_copy_exec(), pose_copy_exec(), blender::ed::space_node::preview_prepare_scene(), preview_prepare_scene(), RE_RenderAnim(), RE_RenderFrame(), save_set_filepath(), screen_opengl_render_anim_step(), screen_opengl_render_write(), SEQ_add_image_strip(), SEQ_add_movie_strip(), seq_disk_cache_get_project_dir(), seq_doversion_250_sound_proxy_update_cb(), sequencer_change_path_exec(), sequencer_generic_invoke_path__internal(), sound_mixdown_exec(), text_jump_to_file_at_point_internal(), text_open_exec(), text_open_invoke(), text_save_as_invoke(), txt_write_file(), blender::bke::bake::unpack_geometry_nodes_bake(), unpack_menu(), view3d_copybuffer_exec(), blender::ed::object::volume_import_exec(), wm_autosave_location(), wm_block_file_close_save(), wm_lib_relocate_exec_do(), wm_link_append_exec(), wm_open_mainfile__select_file_path(), WM_operator_drop_load_path(), wm_revert_mainfile_exec(), wm_save_as_mainfile_exec(), and write_result().

◆ BKE_main_blendfile_path_from_global()

const char * BKE_main_blendfile_path_from_global ( )

Return file-path of global main G_MAIN.

Warning
Usage is not recommended, you should always try to get a valid Main pointer from context.

Definition at line 837 of file main.cc.

References BKE_main_blendfile_path(), and G_MAIN.

Referenced by BKE_modifier_path_init(), BKE_ptcache_toggle_disk_cache(), block_create_autorun_warning(), bpy_lib_write(), dynamicPaint_outputSurfaceImage(), filelist_setdir(), fileselect_ensure_updated_file_params(), fileselect_initialize_params_common(), get_drag_path(), blender::nodes::node_composite_file_output_cc::FileOutputOperation::get_multi_layer_exr_image_path(), get_proxy_filepath(), blender::seq::get_seq_base_path(), blender::nodes::node_composite_file_output_cc::FileOutputOperation::get_single_layer_image_path(), blender::io::usd::import_asset(), blender::io::usd::import_startjob(), library_link_end(), movieclip_open_anim_file(), paste_material_exec(), blender::ed::io::paths_from_operator_properties(), pose_paste_exec(), proxy_dir_get(), ptcache_file_open(), ptcache_filepath(), ptcache_path(), blender::io::grease_pencil::SVGImporter::read(), render_result_exr_file_cache_path(), save_set_compress(), screenshot_exec(), screenshot_invoke(), SEQ_add_image_init_alpha_mode(), SEQ_add_reload_new_file(), seq_proxy_get_custom_file_filepath(), seq_proxy_get_filepath(), seq_proxy_multiview_context_invalid(), stampdata(), blender::seq::thumbnail_cache_invalidate_strip(), wm_history_file_update(), WM_init(), wm_init_splash_show_on_startup_check(), wm_link_append_invoke(), wm_revert_mainfile_poll(), wm_save_mainfile_invoke(), WM_window_title(), and write_crash_blend().

◆ BKE_main_clear()

◆ BKE_main_destroy()

void BKE_main_destroy ( Main & bmain)

Clear and free all data in given bmain, but does not free bmain itself.

Note
In most cases, BKE_main_free should be used instead of this function.
Unlike BKE_main_free, only process the given bmain, without handling any potential other linked Main.

Definition at line 166 of file main.cc.

References BKE_main_clear(), BLI_spin_end(), Main::lock, and MEM_freeN().

Referenced by BKE_main_free(), and blender::bke::blendfile::PartialWriteContext::~PartialWriteContext().

◆ BKE_main_free()

void BKE_main_free ( Main * bmain)

Completely destroy the given bmain, and all its linked 'libraries' ones if any (all other bmains, following the Main.next chained list).

Definition at line 175 of file main.cc.

References BKE_main_destroy(), BKE_main_free(), BLI_assert_msg, Main::filepath, MEM_freeN(), and Main::next.

Referenced by blender::bke::asset_write_in_library(), BKE_blender_globals_clear(), BKE_blendfile_userdef_read(), BKE_blendfile_userdef_read_from_memory(), BKE_blendfile_workspace_config_data_free(), BKE_lib_override_library_operations_store_finalize(), BKE_main_free(), BKE_main_merge(), BLO_blendfiledata_free(), blo_join_main(), BLO_library_temp_free(), bpy_rna_data_context_exit(), ED_preview_free_dbase(), library_link_end(), object_preview_render(), paste_material_exec(), pose_paste_exec(), read_libraries(), render_endjob(), seq_prefetch_free(), sequencer_clipboard_paste_exec(), blender::animrig::nla::tests::NLASlottedActionTest::TearDown(), blender::animrig::tests::ActionFCurveMoveTest::TearDown(), blender::animrig::tests::ActionFilterTest::TearDown(), blender::animrig::tests::ActionIteratorsTest::TearDown(), blender::animrig::tests::ActionLayersTest::TearDown(), blender::animrig::tests::ActionLegacyTest::TearDown(), blender::animrig::tests::ActionQueryTest::TearDown(), blender::animrig::tests::AnimationEvaluationTest::TearDown(), blender::animrig::tests::KeyframingTest::TearDown(), blender::bke::image::partial_update::ImagePartialUpdateTest::TearDown(), blender::bke::tests::BMainMergeTest::TearDown(), blender::bke::tests::BPathTest::TearDown(), blender::bke::tests::ImageTest::TearDown(), blender::interface::tests::CopyDriversToSelected::TearDown(), blender::io::alembic::AlembicExportTest::TearDown(), blender::bke::tests::TestData::teardown(), Freestyle::BlenderStrokeRenderer::~BlenderStrokeRenderer(), blender::bke::greasepencil::tests::GreasePencilIDTestContext::~GreasePencilIDTestContext(), blender::ed::greasepencil::tests::GreasePencilIDTestContext::~GreasePencilIDTestContext(), and blender::bke::tests::LibIDMainSortTestContext::~LibIDMainSortTestContext().

◆ BKE_main_gset_create()

GSet * BKE_main_gset_create ( Main * bmain,
GSet * gset )

Create a GSet storing all IDs present in given bmain, by their pointers.

Parameters
gsetIf not NULL, given GSet will be extended with IDs from given bmain, instead of creating a new one.

Definition at line 615 of file main.cc.

References BLI_ghashutil_ptrcmp(), BLI_ghashutil_ptrhash(), BLI_gset_add(), BLI_gset_new(), FOREACH_MAIN_ID_BEGIN, and FOREACH_MAIN_ID_END.

Referenced by BKE_main_idmap_create().

◆ BKE_main_has_issues()

bool BKE_main_has_issues ( const Main * bmain)

Check whether the bmain has issues, e.g. for reporting in the status bar.

Definition at line 469 of file main.cc.

References Main::has_forward_compatibility_issues, and Main::is_asset_edit_file.

Referenced by uiTemplateStatusInfo().

◆ BKE_main_init()

void BKE_main_init ( Main & bmain)

Initialize a Main data-base.

Note
Always generate a non-global Main, use BKE_blender_globals_main_replace to put a newly created one in G_MAIN.

Definition at line 52 of file main.cc.

References BLI_spin_init(), Main::is_action_slot_to_id_map_dirty, Main::is_global_main, Main::lock, and MEM_mallocN.

Referenced by BKE_main_new(), and blender::bke::blendfile::PartialWriteContext::PartialWriteContext().

◆ BKE_main_is_empty()

bool BKE_main_is_empty ( Main * bmain)

Check whether given bmain is empty or contains some IDs.

Definition at line 457 of file main.cc.

References FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, and result.

Referenced by library_link_end().

◆ BKE_main_library_weak_reference_add_item()

void BKE_main_library_weak_reference_add_item ( MainLibraryWeakReferenceMap * library_weak_reference_mapping,
const char * library_filepath,
const char * library_id_name,
ID * new_id )

Add the given ID weak library reference to given local ID and the runtime mapping.

Parameters
library_weak_reference_mappingthe mapping data generated by BKE_main_library_weak_reference_create.
library_filepaththe path of a blend file library (relative to current working one).
library_id_namethe full ID name, including the leading two chars encoding the ID type.
new_idNew local ID matching given weak reference.

Definition at line 701 of file main.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add_new(), BKE_idtype_idcode_append_is_reusable(), BLI_assert, GS, LibraryWeakReference::library_filepath, LibraryWeakReference::library_id_name, ID::library_weak_reference, MainLibraryWeakReferenceMap::map, MEM_mallocN, ID::name, and STRNCPY.

Referenced by BKE_blendfile_append().

◆ BKE_main_library_weak_reference_create()

MainLibraryWeakReferenceMap * BKE_main_library_weak_reference_create ( Main * bmain)

Generate a mapping between 'library path' of an ID (as a pair (relative blend file path, id name)), and a current local ID, if any.

This uses the information stored in ID.library_weak_reference.

Definition at line 656 of file main.cc.

References BKE_idtype_idcode_append_is_reusable(), BKE_idtype_idcode_is_linkable(), BLI_assert, ListBase::first, FOREACH_MAIN_LISTBASE_BEGIN, FOREACH_MAIN_LISTBASE_END, FOREACH_MAIN_LISTBASE_ID_BEGIN, FOREACH_MAIN_LISTBASE_ID_END, GS, LibraryWeakReference::library_filepath, LibraryWeakReference::library_id_name, ID::library_weak_reference, and ID::name.

Referenced by BKE_blendfile_append().

◆ BKE_main_library_weak_reference_destroy()

void BKE_main_library_weak_reference_destroy ( MainLibraryWeakReferenceMap * library_weak_reference_mapping)

Destroy the data generated by BKE_main_library_weak_reference_create.

Definition at line 686 of file main.cc.

Referenced by BKE_blendfile_append().

◆ BKE_main_library_weak_reference_remove_item()

void BKE_main_library_weak_reference_remove_item ( MainLibraryWeakReferenceMap * library_weak_reference_mapping,
const char * library_filepath,
const char * library_id_name,
ID * old_id )

Remove the given ID weak library reference from the given local ID and the runtime mapping.

Parameters
library_weak_reference_mappingthe mapping data generated by BKE_main_library_weak_reference_create.
library_filepaththe path of a blend file library (relative to current working one).
library_id_namethe full ID name, including the leading two chars encoding the ID type.
old_idExisting local ID matching given weak reference.

Definition at line 743 of file main.cc.

References BLI_assert, GS, ID::library_weak_reference, blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup(), MainLibraryWeakReferenceMap::map, MEM_SAFE_FREE, ID::name, and blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::remove().

Referenced by blendfile_append_define_actions(), and foreach_libblock_append_ensure_reusable_local_id_callback().

◆ BKE_main_library_weak_reference_search_item()

ID * BKE_main_library_weak_reference_search_item ( MainLibraryWeakReferenceMap * library_weak_reference_mapping,
const char * library_filepath,
const char * library_id_name )

Search for a local ID matching the given linked ID reference.

Parameters
library_weak_reference_mappingthe mapping data generated by BKE_main_library_weak_reference_create.
library_filepaththe path of a blend file library (relative to current working one).
library_id_namethe full ID name, including the leading two chars encoding the ID type.

Definition at line 692 of file main.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup_default(), and MainLibraryWeakReferenceMap::map.

Referenced by blendfile_append_define_actions().

◆ BKE_main_library_weak_reference_update_item()

void BKE_main_library_weak_reference_update_item ( MainLibraryWeakReferenceMap * library_weak_reference_mapping,
const char * library_filepath,
const char * library_id_name,
ID * old_id,
ID * new_id )

Update the status of the given ID weak library reference in current local IDs and the runtime mapping.

This effectively transfers the 'ownership' of the given weak reference from old_id to new_id.

Parameters
library_weak_reference_mappingthe mapping data generated by BKE_main_library_weak_reference_create.
library_filepaththe path of a blend file library (relative to current working one).
library_id_namethe full ID name, including the leading two chars encoding the ID type.
old_idExisting local ID matching given weak reference.
new_idNew local ID matching given weak reference.

Definition at line 721 of file main.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add_overwrite(), BLI_assert, GS, LibraryWeakReference::library_filepath, LibraryWeakReference::library_id_name, ID::library_weak_reference, blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup(), MainLibraryWeakReferenceMap::map, ID::name, and STREQ.

◆ BKE_main_lock()

◆ BKE_main_merge()

void BKE_main_merge ( Main * bmain_dst,
Main ** r_bmain_src,
MainMergeReport & reports )

Merge the content of bmain_src into bmain_dst.

In case of collision (ID from same library with same name), the existing ID in bmain_dst is kept, the one from bmain_src is left in its original Main, and its usages in bmain_dst (from newly moved-in IDs) are remapped to its matching counterpart already in bmain_dst.

Libraries are also de-duplicated, based on their absolute filepath, and remapped accordingly. Note that local IDs in source Main always remain local IDs in destination Main.

In case some source IDs are linked data from the blendfile of bmain_dst, they are never moved. If a matching destination local ID is found, their usage get remapped as expected, otherwise they are dropped, their usages are remapped to null, and a warning is printed.

Since bmain_src is either empty or contains left-over IDs with (likely) invalid ID relationships and other potential issues after the merge, it is always freed.

Definition at line 321 of file main.cc.

References blender::bke::id::IDRemapper::add(), blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), are_ids_from_different_mains_matching(), BKE_bpath_absolute_convert(), BKE_bpath_relative_rebase(), BKE_libblock_management_main_add(), BKE_libblock_management_main_remove(), BKE_libblock_relink_multiple(), BKE_main_free(), BKE_main_namemap_clear(), BKE_main_namemap_validate(), BKE_reportf(), BLI_assert, BLI_path_normalize_native(), BLI_path_split_dir_part(), blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::contains(), FILE_MAXDIR, Main::filepath, Library_Runtime::filepath_abs, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, GS, ID_LI, ID_REMAP_DO_LIBRARY_POINTERS, ID_REMAP_TYPE_REMAP, int, blender::Vector< T, InlineBufferCapacity, Allocator >::is_empty(), blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup_default(), blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup_or_add(), main_merge_add_id_to_move(), ID::name, MainMergeReport::num_merged_ids, MainMergeReport::num_remapped_ids, MainMergeReport::num_remapped_libraries, MainMergeReport::num_unknown_ids, MainMergeReport::reports, RPT_INFO, Library::runtime, and blender::Vector< T, InlineBufferCapacity, Allocator >::size().

Referenced by sequencer_clipboard_paste_exec(), blender::bke::tests::TEST_F(), and blender::bke::tests::TEST_F().

◆ BKE_main_needs_overwrite_confirm()

bool BKE_main_needs_overwrite_confirm ( const Main * bmain)

Check whether user confirmation should be required when overwriting this bmain into its source blendfile.

Definition at line 474 of file main.cc.

References Main::has_forward_compatibility_issues, and Main::is_asset_edit_file.

Referenced by block_create__close_file_dialog(), and wm_save_mainfile_invoke().

◆ BKE_main_new()

Main * BKE_main_new ( void )

Create a new Main data-base.

Note
Always generate a non-global Main, use BKE_blender_globals_main_replace to put a newly created one in G_MAIN.

Definition at line 45 of file main.cc.

References BKE_main_init(), and MEM_callocN.

Referenced by blender::bke::asset_main_create_from_ID(), BKE_blender_globals_init(), BKE_lib_override_library_operations_store_init(), Freestyle::BlenderStrokeRenderer::BlenderStrokeRenderer(), blo_find_main(), BLO_library_temp_load_id(), blo_read_file_internal(), blo_split_main(), bpy_rna_data_context_enter(), direct_link_library(), blender::bke::greasepencil::tests::GreasePencilIDTestContext::GreasePencilIDTestContext(), blender::ed::greasepencil::tests::GreasePencilIDTestContext::GreasePencilIDTestContext(), blender::bke::tests::LibIDMainSortTestContext::LibIDMainSortTestContext(), library_link_end(), object_preview_render(), paste_material_exec(), pose_paste_exec(), read_libraries(), seq_prefetch_start_ex(), blender::animrig::nla::tests::NLASlottedActionTest::SetUp(), blender::animrig::tests::ActionFCurveMoveTest::SetUp(), blender::animrig::tests::ActionFilterTest::SetUp(), blender::animrig::tests::ActionIteratorsTest::SetUp(), blender::animrig::tests::ActionLayersTest::SetUp(), blender::animrig::tests::ActionLegacyTest::SetUp(), blender::animrig::tests::ActionQueryTest::SetUp(), blender::animrig::tests::AnimationEvaluationTest::SetUp(), blender::animrig::tests::KeyframingTest::SetUp(), blender::bke::image::partial_update::ImagePartialUpdateTest::SetUp(), blender::bke::tests::BMainMergeTest::SetUp(), blender::bke::tests::BPathTest::SetUp(), blender::bke::tests::ImageTest::SetUp(), blender::interface::tests::CopyDriversToSelected::SetUp(), blender::io::alembic::AlembicExportTest::SetUp(), blender::bke::tests::TestData::setup(), blender::bke::tests::TEST_F(), and blender::bke::tests::TEST_F().

◆ BKE_main_relations_create()

◆ BKE_main_relations_free()

◆ BKE_main_relations_tag_set()

◆ BKE_main_thumbnail_create()

void BKE_main_thumbnail_create ( Main * bmain)

Generates an empty (black) thumbnail for given Main.

Definition at line 822 of file main.cc.

References Main::blen_thumb, BLEN_THUMB_MEMSIZE, BLEN_THUMB_SIZE, BlendThumbnail::height, MEM_callocN, MEM_SAFE_FREE, and BlendThumbnail::width.

◆ BKE_main_thumbnail_from_buffer()

BlendThumbnail * BKE_main_thumbnail_from_buffer ( Main * bmain,
const uint8_t * rect,
const int size[2] )

Generates a raw .blend file thumbnail data from a raw image buffer.

Parameters
bmainIf not NULL, also store generated data in this Main.
rectRGBA image buffer.
sizeThe size of rect.
Returns
The generated .blend file raw thumbnail data.

Definition at line 760 of file main.cc.

References Main::blen_thumb, BLEN_THUMB_MEMSIZE, data, MEM_mallocN, MEM_SAFE_FREE, and BlendThumbnail::width.

Referenced by blend_file_thumb_from_screenshot().

◆ BKE_main_thumbnail_from_imbuf()

BlendThumbnail * BKE_main_thumbnail_from_imbuf ( Main * bmain,
ImBuf * img )

Generates a raw .blend file thumbnail data from given image.

Parameters
bmainIf not NULL, also store generated data in this Main.
imgImBuf image to generate thumbnail data from.
Returns
The generated .blend file raw thumbnail data.

Definition at line 782 of file main.cc.

References Main::blen_thumb, BLEN_THUMB_MEMSIZE, ImBuf::byte_buffer, data, ImBufByteBuffer::data, IMB_rect_from_float(), MEM_mallocN, MEM_SAFE_FREE, ImBuf::x, and ImBuf::y.

Referenced by blend_file_thumb_from_camera(), and blend_file_thumb_from_screenshot().

◆ BKE_main_thumbnail_to_imbuf()

ImBuf * BKE_main_thumbnail_to_imbuf ( Main * bmain,
BlendThumbnail * data )

Generates an image from raw .blend file thumbnail data.

Parameters
bmainUse this bmain->blen_thumb data if given data is NULL.
dataRaw .blend file thumbnail data.
Returns
An ImBuf from given data, or NULL if invalid.

Definition at line 806 of file main.cc.

References Main::blen_thumb, and IMB_allocFromBuffer().

Referenced by imb_thumb_load_from_blendfile(), uiTemplateRecentFiles_tooltip_func(), and wm_file_write().

◆ BKE_main_unlock()

◆ set_listbasepointers()

int set_listbasepointers ( Main * bmain,
ListBase * lb[] )

Put the pointers to all the ListBase structs in given bmain into the *lb[INDEX_ID_MAX] array, and return the number of those for convenience.

This is useful for generic traversal of all the blocks in a Main (by traversing all the lists in turn), without worrying about block types.

Parameters
lbArray of lists INDEX_ID_MAX in length.
Note
The order of each ID type ListBase in the array is determined by the INDEX_ID_<IDTYPE> enum definitions in DNA_ID.h. See also the FOREACH_MAIN_ID_BEGIN macro in BKE_main.hh

Definition at line 929 of file main.cc.

References Main::actions, Main::armatures, Main::brushes, Main::cachefiles, Main::cameras, Main::collections, Main::curves, Main::fonts, Main::gpencils, Main::grease_pencils, Main::hair_curves, Main::images, INDEX_ID_AC, INDEX_ID_AR, INDEX_ID_BR, INDEX_ID_CA, INDEX_ID_CF, INDEX_ID_CU_LEGACY, INDEX_ID_CV, INDEX_ID_GD_LEGACY, INDEX_ID_GP, INDEX_ID_GR, INDEX_ID_IM, INDEX_ID_IP, INDEX_ID_KE, INDEX_ID_LA, INDEX_ID_LI, INDEX_ID_LP, INDEX_ID_LS, INDEX_ID_LT, INDEX_ID_MA, INDEX_ID_MAX, INDEX_ID_MB, INDEX_ID_MC, INDEX_ID_ME, INDEX_ID_MSK, INDEX_ID_NT, INDEX_ID_NULL, INDEX_ID_OB, INDEX_ID_PA, INDEX_ID_PAL, INDEX_ID_PC, INDEX_ID_PT, INDEX_ID_SCE, INDEX_ID_SCR, INDEX_ID_SO, INDEX_ID_SPK, INDEX_ID_TE, INDEX_ID_TXT, INDEX_ID_VF, INDEX_ID_VO, INDEX_ID_WM, INDEX_ID_WO, INDEX_ID_WS, Main::ipo, Main::lattices, Main::libraries, Main::lightprobes, Main::lights, Main::linestyles, Main::masks, Main::materials, Main::meshes, Main::metaballs, Main::movieclips, Main::nodetrees, Main::objects, Main::paintcurves, Main::palettes, Main::particles, Main::pointclouds, Main::scenes, Main::screens, Main::shapekeys, Main::sounds, Main::speakers, Main::texts, Main::textures, Main::volumes, Main::wm, Main::workspaces, and Main::worlds.

Referenced by add_main_to_main(), BKE_blendfile_library_relocate(), BKE_library_ID_test_usages(), BKE_library_indirectly_used_data_tag_clear(), BKE_library_make_local(), BKE_main_clear(), BKE_main_id_flag_all(), BKE_main_id_tag_all(), blo_do_versions_270(), BLO_main_validate_libraries(), blo_split_main(), blender::ed::outliner::TreeDisplayIDOrphans::build_tree(), has_linked_ids_to_read(), id_delete(), library_ID_is_used(), read_library_clear_weak_links(), read_library_linked_ids(), read_undo_reuse_noundo_local_ids(), split_main_newid(), write_file_handle(), and write_libraries().

◆ which_libbase()

ListBase * which_libbase ( Main * bmain,
short type )
Returns
A pointer to the ListBase of given bmain for requested type ID type.

Definition at line 842 of file main.cc.

References Main::actions, Main::armatures, Main::brushes, Main::cachefiles, Main::cameras, Main::collections, Main::curves, Main::fonts, Main::gpencils, Main::grease_pencils, Main::hair_curves, ID_AC, ID_AR, ID_BR, ID_CA, ID_CF, ID_CU_LEGACY, ID_CV, ID_GD_LEGACY, ID_GP, ID_GR, ID_IM, ID_IP, ID_KE, ID_LA, ID_LI, ID_LP, ID_LS, ID_LT, ID_MA, ID_MB, ID_MC, ID_ME, ID_MSK, ID_NT, ID_OB, ID_PA, ID_PAL, ID_PC, ID_PT, ID_SCE, ID_SCR, ID_SO, ID_SPK, ID_TE, ID_TXT, ID_VF, ID_VO, ID_WM, ID_WO, ID_WS, Main::images, Main::ipo, Main::lattices, Main::libraries, Main::lightprobes, Main::lights, Main::linestyles, Main::masks, Main::materials, Main::meshes, Main::metaballs, Main::movieclips, Main::nodetrees, Main::objects, Main::paintcurves, Main::palettes, Main::particles, Main::pointclouds, Main::scenes, Main::screens, Main::shapekeys, Main::sounds, Main::speakers, Main::texts, Main::textures, Main::volumes, Main::wm, Main::workspaces, and Main::worlds.

Referenced by BKE_blendfile_library_relocate(), BKE_id_is_in_main(), BKE_id_move_to_same_lib(), BKE_lib_id_clear_library_data(), BKE_libblock_alloc_in_lib(), BKE_libblock_find_name(), BKE_libblock_find_name_and_library(), BKE_libblock_find_name_and_library_filepath(), BKE_libblock_find_session_uid(), BKE_libblock_management_main_add(), BKE_libblock_management_main_remove(), BKE_libblock_rename(), BKE_main_id_tag_idcode(), BKE_main_idmap_lookup_name(), BKE_mask_clipboard_paste_to_layer(), blendfile_library_relocate_remap(), blo_do_versions_280(), blo_do_versions_290(), blo_do_versions_300(), blender::ed::outliner::TreeDisplayIDOrphans::build_tree(), create_placeholder(), do_versions_rename_id(), expand_doit_library(), id_free(), lib_override_library_create_from(), library_id_is_yet_read(), link_named_part(), main_namemap_validate_and_fix(), blender::ed::outliner::outliner_id_itemf(), blender::ed::outliner::outliner_id_remap_exec(), paste_material_nodetree_ids_relink_or_clear(), pastebuf_match_path_property(), read_libblock(), read_libblock_undo_restore_at_old_address(), read_libblock_undo_restore_identical(), read_undo_reuse_noundo_local_ids(), reuse_bmain_move_id(), reuse_editable_asset_bmain_data_for_blendfile(), split_libdata(), swap_old_bmain_data_dependencies_process(), swap_old_bmain_data_for_blendfile(), ui_template_id(), and uiTemplateAction().