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:
authorAndrew Wiggin <ender79bl@gmail.com>2011-11-17 09:03:07 +0400
committerAndrew Wiggin <ender79bl@gmail.com>2011-11-17 09:03:07 +0400
commit1038c76c551be5f8d4b083f05fd2ed06f16c767a (patch)
treee73aca7bfd4b5508d1eb62f34acb939daf1b48f3 /release/scripts
parent3ed866d2fc69e7c398e4b5f9bc9e2c06758d06cf (diff)
Add access to UVs from python, patch python unwrap scripts to work wtih ngons
Diffstat (limited to 'release/scripts')
-rw-r--r--release/scripts/modules/bpy_extras/mesh_utils.py3
-rw-r--r--release/scripts/modules/bpy_types.py14
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py20
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py25
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py15
5 files changed, 42 insertions, 35 deletions
diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py
index 8149675000f..1f37447a68e 100644
--- a/release/scripts/modules/bpy_extras/mesh_utils.py
+++ b/release/scripts/modules/bpy_extras/mesh_utils.py
@@ -140,8 +140,7 @@ def edge_loops_from_faces(mesh, faces=None, seams=()):
edges = {}
for f in faces:
-# if len(f) == 4:
- if f.vertices_raw[3] != 0:
+ if len(f.vertices) == 4:
edge_keys = f.edge_keys
for i, edkey in enumerate(f.edge_keys):
edges.setdefault(edkey, []).append(edge_keys[OTHER_INDEX[i]])
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index bb1e9988ec2..eeb8f375c3d 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -442,6 +442,20 @@ class MeshFace(StructRNA):
ord_ind(verts[3], verts[0]),
)
+class MeshPolygon(StructRNA):
+ __slots__ = ()
+
+ @property
+ def edge_keys(self):
+ verts = self.vertices[:]
+ vlen = len(self.vertices)
+ return [ord_ind(verts[i], verts[(i+1) % vlen]) for i in range(vlen)]
+
+ @property
+ def loops(self):
+ start = self.loop_start
+ end = start + self.loop_total
+ return range(start, end)
class Text(bpy_types.ID):
__slots__ = ()
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
index 919677fff8b..338dc1a2a1e 100644
--- a/release/scripts/startup/bl_operators/uvcalc_follow_active.py
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -30,6 +30,7 @@ def extend(obj, operator, EXTEND_MODE):
me = obj.data
me_verts = me.vertices
+
# script will fail without UVs
if not me.uv_textures:
me.uv_textures.new()
@@ -52,17 +53,15 @@ def extend(obj, operator, EXTEND_MODE):
'''
def face_edge_vs(vi):
- # assume a quad
- return [(vi[0], vi[1]), (vi[1], vi[2]), (vi[2], vi[3]), (vi[3], vi[0])]
+ vlen = len(vi)
+ return [(vi[i], vi[(i+1) % vlen]) for i in range(vlen)]
vidx_source = face_source.vertices
vidx_target = face_target.vertices
- faceUVsource = me.uv_textures.active.data[face_source.index]
- uvs_source = [faceUVsource.uv1, faceUVsource.uv2, faceUVsource.uv3, faceUVsource.uv4]
-
- faceUVtarget = me.uv_textures.active.data[face_target.index]
- uvs_target = [faceUVtarget.uv1, faceUVtarget.uv2, faceUVtarget.uv3, faceUVtarget.uv4]
+ uv_layer = me.uv_loop_layers.active.data
+ uvs_source = [uv_layer[i].uv for i in face_source.loops]
+ uvs_target = [uv_layer[i].uv for i in face_target.loops]
# vertex index is the key, uv is the value
@@ -135,15 +134,12 @@ def extend(obj, operator, EXTEND_MODE):
uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
- if not me.uv_textures:
- me.uv_textures.new()
-
- face_act = me.faces.active
+ face_act = me.polygons.active
if face_act == -1:
operator.report({'ERROR'}, "No active face")
return
- face_sel = [f for f in me.faces if len(f.vertices) == 4 and f.select]
+ face_sel = [f for f in me.polygons if len(f.vertices) == 4 and f.select]
face_act_local_index = -1
for i, f in enumerate(face_sel):
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index ae4add72a08..cb3cf9a88d1 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -88,8 +88,8 @@ class prettyface(object):
self.children = []
else: # blender face
- # self.uv = data.uv
- self.uv = data.id_data.uv_textures.active.data[data.index].uv # XXX25
+ uv_layer = data.id_data.uv_loop_layers.active.data
+ self.uv = [uv_layer[i].uv for i in data.loops]
# cos = [v.co for v in data]
cos = [data.id_data.vertices[v].co for v in data.vertices] # XXX25
@@ -158,7 +158,8 @@ class prettyface(object):
I = [i for a, i in angles_co]
#~ fuv = f.uv
- fuv = f.id_data.uv_textures.active.data[f.index].uv # XXX25
+ uv_layer = f.id_data.uv_loop_layers.active.data
+ fuv = [uv_layer[i].uv for i in f.loops] # XXX25
if self.rot:
fuv[I[2]] = p1
@@ -219,15 +220,10 @@ def lightmap_uvpack(meshes,
face_groups = []
for me in meshes:
- # Add face UV if it does not exist.
- # All new faces are selected.
- if not me.uv_textures:
- me.uv_textures.new()
-
if PREF_SEL_ONLY:
- faces = [f for f in me.faces if f.select]
+ faces = [f for f in me.polygons if f.select]
else:
- faces = me.faces[:]
+ faces = me.polygons[:]
if PREF_PACK_IN_ONE:
face_groups[0].extend(faces)
@@ -237,6 +233,11 @@ def lightmap_uvpack(meshes,
if PREF_NEW_UVLAYER:
me.uv_textures.new()
+ # Add face UV if it does not exist.
+ # All new faces are selected.
+ if not me.uv_textures:
+ me.uv_textures.new()
+
for face_sel in face_groups:
print("\nStarting unwrap")
@@ -504,7 +505,7 @@ def lightmap_uvpack(meshes,
for f in face_sel:
# f.image = image
- f.id_data.uv_textures.active.data[f.index].image = image # XXX25
+ f.id_data.uv_loop_layers.active.data[f.index].image = image # XXX25
for me in meshes:
me.update()
@@ -528,7 +529,7 @@ def unwrap(operator, context, **kwargs):
if obj and obj.type == 'MESH':
meshes = [obj.data]
else:
- meshes = list({me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if me.faces and me.library is None})
+ meshes = list({me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if me.polygons and me.library is None})
if not meshes:
operator.report({'ERROR'}, "No mesh object")
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
index 17e353ff238..4a78d8fc9be 100644
--- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -756,13 +756,10 @@ def VectoQuat(vec):
class thickface(object):
- __slost__= 'v', 'uv', 'no', 'area', 'edge_keys'
- def __init__(self, face, uvface, mesh_verts):
+ __slots__= ('v', 'uv', 'no', 'area', 'edge_keys')
+ def __init__(self, face, uv_layer, mesh_verts):
self.v = [mesh_verts[i] for i in face.vertices]
- if len(self.v)==4:
- self.uv = uvface.uv1, uvface.uv2, uvface.uv3, uvface.uv4
- else:
- self.uv = uvface.uv1, uvface.uv2, uvface.uv3
+ self.uv = [uv_layer[i].uv for i in face.loops]
self.no = face.normal
self.area = face.area
@@ -892,13 +889,13 @@ def main(context,
if not me.uv_textures: # Mesh has no UV Coords, don't bother.
me.uv_textures.new()
- uv_layer = me.uv_textures.active.data
+ uv_layer = me.uv_loop_layers.active.data
me_verts = list(me.vertices)
if USER_ONLY_SELECTED_FACES:
- meshFaces = [thickface(f, uv_layer[i], me_verts) for i, f in enumerate(me.faces) if f.select]
+ meshFaces = [thickface(f, uv_layer, me_verts) for i, f in enumerate(me.polygons) if f.select]
else:
- meshFaces = [thickface(f, uv_layer[i], me_verts) for i, f in enumerate(me.faces)]
+ meshFaces = [thickface(f, uv_layer, me_verts) for i, f in enumerate(me.polygons)]
if not meshFaces:
continue