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-15 12:51:21 +0300
committerJeroen Bakker <jeroen@blender.org>2022-04-15 12:51:21 +0300
commitc627d7ede2543f9ac2c9c32c83c7cf8ddd7f2460 (patch)
tree039f837dadcbcbbd4f8f6c07d40e0988f9f45239 /source/blender/blenkernel/intern
parent1f8e9ad6de29021bf1a84d7133f665bd5bec8157 (diff)
Remove experimental uv seam bleeding
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/pbvh_pixels.cc12
-rw-r--r--source/blender/blenkernel/intern/pbvh_pixels_seams.cc316
2 files changed, 1 insertions, 327 deletions
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 52f16cdb3fa..07da012f619 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -25,7 +25,6 @@ namespace blender::bke::pbvh::pixels {
/** Durind debugging this check could be enabled. It will write to each image pixel that is covered
* by the pbvh. */
constexpr bool USE_WATERTIGHT_CHECK = false;
-constexpr bool USE_WATERTIGHT_SEAM_CHECK = true;
/**
* Calculate the delta of two neighbour uv coordinates in the given image buffer.
@@ -268,12 +267,7 @@ static void apply_watertight_check(PBVH *pbvh, Image *image, ImageUser *image_us
pixel_row.start_image_coordinate.x;
for (int x = 0; x < pixel_row.num_pixels; x++) {
if (image_buffer->rect_float) {
- if (USE_WATERTIGHT_SEAM_CHECK) {
- image_buffer->rect_float[pixel_offset * 4] += 0.5;
- }
- else {
- copy_v4_fl(&image_buffer->rect_float[pixel_offset * 4], 1.0);
- }
+ copy_v4_fl(&image_buffer->rect_float[pixel_offset * 4], 1.0);
}
if (image_buffer->rect) {
uint8_t *dest = static_cast<uint8_t *>(
@@ -321,10 +315,6 @@ static void update_pixels(PBVH *pbvh,
TaskParallelSettings settings;
BKE_pbvh_parallel_range_settings(&settings, true, nodes_to_update.size());
BLI_task_parallel_range(0, nodes_to_update.size(), &user_data, do_encode_pixels, &settings);
- if (USE_WATERTIGHT_CHECK && USE_WATERTIGHT_SEAM_CHECK) {
- apply_watertight_check(pbvh, image, image_user);
- }
- BKE_pbvh_pixels_fix_seams(*pbvh, *image, *image_user, ldata_uv);
if (USE_WATERTIGHT_CHECK) {
apply_watertight_check(pbvh, image, image_user);
}
diff --git a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc b/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
deleted file mode 100644
index 2a883011cea..00000000000
--- a/source/blender/blenkernel/intern/pbvh_pixels_seams.cc
+++ /dev/null
@@ -1,316 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later
- * Copyright 2022 Blender Foundation. All rights reserved. */
-
-#include "BKE_pbvh.h"
-#include "BKE_pbvh_pixels.hh"
-
-#include "pbvh_intern.h"
-
-#include "BLI_math_geom.h"
-
-namespace blender::bke::pbvh::pixels {
-
-struct ExtendUVContext {
- PBVH *pbvh;
- const ImBuf *image_buffer;
- const MLoopUV *ldata_uv;
-};
-
-static bool intersect_uv_pixel(const ushort2 &pixel_coordinate,
- const ImBuf &image_buffer,
- const float2 triangle_uvs[3])
-{
-
- float2 uv_bottom_left = float2(pixel_coordinate.x / float(image_buffer.x),
- pixel_coordinate.y / float(image_buffer.y));
- float2 uv_top_right = float2((pixel_coordinate.x + 1) / float(image_buffer.x),
- (pixel_coordinate.y + 1) / float(image_buffer.y));
- float2 uv_bottom_right(uv_top_right[0], uv_bottom_left[1]);
- float2 uv_top_left(uv_bottom_left[0], uv_top_right[1]);
-
- return (isect_seg_seg_v2_simple(
- uv_bottom_left, uv_bottom_right, triangle_uvs[0], triangle_uvs[1]) ||
- isect_seg_seg_v2_simple(uv_bottom_left, uv_top_left, triangle_uvs[0], triangle_uvs[1]) ||
- isect_seg_seg_v2_simple(uv_top_left, uv_top_right, triangle_uvs[0], triangle_uvs[1]) ||
- isect_seg_seg_v2_simple(
- uv_bottom_right, uv_top_right, triangle_uvs[0], triangle_uvs[1])) ||
- (isect_seg_seg_v2_simple(
- uv_bottom_left, uv_bottom_right, triangle_uvs[1], triangle_uvs[2]) ||
- isect_seg_seg_v2_simple(uv_bottom_left, uv_top_left, triangle_uvs[1], triangle_uvs[2]) ||
- isect_seg_seg_v2_simple(uv_top_left, uv_top_right, triangle_uvs[1], triangle_uvs[2]) ||
- isect_seg_seg_v2_simple(
- uv_bottom_right, uv_top_right, triangle_uvs[1], triangle_uvs[2])) ||
- (isect_seg_seg_v2_simple(
- uv_bottom_left, uv_bottom_right, triangle_uvs[2], triangle_uvs[0]) ||
- isect_seg_seg_v2_simple(uv_bottom_left, uv_top_left, triangle_uvs[2], triangle_uvs[0]) ||
- isect_seg_seg_v2_simple(uv_top_left, uv_top_right, triangle_uvs[2], triangle_uvs[0]) ||
- isect_seg_seg_v2_simple(
- uv_bottom_right, uv_top_right, triangle_uvs[2], triangle_uvs[0]));
-}
-
-struct UVSeamExtenderRowPackage {
- /** Amount of pixels to extend beyond the determined extension to reduce rendering artifacts. */
- static const int ADDITIONAL_EXTEND_X = 1;
-
- PackedPixelRow *pixel_row;
- TrianglePaintInput *triangle_paint_data;
- bool is_new;
- int extend_xmin_len = 0;
- int extend_xmax_len = 0;
-
- UVSeamExtenderRowPackage(ExtendUVContext &context,
- PackedPixelRow *pixel_row,
- TrianglePaintInput *triangle_paint_data,
- bool is_new,
- const int3 &loop_indices)
- : pixel_row(pixel_row), triangle_paint_data(triangle_paint_data), is_new(is_new)
- {
- init_extend_x_len(context, loop_indices);
- }
-
- bool should_extend_start() const
- {
- return extend_xmin_len != 0;
- }
-
- void extend_x_start()
- {
- BLI_assert(extend_xmin_len != 0);
- pixel_row->num_pixels += 1;
- pixel_row->start_image_coordinate[0] -= 1;
- pixel_row->start_barycentric_coord -= triangle_paint_data->delta_barycentric_coord_u;
- extend_xmin_len--;
- }
-
- bool should_extend_end() const
- {
- return extend_xmax_len != 0;
- }
-
- void extend_x_end()
- {
- BLI_assert(extend_xmax_len != 0);
- pixel_row->num_pixels += 1;
- extend_xmax_len--;
- }
-
- private:
- void init_extend_x_len(ExtendUVContext &context, const int3 &loop_indices)
- {
- if (!is_new) {
- return;
- }
-
- float2 triangle_uvs[3];
- triangle_uvs[0] = context.ldata_uv[loop_indices[0]].uv;
- triangle_uvs[1] = context.ldata_uv[loop_indices[1]].uv;
- triangle_uvs[2] = context.ldata_uv[loop_indices[2]].uv;
-
- init_extend_xmin_len(context, triangle_uvs);
- init_extend_xmax_len(context, triangle_uvs);
- BLI_assert(extend_xmin_len);
- BLI_assert(extend_xmax_len);
- }
-
- void init_extend_xmin_len(ExtendUVContext &context, const float2 triangle_uvs[3])
- {
- int result = 0;
- while (should_extend_xmin(*context.image_buffer, result, triangle_uvs)) {
- result++;
- }
- extend_xmin_len = result + ADDITIONAL_EXTEND_X;
- }
-
- bool should_extend_xmin(const ImBuf &image_buffer,
- int offset,
- const float2 triangle_uvs[3]) const
- {
- uint16_t pixel_offset = offset + 1;
- ushort2 pixel = pixel_row->start_image_coordinate - ushort2(pixel_offset, 0);
- return intersect_uv_pixel(pixel, image_buffer, triangle_uvs);
- }
-
- void init_extend_xmax_len(ExtendUVContext &context, const float2 triangle_uvs[3])
- {
- int result = 0;
- while (should_extend_xmax(*context.image_buffer, result, triangle_uvs)) {
- result++;
- }
- extend_xmax_len = result + ADDITIONAL_EXTEND_X;
- }
-
- bool should_extend_xmax(const ImBuf &image_buffer,
- int offset,
- const float2 triangle_uvs[3]) const
- {
- uint16_t pixel_offset = offset + 1;
- ushort2 pixel = pixel_row->start_image_coordinate + ushort2(pixel_offset, 0);
- return intersect_uv_pixel(pixel, image_buffer, triangle_uvs);
- }
-};
-
-class UVSeamExtenderRow : public Vector<UVSeamExtenderRowPackage> {
-
- public:
- bool has_packages_that_needs_fixing = false;
-
- void append(UVSeamExtenderRowPackage &package)
- {
- has_packages_that_needs_fixing |= package.is_new;
- Vector<UVSeamExtenderRowPackage>::append(package);
- }
-
- void extend_x(int image_buffer_width)
- {
- std::sort(
- begin(), end(), [](const UVSeamExtenderRowPackage &a, const UVSeamExtenderRowPackage &b) {
- return a.pixel_row->start_image_coordinate[0] < b.pixel_row->start_image_coordinate[0];
- });
- extend_x_start();
- extend_x_end(image_buffer_width);
- }
-
- private:
- void extend_x_start()
- {
- int prev_package_x = -1;
- int index = 0;
-
- for (UVSeamExtenderRowPackage &package : *this) {
- if (package.is_new) {
- while (package.should_extend_start()) {
- if (package.pixel_row->start_image_coordinate[0] - 1 <= prev_package_x) {
- /* No room left for extending. */
- break;
- }
- package.extend_x_start();
- }
- }
-
- prev_package_x = package.pixel_row->start_image_coordinate[0] +
- package.pixel_row->num_pixels;
- index++;
- }
- }
-
- void extend_x_end(int image_buffer_width)
- {
- int index = 0;
- for (UVSeamExtenderRowPackage &package : *this) {
- if (package.is_new) {
- int next_package_x;
- if (index < size() - 1) {
- const UVSeamExtenderRowPackage &next_package = (*this)[index + 1];
- next_package_x = next_package.pixel_row->start_image_coordinate[0];
- }
- else {
- next_package_x = image_buffer_width + 1;
- }
- while (package.should_extend_end()) {
- if (package.pixel_row->start_image_coordinate[0] + package.pixel_row->num_pixels >=
- next_package_x - 1) {
- /* No room left for extending */
- break;
- }
- package.extend_x_end();
- }
- }
-
- index++;
- }
- }
-};
-
-class UVSeamExtender {
- Vector<UVSeamExtenderRow> rows;
- int image_buffer_width_;
-
- public:
- explicit UVSeamExtender(ExtendUVContext &context, const image::ImageTileWrapper &image_tile)
- : image_buffer_width_(context.image_buffer->x)
- {
- rows.resize(context.image_buffer->y);
- init(context, image_tile);
- }
-
- void extend_x()
- {
- for (UVSeamExtenderRow &row : rows) {
- if (row.has_packages_that_needs_fixing) {
- row.extend_x(image_buffer_width_);
- }
- }
- }
-
- private:
- void init(ExtendUVContext &context, const image::ImageTileWrapper &image_tile)
- {
- for (int n = 0; n < context.pbvh->totnode; n++) {
- PBVHNode &node = context.pbvh->nodes[n];
- if ((node.flag & PBVH_Leaf) == 0) {
- continue;
- }
- init(context, node, image_tile);
- }
- }
-
- void init(ExtendUVContext &context, PBVHNode &node, const image::ImageTileWrapper &image_tile)
- {
- NodeData &node_data = *static_cast<NodeData *>(node.pixels.node_data);
- UDIMTilePixels *tile_node_data = node_data.find_tile_data(image_tile);
- if (tile_node_data == nullptr) {
- return;
- }
- init(context, node, node_data, *tile_node_data);
- }
-
- void init(ExtendUVContext &context,
- PBVHNode &node,
- NodeData &node_data,
- UDIMTilePixels &tile_data)
- {
- for (PackedPixelRow &pixel_row : tile_data.pixel_rows) {
- const MLoopTri *mt = &context.pbvh->looptri[pixel_row.triangle_index];
- UVSeamExtenderRowPackage row_package(
- context,
- &pixel_row,
- &node_data.triangles.get_paint_input(pixel_row.triangle_index),
- (node.flag & PBVH_RebuildPixels) != 0,
- int3(mt->tri[0], mt->tri[1], mt->tri[2]));
- append(row_package);
- }
- }
-
- void append(UVSeamExtenderRowPackage &package)
- {
- rows[package.pixel_row->start_image_coordinate[1]].append(package);
- }
-};
-
-/** Extend pixels to fix uv seams for the given nodes. */
-void BKE_pbvh_pixels_fix_seams(PBVH &pbvh,
- Image &image,
- ImageUser &image_user,
- const MLoopUV *ldata_uv)
-{
- ExtendUVContext context;
- context.ldata_uv = ldata_uv;
- context.pbvh = &pbvh;
-
- ImageUser local_image_user = image_user;
- LISTBASE_FOREACH (ImageTile *, tile_data, &image.tiles) {
- image::ImageTileWrapper image_tile(tile_data);
-
- local_image_user.tile = image_tile.get_tile_number();
- ImBuf *image_buffer = BKE_image_acquire_ibuf(&image, &local_image_user, nullptr);
- if (image_buffer == nullptr) {
- continue;
- }
- context.image_buffer = image_buffer;
- UVSeamExtender extender(context, image_tile);
- extender.extend_x();
- BKE_image_release_ibuf(&image, image_buffer, nullptr);
- }
-}
-
-} // namespace blender::bke::pbvh::pixels