[Bf-blender-cvs] [a6c5e738df3] temp-sculpt-colors: temp-sculpt-colors: add pbvh color templates from Hans

Joseph Eagar noreply at git.blender.org
Thu Mar 31 23:52:54 CEST 2022


Commit: a6c5e738df3c3640afce28aedaf89e546423eaca
Author: Joseph Eagar
Date:   Thu Mar 31 14:52:29 2022 -0700
Branches: temp-sculpt-colors
https://developer.blender.org/rBa6c5e738df3c3640afce28aedaf89e546423eaca

temp-sculpt-colors: add pbvh color templates from Hans

===================================================================

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/pbvh.cc
M	source/blender/editors/sculpt_paint/sculpt_undo.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 2c157e0bbb9..775847f27f8 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -533,14 +533,23 @@ bool BKE_pbvh_get_color_layer(const struct Mesh *me,
 
 /* Swaps colors at each element in indices (of domain pbvh->vcol_domain)
  * with values in colors. */
-void BKE_pbvh_swap_colors(PBVH *pbvh, float (*colors)[4], int *indices, int indices_num);
+void BKE_pbvh_swap_colors(PBVH *pbvh,
+                          const int *indices,
+                          const int indices_num,
+                          float (*colors)[4]);
 
 /* Stores colors from the elements in indices (of domain pbvh->vcol_domain)
  * into colors. */
-void BKE_pbvh_store_colors(PBVH *pbvh, float (*colors)[4], int *indices, int indices_num);
+void BKE_pbvh_store_colors(PBVH *pbvh,
+                           const int *indices,
+                           const int indices_num,
+                           float (*colors)[4]);
 
 /* Like BKE_pbvh_store_colors but handles loop->vert conversion */
-void BKE_pbvh_store_colors_vertex(PBVH *pbvh, float (*colors)[4], int *indices, int indices_num);
+void BKE_pbvh_store_colors_vertex(PBVH *pbvh,
+                                  const int *indices,
+                                  const int indices_num,
+                                  float (*colors)[4]);
 
 bool BKE_pbvh_is_drawing(const PBVH *pbvh);
 void BKE_pbvh_is_drawing_set(PBVH *pbvh, bool val);
@@ -552,7 +561,7 @@ void BKE_pbvh_update_active_vcol(PBVH *pbvh, const struct Mesh *mesh);
 void BKE_pbvh_pmap_set(PBVH *pbvh, const struct MeshElemMap *pmap);
 
 void BKE_pbvh_vertex_color_set(PBVH *pbvh, int vertex, const float color[4]);
-void BKE_pbvh_vertex_color_get(PBVH *pbvh, int vertex, float r_color[4]);
+void BKE_pbvh_vertex_color_get(const PBVH *pbvh, int vertex, float r_color[4]);
 
 void BKE_pbvh_ensure_node_loops(PBVH *pbvh);
 
diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc
index ffeea1dc299..d32a03186e3 100644
--- a/source/blender/blenkernel/intern/pbvh.cc
+++ b/source/blender/blenkernel/intern/pbvh.cc
@@ -13,6 +13,7 @@
 #include "BLI_index_range.hh"
 #include "BLI_math.h"
 #include "BLI_rand.h"
+#include "BLI_span.hh"
 #include "BLI_task.h"
 
 #include "DNA_mesh_types.h"
@@ -38,112 +39,69 @@
 
 #include <climits>
 
-using IndexRange = blender::IndexRange;
+using blender::IndexRange;
 
-struct MLoopColHelper {
-  using ColType = MLoopCol;
+namespace blender::bke {
 
-  static void to_float(MLoopCol *col, float r_color[4])
-  {
-    rgba_uchar_to_float(r_color, reinterpret_cast<const unsigned char *>(col));
-    srgb_to_linearrgb_v3_v3(r_color, r_color);
-  }
-
-  static void from_float(MLoopCol *col, const float color[4])
-  {
-    float temp[4];
-
-    linearrgb_to_srgb_v3_v3(temp, color);
-    temp[3] = color[3];
-
-    rgba_float_to_uchar(reinterpret_cast<unsigned char *>(col), temp);
-  }
-};
-
-struct MPropColHelper {
-  using ColType = MPropCol;
-
-  static void to_float(MPropCol *col, float r_color[4])
-  {
-    copy_v4_v4(r_color, col->color);
-  }
-
-  static void from_float(MPropCol *col, const float color[4])
-  {
-    copy_v4_v4(col->color, color);
-  }
-};
-
-template<typename Helper> struct ColorSetter {
-  using ColType = typename Helper::ColType;
-
-  static void set(ColType *dst, ColType *src)
-  {
-    *dst = *src;
-  }
-
-  static void set_float(ColType *dst, const float src[4])
-  {
-    Helper::from_float(dst, src);
-  }
-};
-
-template<typename Helper> struct ColorSwapper {
-  using ColType = typename Helper::ColType;
-
-  static void set(ColType *dst, ColType *src)
-  {
-    ColType tmp = *dst;
-
-    *dst = *src;
-    *src = tmp;
+template<typename Func>
+inline void to_static_color_type(const CustomDataType type, const Func &func)
+{
+  switch (type) {
+    case CD_PROP_COLOR:
+      func(MPropCol());
+      break;
+    case CD_MLOOPCOL:
+      func(MLoopCol());
+      break;
+    default:
+      BLI_assert_unreachable();
+      break;
   }
+}
 
-  static void set_float(ColType *dst, float src[4])
-  {
-    ColType temp = *dst;
-
-    Helper::from_float(dst, src);
-    Helper::to_float(&temp, src);
-  }
-};
+template<typename T> void to_float(const T &src, float dst[4]);
 
-/** Reversed setter, sets src to dst instead of dst to src. */
-template<typename Helper> struct ColorStorer {
-  using ColType = typename Helper::ColType;
+template<> void to_float(const MLoopCol &src, float dst[4])
+{
+  rgba_uchar_to_float(dst, reinterpret_cast<const unsigned char *>(&src));
+  srgb_to_linearrgb_v3_v3(dst, dst);
+}
+template<> void to_float(const MPropCol &src, float dst[4])
+{
+  copy_v4_v4(dst, src.color);
+}
 
-  static void set(ColType *dst, ColType *src)
-  {
-    *src = *dst;
-  }
+template<typename T> void from_float(const float src[4], T &dst);
 
-  static void set_float(ColType *dst, float src[4])
-  {
-    Helper::to_float(dst, src);
-  }
-};
+template<> void from_float(const float src[4], MLoopCol &dst)
+{
+  float temp[4];
+  linearrgb_to_srgb_v3_v3(temp, src);
+  temp[3] = src[3];
+  rgba_float_to_uchar(reinterpret_cast<unsigned char *>(&dst), temp);
+}
+template<> void from_float(const float src[4], MPropCol &dst)
+{
+  copy_v4_v4(dst.color, src);
+}
 
-template<typename Helper>
-static void pbvh_vertex_color_get(PBVH *pbvh, int vertex, float r_color[4])
+template<typename T>
+static void pbvh_vertex_color_get(const PBVH &pbvh, int vertex, float r_color[4])
 {
-  if (pbvh->color_domain == ATTR_DOMAIN_CORNER) {
-    const MeshElemMap *melem = pbvh->pmap + vertex;
-    int count = 0;
+  if (pbvh.color_domain == ATTR_DOMAIN_CORNER) {
+    const MeshElemMap &melem = pbvh.pmap[vertex];
 
+    int count = 0;
     zero_v4(r_color);
+    for (const int i_poly : Span(melem.indices, melem.count)) {
+      const MPoly &mp = pbvh.mpoly[i_poly];
+      Span<T> colors{static_cast<const T *>(pbvh.color_layer->data) + mp.loopstart, mp.totloop};
+      Span<MLoop> loops{pbvh.mloop + mp.loopstart, mp.totloop};
 
-    for (int i : IndexRange(melem->count)) {
-      const MPoly *mp = pbvh->mpoly + melem->indices[i];
-      const MLoop *ml = pbvh->mloop + mp->loopstart;
-
-      typename Helper::ColType *col = static_cast<typename Helper::ColType *>(
-                                          pbvh->color_layer->data) +
-                                      mp->loopstart;
-
-      for (int j = 0; j < mp->totloop; j++, col++, ml++) {
-        if (ml->v == vertex) {
+      for (const int i_loop : IndexRange(mp.totloop)) {
+        if (loops[i_loop].v == vertex) {
           float temp[4];
-          Helper::to_float(col, temp);
+          to_float(colors[i_loop], temp);
 
           add_v4_v4(r_color, temp);
           count++;
@@ -156,104 +114,97 @@ static void pbvh_vertex_color_get(PBVH *pbvh, int vertex, float r_color[4])
     }
   }
   else {
-    typename Helper::ColType *col = static_cast<typename Helper::ColType *>(pbvh->color_layer->data) +
-                                    vertex;
-    Helper::to_float(col, r_color);
-  }
-}
-
-void BKE_pbvh_vertex_color_get(PBVH *pbvh, int vertex, float r_color[4])
-{
-  if (pbvh->color_layer->type == CD_PROP_COLOR) {
-    pbvh_vertex_color_get<MPropColHelper>(pbvh, vertex, r_color);
-  }
-  else {
-    pbvh_vertex_color_get<MLoopColHelper>(pbvh, vertex, r_color);
+    to_float(static_cast<T *>(pbvh.color_layer->data)[vertex], r_color);
   }
 }
 
-template<typename Helper, typename Setter = ColorSetter<Helper>>
-static void pbvh_vertex_color_set(PBVH *pbvh, int vertex, const float color[4])
+template<typename T>
+static void pbvh_vertex_color_set(PBVH &pbvh, int vertex, const float color[4])
 {
-  if (pbvh->color_domain == ATTR_DOMAIN_CORNER) {
-    const MeshElemMap *melem = pbvh->pmap + vertex;
-
-    for (int i : IndexRange(melem->count)) {
-      const MPoly *mp = pbvh->mpoly + melem->indices[i];
-      const MLoop *ml = pbvh->mloop + mp->loopstart;
+  if (pbvh.color_domain == ATTR_DOMAIN_CORNER) {
+    const MeshElemMap &melem = pbvh.pmap[vertex];
 
-      typename Helper::ColType *col = static_cast<typename Helper::ColType *>(
-                                          pbvh->color_layer->data) +
-                                      mp->loopstart;
+    for (const int i_poly : Span(melem.indices, melem.count)) {
+      const MPoly &mp = pbvh.mpoly[i_poly];
+      MutableSpan<T> colors{static_cast<T *>(pbvh.color_layer->data) + mp.loopstart, mp.totloop};
+      Span<MLoop> loops{pbvh.mloop + mp.loopstart, mp.totloop};
 
-      for (int j = 0; j < mp->totloop; j++, col++, ml++) {
-        if (ml->v == vertex) {
-          Setter::set_float(col, color);
+      for (const int i_loop : IndexRange(mp.totloop)) {
+        if (loops[i_loop].v == vertex) {
+          from_float(color, colors[i_loop]);
         }
       }
     }
   }
   else {
-    typename Helper::ColType *col = static_cast<typename Helper::ColType *>(
-                                        pbvh->color_layer->data) +
-                                    vertex;
-    Setter::set_float(col, color);
+    from_float(color, static_cast<T *>(pbvh.color_layer->data)[vertex]);
   }
 }
 
-void BKE_pbvh_vertex_color_set(PBVH *pbvh, int vertex, const float color[4])
+}  // namespace blender::bke
+
+extern "C" {
+void BKE_pbvh_vertex_color_get(const PBVH *pbvh, int vertex, float r_color[4])
 {
-  if (pbvh->color_layer->type == CD_PROP_COLOR) {
-    pbvh_vertex_color_set<MPropColHelper>(pbvh, vertex, color);
-  }
-  else {
-    pbvh_vertex_color_set<MLoopColHelper>(pbvh, vertex, color);
-  }
+  blender::bke::to_static_color_type(CustomDataType(pbvh->color_layer->type), [&](auto dummy) {
+    using T = decltype(dummy);
+    blender::bke::pbvh_vertex_color_get<T>(*pbvh, vertex, r_color);
+  });
 }
 
-template<typename Helper, typename Setter = ColorSetter<Helper>>
-static void pbvh_set_colors(
-    PBVH *UNUSED(pbvh), void *color_attr, float (*colors)[4], int *indices, int indices_num)
+void BKE_pbvh_vertex_color_set(PBVH *pbvh, int vertex, const float color[4])
 {
-  typename Helper::ColType *col = reinterpret_cast<typename Helper::ColType *>(color_attr);
-
-  for (int i : 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list