forked from blender/blender
main sync #3
@ -1382,9 +1382,10 @@ static void uvedit_pack_islands_multi(const Scene *scene,
|
|||||||
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->bounds_rect = face_island->bounds_rect;
|
||||||
|
pack_island->caller_index = i;
|
||||||
pack_island_vector.append(pack_island);
|
pack_island_vector.append(pack_island);
|
||||||
}
|
}
|
||||||
BoxPack *box_array = pack_islands(pack_island_vector, *params, scale);
|
pack_islands(pack_island_vector, *params, scale);
|
||||||
|
|
||||||
float base_offset[2] = {0.0f, 0.0f};
|
float base_offset[2] = {0.0f, 0.0f};
|
||||||
copy_v2_v2(base_offset, params->udim_base_offset);
|
copy_v2_v2(base_offset, params->udim_base_offset);
|
||||||
@ -1423,8 +1424,9 @@ static void uvedit_pack_islands_multi(const Scene *scene,
|
|||||||
float matrix[2][2];
|
float matrix[2][2];
|
||||||
float matrix_inverse[2][2];
|
float matrix_inverse[2][2];
|
||||||
float pre_translate[2];
|
float pre_translate[2];
|
||||||
for (int i = 0; i < island_vector.size(); i++) {
|
for (int64_t i : pack_island_vector.index_range()) {
|
||||||
FaceIsland *island = island_vector[box_array[i].index];
|
blender::geometry::PackIsland *pack_island = pack_island_vector[i];
|
||||||
|
FaceIsland *island = island_vector[pack_island->caller_index];
|
||||||
matrix[0][0] = scale[0];
|
matrix[0][0] = scale[0];
|
||||||
matrix[0][1] = 0.0f;
|
matrix[0][1] = 0.0f;
|
||||||
matrix[1][0] = 0.0f;
|
matrix[1][0] = 0.0f;
|
||||||
@ -1434,11 +1436,16 @@ static void uvedit_pack_islands_multi(const Scene *scene,
|
|||||||
/* Add base_offset, post transform. */
|
/* Add base_offset, post transform. */
|
||||||
mul_v2_m2v2(pre_translate, matrix_inverse, base_offset);
|
mul_v2_m2v2(pre_translate, matrix_inverse, base_offset);
|
||||||
|
|
||||||
/* Translate to box_array from bounds_rect. */
|
/* Add pre-translation from #pack_islands. */
|
||||||
blender::geometry::PackIsland *pack_island = pack_island_vector[box_array[i].index];
|
pre_translate[0] += pack_island->pre_translate.x;
|
||||||
pre_translate[0] += box_array[i].x - pack_island->bounds_rect.xmin;
|
pre_translate[1] += pack_island->pre_translate.y;
|
||||||
pre_translate[1] += box_array[i].y - pack_island->bounds_rect.ymin;
|
|
||||||
|
/* Perform the transformation. */
|
||||||
island_uv_transform(island, matrix, pre_translate);
|
island_uv_transform(island, matrix, pre_translate);
|
||||||
|
|
||||||
|
/* Cleanup memory. */
|
||||||
|
pack_island_vector[i] = nullptr;
|
||||||
|
delete pack_island;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||||
@ -1451,14 +1458,6 @@ static void uvedit_pack_islands_multi(const Scene *scene,
|
|||||||
MEM_freeN(island->faces);
|
MEM_freeN(island->faces);
|
||||||
MEM_freeN(island);
|
MEM_freeN(island);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < pack_island_vector.size(); i++) {
|
|
||||||
blender::geometry::PackIsland *pack_island = pack_island_vector[i];
|
|
||||||
pack_island_vector[i] = nullptr;
|
|
||||||
delete pack_island;
|
|
||||||
}
|
|
||||||
|
|
||||||
MEM_freeN(box_array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
#include "BLI_boxpack_2d.h"
|
#include "BLI_math_matrix.hh"
|
||||||
#include "BLI_span.hh"
|
#include "BLI_span.hh"
|
||||||
|
|
||||||
#include "DNA_vec_types.h"
|
#include "DNA_vec_types.h"
|
||||||
@ -46,10 +46,12 @@ namespace blender::geometry {
|
|||||||
class PackIsland {
|
class PackIsland {
|
||||||
public:
|
public:
|
||||||
rctf bounds_rect;
|
rctf bounds_rect;
|
||||||
|
float2 pre_translate; /* Output. */
|
||||||
|
int caller_index; /* Unchanged by #pack_islands, used by caller. */
|
||||||
};
|
};
|
||||||
|
|
||||||
BoxPack *pack_islands(const Span<PackIsland *> &island_vector,
|
void pack_islands(const Span<PackIsland *> &islands,
|
||||||
const UVPackIsland_Params ¶ms,
|
const UVPackIsland_Params ¶ms,
|
||||||
float r_scale[2]);
|
float r_scale[2]);
|
||||||
|
|
||||||
} // namespace blender::geometry
|
} // namespace blender::geometry
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include "BLI_convexhull_2d.h"
|
#include "BLI_convexhull_2d.h"
|
||||||
#include "BLI_listbase.h"
|
#include "BLI_listbase.h"
|
||||||
#include "BLI_math.h"
|
#include "BLI_math.h"
|
||||||
#include "BLI_math_matrix.hh"
|
|
||||||
#include "BLI_rect.h"
|
#include "BLI_rect.h"
|
||||||
#include "BLI_vector.hh"
|
#include "BLI_vector.hh"
|
||||||
|
|
||||||
@ -302,9 +301,9 @@ static float calc_margin_from_aabb_length_sum(const Span<PackIsland *> &island_v
|
|||||||
return params.margin * aabb_length_sum * 0.1f;
|
return params.margin * aabb_length_sum * 0.1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
BoxPack *pack_islands(const Span<PackIsland *> &island_vector,
|
static BoxPack *pack_islands_box_array(const Span<PackIsland *> &island_vector,
|
||||||
const UVPackIsland_Params ¶ms,
|
const UVPackIsland_Params ¶ms,
|
||||||
float r_scale[2])
|
float r_scale[2])
|
||||||
{
|
{
|
||||||
BoxPack *box_array = static_cast<BoxPack *>(
|
BoxPack *box_array = static_cast<BoxPack *>(
|
||||||
MEM_mallocN(sizeof(*box_array) * island_vector.size(), __func__));
|
MEM_mallocN(sizeof(*box_array) * island_vector.size(), __func__));
|
||||||
@ -351,4 +350,20 @@ BoxPack *pack_islands(const Span<PackIsland *> &island_vector,
|
|||||||
return box_array;
|
return box_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pack_islands(const Span<PackIsland *> &islands,
|
||||||
|
const UVPackIsland_Params ¶ms,
|
||||||
|
float r_scale[2])
|
||||||
|
{
|
||||||
|
BoxPack *box_array = pack_islands_box_array(islands, params, r_scale);
|
||||||
|
|
||||||
|
for (int64_t i : islands.index_range()) {
|
||||||
|
BoxPack *box = box_array + i;
|
||||||
|
PackIsland *island = islands[box->index];
|
||||||
|
island->pre_translate.x = box->x - island->bounds_rect.xmin;
|
||||||
|
island->pre_translate.y = box->y - island->bounds_rect.ymin;
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_freeN(box_array);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace blender::geometry
|
} // namespace blender::geometry
|
||||||
|
@ -4167,6 +4167,7 @@ void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
geometry::PackIsland *pack_island = new geometry::PackIsland();
|
geometry::PackIsland *pack_island = new geometry::PackIsland();
|
||||||
|
pack_island->caller_index = i;
|
||||||
pack_island_vector.append(pack_island);
|
pack_island_vector.append(pack_island);
|
||||||
|
|
||||||
float minv[2];
|
float minv[2];
|
||||||
@ -4192,42 +4193,29 @@ void uv_parametrizer_pack(ParamHandle *handle, float margin, bool do_rotate, boo
|
|||||||
params.udim_base_offset[1] = 0.0f;
|
params.udim_base_offset[1] = 0.0f;
|
||||||
|
|
||||||
float scale[2] = {1.0f, 1.0f};
|
float scale[2] = {1.0f, 1.0f};
|
||||||
BoxPack *box_array = pack_islands(pack_island_vector, params, scale);
|
pack_islands(pack_island_vector, params, scale);
|
||||||
|
|
||||||
for (int64_t i : pack_island_vector.index_range()) {
|
for (int64_t i : pack_island_vector.index_range()) {
|
||||||
BoxPack *box = box_array + i;
|
PackIsland *pack_island = pack_island_vector[i];
|
||||||
PackIsland *pack_island = pack_island_vector[box->index];
|
PChart *chart = handle->charts[pack_island->caller_index];
|
||||||
pack_island->bounds_rect.xmin = box->x - pack_island->bounds_rect.xmin;
|
|
||||||
pack_island->bounds_rect.ymin = box->y - pack_island->bounds_rect.ymin;
|
|
||||||
}
|
|
||||||
|
|
||||||
unpacked = 0;
|
|
||||||
for (int i = 0; i < handle->ncharts; i++) {
|
|
||||||
PChart *chart = handle->charts[i];
|
|
||||||
|
|
||||||
if (ignore_pinned && chart->has_pins) {
|
|
||||||
unpacked++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
PackIsland *pack_island = pack_island_vector[i - unpacked];
|
|
||||||
|
|
||||||
/* TODO: Replace with #mul_v2_m2_add_v2v2 here soon. */
|
/* TODO: Replace with #mul_v2_m2_add_v2v2 here soon. */
|
||||||
float m[2];
|
float m[2];
|
||||||
float b[2];
|
float b[2];
|
||||||
m[0] = scale[0];
|
m[0] = scale[0];
|
||||||
m[1] = scale[1];
|
m[1] = scale[1];
|
||||||
b[0] = pack_island->bounds_rect.xmin;
|
b[0] = pack_island->pre_translate.x;
|
||||||
b[1] = pack_island->bounds_rect.ymin;
|
b[1] = pack_island->pre_translate.y;
|
||||||
for (PVert *v = chart->verts; v; v = v->nextlink) {
|
for (PVert *v = chart->verts; v; v = v->nextlink) {
|
||||||
/* Unusual accumulate-and-multiply here (will) reduce round-off error. */
|
/* Unusual accumulate-and-multiply here (will) reduce round-off error. */
|
||||||
v->uv[0] = m[0] * (v->uv[0] + b[0]);
|
v->uv[0] = m[0] * (v->uv[0] + b[0]);
|
||||||
v->uv[1] = m[1] * (v->uv[1] + b[1]);
|
v->uv[1] = m[1] * (v->uv[1] + b[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pack_island_vector[i - unpacked] = nullptr;
|
pack_island_vector[i] = nullptr;
|
||||||
delete pack_island;
|
delete pack_island;
|
||||||
}
|
}
|
||||||
MEM_freeN(box_array);
|
|
||||||
if (handle->aspx != handle->aspy) {
|
if (handle->aspx != handle->aspy) {
|
||||||
uv_parametrizer_scale(handle, handle->aspx, handle->aspy);
|
uv_parametrizer_scale(handle, handle->aspx, handle->aspy);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user