WIP: Brush assets project #106303

Draft
Julian Eisel wants to merge 351 commits from brush-assets-project into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
6 changed files with 25 additions and 33 deletions
Showing only changes of commit d616f2a3ea - Show all commits

View File

@ -33,7 +33,7 @@ void BKE_brush_system_exit();
/* TODO: Should be somewhere else not specific to brushes. */
Brush *BKE_brush_asset_runtime_ensure(Main *bmain,
const AssetWeakReference *brush_asset_reference);
const AssetWeakReference &brush_asset_reference);
/* Data-block functions. */

View File

@ -218,7 +218,7 @@ bool BKE_paint_brush_is_valid_asset(const Brush *brush);
*/
bool BKE_paint_brush_asset_set(Paint *paint,
Brush *brush,
AssetWeakReference *weak_asset_reference);
const AssetWeakReference &weak_asset_reference);
/**
* Get the active brush of given paint struct, together with its weak asset reference.

View File

@ -526,15 +526,13 @@ static void brush_defaults(Brush *brush)
#undef FROM_DEFAULT_PTR
}
Brush *BKE_brush_asset_runtime_ensure(Main *bmain, const AssetWeakReference *brush_asset_reference)
Brush *BKE_brush_asset_runtime_ensure(Main *bmain, const AssetWeakReference &brush_asset_reference)
{
BLI_assert(brush_asset_reference != nullptr);
char asset_full_path_buffer[FILE_MAX_LIBEXTRA];
char *asset_lib_path, *asset_group, *asset_name;
AS_asset_full_path_explode_from_weak_ref(
brush_asset_reference, asset_full_path_buffer, &asset_lib_path, &asset_group, &asset_name);
&brush_asset_reference, asset_full_path_buffer, &asset_lib_path, &asset_group, &asset_name);
if (asset_lib_path == nullptr && asset_group == nullptr && asset_name == nullptr) {
return nullptr;

View File

@ -685,30 +685,26 @@ bool BKE_paint_brush_is_valid_asset(const Brush *brush)
static void paint_brush_asset_update(Paint &paint,
Brush *brush,
AssetWeakReference *brush_asset_reference)
const AssetWeakReference &brush_asset_reference)
{
if (paint.brush_asset_reference != nullptr) {
BKE_asset_weak_reference_free(&paint.brush_asset_reference);
}
MEM_delete(paint.brush_asset_reference);
if (brush == nullptr || brush != paint.brush || !ID_IS_OVERRIDE_LIBRARY_REAL(paint.brush) ||
!(ID_IS_ASSET(paint.brush) || ID_IS_ASSET(paint.brush->id.override_library->reference)))
{
BKE_asset_weak_reference_free(&brush_asset_reference);
return;
}
paint.brush_asset_reference = brush_asset_reference;
paint.brush_asset_reference = MEM_new<AssetWeakReference>(__func__, brush_asset_reference);
}
bool BKE_paint_brush_asset_set(Paint *paint,
Brush *brush,
AssetWeakReference *weak_asset_reference)
const AssetWeakReference &weak_asset_reference)
{
/* Should not happen for users if brush assets are properly filtered by mode, but still protect
* against it in case of invalid API usage. */
if (brush && paint->runtime.ob_mode != brush->ob_mode) {
BKE_asset_weak_reference_free(&weak_asset_reference);
return false;
}
@ -742,14 +738,14 @@ void BKE_paint_brush_asset_restore(Main *bmain, Paint *paint)
return;
}
AssetWeakReference *brush_asset_reference = paint->brush_asset_reference;
paint->brush_asset_reference = nullptr;
AssetWeakReference weak_ref = std::move(*paint->brush_asset_reference);
MEM_delete(paint->brush_asset_reference);
Brush *brush_asset = BKE_brush_asset_runtime_ensure(bmain, brush_asset_reference);
Brush *brush_asset = BKE_brush_asset_runtime_ensure(bmain, weak_ref);
/* Will either re-assign the brush_asset_reference to `paint`, or free it if loading a brush ID
* from it failed. */
BKE_paint_brush_asset_set(paint, brush_asset, brush_asset_reference);
BKE_paint_brush_asset_set(paint, brush_asset, weak_ref);
}
void BKE_paint_runtime_init(const ToolSettings *ts, Paint *paint)
@ -1290,9 +1286,7 @@ void BKE_paint_free(Paint *paint)
{
BKE_curvemapping_free(paint->cavity_curve);
MEM_SAFE_FREE(paint->tool_slots);
if (paint->brush_asset_reference != nullptr) {
BKE_asset_weak_reference_free(&paint->brush_asset_reference);
}
MEM_delete(paint->brush_asset_reference);
}
void BKE_paint_copy(const Paint *src, Paint *tar, const int flag)

View File

@ -102,7 +102,7 @@ AssetView::AssetView(const AssetLibraryReference &library_ref, const AssetShelf
AssetView::~AssetView()
{
BKE_asset_weak_reference_free(&active_asset_);
MEM_delete(active_asset_);
}
void AssetView::build_items()
@ -235,10 +235,9 @@ std::optional<bool> AssetViewItem::should_be_active() const
return false;
}
const asset_system::AssetRepresentation *asset = handle_get_representation(&asset_);
AssetWeakReference *weak_ref = asset->make_weak_reference();
const bool matches = *asset_view.active_asset_ == *weak_ref;
AssetWeakReference weak_ref = asset->make_weak_reference();
const bool matches = *asset_view.active_asset_ == weak_ref;
BKE_asset_weak_reference_free(&weak_ref);
return matches;
}

View File

@ -1002,7 +1002,7 @@ static int brush_asset_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
AssetWeakReference *brush_asset_reference = asset->make_weak_reference();
AssetWeakReference brush_asset_reference = asset->make_weak_reference();
Brush *brush = BKE_brush_asset_runtime_ensure(CTX_data_main(C), brush_asset_reference);
Paint *paint = BKE_paint_get_active_from_context(C);
@ -1034,18 +1034,19 @@ static void BRUSH_OT_asset_select(wmOperatorType *ot)
/* FIXME Quick dirty hack to generate a weak ref from 'raw' paths.
* This needs to be properly implemented in assetlib code.
*/
static AssetWeakReference *brush_asset_create_weakref_hack(const bUserAssetLibrary *user_asset_lib,
std::string &file_path)
static AssetWeakReference brush_asset_create_weakref_hack(const bUserAssetLibrary *user_asset_lib,
std::string &file_path)
{
AssetWeakReference *asset_weak_ref = MEM_new<AssetWeakReference>(__func__);
AssetWeakReference asset_weak_ref{};
StringRef asset_root_path = user_asset_lib->dirpath;
BLI_assert(file_path.find(asset_root_path) == 0);
std::string relative_asset_path = file_path.substr(size_t(asset_root_path.size()) + 1);
asset_weak_ref->asset_library_type = ASSET_LIBRARY_CUSTOM;
asset_weak_ref->asset_library_identifier = BLI_strdup(user_asset_lib->name);
asset_weak_ref->relative_asset_identifier = BLI_strdup(relative_asset_path.c_str());
asset_weak_ref.asset_library_type = ASSET_LIBRARY_CUSTOM;
asset_weak_ref.asset_library_identifier = BLI_strdup(user_asset_lib->name);
asset_weak_ref.relative_asset_identifier = BLI_strdupn(relative_asset_path.c_str(),
relative_asset_path.size());
return asset_weak_ref;
}
@ -1302,7 +1303,7 @@ static int brush_asset_save_as_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
AssetWeakReference *new_brush_weak_ref = brush_asset_create_weakref_hack(
AssetWeakReference new_brush_weak_ref = brush_asset_create_weakref_hack(
user_library, final_full_asset_filepath);
/* TODO: maybe not needed, even less so if there is more visual confirmation of change. */