Suport relative path option per-asset library #107345
|
@ -1491,6 +1491,7 @@ class USERPREF_PT_file_paths_asset_libraries(FilePathsPanel, Panel):
|
|||
active_library = paths.asset_libraries[active_library_index]
|
||||
layout.prop(active_library, "path")
|
||||
layout.prop(active_library, "import_method", text="Import Method")
|
||||
layout.prop(active_library, "use_relative_path")
|
||||
|
||||
|
||||
|
||||
class USERPREF_UL_asset_libraries(bpy.types.UIList):
|
||||
|
|
|
@ -120,6 +120,7 @@ set(SRC_DNA_DEFAULTS_INC
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_space_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_speaker_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_texture_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_userdef_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_vec_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view3d_defaults.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_volume_defaults.h
|
||||
|
|
|
@ -67,6 +67,8 @@ class AssetLibrary {
|
|||
* #import_method_ above, it's just a default. */
|
||||
bool may_override_import_method_ = false;
|
||||
|
||||
bool use_relative_path_ = true;
|
||||
|
||||
bCallbackFuncStore on_save_callback_store_{};
|
||||
|
||||
public:
|
||||
|
|
|
@ -88,6 +88,7 @@ class AssetRepresentation {
|
|||
* #get_import_method(). Also returns true if there is no predefined import method
|
||||
* (when #get_import_method() returns no value). */
|
||||
bool may_override_import_method() const;
|
||||
bool get_use_relative_path() const;
|
||||
/** If this asset is stored inside this current file (#is_local_id() is true), this returns the
|
||||
* ID's pointer, otherwise null. */
|
||||
ID *local_id() const;
|
||||
|
@ -109,3 +110,4 @@ std::string AS_asset_representation_full_library_path_get(const ::AssetRepresent
|
|||
std::optional<eAssetImportMethod> AS_asset_representation_import_method_get(
|
||||
const ::AssetRepresentation *asset_handle);
|
||||
bool AS_asset_representation_may_override_import_method(const ::AssetRepresentation *asset_handle);
|
||||
bool AS_asset_representation_use_relative_path_get(const ::AssetRepresentation *asset_handle);
|
||||
|
|
|
@ -101,6 +101,7 @@ AssetLibrary *AssetLibraryService::get_asset_library(
|
|||
AssetLibrary *library = get_asset_library_on_disk_custom(custom_library->name, root_path);
|
||||
library->import_method_ = eAssetImportMethod(custom_library->import_method);
|
||||
library->may_override_import_method_ = true;
|
||||
library->use_relative_path_ = (custom_library->flag & ASSET_LIBRARY_RELATIVE_PATH) != 0;
|
||||
|
||||
return library;
|
||||
}
|
||||
|
|
|
@ -106,6 +106,14 @@ bool AssetRepresentation::may_override_import_method() const
|
|||
return owner_asset_library_->may_override_import_method_;
|
||||
}
|
||||
|
||||
bool AssetRepresentation::get_use_relative_path() const
|
||||
{
|
||||
if (!owner_asset_library_) {
|
||||
return false;
|
||||
}
|
||||
return owner_asset_library_->use_relative_path_;
|
||||
}
|
||||
|
||||
ID *AssetRepresentation::local_id() const
|
||||
{
|
||||
return is_local_id_ ? local_asset_id_ : nullptr;
|
||||
|
@ -155,6 +163,13 @@ bool AS_asset_representation_may_override_import_method(const AssetRepresentatio
|
|||
return asset->may_override_import_method();
|
||||
}
|
||||
|
||||
bool AS_asset_representation_use_relative_path_get(const AssetRepresentation *asset_handle)
|
||||
{
|
||||
const asset_system::AssetRepresentation *asset =
|
||||
reinterpret_cast<const asset_system::AssetRepresentation *>(asset_handle);
|
||||
return asset->get_use_relative_path();
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
/** \name C-API
|
||||
* \{ */
|
||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
|||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 5
|
||||
#define BLENDER_FILE_SUBVERSION 6
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "BLT_translation.h"
|
||||
|
||||
#include "DNA_defaults.h"
|
||||
#include "DNA_userdef_types.h"
|
||||
|
||||
#define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
|
||||
|
@ -37,6 +38,7 @@ bUserAssetLibrary *BKE_preferences_asset_library_add(UserDef *userdef,
|
|||
const char *path)
|
||||
{
|
||||
bUserAssetLibrary *library = MEM_callocN(sizeof(*library), "bUserAssetLibrary");
|
||||
memcpy(library, DNA_struct_default_get(bUserAssetLibrary), sizeof(*library));
|
||||
|
||||
BLI_addtail(&userdef->asset_libraries, library);
|
||||
|
||||
|
@ -46,7 +48,6 @@ bUserAssetLibrary *BKE_preferences_asset_library_add(UserDef *userdef,
|
|||
if (path) {
|
||||
BLI_strncpy(library->path, path, sizeof(library->path));
|
||||
}
|
||||
library->import_method = ASSET_IMPORT_APPEND_REUSE;
|
||||
|
||||
return library;
|
||||
}
|
||||
|
|
|
@ -1349,6 +1349,18 @@ void do_versions_after_linking_300(FileData * /*fd*/, Main *bmain)
|
|||
FOREACH_NODETREE_END;
|
||||
}
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(bmain, 306, 6)) {
|
||||
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
if (ed == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SEQ_for_each_callback(
|
||||
&scene->ed->seqbase, do_versions_sequencer_init_retiming_tool_data, scene);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Versioning code until next subversion bump goes here.
|
||||
*
|
||||
|
@ -1361,16 +1373,6 @@ void do_versions_after_linking_300(FileData * /*fd*/, Main *bmain)
|
|||
*/
|
||||
{
|
||||
/* Keep this block, even when empty. */
|
||||
|
||||
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
|
||||
Editing *ed = SEQ_editing_get(scene);
|
||||
if (ed == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SEQ_for_each_callback(
|
||||
&scene->ed->seqbase, do_versions_sequencer_init_retiming_tool_data, scene);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -813,6 +813,12 @@ void blo_do_versions_userdef(UserDef *userdef)
|
|||
}
|
||||
}
|
||||
|
||||
if (!USER_VERSION_ATLEAST(306, 6)) {
|
||||
LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
|
||||
asset_library->flag |= ASSET_LIBRARY_RELATIVE_PATH;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Versioning code until next subversion bump goes here.
|
||||
*
|
||||
|
|
|
@ -32,6 +32,7 @@ void ED_asset_handle_get_full_library_path(
|
|||
/* `1090` for #FILE_MAX_LIBEXTRA,
|
||||
* rely on warnings to let us know if this gets out of sync. */
|
||||
char r_full_lib_path[1090]);
|
||||
bool ED_asset_handle_get_use_relative_path(const struct AssetHandle *asset);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -68,3 +68,8 @@ void ED_asset_handle_get_full_library_path(const AssetHandle *asset_handle,
|
|||
|
||||
BLI_strncpy(r_full_lib_path, library_path.c_str(), FILE_MAX);
|
||||
}
|
||||
|
||||
bool ED_asset_handle_get_use_relative_path(const AssetHandle *asset)
|
||||
{
|
||||
return AS_asset_representation_use_relative_path_get(asset->file_data->asset);
|
||||
}
|
||||
|
|
|
@ -126,6 +126,11 @@ typedef enum eAssetImportMethod {
|
|||
ASSET_IMPORT_APPEND_REUSE = 2,
|
||||
} eAssetImportMethod;
|
||||
|
||||
|
||||
typedef enum eAssetLibrary_Flag {
|
||||
ASSET_LIBRARY_RELATIVE_PATH = (1 << 0),
|
||||
} eAssetLibrary_Flag;
|
||||
Julian Eisel
commented
`eAssetLibrary_Flag`
|
||||
|
||||
/**
|
||||
* Information to identify an asset library. May be either one of the predefined types (current
|
||||
* 'Main', builtin library, project library), or a custom type as defined in the Preferences.
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
/** \file
|
||||
* \ingroup DNA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "DNA_asset_types.h"
|
||||
|
||||
/* Struct members on own line. */
|
||||
/* clang-format off */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name bUserAssetLibrary Struct
|
||||
* \{ */
|
||||
|
||||
#define _DNA_DEFAULT_bUserAssetLibrary \
|
||||
{ \
|
||||
.import_method = ASSET_IMPORT_APPEND_REUSE, \
|
||||
.flag = ASSET_LIBRARY_RELATIVE_PATH, \
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* clang-format off */
|
||||
|
||||
/** \} */
|
|
@ -593,7 +593,8 @@ typedef struct bUserAssetLibrary {
|
|||
char path[1024]; /* FILE_MAX */
|
||||
|
||||
short import_method; /* eAssetImportMethod */
|
||||
char _pad0[6];
|
||||
short flag; /* eAssetLibrary_Flag */
|
||||
Julian Eisel
commented
`short` because we might run out of bits quickly (people add flags without checking the type, esp. for small enums).
|
||||
char _pad0[4];
|
||||
} bUserAssetLibrary;
|
||||
|
||||
typedef struct SolidLight {
|
||||
|
|
|
@ -132,6 +132,7 @@
|
|||
#include "DNA_space_defaults.h"
|
||||
#include "DNA_speaker_defaults.h"
|
||||
#include "DNA_texture_defaults.h"
|
||||
#include "DNA_userdef_defaults.h"
|
||||
#include "DNA_volume_defaults.h"
|
||||
#include "DNA_world_defaults.h"
|
||||
|
||||
|
@ -222,6 +223,9 @@ SDNA_DEFAULT_DECL_STRUCT(Speaker);
|
|||
/* DNA_texture_defaults.h */
|
||||
SDNA_DEFAULT_DECL_STRUCT(Tex);
|
||||
|
||||
/* DNA_userdef_types.h */
|
||||
SDNA_DEFAULT_DECL_STRUCT(bUserAssetLibrary);
|
||||
|
||||
/* DNA_view3d_defaults.h */
|
||||
SDNA_DEFAULT_DECL_STRUCT(View3D);
|
||||
|
||||
|
@ -461,6 +465,7 @@ const void *DNA_default_table[SDNA_TYPE_MAX] = {
|
|||
SDNA_DEFAULT_DECL_EX(UserDef_SpaceData, UserDef.space_data),
|
||||
SDNA_DEFAULT_DECL_EX(UserDef_FileSpaceData, UserDef.file_space_data),
|
||||
SDNA_DEFAULT_DECL_EX(WalkNavigation, UserDef.walk_navigation),
|
||||
SDNA_DEFAULT_DECL(bUserAssetLibrary),
|
||||
|
||||
/* DNA_view3d_defaults.h */
|
||||
SDNA_DEFAULT_DECL(View3D),
|
||||
|
|
|
@ -6258,6 +6258,13 @@ static void rna_def_userdef_filepaths_asset_library(BlenderRNA *brna)
|
|||
"Default Import Method",
|
||||
"Determine how the asset will be imported, unless overridden by the Asset Browser");
|
||||
RNA_def_property_update(prop, 0, "rna_userdef_update");
|
||||
|
||||
prop = RNA_def_property(srna, "use_relative_path", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", ASSET_LIBRARY_RELATIVE_PATH);
|
||||
RNA_def_property_ui_text(
|
||||
prop,
|
||||
"Relative Path",
|
||||
"Use relative path when linking assets from this asset library");
|
||||
}
|
||||
|
||||
static void rna_def_userdef_script_directory(BlenderRNA *brna)
|
||||
|
|
|
@ -1100,6 +1100,7 @@ typedef struct wmDragAsset {
|
|||
int id_type;
|
||||
struct AssetMetaData *metadata;
|
||||
int import_method; /* eAssetImportType */
|
||||
bool use_relative_path;
|
||||
|
||||
/* FIXME: This is temporary evil solution to get scene/view-layer/etc in the copy callback of the
|
||||
* #wmDropBox.
|
||||
|
|
|
@ -572,6 +572,7 @@ wmDragAsset *WM_drag_create_asset_data(const AssetHandle *asset, const char *pat
|
|||
asset_drag->path = path;
|
||||
asset_drag->id_type = ED_asset_handle_get_id_type(asset);
|
||||
asset_drag->import_method = import_type;
|
||||
asset_drag->use_relative_path = ED_asset_handle_get_use_relative_path(asset);
|
||||
|
||||
return asset_drag;
|
||||
}
|
||||
|
@ -625,10 +626,18 @@ ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, const int flag_extra)
|
|||
ViewLayer *view_layer = CTX_data_view_layer(asset_drag->evil_C);
|
||||
View3D *view3d = CTX_wm_view3d(asset_drag->evil_C);
|
||||
|
||||
const bool use_relative_path = asset_drag->use_relative_path;
|
||||
|
||||
switch (eAssetImportMethod(asset_drag->import_method)) {
|
||||
case ASSET_IMPORT_LINK:
|
||||
return WM_file_link_datablock(
|
||||
bmain, scene, view_layer, view3d, asset_drag->path, idtype, name, flag);
|
||||
return WM_file_link_datablock(bmain,
|
||||
scene,
|
||||
view_layer,
|
||||
view3d,
|
||||
asset_drag->path,
|
||||
idtype,
|
||||
name,
|
||||
flag | (use_relative_path ? FILE_RELPATH : 0));
|
||||
case ASSET_IMPORT_APPEND:
|
||||
return WM_file_append_datablock(bmain,
|
||||
scene,
|
||||
|
@ -640,16 +649,16 @@ ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, const int flag_extra)
|
|||
flag | BLO_LIBLINK_APPEND_RECURSIVE |
|
||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR);
|
||||
case ASSET_IMPORT_APPEND_REUSE:
|
||||
return WM_file_append_datablock(G_MAIN,
|
||||
scene,
|
||||
view_layer,
|
||||
view3d,
|
||||
asset_drag->path,
|
||||
idtype,
|
||||
name,
|
||||
flag | BLO_LIBLINK_APPEND_RECURSIVE |
|
||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE);
|
||||
return WM_file_append_datablock(
|
||||
G_MAIN,
|
||||
scene,
|
||||
view_layer,
|
||||
view3d,
|
||||
asset_drag->path,
|
||||
idtype,
|
||||
name,
|
||||
flag | BLO_LIBLINK_APPEND_RECURSIVE | BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE | (use_relative_path ? FILE_RELPATH : 0));
|
||||
}
|
||||
|
||||
BLI_assert_unreachable();
|
||||
|
|
Loading…
Reference in New Issue
Would just always show it, in case Append (Reuse Data) is used.