Commit: 1ef3f9c6a825e980ba97c6bd285ef59359676a99
Author: Antony Riakiotakis
Date:   Wed May 21 19:04:03 2014 +0200
https://developer.blender.org/rB1ef3f9c6a825e980ba97c6bd285ef59359676a99

Merge branch 'master' into soc-2013-paint

Conflicts:
        source/blender/editors/sculpt_paint/paint_image_proj.c

===================================================================



===================================================================

diff --cc source/blender/editors/sculpt_paint/paint_image_proj.c
index f20a9bd,53435b6..df0fb92
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@@ -874,6 -840,21 +879,21 @@@ static bool pixel_bounds_array(float (*
  
  #ifndef PROJ_DEBUG_NOSEAMBLEED
  
+ static void project_face_winding_init(const ProjPaintState *ps, const int 
face_index)
+ {
+       /* detect the winding of faces in uv space */
 -      MTFace *tf = ps->dm_mtface + face_index;
++      MTFace *tf = ps->dm_mtface[face_index];
+       float winding = cross_tri_v2(tf->uv[0], tf->uv[1], tf->uv[2]);
+ 
+       if (ps->dm_mface[face_index].v4)
+               winding += cross_tri_v2(tf->uv[2], tf->uv[3], tf->uv[0]);
+ 
+       if (winding > 0)
+               ps->faceWindingFlags[face_index] |= PROJ_FACE_WINDING_CW;
+ 
+       ps->faceWindingFlags[face_index] |= PROJ_FACE_WINDING_INIT;
+ }
+ 
  /* This function returns 1 if this face has a seam along the 2 face-vert 
indices
   * 'orig_i1_fidx' and 'orig_i2_fidx' */
  static bool check_seam(const ProjPaintState *ps,
@@@ -921,39 -902,26 +941,25 @@@
                                *other_face = face_index;
                                *orig_fidx = (i1_fidx < i2_fidx) ? i1_fidx : 
i2_fidx;
  
-                               /* first test if they have the same image, then 
if uvs coincide.
-                                * last check detects if faces are pointing to 
opposite ways. For
-                                * well behaved UV maps, the winding of the 
faces at the connnection edge
-                                * should be opposing */
+                               /* initialize face winding if needed */
+                               if (!ps->faceWindingFlags[face_index] & 
PROJ_FACE_WINDING_INIT)
+                                       project_face_winding_init(ps, 
face_index);
+ 
+                               /* first test if they have the same image */
                                if ((orig_tpage == tpage) &&
                                    cmp_uv(orig_tf->uv[orig_i1_fidx], 
tf->uv[i1_fidx]) &&
 -                                  cmp_uv(orig_tf->uv[orig_i2_fidx], 
tf->uv[i2_fidx]) )
 +                                  cmp_uv(orig_tf->uv[orig_i2_fidx], 
tf->uv[i2_fidx]))
                                {
-                                       /* as extra check, we need to check if 
the polygons occupy the same uv space. To test
-                                        * that, we generate a point slightly 
to the side of the uv edge and check for intersection */
-                                       float uv_edge[2] = {tf->uv[i1_fidx][0] 
- tf->uv[i2_fidx][0],
-                                                           tf->uv[i1_fidx][1] 
- tf->uv[i2_fidx][1]};
-                                       float uv_normal[2];
-                                       float uv_point[2];
-                                       bool isect_orig, isect;
-                                       normalize_v2_v2(uv_normal, uv_edge);
-                                       SWAP(float, uv_normal[0], uv_normal[1]);
-                                       uv_normal[0] = -uv_normal[0];
-                                       mul_v2_fl(uv_normal, FLT_EPSILON*5);
- 
-                                       add_v2_v2v2(uv_point, tf->uv[i1_fidx], 
tf->uv[i2_fidx]);
-                                       mul_v2_fl(uv_point, 0.5);
-                                       add_v2_v2(uv_point, uv_normal);
- 
-                                       /* we now have a point in the middle of 
the uv edge, slightly offset in uv space.
-                                        * Test if it is within both faces */
-                                       isect_orig = 
isect_point_poly_v2(uv_point, orig_tf->uv, ((orig_mf->v4) ? 4 : 3), false);
-                                       isect = isect_point_poly_v2(uv_point, 
((const MTFace *)tf)->uv, ((mf->v4) ? 4 : 3), false);
- 
-                                       if (isect_orig == isect)
+                                       /* if faces don't have the same winding 
in uv space,
+                                        * they are on the same side so edge is 
boundary */
+                                       if ((ps->faceWindingFlags[face_index] & 
PROJ_FACE_WINDING_CW) !=
+                                           (ps->faceWindingFlags[orig_face] & 
PROJ_FACE_WINDING_CW))
+                                       {
                                                return 1;
+                                       }
+ 
                                        // printf("SEAM (NONE)\n");
                                        return 0;
 -
                                }
                                else {
                                        // printf("SEAM (UV GAP)\n");

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to