diff options
author | Chris Blackbourn <chrisbblend@gmail.com> | 2022-08-25 08:59:39 +0300 |
---|---|---|
committer | Chris Blackbourn <chrisbblend@gmail.com> | 2022-08-25 09:09:32 +0300 |
commit | de570dc87ed17cae2d2d1ed4347793c440266b4b (patch) | |
tree | fca4937a3b30e4547fd6bd59e28ab2b4446f98dd /release/scripts/modules/bpy_extras | |
parent | f36d8d59c255e627ef981000fde197cf2be84b73 (diff) |
Fix T78406: create uv randomize islands operator
Implement a new operator to randomize the scale, rotation and offset
of selected UV islands.
Diffstat (limited to 'release/scripts/modules/bpy_extras')
-rw-r--r-- | release/scripts/modules/bpy_extras/bmesh_utils.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/release/scripts/modules/bpy_extras/bmesh_utils.py b/release/scripts/modules/bpy_extras/bmesh_utils.py new file mode 100644 index 00000000000..baf1f9d863f --- /dev/null +++ b/release/scripts/modules/bpy_extras/bmesh_utils.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +__all__ = ( + "bmesh_linked_uv_islands", +) + +import bmesh + +def match_uv(face, vert, uv, uv_layer): + for loop in face.loops: + if loop.vert == vert: + return uv == loop[uv_layer].uv + return False + + +def bmesh_linked_uv_islands(bm, uv_layer): + """ + Returns lists of face indices connected by UV islands. + + For `bpy.types.Mesh`, use `mesh_linked_uv_islands` instead. + + :arg bm: the bmesh used to group with. + :type bmesh: :class: `BMesh` + :arg uv_layer: the UV layer to source UVs from. + :type bmesh: :class: `BMLayerItem` + :return: list of lists containing polygon indices + :rtype: list + """ + + result = [] + bm.faces.ensure_lookup_table() + + used = {} + for seed_face in bm.faces: + seed_index = seed_face.index + if used.get(seed_index): + continue # Face has already been processed. + used[seed_index] = True + island = [seed_index] + stack = [seed_face] # Faces still to consider on this island. + while stack: + current_face = stack.pop() + for loop in current_face.loops: + v = loop.vert + uv = loop[uv_layer].uv + for f in v.link_faces: + if used.get(f.index): + continue + if not match_uv(f, v, uv, uv_layer): + continue + + # `f` is part of island, add to island and stack + used[f.index] = True + island.append(f.index) + stack.append(f) + result.append(island) + + return result |