Revision: 41322
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41322
Author:   psy-fi
Date:     2011-10-27 22:06:02 +0000 (Thu, 27 Oct 2011)
Log Message:
-----------
smart stitching
================
static island functionality:
*Now uvs are stitched to the "static island". No longer to the middle point 
between two stitchable uvs
*User can toggle between static islands with the I button.
*If a uv is on an island that can't be stitched to the static island, it is 
tagged unstitchable.

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

Modified: 
branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 
2011-10-27 20:57:14 UTC (rev 41321)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 
2011-10-27 22:06:02 UTC (rev 41322)
@@ -1263,6 +1263,8 @@
        int numOfEdges;
        /* Flag to remember if island has been added for preview */
        char addedForPreview;
+       /* Flag an island to be considered for determining static island */
+       char stitchableCandidate;
 }IslandStitchData;
 
 /* just for averaging UVs */
@@ -1330,6 +1332,7 @@
 #define STITCH_STITCHABLE 2
 #define STITCH_PROCESSED 4
 #define STITCH_BOUNDARY 8
+#define STITCH_STITCHABLE_CANDIDATE 16
 #endif
 /* Previewer stuff (see uvedit_intern.h for more info) */
 static StitchPreviewer *_stitch_preview;
@@ -1394,7 +1397,7 @@
 /* This function updates the header of the UV editor when the stitch tool 
updates its settings */
 static void stitch_update_header(StitchState *stitch_state, bContext *C)
 {
-       static char str[] = "Select(V {+Ctrl deselect}) Mode(M): %c Vertex  %c 
Edge  %c Preview(P)  %c Limit(L)  %c Snap(S)  Ctrl+Wheel(limit adjust): %.2f  
Static Island(I): %d";
+       static char str[] = "Select(V {+Ctrl deselect}) Mode(M): %c Vertex  %c 
Edge  %c Preview(P)  %c Limit(L)  %c Snap(S)  Ctrl+Wheel(limit adjust): %.2f";
        char msg[256];
        ScrArea *sa= CTX_wm_area(C);
        char mode = (stitch_state->mode == VERT_STITCH);
@@ -1405,8 +1408,7 @@
                                uv_get_stitch_previewer()->enabled?'*':' ',
                                stitch_state->use_limit?'*':' ',
                                stitch_state->snapIslands?'*' :' ',
-                               stitch_state->limitDist,
-                               stitch_state->static_island + 1);
+                               stitch_state->limitDist);
                ED_area_headerprint(sa, msg);
        }
 }
@@ -2137,7 +2139,7 @@
 
 
 /* Checks for remote uvs that may be stitched with a certain uv, flags them if 
stitchable. */
-static int determine_uv_stitchability(UvElement *element, StitchState *state){
+static void determine_uv_stitchability(UvElement *element, StitchState *state, 
IslandStitchData *island_stitch_data){
        int vert_index;
        UvElement *element_iter;
        float limit= state->limitDist;
@@ -2157,15 +2159,18 @@
 
                                if(fabs(mtface_orig->uv[element->tfindex][0] - 
mtface_iter->uv[element_iter->tfindex][0]) < limit
                                                && 
fabs(mtface_orig->uv[element->tfindex][1] - 
mtface_iter->uv[element_iter->tfindex][1]) < limit){
-                                       return 1;
+                                       
island_stitch_data[element_iter->island].stitchableCandidate = 1;
+                                       
island_stitch_data[element->island].stitchableCandidate = 1;
+                                       element->flag |= 
STITCH_STITCHABLE_CANDIDATE;
                                }
                        }else{
                                /* if no limit exists, then the mere existence 
of a separate uv means that the uv is stitchable */
-                               return 1;
+                               
island_stitch_data[element_iter->island].stitchableCandidate = 1;
+                               
island_stitch_data[element->island].stitchableCandidate = 1;
+                               element->flag |= STITCH_STITCHABLE_CANDIDATE;
                        }
                }
        }
-       return 0;
 }
 
 /* Set preview buffer position of UV face in editface->tmp.l */
@@ -2213,22 +2218,38 @@
 
                                if(fabs(mtface_orig->uv[element->tfindex][0] - 
mtface_iter->uv[element_iter->tfindex][0]) < state->limitDist
                                                && 
fabs(mtface_orig->uv[element->tfindex][1] - 
mtface_iter->uv[element_iter->tfindex][1]) < state->limitDist){
-
-                                       if(!(element_iter->flag & 
STITCH_STITCHABLE)){
+                                       if(((element_iter->island == 
state->static_island) || (element->island == state->static_island))
+                                                       && !(element_iter->flag 
& STITCH_STITCHABLE)){
                                                element_iter->flag |= 
STITCH_STITCHABLE;
                                                preview->numOfStitchable++;
                                                
stitch_setup_face_preview_for_uv_group(element_iter, state, island_stitch_data);
+                                               if(!(element->flag & 
STITCH_STITCHABLE)){
+                                                       element->flag |= 
STITCH_STITCHABLE;
+                                                       
preview->numOfStitchable++;
+                                                       
stitch_setup_face_preview_for_uv_group(element, state, island_stitch_data);
+                                               }
                                        }
                                }
                        }else{
-                               if(!(element_iter->flag & STITCH_STITCHABLE)){
+                               if(((element_iter->island == 
state->static_island) || (element->island == state->static_island))
+                                               && !(element_iter->flag & 
STITCH_STITCHABLE)){
                                        element_iter->flag |= STITCH_STITCHABLE;
                                        preview->numOfStitchable++;
                                        
stitch_setup_face_preview_for_uv_group(element_iter, state, island_stitch_data);
+                                       if(!(element->flag & 
STITCH_STITCHABLE)){
+                                               element->flag |= 
STITCH_STITCHABLE;
+                                               preview->numOfStitchable++;
+                                               
stitch_setup_face_preview_for_uv_group(element, state, island_stitch_data);
+                                       }
                                }
                        }
                }
        }
+
+       /* This can happen if the uvs to be stitched are not on a stitchable 
island */
+       if(!(element->flag & STITCH_STITCHABLE)){
+               preview->numOfUnstitchable++;
+       }
 }
 
 /* Main processing function. It calculates preview and final positions. */
@@ -2237,6 +2258,7 @@
        int i;
        StitchPreviewer *preview = uv_get_stitch_previewer();
        IslandStitchData *island_stitch_data = NULL;
+       int previousIsland = state->static_island;
        short preview_enabled = preview->enabled;
        EditFace *efa;
        EditVert *ev;
@@ -2253,11 +2275,9 @@
                efa->tmp.l = -1;
        }
 
-       if(state->snapIslands){
-               island_stitch_data = 
MEM_callocN(sizeof(*island_stitch_data)*state->elementMap->totalIslands, 
"stitch_island_data");
-               if(!island_stitch_data){
-                       return 0;
-               }
+       island_stitch_data = 
MEM_callocN(sizeof(*island_stitch_data)*state->elementMap->totalIslands, 
"stitch_island_data");
+       if(!island_stitch_data){
+               return 0;
        }
 
        /* Store Indices to editVerts. */
@@ -2272,10 +2292,26 @@
                /* Uv Vert case */
                for(i = 0; i < state->selection_size; i++){
                        UvElement *element = (UvElement 
*)state->selection_stack[i];
-                       if(determine_uv_stitchability(element, state)){
+                       determine_uv_stitchability(element, state, 
island_stitch_data);
+               }
+
+               /* Set static island to one that is added for preview */
+               state->static_island %= state->elementMap->totalIslands;
+               
while(!(island_stitch_data[state->static_island].stitchableCandidate)){
+                       state->static_island++;
+                       state->static_island %= state->elementMap->totalIslands;
+                       /* This is entirely possible if for example limit 
stitching with no stitchable verts or no selection */
+                       if(state->static_island == previousIsland)
+                               break;
+               }
+
+               for(i = 0; i < state->selection_size; i++){
+                       UvElement *element = (UvElement 
*)state->selection_stack[i];
+                       if(element->flag & STITCH_STITCHABLE_CANDIDATE){
+                               element->flag &= ~STITCH_STITCHABLE_CANDIDATE;
                                stitch_setup_preview_for_stitchable_uv(element, 
state, island_stitch_data);
                        }else{
-                               /* Add to preview */
+                               /* Add to preview for unstitchable */
                                preview->numOfUnstitchable++;
                        }
                }
@@ -2371,7 +2407,7 @@
                }
        }
 
-       printf("st %d, ust %d\n",preview->numOfStitchable, 
preview->numOfUnstitchable);
+       //printf("st %d, ust %d\n",preview->numOfStitchable, 
preview->numOfUnstitchable);
        /*****************************************
         *  Setup preview for stitchable islands *
         *****************************************/
@@ -2498,13 +2534,6 @@
        /******************************************************
         * Here we calculate the final coordinates of the uvs *
         ******************************************************/
-       /* Set static island to one that is added for preview */
-       if(state->selection_size && state->snapIslands){
-               
while(!island_stitch_data[state->static_island].addedForPreview){
-                       state->static_island++;
-                       state->static_island %= state->elementMap->totalIslands;
-               }
-       }
 
        if(state->mode == VERT_STITCH){
                UVVertAverage *averageUvPosition = 
MEM_callocN(state->selection_size*sizeof(*averageUvPosition), 
"stitch_uv_average");
@@ -2515,19 +2544,15 @@
                        if(element->flag & STITCH_STITCHABLE){
                                UvElement *element_iter = 
state->elementMap->vert[(*(&element->face->v1 + element->tfindex))->tmp.l];
                                for(;element_iter; element_iter = 
element_iter->next){
-                                       if(element_iter->flag & 
STITCH_STITCHABLE){
+                                       if((element_iter->flag & 
STITCH_STITCHABLE) && (element_iter->island == state->static_island)){
                                                MTFace *mt;
                                                efa = element_iter->face;
                                                mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-                                               averageUvPosition[i].uv[0] += 
mt->uv[element_iter->tfindex][0];
-                                               averageUvPosition[i].uv[1] += 
mt->uv[element_iter->tfindex][1];
-                                               averageUvPosition[i].count++;
+                                               averageUvPosition[i].uv[0] = 
mt->uv[element_iter->tfindex][0];
+                                               averageUvPosition[i].uv[1] = 
mt->uv[element_iter->tfindex][1];
                                        }
                                }
-                               /* median result */
-                               averageUvPosition[i].uv[0] /= 
averageUvPosition[i].count;
-                               averageUvPosition[i].uv[1] /= 
averageUvPosition[i].count;
                        }
                }
                /* Second pass, propagate changes to stitchable uvs */
@@ -2597,8 +2622,7 @@
                }
        }
 
-       if(island_stitch_data)
-               MEM_freeN(island_stitch_data);
+       MEM_freeN(island_stitch_data);
 
        return 1;
 }

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

Reply via email to