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:
authorCampbell Barton <ideasman42@gmail.com>2012-06-25 11:24:01 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-06-25 11:24:01 +0400
commitf6337a2843b2686fea49df60562c28ed7490ebcd (patch)
tree9241934b2cfc49eea9ec08e2e707f2ba006a7e6d /release/scripts/modules/bpy_extras
parent49e0175e4018930c906cca1eda14c10cbf71bd24 (diff)
utility mesh function to return UV islands
Diffstat (limited to 'release/scripts/modules/bpy_extras')
-rw-r--r--release/scripts/modules/bpy_extras/mesh_utils.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py
index fa83b1861d2..efd69f91a8b 100644
--- a/release/scripts/modules/bpy_extras/mesh_utils.py
+++ b/release/scripts/modules/bpy_extras/mesh_utils.py
@@ -19,6 +19,7 @@
# <pep8-80 compliant>
__all__ = (
+ "mesh_linked_uv_islands",
"mesh_linked_tessfaces",
"edge_face_count_dict",
"edge_face_count",
@@ -29,6 +30,66 @@ __all__ = (
)
+def mesh_linked_uv_islands(mesh):
+ """
+ Splits the mesh into connected polygons, use this for seperating cubes from
+ other mesh elements within 1 mesh datablock.
+
+ :arg mesh: the mesh used to group with.
+ :type mesh: :class:`bpy.types.Mesh`
+ :return: lists of lists containing polygon indices
+ :rtype: list
+ """
+ uv_loops = [luv.uv[:] for luv in mesh.uv_layers.active.data]
+ poly_loops = [poly.loop_indices for poly in mesh.polygons]
+ luv_hash = {}
+ luv_hash_get = luv_hash.get
+ luv_hash_ls = [None] * len(uv_loops)
+ for pi, poly_indices in enumerate(poly_loops):
+ for li in poly_indices:
+ uv = uv_loops[li]
+ uv_hub = luv_hash_get(uv)
+ if uv_hub is None:
+ uv_hub = luv_hash[uv] = [pi]
+ else:
+ uv_hub.append(pi)
+ luv_hash_ls[li] = uv_hub
+
+ poly_islands = []
+
+ # 0 = none, 1 = added, 2 = searched
+ poly_tag = [0] * len(poly_loops)
+
+ while True:
+ poly_index = -1
+ for i in range(len(poly_loops)):
+ if poly_tag[i] == 0:
+ poly_index = i
+ break
+
+ if poly_index != -1:
+ island = [poly_index]
+ poly_tag[poly_index] = 1
+ poly_islands.append(island)
+ else:
+ break # we're done
+
+ added = True
+ while added:
+ added = False
+ for poly_index in island[:]:
+ if poly_tag[poly_index] == 1:
+ for li in poly_loops[poly_index]:
+ for poly_index_shared in luv_hash_ls[li]:
+ if poly_tag[poly_index_shared] == 0:
+ added = True
+ poly_tag[poly_index_shared] = 1
+ island.append(poly_index_shared)
+ poly_tag[poly_index] = 2
+
+ return poly_islands
+
+
def mesh_linked_tessfaces(mesh):
"""
Splits the mesh into connected faces, use this for seperating cubes from