Revision: 38422
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38422
Author:   psy-fi
Date:     2011-07-15 23:27:26 +0000 (Fri, 15 Jul 2011)
Log Message:
-----------
seams from islands commit #2
============================
-After a lot of experimentation setting on one mode of operation: If one of the 
UV's is disconnected, tag seam. The other scheme(tagging if both uv's were 
disconnected) was giving a lot of false cases and strange results. Completely 
reimplemented operator. Should work correctly now. This needed a lot of trial 
and error and I am afraid the logic is not easy to follow but I think it works, 
at least it does in 2 difficult cases I've fed it with.

Looks like that's it! enjoy your new tool under UV's->Seams From Islands :)

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-07-15 20:44:19 UTC (rev 38421)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-07-15 23:27:26 UTC (rev 38422)
@@ -73,15 +73,6 @@
 
 #include "uvedit_intern.h"
 
-#define SFI_ISLAND_SEMANTICS 1
-#define SFI_EDGE_SEMANTICS 2
-
-EnumPropertyItem island_to_seam_items[] = {
-       {SFI_ISLAND_SEMANTICS, "ISLAND_SEMANTICS", 0, "Island Semantics", "Tag 
seams only if both of its UVs are unconnected"},
-       {SFI_EDGE_SEMANTICS, "EDGE_SEMANTICS", 0, "Edge Semantics", "Tag seams 
even if one of its UVs is unconnected"},
-       {0, NULL, 0, NULL, NULL}};
-
-
 /************************* state testing ************************/
 
 int ED_uvedit_test(Object *obedit)
@@ -3887,6 +3878,7 @@
        RNA_def_int_vector(ot->srna, "tile", 2, NULL, 0, INT_MAX, "Tile", "Tile 
coordinate.", 0, 10);
 }
 
+
 static int seams_from_islands_exec(bContext *C, wmOperator *op)
 {
        UvVertMap *vmap;
@@ -3894,7 +3886,6 @@
        EditMesh *em;
        EditEdge *editedge;
        float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT};
-       int operationMode = RNA_enum_get(op->ptr,  "island_to_seam_items");
 
        em = BKE_mesh_get_editmesh(ob->data);
        if(!EM_texFaceCheck(em)){
@@ -3902,41 +3893,86 @@
                BKE_mesh_end_editmesh(ob->data, em);
        }
 
-       /* important, make_uv_vert_map sets tmp.l of editverts to their index,
-        * will be used later */
-       vmap = EM_make_uv_vert_map(em, 0, 1, limit);
+       /* This code sets editvert->tmp.l to the index. This will be useful 
later on. */
+       EM_init_index_arrays(em, 0, 0, 1);
+       vmap = EM_make_uv_vert_map(em, 0, 0, limit);
 
        for(editedge = em->edges.first; editedge; editedge = editedge->next){
-               char flag1 = 0, flag2 = 0;
-               UvMapVert *mapVert, *initMapVert;
-               /* first clean previous seam flag */
-               editedge->seam = 0;
+                       /* flags to determine if we uv is separated from first 
editface match */
+                       char separated1 = 0, separated2;
+                       /* set to denote edge must be flagged as seam */
+                       char faces_separated = 0;
+                       /* flag to keep track if uv1 is disconnected from first 
editface match */
+                       char v1coincident = 1;
+                       /* For use with v1coincident. v1coincident will change 
only if we've had commonFaces */
+                       int commonFaces = 0;
 
-               initMapVert = vmap->vert[editedge->v1->tmp.l];
-               for(mapVert = initMapVert; mapVert; mapVert = mapVert->next){
-                       /* if there are uv's that are not coincident, flag the 
vert */
-                       if(mapVert->separate && mapVert != initMapVert){
-                               flag1 = 1;
-                               break;
+                       EditFace *efa1, *efa2;
+
+                       UvMapVert *mv1, *mvinit1, *mv2, *mvinit2, *mviter;
+                       /* mv2cache stores the first of the list of coincident 
uv's for later comparison
+                        * mv2sep holds the last separator and is copied to 
mv2cache hen a hit is first found */
+                       UvMapVert *mv2cache = NULL, *mv2sep;
+
+                       mvinit1 = vmap->vert[editedge->v1->tmp.l];
+
+                       editedge->seam = 0;
+
+                       for(mv1 = mvinit1; mv1 && !faces_separated; mv1 = 
mv1->next){
+                               if(mv1->separate && commonFaces){
+                                       v1coincident = 0;
+                               }
+
+                               separated2 = 0;
+                               efa1 = EM_get_face_for_index(mv1->f);
+                               mvinit2 = vmap->vert[editedge->v2->tmp.l];
+
+                               for(mv2 = mvinit2; mv2; mv2 = mv2->next){
+                                       if(mv2->separate){
+                                               mv2sep = mv2;
+                                       }
+
+                                       efa2 = EM_get_face_for_index(mv2->f);
+                                       if(efa1 == efa2){
+                                               /* if v1 is not coincident no 
point in comparing */
+                                               if(v1coincident){
+                                                       /* have we found 
previously anything? */
+                                                       if(mv2cache){
+                                                               /* flag seam 
unless proved to be coincident with previous hit */
+                                                               separated2 = 1;
+                                                               for(mviter = 
mv2cache; mviter; mviter = mviter->next){
+                                                                       
if(mviter->separate && mviter != mv2cache)
+                                                                               
break;
+                                                                       /* 
coincident with previous hit, do not flag seam */
+                                                                       
if(mviter == mv2)
+                                                                               
separated2 = 0;
+                                                               }
+                                                       }
+                                                       /* First hit case, 
store the hit in the cache */
+                                                       else {
+                                                               mv2cache = 
mv2sep;
+                                                               commonFaces = 1;
+                                                       }
+                                               }else {
+                                                       separated1 = 1;
+                                               }
+
+                                               if(separated1 || separated2){
+                                                       faces_separated = 1;
+                                                       break;
+                                               }
+                                       }
+                               }
                        }
-               }
 
-               initMapVert = vmap->vert[editedge->v2->tmp.l];
-               for(mapVert = initMapVert; mapVert; mapVert = mapVert->next){
-                       /* if there are uv's that are not coincident, flag the 
vert */
-                       if(mapVert->separate && mapVert != initMapVert){
-                               flag2 = 1;
-                               break;
+                       if(faces_separated){
+                               editedge->seam = 1;
                        }
-               }
 
-               if(flag1 && flag2){
-                       editedge->seam = 1;
-               }
        }
 
        EM_free_uv_vert_map(vmap);
-
+       EM_free_index_arrays();
        BKE_mesh_end_editmesh(ob->data, em);
 
        DAG_id_tag_update(ob->data, 0);
@@ -3945,6 +3981,7 @@
        return OPERATOR_FINISHED;
 }
 
+
 static void UV_OT_seams_from_islands(wmOperatorType *ot)
 {
        /* identifiers */
@@ -3952,15 +3989,12 @@
        ot->description= "Set mesh seams according to island setup in the UV 
editor";
        ot->idname= "UV_OT_seams_from_islands";
 
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
        /* api callbacks */
        ot->exec= seams_from_islands_exec;
-       ot->poll= ED_operator_image_active;     /* requires space image */;
-
-       /* properties */
-       RNA_def_enum(ot->srna, "island_to_seam_items", island_to_seam_items, 1, 
"Semantics", "");
-
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+       ot->poll= ED_operator_uvmap;
 }
 
 /* ************************** registration **********************************/

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

Reply via email to