[Bf-blender-cvs] [27fd506501b] temp-pbvh-split: temp-pbvh-split: Fix pixel row splitting
Joseph Eagar
noreply at git.blender.org
Tue May 10 01:35:54 CEST 2022
Commit: 27fd506501bab6a0b9be51b291a7da38d1c9427a
Author: Joseph Eagar
Date: Mon May 9 16:35:39 2022 -0700
Branches: temp-pbvh-split
https://developer.blender.org/rB27fd506501bab6a0b9be51b291a7da38d1c9427a
temp-pbvh-split: Fix pixel row splitting
===================================================================
M source/blender/blenkernel/intern/pbvh.c
M source/blender/blenkernel/intern/pbvh_pixels.cc
M source/blender/editors/sculpt_paint/sculpt_paint_image.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index db6ab27f62a..129624d0885 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -687,7 +687,9 @@ void BKE_pbvh_free(PBVH *pbvh)
if (node->bm_other_verts) {
BLI_gset_free(node->bm_other_verts, NULL);
}
+ }
+ if (node->flag & PBVH_TexLeaf) {
pbvh_pixels_free(node);
}
}
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index a35f7267161..c962bc5c35d 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -68,14 +68,18 @@ int count_node_pixels(PBVHNode &node)
return totpixel;
}
-ATTR_NO_OPT void split_pixel_node(
- PBVH *pbvh, int node_i, Mesh *mesh, Image *image, ImageUser *image_user)
+ATTR_NO_OPT static void split_pixel_node(
+ PBVH *pbvh, int node_i, Mesh *mesh, Image *image, ImageUser *image_user, int depth)
{
BB cb;
PBVHNode *node = pbvh->nodes + node_i;
cb = node->vb;
+ if (depth >= pbvh->depth_limit || count_node_pixels(*node) <= pbvh->pixel_leaf_limit) {
+ return;
+ }
+
/* Find widest axis and its midpoint */
const int axis = BB_widest_axis(&cb);
const float mid = (cb.bmax[axis] + cb.bmin[axis]) * 0.5f;
@@ -164,6 +168,8 @@ ATTR_NO_OPT void split_pixel_node(
if (mid < co1[axis]) {
t = 1.0f - (mid - co2[axis]) / (co1[axis] - co2[axis]);
+
+ SWAP(UDIMTilePixels *, tile1, tile2);
}
else {
t = (mid - co1[axis]) / (co2[axis] - co1[axis]);
@@ -201,30 +207,31 @@ ATTR_NO_OPT void split_pixel_node(
}
pbvh_pixels_free(node);
+
+ split_pixel_node(pbvh, child1_i, mesh, image, image_user, depth + 1);
+ split_pixel_node(pbvh, child2_i, mesh, image, image_user, depth + 1);
}
-void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user)
+static void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user)
{
if (G.debug_value == 891) {
return;
}
if (!pbvh->depth_limit) {
- pbvh->depth_limit = 25; /* TODO: move into a constant */
+ pbvh->depth_limit = 40; /* TODO: move into a constant */
}
if (!pbvh->pixel_leaf_limit) {
pbvh->pixel_leaf_limit = 256 * 256; /* TODO: move into a constant */
}
- for (int i = 0; i < pbvh->totnode; i++) {
+ int totnode = pbvh->totnode;
+ for (int i = 0; i < totnode; i++) {
PBVHNode &node = pbvh->nodes[i];
- bool ok = node.flag & PBVH_TexLeaf;
- ok = ok && (count_node_pixels(node) > pbvh->pixel_leaf_limit);
-
- if (ok) {
- split_pixel_node(pbvh, i, mesh, image, image_user);
+ if (node.flag & PBVH_TexLeaf) {
+ split_pixel_node(pbvh, i, mesh, image, image_user, 0);
}
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index d0a071c636e..62dd85b3ed6 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -1,6 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
+/* Paint a color made from hash of node pointer. */
+//#define DEBUG_PIXEL_NODES
+
#include "DNA_image_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
@@ -13,6 +16,9 @@
#include "BLI_math.h"
#include "BLI_math_color_blend.h"
#include "BLI_task.h"
+#ifdef DEBUG_PIXEL_NODES
+# include "BLI_rand.h"
+#endif
#include "IMB_colormanagement.h"
#include "IMB_imbuf.h"
@@ -175,6 +181,15 @@ template<typename ImageBuffer> class PaintingKernel {
ss, brush, pixel_pos, sqrtf(test.dist), normal, face_normal, mask, 0, thread_id);
float4 paint_color = brush_color * falloff_strength * brush_strength;
float4 buffer_color;
+
+#ifdef DEBUG_PIXEL_NODES
+ if ((pixel_row.start_image_coordinate.y >> 3) & 1) {
+ paint_color[0] *= 0.5f;
+ paint_color[1] *= 0.5f;
+ paint_color[2] *= 0.5f;
+ }
+#endif
+
blend_color_mix_float(buffer_color, color, paint_color);
buffer_color *= brush->alpha;
IMB_blend_color_float(color, color, buffer_color, static_cast<IMB_BlendMode>(brush->blend));
@@ -187,20 +202,18 @@ template<typename ImageBuffer> class PaintingKernel {
return pixels_painted;
}
- void init_brush_color(ImBuf *image_buffer)
+ void init_brush_color(ImBuf *image_buffer, float in_brush_color[3])
{
const char *to_colorspace = image_accessor.get_colorspace_name(image_buffer);
if (last_used_color_space == to_colorspace) {
return;
}
- copy_v3_v3(brush_color,
- ss->cache->invert ? BKE_brush_secondary_color_get(ss->scene, brush) :
- BKE_brush_color_get(ss->scene, brush));
+
/* NOTE: Brush colors are stored in sRGB. We use math color to follow other areas that
* use brush colors. From there on we use IMB_colormanagement to convert the brush color to the
* colorspace of the texture. This isn't ideal, but would need more refactoring to make sure
* that brush colors are stored in scene linear by default. */
- srgb_to_linearrgb_v3_v3(brush_color, brush_color);
+ srgb_to_linearrgb_v3_v3(brush_color, in_brush_color);
brush_color[3] = 1.0f;
const char *from_colorspace = IMB_colormanagement_role_colorspace_name_get(
@@ -313,6 +326,22 @@ static void do_paint_pixels(void *__restrict userdata,
PaintingKernel<ImageBufferFloat4> kernel_float4(ss, brush, thread_id, mvert);
PaintingKernel<ImageBufferByte4> kernel_byte4(ss, brush, thread_id, mvert);
+ float brush_color[4];
+
+#ifdef DEBUG_PIXEL_NODES
+ RNG *rng = BLI_rng_new(POINTER_AS_UINT(node));
+
+ brush_color[0] = BLI_rng_get_float(rng);
+ brush_color[1] = BLI_rng_get_float(rng);
+ brush_color[2] = BLI_rng_get_float(rng);
+#else
+ copy_v3_v3(brush_color,
+ ss->cache->invert ? BKE_brush_secondary_color_get(ss->scene, brush) :
+ BKE_brush_color_get(ss->scene, brush));
+#endif
+
+ brush_color[3] = 1.0f;
+
ImageUser image_user = *data->image_data.image_user;
bool pixels_updated = false;
for (UDIMTilePixels &tile_data : node_data.tiles) {
@@ -327,10 +356,10 @@ static void do_paint_pixels(void *__restrict userdata,
}
if (image_buffer->rect_float != nullptr) {
- kernel_float4.init_brush_color(image_buffer);
+ kernel_float4.init_brush_color(image_buffer, brush_color);
}
else {
- kernel_byte4.init_brush_color(image_buffer);
+ kernel_byte4.init_brush_color(image_buffer, brush_color);
}
for (const PackedPixelRow &pixel_row : tile_data.pixel_rows) {
More information about the Bf-blender-cvs
mailing list