Sculpt/paint: Write brush types to brush asset metadata

This way we can query the brush types, e.g. to filter out eraser brushes
in the brush asset selector while the eraser tool is selected, see
https://projects.blender.org/blender/blender/issues/126032.

Technically a brush may have different brush types depending on the
mode. So we store a type for all supported modes.

Ideally the name of the custom metadata property would match the name of the
properties in RNA. They will match after #126796, the names here are the new
ones, to avoid having to version asset metadata.

Pull Request: https://projects.blender.org/blender/blender/pulls/124618
This commit is contained in:
Julian Eisel
2024-08-30 17:00:10 +02:00
committed by Julian Eisel
parent ba28469e45
commit 3386761411
3 changed files with 53 additions and 13 deletions

View File

@@ -197,6 +197,8 @@ bool BKE_paint_ensure_from_paintmode(Main *bmain, Scene *sce, PaintMode mode);
Paint *BKE_paint_get_active_from_paintmode(Scene *sce, PaintMode mode);
const EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(PaintMode mode);
uint BKE_paint_get_brush_tool_offset_from_paintmode(PaintMode mode);
std::optional<int> BKE_paint_get_brush_tool_from_obmode(const Brush *brush,
const eObjectMode ob_mode);
Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer);
Paint *BKE_paint_get_active_from_context(const bContext *C);
PaintMode BKE_paintmode_get_active_from_context(const bContext *C);

View File

@@ -393,27 +393,37 @@ static void brush_asset_metadata_ensure(void *asset_ptr, AssetMetaData *asset_da
/* Most names copied from brush RNA (not all are available there though). */
constexpr std::array mode_map{
std::pair{"use_paint_sculpt", OB_MODE_SCULPT},
std::pair{"use_paint_vertex", OB_MODE_VERTEX_PAINT},
std::pair{"use_paint_weight", OB_MODE_WEIGHT_PAINT},
std::pair{"use_paint_image", OB_MODE_TEXTURE_PAINT},
std::tuple{"use_paint_sculpt", OB_MODE_SCULPT, "sculpt_brush_type"},
std::tuple{"use_paint_vertex", OB_MODE_VERTEX_PAINT, "vertex_brush_type"},
std::tuple{"use_paint_weight", OB_MODE_WEIGHT_PAINT, "weight_brush_type"},
std::tuple{"use_paint_image", OB_MODE_TEXTURE_PAINT, "image_brush_type"},
/* Sculpt UVs in the image editor while in edit mode. */
std::pair{"use_paint_uv_sculpt", OB_MODE_EDIT},
std::pair{"use_paint_grease_pencil", OB_MODE_PAINT_GPENCIL_LEGACY},
std::tuple{"use_paint_uv_sculpt", OB_MODE_EDIT, "image_brush_type"},
std::tuple{"use_paint_grease_pencil", OB_MODE_PAINT_GPENCIL_LEGACY, "gpencil_brush_type"},
/* Note: Not defined in brush RNA, own name. */
std::pair{"use_sculpt_grease_pencil", OB_MODE_SCULPT_GPENCIL_LEGACY},
std::pair{"use_vertex_grease_pencil", OB_MODE_VERTEX_GPENCIL_LEGACY},
std::pair{"use_weight_grease_pencil", OB_MODE_WEIGHT_GPENCIL_LEGACY},
std::pair{"use_paint_sculpt_curves", OB_MODE_SCULPT_CURVES},
std::tuple{
"use_sculpt_grease_pencil", OB_MODE_SCULPT_GPENCIL_LEGACY, "gpencil_sculpt_brush_type"},
std::tuple{
"use_vertex_grease_pencil", OB_MODE_VERTEX_GPENCIL_LEGACY, "gpencil_vertex_brush_type"},
std::tuple{"use_weight_gpencil", OB_MODE_WEIGHT_GPENCIL_LEGACY, "gpencil_weight_brush_type"},
std::tuple{"use_paint_sculpt_curves", OB_MODE_SCULPT_CURVES, "curves_sculpt_brush_type"},
};
for (const auto &mode_mapping : mode_map) {
for (const auto &[prop_name, mode, tool_prop_name] : mode_map) {
/* Only add bools for supported modes. */
if (!(brush->ob_mode & mode_mapping.second)) {
if (!(brush->ob_mode & mode)) {
continue;
}
auto mode_property = idprop::create_bool(mode_mapping.first, true);
auto mode_property = idprop::create_bool(prop_name, true);
BKE_asset_metadata_idprop_ensure(asset_data, mode_property.release());
if (std::optional<int> brush_tool = BKE_paint_get_brush_tool_from_obmode(brush, mode)) {
auto type_property = idprop::create(tool_prop_name, *brush_tool);
BKE_asset_metadata_idprop_ensure(asset_data, type_property.release());
}
else {
BLI_assert_unreachable();
}
}
}

View File

@@ -977,6 +977,34 @@ uint BKE_paint_get_brush_tool_offset_from_paintmode(const PaintMode mode)
return 0;
}
std::optional<int> BKE_paint_get_brush_tool_from_obmode(const Brush *brush,
const eObjectMode ob_mode)
{
switch (ob_mode) {
case OB_MODE_TEXTURE_PAINT:
case OB_MODE_EDIT:
return brush->imagepaint_tool;
case OB_MODE_SCULPT:
return brush->sculpt_tool;
case OB_MODE_VERTEX_PAINT:
return brush->vertexpaint_tool;
case OB_MODE_WEIGHT_PAINT:
return brush->weightpaint_tool;
case OB_MODE_PAINT_GPENCIL_LEGACY:
return brush->gpencil_tool;
case OB_MODE_VERTEX_GPENCIL_LEGACY:
return brush->gpencil_vertex_tool;
case OB_MODE_SCULPT_GPENCIL_LEGACY:
return brush->gpencil_sculpt_tool;
case OB_MODE_WEIGHT_GPENCIL_LEGACY:
return brush->gpencil_weight_tool;
case OB_MODE_SCULPT_CURVES:
return brush->curves_sculpt_tool;
default:
return {};
}
}
PaintCurve *BKE_paint_curve_add(Main *bmain, const char *name)
{
PaintCurve *pc = static_cast<PaintCurve *>(BKE_id_new(bmain, ID_PC, name));