Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEthan-Hall <Ethan1080>2022-05-02 13:18:04 +0300
committerJeroen Bakker <jeroen@blender.org>2022-05-02 13:18:23 +0300
commit3d5f5c2d9a5f1c04ea4d8722bfcb78ea7eedfa8b (patch)
treeba1bef22278e195f03f0329e6b98078055d36403
parent38394e1a321ef0d139c0040cbd36c7627276c28e (diff)
Color Attributes: Add initial fill color option
This patch adds allows the user to select the initial fill color when adding a new color attribute layer. --- {F13035372} Reviewed By: JulienKaspar, joeedh Differential Revision: https://developer.blender.org/D14743
-rw-r--r--source/blender/blenkernel/BKE_paint.h15
-rw-r--r--source/blender/editors/geometry/geometry_attributes.cc14
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.cc68
3 files changed, 80 insertions, 17 deletions
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index f0488e84091..0e976f04dd1 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -730,6 +730,21 @@ enum {
SCULPT_MASK_LAYER_CALC_LOOP = (1 << 1),
};
+/* paint_vertex.cc */
+
+/**
+ * Fills the object's active color atribute layer with the fill color.
+ *
+ * \param[in] ob: The object.
+ * \param[in] fill_color: The fill color.
+ * \param[in] only_selected: Limit the fill to selected faces or vertices.
+ *
+ * \return #true if successful.
+ */
+bool BKE_object_attributes_active_color_fill(struct Object *ob,
+ const float fill_color[4],
+ bool only_selected);
+
/* paint_canvas.cc */
/**
diff --git a/source/blender/editors/geometry/geometry_attributes.cc b/source/blender/editors/geometry/geometry_attributes.cc
index 7bba297af8c..05f9e19da71 100644
--- a/source/blender/editors/geometry/geometry_attributes.cc
+++ b/source/blender/editors/geometry/geometry_attributes.cc
@@ -18,6 +18,7 @@
#include "BKE_lib_id.h"
#include "BKE_mesh.h"
#include "BKE_object_deform.h"
+#include "BKE_paint.h"
#include "BKE_report.h"
#include "RNA_access.h"
@@ -221,6 +222,9 @@ static int geometry_color_attribute_add_exec(bContext *C, wmOperator *op)
AttributeDomain domain = (AttributeDomain)RNA_enum_get(op->ptr, "domain");
CustomDataLayer *layer = BKE_id_attribute_new(id, name, type, domain, op->reports);
+ float color[4];
+ RNA_float_get_array(op->ptr, "color", color);
+
if (layer == nullptr) {
return OPERATOR_CANCELLED;
}
@@ -231,6 +235,8 @@ static int geometry_color_attribute_add_exec(bContext *C, wmOperator *op)
BKE_id_attributes_render_color_set(id, layer);
}
+ BKE_object_attributes_active_color_fill(ob, color, false);
+
DEG_id_tag_update(id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GEOM | ND_DATA, id);
@@ -353,6 +359,7 @@ static void geometry_color_attribute_add_ui(bContext *UNUSED(C), wmOperator *op)
uiItemR(layout, op->ptr, "name", 0, nullptr, ICON_NONE);
uiItemR(layout, op->ptr, "domain", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
uiItemR(layout, op->ptr, "data_type", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
+ uiItemR(layout, op->ptr, "color", 0, nullptr, ICON_NONE);
}
void GEOMETRY_OT_color_attribute_add(wmOperatorType *ot)
@@ -399,6 +406,13 @@ void GEOMETRY_OT_color_attribute_add(wmOperatorType *ot)
CD_PROP_COLOR,
"Data Type",
"Type of data stored in attribute");
+
+ static float default_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ prop = RNA_def_float_color(
+ ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color", 0.0f, 1.0f);
+ RNA_def_property_subtype(prop, PROP_COLOR_GAMMA);
+ RNA_def_property_float_array_default(prop, default_color);
}
static int geometry_color_attribute_set_render_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc
index a474767b1a1..747295f3de0 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.cc
+++ b/source/blender/editors/sculpt_paint/paint_vertex.cc
@@ -4144,43 +4144,77 @@ static bool vertex_color_set(Object *ob, ColorPaint4f paintcol_in, Color *color_
return true;
}
-static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op))
+/**
+ * Fills the object's active color atribute layer with the fill color.
+ *
+ * \param[in] ob: The object.
+ * \param[in] fill_color: The fill color.
+ * \param[in] only_selected: Limit the fill to selected faces or vertices.
+ *
+ * \return #true if successful.
+ */
+static bool paint_object_attributes_active_color_fill_ex(Object *ob,
+ ColorPaint4f fill_color,
+ bool only_selected = true)
{
- Scene *scene = CTX_data_scene(C);
- Object *obact = CTX_data_active_object(C);
- Mesh *me = BKE_object_get_original_mesh(obact);
-
- // uint paintcol = vpaint_get_current_color(scene, scene->toolsettings->vpaint, false);
- ColorPaint4f paintcol = vpaint_get_current_col<ColorPaint4f, FloatTraits, ATTR_DOMAIN_POINT>(
- scene, scene->toolsettings->vpaint, false);
-
- bool ok = false;
-
+ Mesh *me = BKE_object_get_original_mesh(ob);
+ if (!me) {
+ return false;
+ }
CustomDataLayer *layer = BKE_id_attributes_active_color_get(&me->id);
+ if (!layer) {
+ return false;
+ }
+ /* Store original #Mesh.editflag.*/
+ const decltype(me->editflag) editflag = me->editflag;
+ if (!only_selected) {
+ me->editflag &= ~ME_EDIT_PAINT_FACE_SEL;
+ me->editflag &= ~ME_EDIT_PAINT_VERT_SEL;
+ }
AttributeDomain domain = BKE_id_attribute_domain(&me->id, layer);
-
+ bool ok = false;
if (domain == ATTR_DOMAIN_POINT) {
if (layer->type == CD_PROP_COLOR) {
ok = vertex_color_set<ColorPaint4f, FloatTraits, ATTR_DOMAIN_POINT>(
- obact, paintcol, static_cast<ColorPaint4f *>(layer->data));
+ ob, fill_color, static_cast<ColorPaint4f *>(layer->data));
}
else if (layer->type == CD_PROP_BYTE_COLOR) {
ok = vertex_color_set<ColorPaint4b, ByteTraits, ATTR_DOMAIN_POINT>(
- obact, paintcol, static_cast<ColorPaint4b *>(layer->data));
+ ob, fill_color, static_cast<ColorPaint4b *>(layer->data));
}
}
else {
if (layer->type == CD_PROP_COLOR) {
ok = vertex_color_set<ColorPaint4f, FloatTraits, ATTR_DOMAIN_CORNER>(
- obact, paintcol, static_cast<ColorPaint4f *>(layer->data));
+ ob, fill_color, static_cast<ColorPaint4f *>(layer->data));
}
else if (layer->type == CD_PROP_BYTE_COLOR) {
ok = vertex_color_set<ColorPaint4b, ByteTraits, ATTR_DOMAIN_CORNER>(
- obact, paintcol, static_cast<ColorPaint4b *>(layer->data));
+ ob, fill_color, static_cast<ColorPaint4b *>(layer->data));
}
}
+ /* Restore #Mesh.editflag. */
+ me->editflag = editflag;
+ return ok;
+}
+
+extern "C" bool BKE_object_attributes_active_color_fill(Object *ob,
+ const float fill_color[4],
+ bool only_selected)
+{
+ return paint_object_attributes_active_color_fill_ex(ob, ColorPaint4f(fill_color), only_selected);
+}
+
+static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *obact = CTX_data_active_object(C);
+
+ // uint paintcol = vpaint_get_current_color(scene, scene->toolsettings->vpaint, false);
+ ColorPaint4f paintcol = vpaint_get_current_col<ColorPaint4f, FloatTraits, ATTR_DOMAIN_POINT>(
+ scene, scene->toolsettings->vpaint, false);
- if (ok) {
+ if (paint_object_attributes_active_color_fill_ex(obact, paintcol)) {
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obact);
return OPERATOR_FINISHED;
}