[Bf-blender-cvs] [c627d7ede25] temp-T96710-pbvh-pixels: Remove experimental uv seam bleeding
Jeroen Bakker
noreply at git.blender.org
Fri Apr 15 11:51:45 CEST 2022
Commit: c627d7ede2543f9ac2c9c32c83c7cf8ddd7f2460
Author: Jeroen Bakker
Date: Fri Apr 15 11:51:21 2022 +0200
Branches: temp-T96710-pbvh-pixels
https://developer.blender.org/rBc627d7ede2543f9ac2c9c32c83c7cf8ddd7f2460
Remove experimental uv seam bleeding
===================================================================
M source/blender/blenkernel/BKE_pbvh_pixels.hh
M source/blender/blenkernel/CMakeLists.txt
M source/blender/blenkernel/intern/pbvh_pixels.cc
D source/blender/blenkernel/intern/pbvh_pixels_seams.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh
index b2cdb9353e3..dbfc03dd12a 100644
--- a/source/blender/blenkernel/BKE_pbvh_pixels.hh
+++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh
@@ -184,10 +184,5 @@ struct NodeData {
NodeData &BKE_pbvh_pixels_node_data_get(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. */
-void BKE_pbvh_pixels_fix_seams(PBVH &pbvh,
- Image &image,
- ImageUser &image_user,
- const MLoopUV *ldata_uv);
} // namespace blender::bke::pbvh::pixels
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 1dd270ab591..0444fd33302 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -245,7 +245,6 @@ set(SRC
intern/pbvh.c
intern/pbvh_bmesh.c
intern/pbvh_pixels.cc
- intern/pbvh_pixels_seams.cc
intern/pointcache.c
intern/pointcloud.cc
intern/preferences.c
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 UVSeamExtenderRo
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list