[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