[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41940] branches/bmesh/blender: Add access to UVs from python, patch python unwrap scripts to work wtih ngons

Andrew Wiggin ender79bl at gmail.com
Thu Nov 17 06:03:13 CET 2011


Revision: 41940
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41940
Author:   ender79
Date:     2011-11-17 05:03:07 +0000 (Thu, 17 Nov 2011)
Log Message:
-----------
Add access to UVs from python, patch python unwrap scripts to work wtih ngons

Modified Paths:
--------------
    branches/bmesh/blender/release/scripts/modules/bpy_extras/mesh_utils.py
    branches/bmesh/blender/release/scripts/modules/bpy_types.py
    branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_follow_active.py
    branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_lightmap.py
    branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_smart_project.py
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/bmesh/blender/release/scripts/modules/bpy_extras/mesh_utils.py
===================================================================
--- branches/bmesh/blender/release/scripts/modules/bpy_extras/mesh_utils.py	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/release/scripts/modules/bpy_extras/mesh_utils.py	2011-11-17 05:03:07 UTC (rev 41940)
@@ -140,8 +140,7 @@
     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]])

Modified: branches/bmesh/blender/release/scripts/modules/bpy_types.py
===================================================================
--- branches/bmesh/blender/release/scripts/modules/bpy_types.py	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/release/scripts/modules/bpy_types.py	2011-11-17 05:03:07 UTC (rev 41940)
@@ -442,7 +442,21 @@
                     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__ = ()
 

Modified: branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_follow_active.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_follow_active.py	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_follow_active.py	2011-11-17 05:03:07 UTC (rev 41940)
@@ -30,6 +30,7 @@
 
     me = obj.data
     me_verts = me.vertices
+
     # script will fail without UVs
     if not me.uv_textures:
         me.uv_textures.new()
@@ -52,18 +53,16 @@
         '''
 
         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]
+        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]
 
-        faceUVtarget = me.uv_textures.active.data[face_target.index]
-        uvs_target = [faceUVtarget.uv1, faceUVtarget.uv2, faceUVtarget.uv3, faceUVtarget.uv4]
-
         # vertex index is the key, uv is the value
 
         uvs_vhash_source = {vindex: uvs_source[i] for i, vindex in enumerate(vidx_source)}
@@ -135,15 +134,12 @@
             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):

Modified: branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_lightmap.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_lightmap.py	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_lightmap.py	2011-11-17 05:03:07 UTC (rev 41940)
@@ -88,8 +88,8 @@
             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 @@
                 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 @@
         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 @@
         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 @@
 
             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 @@
         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")

Modified: branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_smart_project.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_smart_project.py	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/release/scripts/startup/bl_operators/uvcalc_smart_project.py	2011-11-17 05:03:07 UTC (rev 41940)
@@ -756,13 +756,10 @@
 
 
 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 @@
         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

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2011-11-17 05:03:07 UTC (rev 41940)
@@ -292,6 +292,7 @@
 
 int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me, const char *name, int active_set);
 int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
+int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me);
 int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
 int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
 int ED_mesh_color_remove_named(struct bContext *C, struct Object *ob, struct Mesh *me, const char *name);

Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c	2011-11-17 04:05:54 UTC (rev 41939)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c	2011-11-17 05:03:07 UTC (rev 41940)
@@ -42,6 +42,7 @@
 #include "DNA_view3d_types.h"
 
 #include "BLI_utildefines.h"
+#include "BLI_array.h"
 #include "BLI_math.h"
 #include "BLI_editVert.h"
 #include "BLI_edgehash.h"
@@ -200,6 +201,112 @@
 #endif
 }
 
+int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me)
+{
+	BMEditMesh *em= me->edit_btmesh;
+	MLoopUV *luv;
+	BLI_array_declare(polylengths);
+	int *polylengths = NULL;
+	BLI_array_declare(uvs);
+	float **uvs = NULL;
+	float **fuvs = NULL;
+	int i, j;
+
+	if (em) {
+		/* Collect BMesh UVs */
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list