Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2022-04-12 13:07:37 +0300
committerJeroen Bakker <jeroen@blender.org>2022-04-12 13:07:37 +0300
commit66b03b7e3bcaeb76865c0b1e34a68c1a754277f4 (patch)
tree1fe934a590ee332067b5a0cf0ec5793f6d9cc9f2
parent09478756373c97cd6d6ad0ce08f5228abcbfe7e3 (diff)
Change the tile painting loop to use node data first.
-rw-r--r--source/blender/blenkernel/BKE_pbvh_pixels.hh4
-rw-r--r--source/blender/blenkernel/intern/pbvh_pixels.cc12
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_paint_image.cc72
3 files changed, 39 insertions, 49 deletions
diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index 26d90639fc0..92d5b84be72 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -222,9 +222,7 @@ struct NodeData {
}
};
-Triangles &BKE_pbvh_pixels_triangles_get(PBVHNode &node);
-UDIMTilePixels *BKE_pbvh_pixels_tile_data_get(PBVHNode &node,
- const image::ImageTileWrapper &image_tile);
+NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node);
void BKE_pbvh_pixels_mark_dirty(PBVHNode &node);
void BKE_pbvh_pixels_mark_image_dirty(PBVHNode &node, Image &image, ImageUser &image_user);
/** Extend pixels to fix uv seams for the given nodes. */
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index b4f8c6f8265..bcb97624566 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -367,19 +367,11 @@ static void update_pixels(PBVH *pbvh,
#endif
}
-Triangles &BKE_pbvh_pixels_triangles_get(PBVHNode &node)
+NodeData &BKE_pbvh_pixels_node_data_get(PBVHNode &node)
{
BLI_assert(node.pixels.node_data != nullptr);
NodeData *node_data = static_cast<NodeData *>(node.pixels.node_data);
- return node_data->triangles;
-}
-
-UDIMTilePixels *BKE_pbvh_pixels_tile_data_get(PBVHNode &node,
- const image::ImageTileWrapper &image_tile)
-{
- BLI_assert(node.pixels.node_data != nullptr);
- NodeData *node_data = static_cast<NodeData *>(node.pixels.node_data);
- return node_data->find_tile_data(image_tile);
+ return *node_data;
}
void BKE_pbvh_pixels_mark_dirty(PBVHNode &node)
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
index 2c4e7553ef3..2c587656ef1 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc
@@ -291,14 +291,15 @@ static void do_paint_pixels(void *__restrict userdata,
const Brush *brush = data->brush;
PBVHNode *node = data->nodes[n];
- Triangles &triangles = BKE_pbvh_pixels_triangles_get(*node);
+ NodeData &node_data = BKE_pbvh_pixels_node_data_get(*node);
+
/* Propagate vertex brush test to triangle. This should be extended with brush overlapping edges
* and faces only. */
/* TODO(jbakker) move to user data. to reduce reallocation. */
- std::vector<bool> triangle_brush_test_results(triangles.size());
+ std::vector<bool> triangle_brush_test_results(node_data.triangles.size());
- for (int triangle_index = 0; triangle_index < triangles.size(); triangle_index++) {
- TrianglePaintInput &triangle = triangles.get_paint_input(triangle_index);
+ for (int triangle_index = 0; triangle_index < node_data.triangles.size(); triangle_index++) {
+ TrianglePaintInput &triangle = node_data.triangles.get_paint_input(triangle_index);
int3 &vert_indices = triangle.vert_indices;
for (int i = 0; i < 3; i++) {
triangle_brush_test_results[triangle_index] = triangle_brush_test_results[triangle_index] ||
@@ -313,40 +314,39 @@ static void do_paint_pixels(void *__restrict userdata,
ImageUser image_user = *data->image_data.image_user;
bool pixels_updated = false;
- LISTBASE_FOREACH (ImageTile *, tile, &data->image_data.image->tiles) {
- ImageTileWrapper image_tile(tile);
- image_user.tile = image_tile.get_tile_number();
- UDIMTilePixels *tile_data = BKE_pbvh_pixels_tile_data_get(*node, image_tile);
- if (tile_data == nullptr) {
- /* This node doesn't paint on this tile. */
- continue;
- }
-
- ImBuf *image_buffer = BKE_image_acquire_ibuf(data->image_data.image, &image_user, nullptr);
- if (image_buffer == nullptr) {
- continue;
- }
-
- for (const PackedPixelRow &pixel_row : tile_data->pixel_rows) {
- if (!triangle_brush_test_results[pixel_row.triangle_index]) {
- continue;
- }
- bool pixels_painted = false;
- if (image_buffer->rect_float != nullptr) {
- pixels_painted = kernel_float4.paint(triangles, pixel_row, image_buffer);
- }
- else {
- pixels_painted = kernel_byte4.paint(triangles, pixel_row, image_buffer);
- }
-
- if (pixels_painted) {
- tile_data->mark_dirty(pixel_row);
+ for (UDIMTilePixels &tile_data : node_data.tiles) {
+ LISTBASE_FOREACH (ImageTile *, tile, &data->image_data.image->tiles) {
+ ImageTileWrapper image_tile(tile);
+ if (image_tile.get_tile_number() == tile_data.tile_number) {
+ image_user.tile = image_tile.get_tile_number();
+
+ ImBuf *image_buffer = BKE_image_acquire_ibuf(data->image_data.image, &image_user, nullptr);
+ if (image_buffer == nullptr) {
+ continue;
+ }
+
+ for (const PackedPixelRow &pixel_row : tile_data.pixel_rows) {
+ if (!triangle_brush_test_results[pixel_row.triangle_index]) {
+ continue;
+ }
+ bool pixels_painted = false;
+ if (image_buffer->rect_float != nullptr) {
+ pixels_painted = kernel_float4.paint(node_data.triangles, pixel_row, image_buffer);
+ }
+ else {
+ pixels_painted = kernel_byte4.paint(node_data.triangles, pixel_row, image_buffer);
+ }
+
+ if (pixels_painted) {
+ tile_data.mark_dirty(pixel_row);
+ }
+ }
+
+ BKE_image_release_ibuf(data->image_data.image, image_buffer, nullptr);
+ pixels_updated |= tile_data.flags.dirty;
}
+ break;
}
-
- BKE_image_release_ibuf(data->image_data.image, image_buffer, nullptr);
-
- pixels_updated |= tile_data->flags.dirty;
}
if (pixels_updated) {