forked from blender/blender
WIP code for persistent asset library registrering and separated loading #3
@ -23,6 +23,7 @@
|
|||||||
struct AssetLibrary;
|
struct AssetLibrary;
|
||||||
struct IDRemapper;
|
struct IDRemapper;
|
||||||
struct Main;
|
struct Main;
|
||||||
|
struct UserDef;
|
||||||
|
|
||||||
namespace blender::asset_system {
|
namespace blender::asset_system {
|
||||||
|
|
||||||
@ -30,6 +31,19 @@ class AssetIdentifier;
|
|||||||
class AssetRepresentation;
|
class AssetRepresentation;
|
||||||
class AssetStorage;
|
class AssetStorage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make an asset library available to the asset system, by letting it take ownership.
|
||||||
|
*/
|
||||||
|
void register_library(eAssetLibraryType type, std::unique_ptr<AssetLibrary> library);
|
||||||
|
/**
|
||||||
|
* Unregister all asset libraries of \a type, returning the unregistered libraries as owning
|
||||||
|
* pointers. The return value can be discarded to completely destruct the asset libraries.
|
||||||
|
*/
|
||||||
|
Vector<std::unique_ptr<AssetLibrary>> unregister_libraries_of_type(eAssetLibraryType type);
|
||||||
|
|
||||||
|
void register_builtin_libraries();
|
||||||
|
void register_userdef_libraries(const UserDef *userdef);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AssetLibrary provides access to an asset library's data.
|
* AssetLibrary provides access to an asset library's data.
|
||||||
*
|
*
|
||||||
@ -76,6 +90,10 @@ class AssetLibrary {
|
|||||||
|
|
||||||
bCallbackFuncStore on_save_callback_store_{};
|
bCallbackFuncStore on_save_callback_store_{};
|
||||||
|
|
||||||
|
/* TODO temp, just to set up some settings. */
|
||||||
|
friend void register_builtin_libraries();
|
||||||
|
friend void register_userdef_libraries(const UserDef *userdef);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* Controlled by #ED_asset_catalogs_set_save_catalogs_when_file_is_saved,
|
/* Controlled by #ED_asset_catalogs_set_save_catalogs_when_file_is_saved,
|
||||||
* for managing the "Save Catalog Changes" in the quit-confirmation dialog box. */
|
* for managing the "Save Catalog Changes" in the quit-confirmation dialog box. */
|
||||||
@ -95,7 +113,7 @@ class AssetLibrary {
|
|||||||
* \param root_path: If this is an asset library on disk, the top-level directory path.
|
* \param root_path: If this is an asset library on disk, the top-level directory path.
|
||||||
*/
|
*/
|
||||||
AssetLibrary(eAssetLibraryType library_type, StringRef name = "", StringRef root_path = "");
|
AssetLibrary(eAssetLibraryType library_type, StringRef name = "", StringRef root_path = "");
|
||||||
~AssetLibrary();
|
virtual ~AssetLibrary();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute \a fn for every asset library that is loaded. The asset library is passed to the
|
* Execute \a fn for every asset library that is loaded. The asset library is passed to the
|
||||||
@ -107,6 +125,8 @@ class AssetLibrary {
|
|||||||
*/
|
*/
|
||||||
static void foreach_loaded(FunctionRef<void(AssetLibrary &)> fn, bool include_all_library);
|
static void foreach_loaded(FunctionRef<void(AssetLibrary &)> fn, bool include_all_library);
|
||||||
|
|
||||||
|
virtual void load(const Main &bmain) = 0;
|
||||||
|
|
||||||
void load_catalogs();
|
void load_catalogs();
|
||||||
|
|
||||||
/** Load catalogs that have changed on disk. */
|
/** Load catalogs that have changed on disk. */
|
||||||
|
@ -12,6 +12,11 @@
|
|||||||
|
|
||||||
namespace blender::asset_system {
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
class EssentialsAssetLibrary : public AssetLibrary {
|
||||||
|
public:
|
||||||
|
void load() override;
|
||||||
|
};
|
||||||
|
|
||||||
StringRefNull essentials_directory_path();
|
StringRefNull essentials_directory_path();
|
||||||
|
|
||||||
}
|
} // namespace blender::asset_system
|
||||||
|
@ -15,13 +15,16 @@ set(SRC
|
|||||||
intern/asset_catalog.cc
|
intern/asset_catalog.cc
|
||||||
intern/asset_catalog_path.cc
|
intern/asset_catalog_path.cc
|
||||||
intern/asset_catalog_tree.cc
|
intern/asset_catalog_tree.cc
|
||||||
intern/asset_essentials_library.cc
|
|
||||||
intern/asset_identifier.cc
|
intern/asset_identifier.cc
|
||||||
intern/asset_library.cc
|
intern/asset_library.cc
|
||||||
|
intern/asset_library_registry.cc
|
||||||
intern/asset_library_service.cc
|
intern/asset_library_service.cc
|
||||||
intern/asset_representation.cc
|
intern/asset_representation.cc
|
||||||
intern/asset_storage.cc
|
intern/asset_storage.cc
|
||||||
intern/utils.cc
|
intern/utils.cc
|
||||||
|
intern/asset_libraries/all_library.cc
|
||||||
|
intern/asset_libraries/essentials_library.cc
|
||||||
|
intern/asset_libraries/current_file_library.cc
|
||||||
|
|
||||||
AS_asset_catalog.hh
|
AS_asset_catalog.hh
|
||||||
AS_asset_catalog_path.hh
|
AS_asset_catalog_path.hh
|
||||||
@ -33,6 +36,8 @@ set(SRC
|
|||||||
intern/asset_library_service.hh
|
intern/asset_library_service.hh
|
||||||
intern/asset_storage.hh
|
intern/asset_storage.hh
|
||||||
intern/utils.hh
|
intern/utils.hh
|
||||||
|
intern/asset_libraries/all_library.hh
|
||||||
|
intern/asset_libraries/current_file_library.hh
|
||||||
|
|
||||||
AS_asset_library.h
|
AS_asset_library.h
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup asset_system
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "asset_library_service.hh"
|
||||||
|
|
||||||
|
#include "all_library.hh"
|
||||||
|
|
||||||
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
AllAssetLibrary::AllAssetLibrary() : AssetLibrary(ASSET_LIBRARY_ALL) {}
|
||||||
|
|
||||||
|
void AllAssetLibrary::load(const Main &bmain)
|
||||||
|
{
|
||||||
|
AssetLibraryService::get_asset_library_all(&bmain);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::asset_system
|
@ -0,0 +1,21 @@
|
|||||||
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup asset_system
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "AS_asset_library.hh"
|
||||||
|
|
||||||
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
class AllAssetLibrary : public AssetLibrary {
|
||||||
|
public:
|
||||||
|
AllAssetLibrary();
|
||||||
|
void load(const Main &bmain) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace blender::asset_system
|
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup asset_system
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "asset_library_service.hh"
|
||||||
|
|
||||||
|
#include "current_file_library.hh"
|
||||||
|
|
||||||
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
CurrentFileAssetLibrary::CurrentFileAssetLibrary() : {}
|
||||||
|
|
||||||
|
void CurrentFileAssetLibrary::load(const Main &bmain)
|
||||||
|
{
|
||||||
|
/* For the "Current File" library we get the asset library root path based on main. */
|
||||||
|
std::string root_path = bmain ? AS_asset_library_find_suitable_root_path_from_main(bmain) : "";
|
||||||
|
|
||||||
|
if (root_path.empty()) {
|
||||||
|
/* File wasn't saved yet. */
|
||||||
|
return AssetLibraryService::get_asset_library_current_file();
|
||||||
|
}
|
||||||
|
return AssetLibraryService::get_asset_library_on_disk_builtin(ASSET_LIBRARY_LOCAL, root_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::asset_system
|
@ -0,0 +1,22 @@
|
|||||||
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup asset_system
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "AS_asset_library.hh"
|
||||||
|
|
||||||
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
class CurrentFileAssetLibrary : public AssetLibrary {
|
||||||
|
public:
|
||||||
|
CurrentFileAssetLibrary();
|
||||||
|
|
||||||
|
void load(const Main &bmain) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace blender::asset_system
|
@ -10,10 +10,21 @@
|
|||||||
|
|
||||||
#include "BKE_appdir.h"
|
#include "BKE_appdir.h"
|
||||||
|
|
||||||
|
#include "AS_asset_library.hh"
|
||||||
|
#include "asset_library_service.hh"
|
||||||
|
|
||||||
#include "AS_essentials_library.hh"
|
#include "AS_essentials_library.hh"
|
||||||
|
|
||||||
namespace blender::asset_system {
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
void EssentialsAssetLibrary::load(const Main & /*bmain*/) override
|
||||||
|
{
|
||||||
|
/* Builtin asset libraries don't need a name, the #eAssetLibraryType is enough to identify them
|
||||||
|
* (and doesn't change, unlike the name). */
|
||||||
|
AssetLibraryService::get_asset_library_on_disk(
|
||||||
|
ASSET_LIBRARY_ESSENTIALS, "", essentials_directory_path());
|
||||||
|
}
|
||||||
|
|
||||||
StringRefNull essentials_directory_path()
|
StringRefNull essentials_directory_path()
|
||||||
{
|
{
|
||||||
static std::string path = []() {
|
static std::string path = []() {
|
118
source/blender/asset_system/intern/asset_library_registry.cc
Normal file
118
source/blender/asset_system/intern/asset_library_registry.cc
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup asset_system
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "DNA_userdef_types.h"
|
||||||
|
|
||||||
|
#include "BLI_listbase.h"
|
||||||
|
|
||||||
|
#include "AS_asset_library.hh"
|
||||||
|
#include "AS_essentials_library.hh"
|
||||||
|
#include "asset_libraries/all_library.hh"
|
||||||
|
#include "asset_libraries/current_file_library.hh"
|
||||||
|
|
||||||
|
#include "BLI_map.hh"
|
||||||
|
#include "BLI_vector.hh"
|
||||||
|
|
||||||
|
#include "CLG_log.h"
|
||||||
|
|
||||||
|
static CLG_LogRef LOG = {"asset_system"};
|
||||||
|
|
||||||
|
namespace blender::asset_system {
|
||||||
|
|
||||||
|
class AssetLibraryRegistry {
|
||||||
|
public:
|
||||||
|
using LibrariesVec = Vector<std::unique_ptr<AssetLibrary>>;
|
||||||
|
Map<eAssetLibraryType, LibrariesVec> libraries_by_type;
|
||||||
|
|
||||||
|
static AssetLibraryRegistry &get_registry();
|
||||||
|
};
|
||||||
|
|
||||||
|
AssetLibraryRegistry &AssetLibraryRegistry::get_registry()
|
||||||
|
{
|
||||||
|
static AssetLibraryRegistry instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_library(const eAssetLibraryType type, std::unique_ptr<AssetLibrary> library)
|
||||||
|
{
|
||||||
|
AssetLibraryRegistry ®istry = AssetLibraryRegistry::get_registry();
|
||||||
|
registry.libraries_by_type.add_or_modify(
|
||||||
|
type,
|
||||||
|
[&](AssetLibraryRegistry::LibrariesVec *libraries) {
|
||||||
|
*libraries = Vector<std::unique_ptr<AssetLibrary>>{};
|
||||||
|
libraries->append(std::move(library));
|
||||||
|
},
|
||||||
|
[&](AssetLibraryRegistry::LibrariesVec *libraries) {
|
||||||
|
libraries->append(std::move(library));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<std::unique_ptr<AssetLibrary>> unregister_libraries_of_type(const eAssetLibraryType type)
|
||||||
|
{
|
||||||
|
AssetLibraryRegistry ®istry = AssetLibraryRegistry::get_registry();
|
||||||
|
std::optional<AssetLibraryRegistry::LibrariesVec> libraries = registry.libraries_by_type.pop_try(
|
||||||
|
type);
|
||||||
|
|
||||||
|
if (!libraries) {
|
||||||
|
CLOG_INFO(&LOG, 2, "No asset libraries registered for this type [%i].", type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return libraries;
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_builtin_libraries()
|
||||||
|
{
|
||||||
|
register_library(ASSET_LIBRARY_ALL, std::make_unique<AssetLibrary>(ASSET_LIBRARY_ALL));
|
||||||
|
|
||||||
|
register_library(ASSET_LIBRARY_LOCAL, std::make_unique<AssetLibrary>(ASSET_LIBRARY_LOCAL));
|
||||||
|
|
||||||
|
std::unique_ptr essentials_library = std::make_unique<AssetLibrary>(
|
||||||
|
ASSET_LIBRARY_ESSENTIALS, "", essentials_directory_path());
|
||||||
|
essentials_library->import_method_ = ASSET_IMPORT_APPEND_REUSE;
|
||||||
|
register_library(ASSET_LIBRARY_ESSENTIALS, std::move(essentials_library));
|
||||||
|
}
|
||||||
|
|
||||||
|
void unregister_all_libraries()
|
||||||
|
{
|
||||||
|
AssetLibraryRegistry ®istry = AssetLibraryRegistry::get_registry();
|
||||||
|
registry.libraries_by_type.clear_and_shrink();
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_userdef_libraries(const UserDef *userdef)
|
||||||
|
{
|
||||||
|
LISTBASE_FOREACH (bUserAssetLibrary *, user_library, &userdef->asset_libraries) {
|
||||||
|
std::unique_ptr library = std::make_unique<AssetLibrary>(
|
||||||
|
ASSET_LIBRARY_CUSTOM, user_library->name, user_library->dirpath);
|
||||||
|
|
||||||
|
library->import_method_ = eAssetImportMethod(user_library->import_method);
|
||||||
|
library->may_override_import_method_ = true;
|
||||||
|
library->use_relative_path_ = (user_library->flag & ASSET_LIBRARY_RELATIVE_PATH) != 0;
|
||||||
|
|
||||||
|
register_library(ASSET_LIBRARY_CUSTOM, std::move(library));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_registered_userdef_libraries(const UserDef *userdef)
|
||||||
|
{
|
||||||
|
AssetLibraryRegistry ®istry = AssetLibraryRegistry::get_registry();
|
||||||
|
|
||||||
|
Map<StringRef, int> registered_libraries_to_index;
|
||||||
|
AssetLibraryRegistry::LibrariesVec &user_libraries = registry.libraries_by_type.lookup_default(
|
||||||
|
ASSET_LIBRARY_CUSTOM, {});
|
||||||
|
for (std::unique_ptr<AssetLibrary> &user_library : user_libraries) {
|
||||||
|
// registered_libraries_to_index.add(user_library.)
|
||||||
|
}
|
||||||
|
|
||||||
|
LISTBASE_FOREACH (bUserAssetLibrary *, user_library, &userdef->asset_libraries) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::asset_system
|
Loading…
Reference in New Issue
Block a user