Cleanup: simplify uv packing api

This commit is contained in:
2023-03-29 15:45:38 +13:00
parent 2bc331981d
commit 86b1e5e3b6
4 changed files with 37 additions and 17 deletions

View File

@@ -1388,7 +1388,6 @@ static void uvedit_pack_islands_multi(const Scene *scene,
for (int i = 0; i < island_vector.size(); i++) { for (int i = 0; i < island_vector.size(); i++) {
FaceIsland *face_island = island_vector[i]; FaceIsland *face_island = island_vector[i];
blender::geometry::PackIsland *pack_island = new blender::geometry::PackIsland(); blender::geometry::PackIsland *pack_island = new blender::geometry::PackIsland();
pack_island->bounds_rect = face_island->bounds_rect;
pack_island->caller_index = i; pack_island->caller_index = i;
pack_island->aspect_y = face_island->aspect_y; pack_island->aspect_y = face_island->aspect_y;
pack_island->angle = 0.0f; pack_island->angle = 0.0f;

View File

@@ -72,7 +72,7 @@ class UVPackIsland_Params {
class PackIsland { class PackIsland {
public: public:
/** Bounding rectangle of input. Will be calculated automatically in a future update. */ /** Calculated automatically. */
rctf bounds_rect; rctf bounds_rect;
/** Aspect ratio, required for rotation. */ /** Aspect ratio, required for rotation. */
float aspect_y; float aspect_y;

View File

@@ -7,6 +7,7 @@
#include "GEO_uv_pack.hh" #include "GEO_uv_pack.hh"
#include "BLI_array.hh" #include "BLI_array.hh"
#include "BLI_bounds.hh"
#include "BLI_boxpack_2d.h" #include "BLI_boxpack_2d.h"
#include "BLI_convexhull_2d.h" #include "BLI_convexhull_2d.h"
#include "BLI_listbase.h" #include "BLI_listbase.h"
@@ -125,6 +126,7 @@ void PackIsland::add_polygon(const blender::Span<float2> uvs, MemArena *arena, H
void PackIsland::finalize_geometry(const UVPackIsland_Params &params, MemArena *arena, Heap *heap) void PackIsland::finalize_geometry(const UVPackIsland_Params &params, MemArena *arena, Heap *heap)
{ {
BLI_assert(triangle_vertices_.size() >= 3); BLI_assert(triangle_vertices_.size() >= 3);
const eUVPackIsland_ShapeMethod shape_method = params.shape_method; const eUVPackIsland_ShapeMethod shape_method = params.shape_method;
if (shape_method == ED_UVPACK_SHAPE_CONVEX) { if (shape_method == ED_UVPACK_SHAPE_CONVEX) {
/* Compute convex hull of existing triangles. */ /* Compute convex hull of existing triangles. */
@@ -154,6 +156,17 @@ void PackIsland::finalize_geometry(const UVPackIsland_Params &params, MemArena *
BLI_heap_clear(heap, nullptr); BLI_heap_clear(heap, nullptr);
} }
Bounds<float2> triangle_bounds = *bounds::min_max(triangle_vertices_.as_span());
float2 aabb_min = triangle_bounds.min;
float2 aabb_max = triangle_bounds.max;
float2 pivot = (aabb_min + aabb_max) * 0.5f;
float2 half_diagonal = (aabb_max - aabb_min) * 0.5f;
bounds_rect.xmin = pivot.x - half_diagonal.x;
bounds_rect.ymin = pivot.y - half_diagonal.y;
bounds_rect.xmax = pivot.x + half_diagonal.x;
bounds_rect.ymax = pivot.y + half_diagonal.y;
} }
UVPackIsland_Params::UVPackIsland_Params() UVPackIsland_Params::UVPackIsland_Params()
@@ -944,7 +957,7 @@ static float pack_islands_margin_fraction(const Span<PackIsland *> &island_vecto
/* TODO (?): `if (max_uv < 1.0f) { scale_last /= max_uv; }` */ /* TODO (?): `if (max_uv < 1.0f) { scale_last /= max_uv; }` */
} }
/* Then expand FaceIslands by the correct amount. */ /* Then expand PackIslands by the correct amount. */
for (const int64_t index : island_vector.index_range()) { for (const int64_t index : island_vector.index_range()) {
BoxPack *box = &box_array[index]; BoxPack *box = &box_array[index];
box->x /= scale_last; box->x /= scale_last;
@@ -998,7 +1011,7 @@ static BoxPack *pack_islands_box_array(const Span<PackIsland *> &islands,
const float scale = pack_islands_margin_fraction(islands, box_array, params.margin, params); const float scale = pack_islands_margin_fraction(islands, box_array, params.margin, params);
r_scale[0] = scale; r_scale[0] = scale;
r_scale[1] = scale; r_scale[1] = scale;
/* pack_islands_margin_fraction will pad FaceIslands, return early. */ /* pack_islands_margin_fraction will pad PackIslands, return early. */
return box_array; return box_array;
} }

View File

@@ -4144,7 +4144,17 @@ void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, boo
} }
uv_parametrizer_scale_x(handle, 1.0f / handle->aspect_y); uv_parametrizer_scale_x(handle, 1.0f / handle->aspect_y);
Vector<PackIsland *> pack_island_vector; Vector<PackIsland *> pack_island_vector;
UVPackIsland_Params params;
params.rotate = do_rotate;
params.margin = margin;
params.margin_method = ED_UVPACK_MARGIN_SCALED;
MemArena *arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
Heap *heap = BLI_heap_new();
int unpacked = 0; int unpacked = 0;
for (int i = 0; i < handle->ncharts; i++) { for (int i = 0; i < handle->ncharts; i++) {
PChart *chart = handle->charts[i]; PChart *chart = handle->charts[i];
@@ -4159,21 +4169,19 @@ void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, boo
pack_island->caller_index = i; pack_island->caller_index = i;
pack_island->aspect_y = handle->aspect_y; pack_island->aspect_y = handle->aspect_y;
pack_island->angle = 0.0f; pack_island->angle = 0.0f;
for (PFace *f = chart->faces; f; f = f->nextlink) {
PVert *v0 = f->edge->vert;
PVert *v1 = f->edge->next->vert;
PVert *v2 = f->edge->next->next->vert;
pack_island->add_triangle(v0->uv, v1->uv, v2->uv);
}
pack_island->finalize_geometry(params, arena, heap);
pack_island_vector.append(pack_island); pack_island_vector.append(pack_island);
float minv[2];
float maxv[2];
p_chart_uv_bbox(chart, minv, maxv);
pack_island->bounds_rect.xmin = minv[0];
pack_island->bounds_rect.ymin = minv[1];
pack_island->bounds_rect.xmax = maxv[0];
pack_island->bounds_rect.ymax = maxv[1];
} }
BLI_heap_free(heap, nullptr);
UVPackIsland_Params params; BLI_memarena_free(arena);
params.rotate = do_rotate;
params.margin = margin;
params.margin_method = ED_UVPACK_MARGIN_SCALED;
float scale[2] = {1.0f, 1.0f}; float scale[2] = {1.0f, 1.0f};
pack_islands(pack_island_vector, params, scale); pack_islands(pack_island_vector, params, scale);