diff options
author | Jeroen Bakker <jeroen@blender.org> | 2022-04-12 13:07:37 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-04-12 13:07:37 +0300 |
commit | 66b03b7e3bcaeb76865c0b1e34a68c1a754277f4 (patch) | |
tree | 1fe934a590ee332067b5a0cf0ec5793f6d9cc9f2 | |
parent | 09478756373c97cd6d6ad0ce08f5228abcbfe7e3 (diff) |
Change the tile painting loop to use node data first.
-rw-r--r-- | source/blender/blenkernel/BKE_pbvh_pixels.hh | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_pixels.cc | 12 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_paint_image.cc | 72 |
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) { |