Commit: 87e15ada9b1270199c17bfec4ce32cf087f8ae93 Author: Jeroen Bakker Date: Thu Jan 19 15:03:18 2023 +0100 Branches: temp-T101739-fix-seam-bleeding-non-manifold https://developer.blender.org/rB87e15ada9b1270199c17bfec4ce32cf087f8ae93
Fix some todos. =================================================================== M source/blender/blenkernel/BKE_pbvh_pixels.hh M source/blender/blenkernel/intern/pbvh_pixels_copy.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh index f5d43710206..54f2fabd919 100644 --- a/source/blender/blenkernel/BKE_pbvh_pixels.hh +++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh @@ -261,6 +261,8 @@ struct NodeData { // TODO: move to image wrappers? // TODO: Add compile time checks. template<typename T, int Channels = 4> struct ImageBufferAccessor { + // BLI_static_assert(constexpr(std::is_same_v<T, int> || std::is_same_v<T, float>); + ImBuf &image_buffer; ImageBufferAccessor(ImBuf &image_buffer) : image_buffer(image_buffer) @@ -312,7 +314,6 @@ struct CopyPixelGroup { int2 start_destination; int2 start_source_1; int64_t start_delta_index; - // TODO: extract from next group. int num_deltas; }; diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc index 0dae7d306b0..bc9de2747e1 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc @@ -23,7 +23,7 @@ namespace blender::bke::pbvh::pixels { -const int GRAIN_SIZE = 128; +const int THREADING_GRAIN_SIZE = 128; /** Coordinate space of a coordinate. */ enum class CoordSpace { @@ -125,9 +125,6 @@ class NonManifoldUVEdges : public Vector<Edge<CoordSpace::UV>> { const int2 tile_resolution) const { NonManifoldTileEdges result; - // TODO: Only add edges that intersects with the given tile. - // TODO: Clamp edges to tile bounds. - for (const Edge<CoordSpace::UV> &uv_edge : *this) { const Edge<CoordSpace::Tile> tile_edge = convert_coord_space( uv_edge, image_tile, tile_resolution); @@ -392,10 +389,9 @@ struct Rows { int2 found_source(0); for (int sy : IndexRange(bounds.ymin, BLI_rcti_size_y(&bounds))) { - // TODO don't use row view here. - RowView row(*this, sy); + int pixel_index = sy * resolution.x; for (int sx : IndexRange(bounds.xmin, BLI_rcti_size_x(&bounds))) { - Pixel &source = row.pixels[sx]; + Pixel &source = pixels[pixel_index + sx]; if (source.type != PixelType::Brush) { continue; } @@ -424,18 +420,15 @@ struct Rows { void find_copy_source(Vector<std::reference_wrapper<Pixel>> &selected_pixels, const NonManifoldTileEdges &tile_edges) { - threading::parallel_for(IndexRange(selected_pixels.size()), GRAIN_SIZE, [&](IndexRange range) { - for (int selected_pixel_index : range) { - Pixel ¤t_pixel = selected_pixels[selected_pixel_index]; - find_copy_source(current_pixel, tile_edges); - } - }); + threading::parallel_for( + IndexRange(selected_pixels.size()), THREADING_GRAIN_SIZE, [&](IndexRange range) { + for (int selected_pixel_index : range) { + Pixel ¤t_pixel = selected_pixels[selected_pixel_index]; + find_copy_source(current_pixel, tile_edges); + } + }); } - /** - * Mark pixels that needs to be evaluated. Pixels that are marked will have its `edge_index` - * filled. - */ Vector<std::reference_wrapper<Pixel>> filter_pixels_for_closer_examination( const NonManifoldTileEdges &tile_edges) { @@ -504,20 +497,10 @@ struct Rows { last_command = elem.copy_command; } } - - /* Shrink vectors to fit the actual data it contains. From now on these vectors should be - * immutable. */ - // copy_tile.groups.resize(copy_tile.groups.size()); - // copy_tile.command_deltas.resize(copy_tile.command_deltas.size()); } }; // namespace blender::bke::pbvh::pixels -static void copy_pixels_reinit(CopyPixelTiles &tiles) -{ - tiles.clear(); -} - void BKE_pbvh_pixels_copy_update(PBVH &pbvh, Image &image, ImageUser &image_user, @@ -525,7 +508,7 @@ void BKE_pbvh_pixels_copy_update(PBVH &pbvh, { TIMEIT_START(pbvh_pixels_copy_update); PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh); - copy_pixels_reinit(pbvh_data.tiles_copy_pixels); + pbvh_data.tiles_copy_pixels.clear(); const NonManifoldUVEdges non_manifold_edges(mesh_data); if (non_manifold_edges.is_empty()) { /* Early exit: No non manifold edges detected. */ @@ -588,8 +571,7 @@ void BKE_pbvh_pixels_copy_pixels(PBVH &pbvh, } CopyPixelTile &tile = pixel_tile->get(); - const int grain_size = 128; - threading::parallel_for(tile.groups.index_range(), grain_size, [&](IndexRange range) { + threading::parallel_for(tile.groups.index_range(), THREADING_GRAIN_SIZE, [&](IndexRange range) { tile.copy_pixels(*tile_buffer, range); }); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs