Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Blackbourn <chrisbblend@gmail.com>2022-08-25 08:59:39 +0300
committerChris Blackbourn <chrisbblend@gmail.com>2022-08-25 09:09:32 +0300
commitde570dc87ed17cae2d2d1ed4347793c440266b4b (patch)
treefca4937a3b30e4547fd6bd59e28ab2b4446f98dd /release/scripts/modules/bpy_extras
parentf36d8d59c255e627ef981000fde197cf2be84b73 (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.py58
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