[Bf-blender-cvs] [3bd3bc71227] temp-T96709-painting-target: Switching canvas sources.
Jeroen Bakker
noreply at git.blender.org
Mon Mar 28 13:50:47 CEST 2022
Commit: 3bd3bc71227dbb3b21fd71df78a58aad8ef4e5b0
Author: Jeroen Bakker
Date: Mon Mar 28 13:50:41 2022 +0200
Branches: temp-T96709-painting-target
https://developer.blender.org/rB3bd3bc71227dbb3b21fd71df78a58aad8ef4e5b0
Switching canvas sources.
===================================================================
M source/blender/editors/include/ED_paint.h
M source/blender/editors/sculpt_paint/CMakeLists.txt
R084 source/blender/editors/sculpt_paint/paint_canvas_material.cc source/blender/editors/sculpt_paint/paint_canvas.cc
M source/blender/makesrna/intern/rna_object.c
M source/blender/makesrna/intern/rna_sculpt_paint.c
===================================================================
diff --git a/source/blender/editors/include/ED_paint.h b/source/blender/editors/include/ED_paint.h
index 23f4b8e2c25..e1a42ee5162 100644
--- a/source/blender/editors/include/ED_paint.h
+++ b/source/blender/editors/include/ED_paint.h
@@ -111,12 +111,16 @@ void ED_paintcurve_undo_push_end(struct bContext *C);
/** Export for ED_undo_sys. */
void ED_paintcurve_undosys_type(struct UndoType *ut);
-/* paint_canvas_material.cc */
+/* paint_canvas.cc */
int ED_paint_canvas_material_get(struct Object *ob);
void ED_paint_canvas_material_set(struct Object *ob, int new_value);
void ED_paint_canvas_material_itemf(struct Object *ob,
struct EnumPropertyItem **r_items,
int *r_totitem);
+struct Image *ED_paint_canvas_image_get(const struct PaintModeSettings *settings,
+ struct Object *ob);
+int ED_paint_canvas_uvmap_layer_index_get(const struct PaintModeSettings *settings,
+ struct Object *ob);
/** Color type of an object can be overridden in sculpt/paint mode. */
eV3DShadingColorType ED_paint_draw_color_override(const struct PaintModeSettings *settings,
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt
index 503664d57de..520ed57e0de 100644
--- a/source/blender/editors/sculpt_paint/CMakeLists.txt
+++ b/source/blender/editors/sculpt_paint/CMakeLists.txt
@@ -32,7 +32,7 @@ set(SRC
curves_sculpt_delete.cc
curves_sculpt_ops.cc
curves_sculpt_snake_hook.cc
- paint_canvas_material.cc
+ paint_canvas.cc
paint_cursor.c
paint_curve.c
paint_curve_undo.c
diff --git a/source/blender/editors/sculpt_paint/paint_canvas_material.cc b/source/blender/editors/sculpt_paint/paint_canvas.cc
similarity index 84%
rename from source/blender/editors/sculpt_paint/paint_canvas_material.cc
rename to source/blender/editors/sculpt_paint/paint_canvas.cc
index da2cbd7b8cc..8c33052a72e 100644
--- a/source/blender/editors/sculpt_paint/paint_canvas_material.cc
+++ b/source/blender/editors/sculpt_paint/paint_canvas.cc
@@ -174,6 +174,15 @@ struct MaterialCanvas {
return V3D_SHADING_MATERIAL_COLOR;
}
+ Image *image() const
+ {
+ switch (node->type) {
+ case SH_NODE_TEX_IMAGE:
+ return static_cast<Image *>(static_cast<void *>(node->id));
+ }
+ return nullptr;
+ }
+
static bool supports(const Object *ob, bNode *node)
{
switch (node->type) {
@@ -223,16 +232,6 @@ struct MaterialCanvases {
}
return std::nullopt;
}
-
- std::optional<MaterialCanvas> active()
- {
- for (const MaterialCanvas &item : items) {
- if ((item.node->flag & NODE_ACTIVE) != 0) {
- return item;
- }
- }
- return std::nullopt;
- }
};
struct MaterialWrapper {
@@ -362,6 +361,15 @@ static std::optional<MaterialWrapper> get_active_material(Object *ob)
return get_material_in_slot(ob, material_slot);
}
+static std::optional<MaterialCanvas> get_active_canvas(Object *ob)
+{
+ std::optional<MaterialWrapper> material = get_active_material(ob);
+ if (!material.has_value()) {
+ return std::nullopt;
+ }
+ return material->active_canvas(ob);
+}
+
} // namespace blender::ed::sculpt_paint::canvas
extern "C" {
@@ -371,15 +379,11 @@ using namespace blender::ed::sculpt_paint::canvas;
int ED_paint_canvas_material_get(Object *ob)
{
- std::optional<MaterialWrapper> material = get_active_material(ob);
- if (!material.has_value()) {
- return 0;
- }
- std::optional<MaterialCanvas> resource = material->canvases(ob).active();
- if (!resource.has_value()) {
+ std::optional<MaterialCanvas> canvas = get_active_canvas(ob);
+ if (!canvas.has_value()) {
return 0;
}
- return resource->rna_enum_item.value;
+ return canvas->rna_enum_item.value;
}
void ED_paint_canvas_material_set(Object *ob, int new_value)
@@ -428,11 +432,7 @@ eV3DShadingColorType ED_paint_draw_color_override(const PaintModeSettings *setti
override = V3D_SHADING_TEXTURE_COLOR;
break;
case PAINT_CANVAS_SOURCE_MATERIAL: {
- std::optional<MaterialWrapper> material = get_active_material(ob);
- if (!material.has_value()) {
- break;
- }
- std::optional<MaterialCanvas> canvas = material->active_canvas(ob);
+ std::optional<MaterialCanvas> canvas = get_active_canvas(ob);
if (!canvas.has_value()) {
break;
}
@@ -452,4 +452,56 @@ eV3DShadingColorType ED_paint_draw_color_override(const PaintModeSettings *setti
return override;
}
+
+Image *ED_paint_canvas_image_get(const struct PaintModeSettings *settings, struct Object *ob)
+{
+ switch (settings->canvas_source) {
+ case PAINT_CANVAS_SOURCE_COLOR_ATTRIBUTE:
+ return nullptr;
+ case PAINT_CANVAS_SOURCE_IMAGE:
+ return settings->image;
+ case PAINT_CANVAS_SOURCE_MATERIAL: {
+ std::optional<MaterialCanvas> canvas = get_active_canvas(ob);
+ if (!canvas.has_value()) {
+ break;
+ }
+ return canvas->image();
+ }
+ }
+ return nullptr;
+}
+
+int ED_paint_canvas_uvmap_layer_index_get(const struct PaintModeSettings *settings,
+ struct Object *ob)
+{
+ switch (settings->canvas_source) {
+ case PAINT_CANVAS_SOURCE_COLOR_ATTRIBUTE:
+ return -1;
+ case PAINT_CANVAS_SOURCE_IMAGE: {
+ /* Use active uv map of the object. */
+ if (ob->type != OB_MESH) {
+ return -1;
+ }
+
+ const Mesh *mesh = static_cast<Mesh *>(ob->data);
+ return CustomData_get_active_layer_index(&mesh->ldata, CD_MLOOPUV);
+ }
+ case PAINT_CANVAS_SOURCE_MATERIAL: {
+ /* Use uv map of the canvas. */
+ std::optional<MaterialCanvas> canvas = get_active_canvas(ob);
+ if (!canvas.has_value()) {
+ break;
+ }
+
+ if (ob->type != OB_MESH) {
+ return -1;
+ }
+
+ /* TODO: when uv is directly linked with a uv map node we could that one. */
+ const Mesh *mesh = static_cast<Mesh *>(ob->data);
+ return CustomData_get_active_layer_index(&mesh->ldata, CD_MLOOPUV);
+ }
+ }
+ return -1;
+}
}
\ No newline at end of file
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 9e744e09aa6..7d19a3e0b5d 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -3244,6 +3244,7 @@ static void rna_def_object(BlenderRNA *brna)
"rna_Object_paint_canvas_get",
"rna_Object_paint_canvas_set",
"rna_Object_paint_canvas_itemf");
+ RNA_def_property_ui_text(prop, "Canvas", "Material canvas to paint on");
RNA_def_property_update(prop, 0, "rna_Object_paint_canvas_update");
/* transform */
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index c13cc01d160..0cf916ecbde 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -561,7 +561,8 @@ static bool rna_PaintModeSettings_image_poll(PointerRNA *UNUSED(ptr), PointerRNA
static int rna_PaintModeSettings_canvas_source_get(PointerRNA *ptr)
{
PaintModeSettings *settings = ptr->data;
- if (!U.experimental.use_sculpt_texture_paint && settings->canvas_source == PAINT_CANVAS_SOURCE_IMAGE) {
+ if (!U.experimental.use_sculpt_texture_paint &&
+ settings->canvas_source == PAINT_CANVAS_SOURCE_IMAGE) {
return PAINT_CANVAS_SOURCE_COLOR_ATTRIBUTE;
}
@@ -589,6 +590,22 @@ static const EnumPropertyItem *rna_PaintModeSettings_canvas_source_itemf(bContex
return items;
}
+static void rna_PaintModeSettings_canvas_source_update(Main *main,
+ Scene *UNUSED(scene),
+ PointerRNA *UNUSED(ptr))
+{
+ /* When canvas source changes the pbvh would require updates when switching between color
+ * attributes. */
+ LISTBASE_FOREACH (Object *, ob, &main->objects) {
+ if (ob->sculpt == NULL) {
+ continue;
+ }
+
+ DEG_id_tag_update(&ob->id, 0);
+ WM_main_add_notifier(NC_GEOM | ND_DATA, &ob->id);
+ }
+}
+
/* \} */
static bool rna_ImaPaint_detect_data(ImagePaintSettings *imapaint)
@@ -1036,6 +1053,7 @@ static void rna_def_paint_mode(BlenderRNA *brna)
NULL,
"rna_PaintModeSettings_canvas_source_itemf");
RNA_def_property_ui_text(prop, "Source", "Source to select canvas from");
+ RNA_def_property_update(prop, 0, "rna_PaintModeSettings_canvas_source_update");
prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_PaintModeSettings_image_poll");
More information about the Bf-blender-cvs
mailing list