[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