61 luv->
uv[1] *= scale_y;
62 }
while ((l_iter = l_iter->
next) != l_first);
66 const float offset[2],
69 const int cd_loop_uv_offset)
76 for (
int i = 0; i < 2; i++) {
77 luv->
uv[i] = offset[i] + (((luv->
uv[i] - pivot[i]) * scale[i]) + pivot[i]);
79 }
while ((l_iter = l_iter->
next) != l_first);
90 const uint cd_loop_uv_offset,
93 float bounds_min[2], bounds_max[2];
95 for (
int i = 0; i < faces_len; i++) {
99 r_bounds_rect->
xmin = bounds_min[0];
100 r_bounds_rect->
ymin = bounds_min[1];
101 r_bounds_rect->
xmax = bounds_max[0];
102 r_bounds_rect->
ymax = bounds_max[1];
110 BMFace **
faces,
int faces_len,
const uint cd_loop_uv_offset,
int *r_coords_len))[2]
112 int coords_len_alloc = 0;
113 for (
int i = 0; i < faces_len; i++) {
119 }
while ((l_iter = l_iter->
next) != l_first);
120 coords_len_alloc += f->
len;
123 float(*coords)[2] =
MEM_mallocN(
sizeof(*coords) * coords_len_alloc, __func__);
126 for (
int i = 0; i < faces_len; i++) {
150 if (l_radial->
v == l_iter->
v) {
162 }
while ((l_iter = l_iter->
next) != l_first);
164 coords =
MEM_reallocN(coords,
sizeof(*coords) * coords_len);
165 *r_coords_len = coords_len;
178 const uint cd_loop_uv_offset)
183 faces, faces_len, cd_loop_uv_offset, &coords_len);
187 if (align_to_axis != -1) {
191 for (
int i = 0; i < coords_len; i++) {
196 float bounds_min[2], bounds_max[2];
198 for (
int i = 0; i < coords_len; i++) {
214 for (
int i = 0; i < faces_len; i++) {
223 const uint cd_loop_uv_offset)
225 for (
int i = 0; i < faces_len; i++) {
261 if (
data->use_seams) {
276 const bool only_selected_faces,
277 const bool only_selected_uvs,
279 const float aspect_y,
282 int island_added = 0;
292 int(*group_index)[2];
295 uchar hflag_face_test = 0;
296 if (only_selected_faces) {
297 if (only_selected_uvs) {
324 for (
int i = 0; i < group_len; i++) {
325 const int faces_start = group_index[i][0];
326 const int faces_len = group_index[i][1];
329 float bounds_min[2], bounds_max[2];
332 for (
int j = 0; j < faces_len; j++) {
360 const uint objects_len,
364 const int rotate_align_axis = 1;
366 int island_list_len = 0;
368 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
369 Object *obedit = objects[ob_index];
379 if (
params->correct_aspect) {
390 params->only_selected_faces,
391 params->only_selected_uvs,
397 if (island_list_len == 0) {
412 if (island->aspect_y != 1.0f) {
414 island->faces, island->faces_len, 1.0f / island->aspect_y, island->cd_loop_uv_offset);
418 island->faces, island->faces_len, rotate_align_axis, island->cd_loop_uv_offset);
420 if (island->aspect_y != 1.0f) {
422 island->faces, island->faces_len, island->aspect_y, island->cd_loop_uv_offset);
427 island->faces, island->faces_len, island->cd_loop_uv_offset, &island->bounds_rect);
429 BoxPack *box = &boxarray[index];
436 island_array[index] = island;
448 for (
int i = 0; i < island_list_len; i++) {
458 float boxarray_size[2];
459 BLI_box_pack_2d(boxarray, island_list_len, &boxarray_size[0], &boxarray_size[1]);
462 boxarray_size[0] = boxarray_size[1] =
max_ff(boxarray_size[0], boxarray_size[1]);
464 const float scale[2] = {1.0f / boxarray_size[0], 1.0f / boxarray_size[1]};
466 for (
int i = 0; i < island_list_len; i++) {
468 const float pivot[2] = {
472 const float offset[2] = {
476 for (
int j = 0; j < island->
faces_len; j++) {
483 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
484 Object *obedit = objects[ob_index];
489 for (
int i = 0; i < island_list_len; i++) {
typedef float(TangentPoint)[2]
int CustomData_get_offset(const struct CustomData *data, int type)
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
void BLI_box_pack_2d(BoxPack *boxarray, const unsigned int len, float *r_tot_x, float *r_tot_y)
float BLI_convexhull_aabb_fit_points_2d(const float(*points)[2], unsigned int n)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
void mul_m2_v2(const float M[2][2], float v[2])
void angle_to_mat2(float R[2][2], const float angle)
MINLINE void copy_v2_v2(float r[2], const float a[2])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
void BLI_rctf_pad(struct rctf *rect, float pad_x, float pad_y)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
#define INIT_MINMAX2(min, max)
typedef double(DMatrix)[4][4]
void DEG_id_tag_update(struct ID *id, int flag)
bool uvedit_face_select_test(const struct Scene *scene, struct BMFace *efa, const int cd_loop_uv_offset)
void ED_uvedit_get_aspect(struct Object *obedit, float *r_aspx, float *r_aspy)
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define BM_DISK_EDGE_NEXT(e, v)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
BLI_INLINE BMFace * BM_face_at_index(BMesh *bm, const int index)
int BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int(**r_group_index)[2], BMLoopFilterFunc filter_fn, BMLoopPairFilterFunc filter_pair_fn, void *user_data, const char hflag_test, const char htype_step)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
void BM_face_uv_transform(BMFace *f, const float matrix[2][2], const int cd_loop_uv_offset)
bool BM_loop_uv_share_edge_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
void BM_face_uv_minmax(const BMFace *f, float min[2], float max[2], const int cd_loop_uv_offset)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static void area(int d1, int d2, int e1, int e2, float weights[2])
struct BMLoop * radial_next
struct ToolSettings * toolsettings
void ED_uvedit_pack_islands_multi(const Scene *scene, Object **objects, const uint objects_len, const struct UVPackIsland_Params *params)
static void bm_face_array_uv_rotate_fit_aabb(BMFace **faces, int faces_len, int align_to_axis, const uint cd_loop_uv_offset)
static void bm_face_uv_scale_y(BMFace *f, const float scale_y, const int cd_loop_uv_offset)
static void bm_face_array_uv_scale_y(BMFace **faces, int faces_len, const float scale_y, const uint cd_loop_uv_offset)
static bool bm_loop_uv_shared_edge_check(const BMLoop *l_a, const BMLoop *l_b, void *user_data)
static void bm_face_uv_translate_and_scale_around_pivot(BMFace *f, const float offset[2], const float scale[2], const float pivot[2], const int cd_loop_uv_offset)
static void bm_face_array_calc_bounds(BMFace **faces, int faces_len, const uint cd_loop_uv_offset, rctf *r_bounds_rect)
static int bm_mesh_calc_uv_islands(const Scene *scene, BMesh *bm, ListBase *island_list, const bool only_selected_faces, const bool only_selected_uvs, const bool use_seams, const float aspect_y, const uint cd_loop_uv_offset)
static float(* bm_face_array_calc_unique_uv_coords(BMFace **faces, int faces_len, const uint cd_loop_uv_offset, int *r_coords_len))[2]
void WM_main_add_notifier(unsigned int type, void *reference)