[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57244] trunk/blender: fix [#35453] " copy mirrored uv coords" doesn't work

Campbell Barton ideasman42 at gmail.com
Wed Jun 5 05:10:31 CEST 2013


Revision: 57244
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57244
Author:   campbellbarton
Date:     2013-06-05 03:10:29 +0000 (Wed, 05 Jun 2013)
Log Message:
-----------
fix [#35453] "copy mirrored uv coords" doesn't work

- made precision configurable.
- report a warning when doubles are found since they cause problems.

added Polygon.center attribute to avoid calculating in python.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_operators/mesh.py
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/modifiers/intern/MOD_uvwarp.c

Modified: trunk/blender/release/scripts/startup/bl_operators/mesh.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_operators/mesh.py	2013-06-04 22:30:41 UTC (rev 57243)
+++ trunk/blender/release/scripts/startup/bl_operators/mesh.py	2013-06-05 03:10:29 UTC (rev 57244)
@@ -21,7 +21,7 @@
 import bpy
 from bpy.types import Operator
 
-from bpy.props import EnumProperty
+from bpy.props import EnumProperty, IntProperty
 
 
 class MeshMirrorUV(Operator):
@@ -36,6 +36,14 @@
                    ('NEGATIVE', "Negative", "")),
             )
 
+    precision = IntProperty(
+            name="Precision",
+            description=("Tolerance for finding vertex duplicates"),
+            min=1, max=16,
+            soft_min=1, soft_max=16,
+            default=3,
+            )
+
     @classmethod
     def poll(cls, context):
         obj = context.active_object
@@ -43,6 +51,8 @@
 
     def execute(self, context):
         DIR = (self.direction == 'NEGATIVE')
+        precision = self.precision
+        double_warn = 0
 
         ob = context.active_object
         is_editmode = (ob.mode == 'EDIT')
@@ -55,12 +65,14 @@
         mirror_gt = {}
         mirror_lt = {}
 
-        vcos = (v.co.to_tuple(5) for v in mesh.vertices)
+        vcos = (v.co.to_tuple(precision) for v in mesh.vertices)
 
         for i, co in enumerate(vcos):
             if co[0] >= 0.0:
+                double_warn += co in mirror_gt
                 mirror_gt[co] = i
             if co[0] <= 0.0:
+                double_warn += co in mirror_lt
                 mirror_lt[co] = i
 
         #for i, v in enumerate(mesh.vertices):
@@ -95,10 +107,7 @@
                          (uv.select for uv in uv_loops[lstart:lend]))
             # Vert idx of the poly.
             vidxs[i] = tuple(l.vertex_index for l in loops[lstart:lend])
-            # As we have no poly.center yet...
-            pcents[i] = tuple(map(lambda x: x / p.loop_total,
-                                  map(sum, zip(*(verts[idx].co
-                                                 for idx in vidxs[i])))))
+            pcents[i] = p.center
             # Preparing next step finding matching polys.
             mirror_pm[tuple(sorted(vidxs[i]))] = i
 
@@ -135,4 +144,9 @@
         if is_editmode:
             bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 
+        if double_warn:
+            self.report({'WARNING'},
+                        "%d duplicates found, mirror may be incomplete" %
+                        double_warn)
+
         return {'FINISHED'}

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-06-04 22:30:41 UTC (rev 57243)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-06-05 03:10:29 UTC (rev 57244)
@@ -326,10 +326,17 @@
 	Mesh *me = rna_mesh(ptr);
 	MPoly *mp = (MPoly *)ptr->data;
 
-	/* BMESH_TODO: might be faster to look for a CD_NORMALS layer and use that */
 	BKE_mesh_calc_poly_normal(mp, me->mloop + mp->loopstart, me->mvert, values);
 }
 
+static void rna_MeshPolygon_center_get(PointerRNA *ptr, float *values)
+{
+	Mesh *me = rna_mesh(ptr);
+	MPoly *mp = (MPoly *)ptr->data;
+
+	BKE_mesh_calc_poly_center(mp, me->mloop + mp->loopstart, me->mvert, values);
+}
+
 static float rna_MeshPolygon_area_get(PointerRNA *ptr)
 {
 	Mesh *me = (Mesh *)ptr->id.data;
@@ -1880,6 +1887,12 @@
 	RNA_def_property_float_funcs(prop, "rna_MeshPolygon_normal_get", NULL, NULL);
 	RNA_def_property_ui_text(prop, "Face normal", "Local space unit length normal vector for this polygon");
 
+	prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_array(prop, 3);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_float_funcs(prop, "rna_MeshPolygon_center_get", NULL, NULL);
+	RNA_def_property_ui_text(prop, "Face center", "Center of the polygon");
+
 	prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_float_funcs(prop, "rna_MeshPolygon_area_get", NULL, NULL);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_uvwarp.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_uvwarp.c	2013-06-04 22:30:41 UTC (rev 57243)
+++ trunk/blender/source/blender/modifiers/intern/MOD_uvwarp.c	2013-06-05 03:10:29 UTC (rev 57244)
@@ -105,7 +105,10 @@
 	}
 }
 
-#define OMP_LIMIT 1000
+#ifdef _OPENMP
+#  define OMP_LIMIT 1000
+#endif
+
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                                   DerivedMesh *dm,
                                   ModifierApplyFlag UNUSED(flag))




More information about the Bf-blender-cvs mailing list