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]
|
active_library = paths.asset_libraries[active_library_index]
|
||||||
layout.prop(active_library, "path")
|
layout.prop(active_library, "path")
|
||||||
layout.prop(active_library, "import_method", text="Import Method")
|
layout.prop(active_library, "import_method", text="Import Method")
|
||||||
|
layout.prop(active_library, "use_relative_path")
|
||||||
|
|||||||
|
|
||||||
|
|
||||||
class USERPREF_UL_asset_libraries(bpy.types.UIList):
|
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_space_defaults.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_speaker_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_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_vec_defaults.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view3d_defaults.h
|
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view3d_defaults.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_volume_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. */
|
* #import_method_ above, it's just a default. */
|
||||||
bool may_override_import_method_ = false;
|
bool may_override_import_method_ = false;
|
||||||
|
|
||||||
|
bool use_relative_path_ = true;
|
||||||
|
|
||||||
bCallbackFuncStore on_save_callback_store_{};
|
bCallbackFuncStore on_save_callback_store_{};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -88,6 +88,7 @@ class AssetRepresentation {
|
||||||
* #get_import_method(). Also returns true if there is no predefined import method
|
* #get_import_method(). Also returns true if there is no predefined import method
|
||||||
* (when #get_import_method() returns no value). */
|
* (when #get_import_method() returns no value). */
|
||||||
bool may_override_import_method() const;
|
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
|
/** If this asset is stored inside this current file (#is_local_id() is true), this returns the
|
||||||
* ID's pointer, otherwise null. */
|
* ID's pointer, otherwise null. */
|
||||||
ID *local_id() const;
|
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(
|
std::optional<eAssetImportMethod> AS_asset_representation_import_method_get(
|
||||||
const ::AssetRepresentation *asset_handle);
|
const ::AssetRepresentation *asset_handle);
|
||||||
bool AS_asset_representation_may_override_import_method(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);
|
AssetLibrary *library = get_asset_library_on_disk_custom(custom_library->name, root_path);
|
||||||
library->import_method_ = eAssetImportMethod(custom_library->import_method);
|
library->import_method_ = eAssetImportMethod(custom_library->import_method);
|
||||||
library->may_override_import_method_ = true;
|
library->may_override_import_method_ = true;
|
||||||
|
library->use_relative_path_ = (custom_library->flag & ASSET_LIBRARY_RELATIVE_PATH) != 0;
|
||||||
|
|
||||||
return library;
|
return library;
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,14 @@ bool AssetRepresentation::may_override_import_method() const
|
||||||
return owner_asset_library_->may_override_import_method_;
|
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
|
ID *AssetRepresentation::local_id() const
|
||||||
{
|
{
|
||||||
return is_local_id_ ? local_asset_id_ : nullptr;
|
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();
|
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
|
/** \name C-API
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
|
|
||||||
/* Blender file format version. */
|
/* Blender file format version. */
|
||||||
#define BLENDER_FILE_VERSION BLENDER_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
|
/* 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
|
* version. Older Blender versions will test this and show a warning if the file
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "BLT_translation.h"
|
#include "BLT_translation.h"
|
||||||
|
|
||||||
|
#include "DNA_defaults.h"
|
||||||
#include "DNA_userdef_types.h"
|
#include "DNA_userdef_types.h"
|
||||||
|
|
||||||
#define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
|
#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)
|
const char *path)
|
||||||
{
|
{
|
||||||
bUserAssetLibrary *library = MEM_callocN(sizeof(*library), "bUserAssetLibrary");
|
bUserAssetLibrary *library = MEM_callocN(sizeof(*library), "bUserAssetLibrary");
|
||||||
|
memcpy(library, DNA_struct_default_get(bUserAssetLibrary), sizeof(*library));
|
||||||
|
|
||||||
BLI_addtail(&userdef->asset_libraries, library);
|
BLI_addtail(&userdef->asset_libraries, library);
|
||||||
|
|
||||||
|
@ -46,7 +48,6 @@ bUserAssetLibrary *BKE_preferences_asset_library_add(UserDef *userdef,
|
||||||
if (path) {
|
if (path) {
|
||||||
BLI_strncpy(library->path, path, sizeof(library->path));
|
BLI_strncpy(library->path, path, sizeof(library->path));
|
||||||
}
|
}
|
||||||
library->import_method = ASSET_IMPORT_APPEND_REUSE;
|
|
||||||
|
|
||||||
return library;
|
return library;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1349,6 +1349,18 @@ void do_versions_after_linking_300(FileData * /*fd*/, Main *bmain)
|
||||||
FOREACH_NODETREE_END;
|
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.
|
* 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. */
|
/* 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.
|
* 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,
|
/* `1090` for #FILE_MAX_LIBEXTRA,
|
||||||
* rely on warnings to let us know if this gets out of sync. */
|
* rely on warnings to let us know if this gets out of sync. */
|
||||||
char r_full_lib_path[1090]);
|
char r_full_lib_path[1090]);
|
||||||
|
bool ED_asset_handle_get_use_relative_path(const struct AssetHandle *asset);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#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);
|
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,
|
ASSET_IMPORT_APPEND_REUSE = 2,
|
||||||
} eAssetImportMethod;
|
} 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
|
* 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.
|
* '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 */
|
char path[1024]; /* FILE_MAX */
|
||||||
|
|
||||||
short import_method; /* eAssetImportMethod */
|
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;
|
} bUserAssetLibrary;
|
||||||
|
|
||||||
typedef struct SolidLight {
|
typedef struct SolidLight {
|
||||||
|
|
|
@ -132,6 +132,7 @@
|
||||||
#include "DNA_space_defaults.h"
|
#include "DNA_space_defaults.h"
|
||||||
#include "DNA_speaker_defaults.h"
|
#include "DNA_speaker_defaults.h"
|
||||||
#include "DNA_texture_defaults.h"
|
#include "DNA_texture_defaults.h"
|
||||||
|
#include "DNA_userdef_defaults.h"
|
||||||
#include "DNA_volume_defaults.h"
|
#include "DNA_volume_defaults.h"
|
||||||
#include "DNA_world_defaults.h"
|
#include "DNA_world_defaults.h"
|
||||||
|
|
||||||
|
@ -222,6 +223,9 @@ SDNA_DEFAULT_DECL_STRUCT(Speaker);
|
||||||
/* DNA_texture_defaults.h */
|
/* DNA_texture_defaults.h */
|
||||||
SDNA_DEFAULT_DECL_STRUCT(Tex);
|
SDNA_DEFAULT_DECL_STRUCT(Tex);
|
||||||
|
|
||||||
|
/* DNA_userdef_types.h */
|
||||||
|
SDNA_DEFAULT_DECL_STRUCT(bUserAssetLibrary);
|
||||||
|
|
||||||
/* DNA_view3d_defaults.h */
|
/* DNA_view3d_defaults.h */
|
||||||
SDNA_DEFAULT_DECL_STRUCT(View3D);
|
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_SpaceData, UserDef.space_data),
|
||||||
SDNA_DEFAULT_DECL_EX(UserDef_FileSpaceData, UserDef.file_space_data),
|
SDNA_DEFAULT_DECL_EX(UserDef_FileSpaceData, UserDef.file_space_data),
|
||||||
SDNA_DEFAULT_DECL_EX(WalkNavigation, UserDef.walk_navigation),
|
SDNA_DEFAULT_DECL_EX(WalkNavigation, UserDef.walk_navigation),
|
||||||
|
SDNA_DEFAULT_DECL(bUserAssetLibrary),
|
||||||
|
|
||||||
/* DNA_view3d_defaults.h */
|
/* DNA_view3d_defaults.h */
|
||||||
SDNA_DEFAULT_DECL(View3D),
|
SDNA_DEFAULT_DECL(View3D),
|
||||||
|
|
|
@ -6258,6 +6258,13 @@ static void rna_def_userdef_filepaths_asset_library(BlenderRNA *brna)
|
||||||
"Default Import Method",
|
"Default Import Method",
|
||||||
"Determine how the asset will be imported, unless overridden by the Asset Browser");
|
"Determine how the asset will be imported, unless overridden by the Asset Browser");
|
||||||
RNA_def_property_update(prop, 0, "rna_userdef_update");
|
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)
|
static void rna_def_userdef_script_directory(BlenderRNA *brna)
|
||||||
|
|
|
@ -1100,6 +1100,7 @@ typedef struct wmDragAsset {
|
||||||
int id_type;
|
int id_type;
|
||||||
struct AssetMetaData *metadata;
|
struct AssetMetaData *metadata;
|
||||||
int import_method; /* eAssetImportType */
|
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
|
/* FIXME: This is temporary evil solution to get scene/view-layer/etc in the copy callback of the
|
||||||
* #wmDropBox.
|
* #wmDropBox.
|
||||||
|
|
|
@ -572,6 +572,7 @@ wmDragAsset *WM_drag_create_asset_data(const AssetHandle *asset, const char *pat
|
||||||
asset_drag->path = path;
|
asset_drag->path = path;
|
||||||
asset_drag->id_type = ED_asset_handle_get_id_type(asset);
|
asset_drag->id_type = ED_asset_handle_get_id_type(asset);
|
||||||
asset_drag->import_method = import_type;
|
asset_drag->import_method = import_type;
|
||||||
|
asset_drag->use_relative_path = ED_asset_handle_get_use_relative_path(asset);
|
||||||
|
|
||||||
return asset_drag;
|
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);
|
ViewLayer *view_layer = CTX_data_view_layer(asset_drag->evil_C);
|
||||||
View3D *view3d = CTX_wm_view3d(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)) {
|
switch (eAssetImportMethod(asset_drag->import_method)) {
|
||||||
case ASSET_IMPORT_LINK:
|
case ASSET_IMPORT_LINK:
|
||||||
return WM_file_link_datablock(
|
return WM_file_link_datablock(bmain,
|
||||||
bmain, scene, view_layer, view3d, asset_drag->path, idtype, name, flag);
|
scene,
|
||||||
|
view_layer,
|
||||||
|
view3d,
|
||||||
|
asset_drag->path,
|
||||||
|
idtype,
|
||||||
|
name,
|
||||||
|
flag | (use_relative_path ? FILE_RELPATH : 0));
|
||||||
case ASSET_IMPORT_APPEND:
|
case ASSET_IMPORT_APPEND:
|
||||||
return WM_file_append_datablock(bmain,
|
return WM_file_append_datablock(bmain,
|
||||||
scene,
|
scene,
|
||||||
|
@ -640,16 +649,16 @@ ID *WM_drag_asset_id_import(wmDragAsset *asset_drag, const int flag_extra)
|
||||||
flag | BLO_LIBLINK_APPEND_RECURSIVE |
|
flag | BLO_LIBLINK_APPEND_RECURSIVE |
|
||||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR);
|
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR);
|
||||||
case ASSET_IMPORT_APPEND_REUSE:
|
case ASSET_IMPORT_APPEND_REUSE:
|
||||||
return WM_file_append_datablock(G_MAIN,
|
return WM_file_append_datablock(
|
||||||
scene,
|
G_MAIN,
|
||||||
view_layer,
|
scene,
|
||||||
view3d,
|
view_layer,
|
||||||
asset_drag->path,
|
view3d,
|
||||||
idtype,
|
asset_drag->path,
|
||||||
name,
|
idtype,
|
||||||
flag | BLO_LIBLINK_APPEND_RECURSIVE |
|
name,
|
||||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
flag | BLO_LIBLINK_APPEND_RECURSIVE | BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||||
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE);
|
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE | (use_relative_path ? FILE_RELPATH : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_assert_unreachable();
|
BLI_assert_unreachable();
|
||||||
|
|
Loading…
Reference in New Issue
Would just always show it, in case Append (Reuse Data) is used.