[Bf-blender-cvs] [968b0495e2b] temp-asset-representation: Initial AssetRepresentation type, storage & construction

Julian Eisel noreply at git.blender.org
Wed Sep 21 20:36:01 CEST 2022


Commit: 968b0495e2b42b8d7c0260e92311fa67dd91d78b
Author: Julian Eisel
Date:   Wed Sep 21 20:29:37 2022 +0200
Branches: temp-asset-representation
https://developer.blender.org/rB968b0495e2b42b8d7c0260e92311fa67dd91d78b

Initial AssetRepresentation type, storage & construction

===================================================================

M	source/blender/blenkernel/BKE_asset_library.h
M	source/blender/blenkernel/BKE_asset_library.hh
A	source/blender/blenkernel/BKE_asset_representation.hh
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/asset_catalog.cc
M	source/blender/blenkernel/intern/asset_library.cc
M	source/blender/blenkernel/intern/asset_library_service.cc
M	source/blender/blenkernel/intern/asset_library_service.hh
M	source/blender/blenkernel/intern/asset_library_service_test.cc
A	source/blender/blenkernel/intern/asset_representation.cc
M	source/blender/editors/space_file/asset_catalog_tree_view.cc
M	source/blender/editors/space_file/file_intern.h
M	source/blender/editors/space_file/filelist.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_asset_library.h b/source/blender/blenkernel/BKE_asset_library.h
index 824bc24203d..e82ebba8d88 100644
--- a/source/blender/blenkernel/BKE_asset_library.h
+++ b/source/blender/blenkernel/BKE_asset_library.h
@@ -24,41 +24,6 @@ typedef struct AssetLibrary AssetLibrary;
  */
 struct AssetLibrary *BKE_asset_library_load(const char *library_path);
 
-/**
- * Try to find an appropriate location for an asset library root from a file or directory path.
- * Does not check if \a input_path exists.
- *
- * The design is made to find an appropriate asset library path from a .blend file path, but
- * technically works with any file or directory as \a input_path.
- * Design is:
- * * If \a input_path lies within a known asset library path (i.e. an asset library registered in
- *   the Preferences), return the asset library path.
- * * Otherwise, if \a input_path has a parent path, return the parent path (e.g. to use the
- *   directory a .blend file is in as asset library root).
- * * If \a input_path is empty or doesn't have a parent path (e.g. because a .blend wasn't saved
- *   yet), there is no suitable path. The caller has to decide how to handle this case.
- *
- * \param r_library_path: The returned asset library path with a trailing slash, or an empty string
- *                        if no suitable path is found. Assumed to be a buffer of at least
- *                        #FILE_MAXDIR bytes.
- *
- * \return True if the function could find a valid, that is, a non-empty path to return in \a
- *         r_library_path.
- */
-bool BKE_asset_library_find_suitable_root_path_from_path(
-    const char *input_path, char r_library_path[768 /* FILE_MAXDIR */]);
-/**
- * Uses the current location on disk of the file represented by \a bmain as input to
- * #BKE_asset_library_find_suitable_root_path_from_path(). Refer to it for a design
- * description.
- *
- * \return True if the function could find a valid, that is, a non-empty path to return in \a
- *         r_library_path. If \a bmain wasn't saved into a file yet, the return value will be
- *         false.
- */
-bool BKE_asset_library_find_suitable_root_path_from_main(
-    const struct Main *bmain, char r_library_path[768 /* FILE_MAXDIR */]);
-
 /** Look up the asset's catalog and copy its simple name into #asset_data. */
 void BKE_asset_library_refresh_catalog_simplename(struct AssetLibrary *asset_library,
                                                   struct AssetMetaData *asset_data);
diff --git a/source/blender/blenkernel/BKE_asset_library.hh b/source/blender/blenkernel/BKE_asset_library.hh
index e0a39e3aee8..fe3ddf805c0 100644
--- a/source/blender/blenkernel/BKE_asset_library.hh
+++ b/source/blender/blenkernel/BKE_asset_library.hh
@@ -10,6 +10,9 @@
 #  error This is a C++-only header file. Use BKE_asset_library.h instead.
 #endif
 
+#include "BLI_string_ref.hh"
+#include "BLI_vector.hh"
+
 #include "BKE_asset_library.h"
 
 #include "BKE_asset_catalog.hh"
@@ -17,23 +20,45 @@
 
 #include <memory>
 
+struct AssetLibraryReference;
+struct Main;
+
 namespace blender::bke {
 
+struct AssetRepresentation;
+
+class AssetStorage {
+  Vector<std::unique_ptr<AssetRepresentation>> assets_;
+
+ public:
+  AssetRepresentation &append(std::unique_ptr<AssetRepresentation> asset);
+};
+
 /**
  * AssetLibrary provides access to an asset library's data.
- * For now this is only for catalogs, later this can be expanded to indexes/caches/more.
+ *
+ * The asset library contains catalogs and storage for asset representations. It could be extended
+ * to also include asset indexes and more.
  */
 struct AssetLibrary {
   /* Controlled by #ED_asset_catalogs_set_save_catalogs_when_file_is_saved,
    * for managing the "Save Catalog Changes" in the quit-confirmation dialog box. */
   static bool save_catalogs_when_file_is_saved;
 
+  /** The directory representing the root of this library. */
+  std::string root_path;
+
   std::unique_ptr<AssetCatalogService> catalog_service;
+  /** Container to store asset representations, managed by whatever manages this library, not by
+   * the library itself. So this really is arbitrary storage as far as #AssetLibrary is concerned
+   * (allowing the API user to manage partial library storage and partial loading, so only relevant
+   * parts of a library are kept in memory). */
+  AssetStorage asset_storage;
 
   AssetLibrary();
   ~AssetLibrary();
 
-  void load(StringRefNull library_root_directory);
+  void load_catalogs(StringRefNull library_root_directory);
 
   /** Load catalogs that have changed on disk. */
   void refresh();
@@ -57,6 +82,43 @@ struct AssetLibrary {
 
 }  // namespace blender::bke
 
+blender::bke::AssetLibrary *BKE_asset_library_load(const Main *bmain,
+                                                   const AssetLibraryReference &library_reference);
+
+/**
+ * Try to find an appropriate location for an asset library root from a file or directory path.
+ * Does not check if \a input_path exists.
+ *
+ * The design is made to find an appropriate asset library path from a .blend file path, but
+ * technically works with any file or directory as \a input_path.
+ * Design is:
+ * * If \a input_path lies within a known asset library path (i.e. an asset library registered in
+ *   the Preferences), return the asset library path.
+ * * Otherwise, if \a input_path has a parent path, return the parent path (e.g. to use the
+ *   directory a .blend file is in as asset library root).
+ * * If \a input_path is empty or doesn't have a parent path (e.g. because a .blend wasn't saved
+ *   yet), there is no suitable path. The caller has to decide how to handle this case.
+ *
+ * \param r_library_path: The returned asset library path with a trailing slash, or an empty string
+ *                        if no suitable path is found. Assumed to be a buffer of at least
+ *                        #FILE_MAXDIR bytes.
+ *
+ * \return True if the function could find a valid, that is, a non-empty path to return in \a
+ *         r_library_path.
+ */
+std::string BKE_asset_library_find_suitable_root_path_from_path(blender::StringRefNull input_path);
+
+/**
+ * Uses the current location on disk of the file represented by \a bmain as input to
+ * #BKE_asset_library_find_suitable_root_path_from_path(). Refer to it for a design
+ * description.
+ *
+ * \return True if the function could find a valid, that is, a non-empty path to return in \a
+ *         r_library_path. If \a bmain wasn't saved into a file yet, the return value will be
+ *         false.
+ */
+std::string BKE_asset_library_find_suitable_root_path_from_main(const struct Main *bmain);
+
 blender::bke::AssetCatalogService *BKE_asset_library_get_catalog_service(
     const ::AssetLibrary *library);
 blender::bke::AssetCatalogTree *BKE_asset_library_get_catalog_tree(const ::AssetLibrary *library);
diff --git a/source/blender/blenkernel/BKE_asset_representation.hh b/source/blender/blenkernel/BKE_asset_representation.hh
new file mode 100644
index 00000000000..74593e20b40
--- /dev/null
+++ b/source/blender/blenkernel/BKE_asset_representation.hh
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/** \file
+ * \ingroup bke
+ */
+
+#pragma once
+
+#include <memory>
+
+struct AssetMetaData;
+struct ID;
+
+namespace blender::bke {
+
+/**
+ * \brief Abstraction to reference an asset, with necessary data for display & interaction.
+ *
+ * #AssetRepresentation is the core data-structure to store information about an asset. It doesn't
+ * contain the asset itself, but information like the metadata and preview, as well as methods to
+ * interact with them. Think of it like a view on an asset.
+ */
+class AssetRepresentation {
+  /** Null if the asset represents a local ID, in which case the ID owns the metadata. */
+  std::unique_ptr<AssetMetaData> metadata_;
+  /** If the asset representation was constructed from a local ID, this points to the editable
+   * asset metadata of the ID. */
+  AssetMetaData *local_id_metadata_; /* Non-owning. */
+
+ public:
+  explicit AssetRepresentation(std::unique_ptr<AssetMetaData> metadata);
+  /** Constructs an asset representation for an ID stored in the current file. This makes the asset
+   * local and fully editable. */
+  explicit AssetRepresentation(ID &id);
+
+  /* TODO this doesn't make sense. Remove this. */
+  explicit AssetRepresentation(AssetMetaData &&metadata);
+
+  AssetMetaData &get_metadata();
+  /** Returns if this asset is stored inside this current file, and as such fully editable. */
+  bool is_local();
+};
+
+}  // namespace blender::bke
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 877407a644c..8c13e2ab96d 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -75,6 +75,7 @@ set(SRC
   intern/asset_catalog_path.cc
   intern/asset_library.cc
   intern/asset_library_service.cc
+  intern/asset_representation.cc
   intern/attribute.cc
   intern/attribute_access.cc
   intern/attribute_math.cc
@@ -322,6 +323,7 @@ set(SRC
   BKE_asset_catalog_path.hh
   BKE_asset_library.h
   BKE_asset_library.hh
+  BKE_asset_representation.hh
   BKE_attribute.h
   BKE_attribute.hh
   BKE_attribute_math.hh
diff --git a/source/blender/blenkernel/intern/asset_catalog.cc b/source/blender/blenkernel/intern/asset_catalog.cc
index f7b14cc3479..e19982155b4 100644
--- a/source/blender/blenkernel/intern/asset_catalog.cc
+++ b/source/blender/blenkernel/intern/asset_catalog.cc
@@ -8,7 +8,7 @@
 #include <set>
 
 #include "BKE_asset_catalog.hh"
-#include "BKE_asset_library.h"
+#include "BKE_asset_library.hh"
 
 #include "BLI_fileops.hh"
 #include "BLI_path_util.h"
@@ -507,14 +507,13 @@ CatalogFilePath AssetCatalogService::find_suitable_cdf_path_for_writing(
                  "catalog definition file should be put");
 
   /* Ask the asset library API for an appropriate location. */
-  char suitable_root_path[PATH_MAX];
-  const bool asset_lib_root_found = BKE_asset_library_find_suitable_root_path_from_path(
-      blend_file_path.c_str(), suitable_root_path);
-  if (asset_lib_root_found) {
+  const std::string suitable_root_path = BKE_asset_library_find_su

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list