Fix T78406: create uv randomize islands operator
Implement a new operator to randomize the scale, rotation and offset of selected UV islands.
This commit is contained in:
58
release/scripts/modules/bpy_extras/bmesh_utils.py
Normal file
58
release/scripts/modules/bpy_extras/bmesh_utils.py
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user