Cleanup: simplify uv packing api
Affects paint.add_simple_uvs No user visible changes. Differential Revision: https://developer.blender.org/D16231
This commit is contained in:
parent
057e99d6df
commit
4767a8eb4a
|
@ -361,9 +361,24 @@ struct UVPackIsland_Params {
|
|||
bool uv_coords_isect_udim(const struct Image *image,
|
||||
const int udim_grid[2],
|
||||
const float coords[2]);
|
||||
|
||||
/**
|
||||
* Pack UV islands from multiple objects.
|
||||
*
|
||||
* \param scene: Scene containing the objects to be packed.
|
||||
* \param objects: Array of Objects to pack.
|
||||
* \param objects_len: Length of `objects` array.
|
||||
* \param bmesh_override: BMesh array aligned with `objects`.
|
||||
* Optional, when non-null this overrides object's BMesh.
|
||||
* This is needed to perform UV packing on objects that aren't in edit-mode.
|
||||
* \param udim_params: Parameters to specify UDIM target and UDIM source image.
|
||||
* \param params: Parameters and options to pass to the packing engine.
|
||||
*
|
||||
*/
|
||||
void ED_uvedit_pack_islands_multi(const struct Scene *scene,
|
||||
Object **objects,
|
||||
uint objects_len,
|
||||
struct BMesh **bmesh_override,
|
||||
const struct UVMapUDIM_Params *udim_params,
|
||||
const struct UVPackIsland_Params *params);
|
||||
|
||||
|
|
|
@ -609,6 +609,7 @@ static BoxPack *pack_islands_params(const blender::Vector<FaceIsland *> &island_
|
|||
void ED_uvedit_pack_islands_multi(const Scene *scene,
|
||||
Object **objects,
|
||||
const uint objects_len,
|
||||
BMesh **bmesh_override,
|
||||
const struct UVMapUDIM_Params *udim_params,
|
||||
const struct UVPackIsland_Params *params)
|
||||
{
|
||||
|
@ -616,9 +617,17 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
|
|||
|
||||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
|
||||
BMesh *bm = nullptr;
|
||||
if (bmesh_override) {
|
||||
/* Note: obedit is still required for aspect ratio and ID_RECALC_GEOMETRY. */
|
||||
bm = bmesh_override[ob_index];
|
||||
}
|
||||
else {
|
||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
bm = em->bm;
|
||||
}
|
||||
BLI_assert(bm);
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
if (cd_loop_uv_offset == -1) {
|
||||
continue;
|
||||
}
|
||||
|
@ -634,7 +643,7 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
|
|||
|
||||
ListBase island_list = {nullptr};
|
||||
bm_mesh_calc_uv_islands(scene,
|
||||
em->bm,
|
||||
bm,
|
||||
&island_list,
|
||||
params->only_selected_faces,
|
||||
params->only_selected_uvs,
|
||||
|
|
|
@ -1050,25 +1050,6 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
|
|||
/** \name Pack UV Islands Operator
|
||||
* \{ */
|
||||
|
||||
static void uvedit_pack_islands(const Scene *scene, Object *ob, BMesh *bm)
|
||||
{
|
||||
const UnwrapOptions options = {
|
||||
.topology_from_uvs = true,
|
||||
.only_selected_faces = false,
|
||||
.only_selected_uvs = true,
|
||||
.fill_holes = false,
|
||||
.correct_aspect = false,
|
||||
};
|
||||
|
||||
bool rotate = true;
|
||||
bool ignore_pinned = false;
|
||||
|
||||
ParamHandle *handle = construct_param_handle(scene, ob, bm, &options, NULL);
|
||||
GEO_uv_parametrizer_pack(handle, scene->toolsettings->uvcalc_margin, rotate, ignore_pinned);
|
||||
GEO_uv_parametrizer_flush(handle);
|
||||
GEO_uv_parametrizer_delete(handle);
|
||||
}
|
||||
|
||||
/**
|
||||
* \warning Since this uses #ParamHandle it doesn't work with non-manifold meshes (see T82637).
|
||||
* Use #ED_uvedit_pack_islands_multi for a more general solution.
|
||||
|
@ -1147,7 +1128,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
|
|||
.margin = RNA_float_get(op->ptr, "margin"),
|
||||
};
|
||||
ED_uvedit_pack_islands_multi(
|
||||
scene, objects, objects_len, use_udim_params ? &udim_params : NULL, ¶ms);
|
||||
scene, objects, objects_len, NULL, use_udim_params ? &udim_params : NULL, ¶ms);
|
||||
|
||||
MEM_freeN(objects);
|
||||
return OPERATOR_FINISHED;
|
||||
|
@ -2439,7 +2420,7 @@ static int smart_project_exec(bContext *C, wmOperator *op)
|
|||
.margin_method = RNA_enum_get(op->ptr, "margin_method"),
|
||||
.margin = RNA_float_get(op->ptr, "island_margin"),
|
||||
};
|
||||
ED_uvedit_pack_islands_multi(scene, objects_changed, object_changed_len, NULL, ¶ms);
|
||||
ED_uvedit_pack_islands_multi(scene, objects_changed, object_changed_len, NULL, NULL, ¶ms);
|
||||
|
||||
/* #ED_uvedit_pack_islands_multi only supports `per_face_aspect = false`. */
|
||||
const bool per_face_aspect = false;
|
||||
|
@ -3180,13 +3161,24 @@ void ED_uvedit_add_simple_uvs(Main *bmain, const Scene *scene, Object *ob)
|
|||
.calc_face_normal = true,
|
||||
.calc_vert_normal = true,
|
||||
}));
|
||||
/* select all uv loops first - pack parameters needs this to make sure charts are registered */
|
||||
/* Select all UVs for cube_project. */
|
||||
ED_uvedit_select_all(bm);
|
||||
/* A cube size of 2.0 maps [-1..1] vertex coords to [0.0..1.0] in UV coords. */
|
||||
uvedit_unwrap_cube_project(scene, bm, 2.0, false, false, NULL);
|
||||
/* Set the margin really quickly before the packing operation. */
|
||||
scene->toolsettings->uvcalc_margin = 0.001f;
|
||||
uvedit_pack_islands(scene, ob, bm);
|
||||
|
||||
/* Pack UVs. */
|
||||
const struct UVPackIsland_Params params = {
|
||||
.rotate = true,
|
||||
.only_selected_uvs = false,
|
||||
.only_selected_faces = false,
|
||||
.correct_aspect = false,
|
||||
.use_seams = true,
|
||||
.margin_method = ED_UVPACK_MARGIN_SCALED,
|
||||
.margin = 0.001f,
|
||||
};
|
||||
ED_uvedit_pack_islands_multi(scene, &ob, 1, &bm, NULL, ¶ms);
|
||||
|
||||
/* Write back from BMesh to Mesh. */
|
||||
BM_mesh_bm_to_me(bmain, bm, me, (&(struct BMeshToMeshParams){0}));
|
||||
BM_mesh_free(bm);
|
||||
|
||||
|
|
Loading…
Reference in New Issue