Revision: 41353
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41353
Author:   psy-fi
Date:     2011-10-28 22:45:59 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
smart stitching
===================
*Edge stitch functionality is back

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-28 20:54:45 UTC (rev 41352)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 
2011-10-28 22:45:59 UTC (rev 41353)
@@ -1491,36 +1491,31 @@
 
 
 
-static void stitch_island_calculate_rotation(UvElement *element, int i, 
StitchState *state, UVVertAverage *uv_average, IslandStitchData 
*island_stitch_data)
+static void stitch_island_calculate_rotation(UvEdge *edge, StitchState *state, 
UVVertAverage *uv_average, IslandStitchData *island_stitch_data)
 {
+       UvElement *element;
        EditFace *efa;
        MTFace *mt;
        int nverts;
        float uv1[2], uv2[2];
-       UvElement *element2;
        float edgecos, edgesin;
-       int i2;
+       int index1, index2;
 
+       element = edge->element;
        efa = element->face;
        nverts = (efa->v4)? 4 : 3;
        mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-       /* find second UV element */
-       element2 = state->elementMap->vert[(*(&efa->v1 + (element->tfindex + 
1)%nverts))->tmp.l];
-       for(; element2; element2 = element2->next){
-               if(element2->face == efa){
-                       break;
-               }
-       }
-       i2 = element2 - state->elementMap->buf;
+       index1 = (*(&element->face->v1 + element->tfindex))->tmp.l;
+       index2 = (*(&element->face->v1 + (element->tfindex + 1)%nverts))->tmp.l;
 
        /* The idea here is to take the directions of the edges and find the 
rotation between final and initial
        * direction. This, using inner and outer vector products, gives the 
angle. Directions are differences so... */
        uv1[0] = mt->uv[(element->tfindex + 1)%nverts][0] - 
mt->uv[element->tfindex][0];
        uv1[1] = mt->uv[(element->tfindex + 1)%nverts][1] - 
mt->uv[element->tfindex][1];
 
-       uv2[0] = uv_average[i2].uv[0]/uv_average[i2].count - 
uv_average[i].uv[0]/uv_average[i].count;
-       uv2[1] = uv_average[i2].uv[1]/uv_average[i2].count - 
uv_average[i].uv[1]/uv_average[i].count;
+       uv2[0] = uv_average[index2].uv[0] - uv_average[index1].uv[0];
+       uv2[1] = uv_average[index2].uv[1] - uv_average[index1].uv[1];
 
        normalize_v2(uv1);
        normalize_v2(uv2);
@@ -1532,7 +1527,6 @@
        island_stitch_data[element->island].rotation += (edgesin > 0)? 
acos(edgecos): -acos(edgecos);
        island_stitch_data[element->island].medianPoint[0] += 
(mt->uv[(element->tfindex + 1)%nverts][0] + mt->uv[element->tfindex][0]) / 2.0;
        island_stitch_data[element->island].medianPoint[1] += 
(mt->uv[(element->tfindex + 1)%nverts][1] + mt->uv[element->tfindex][1]) / 2.0;
-
 }
 
 
@@ -1888,6 +1882,11 @@
 
                                                                                
edge->flag |= STITCH_STITCHABLE;
                                                                                
edge_iter->flag |= STITCH_STITCHABLE;
+
+                                                                               
element1->flag |= STITCH_STITCHABLE;
+                                                                               
element2->flag |= STITCH_STITCHABLE;
+                                                                               
element_prev1->flag |= STITCH_STITCHABLE;
+                                                                               
element_prev2->flag |= STITCH_STITCHABLE;
                                                                                
preview->numOfStitchable++;
                                                                        }
                                                                }
@@ -1903,6 +1902,11 @@
 
                                                                        
edge->flag |= STITCH_STITCHABLE;
                                                                        
edge_iter->flag |= STITCH_STITCHABLE;
+
+                                                                       
element1->flag |= STITCH_STITCHABLE;
+                                                                       
element2->flag |= STITCH_STITCHABLE;
+                                                                       
element_prev1->flag |= STITCH_STITCHABLE;
+                                                                       
element_prev2->flag |= STITCH_STITCHABLE;
                                                                        
preview->numOfStitchable++;
                                                                }
                                                        }
@@ -2084,66 +2088,201 @@
 
                /* Second pass, propagate changes to stitchable uvs */
                for(i = 0; i < state->selection_size; i++){
-                       char stitchable = 0;
                        UvElement *element = (UvElement 
*)state->selection_stack[i];
                        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){
-                                       MTFace *mt;
-                                       efa = element_iter->face;
-                                       mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+                               for(;element_iter;){
+                                       /* determine if uv stitchable */
+                                       if(element_iter->separate && 
element_iter->flag & STITCH_STITCHABLE){
+                                               MTFace *mt;
+                                               efa = element_iter->face;
+                                               mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-                                       /* determine if uv stitchable */
-                                       if(element_iter->separate){
-                                               if(element_iter->flag & 
STITCH_STITCHABLE){
-                                                       stitchable = 1;
-                                                       if(state->snapIslands){
-                                                               /* Accumulate 
each islands' translation from stitchable elements. It is important to do here
-                                                                * because in 
final pass MTFaces get modified and result is zero. */
-                                                               
island_stitch_data[element_iter->island].translation[0] += 
averageUvPosition[i].uv[0] - mt->uv[element_iter->tfindex][0];
-                                                               
island_stitch_data[element_iter->island].translation[1] += 
averageUvPosition[i].uv[1] - mt->uv[element_iter->tfindex][1];
-                                                               
island_stitch_data[element_iter->island].numOfElements++;
+                                               if(state->snapIslands){
+                                                       /* Accumulate each 
islands' translation from stitchable elements. It is important to do here
+                                                        * because in final 
pass MTFaces get modified and result is zero. */
+                                                       
island_stitch_data[element_iter->island].translation[0] += 
averageUvPosition[i].uv[0] - mt->uv[element_iter->tfindex][0];
+                                                       
island_stitch_data[element_iter->island].translation[1] += 
averageUvPosition[i].uv[1] - mt->uv[element_iter->tfindex][1];
+                                                       
island_stitch_data[element_iter->island].numOfElements++;
+                                               }
+                                               /* propagate to coincident uvs 
*/
+                                               do{
+                                                       efa = 
element_iter->face;
+                                                       mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+                                                       element_iter->flag |= 
STITCH_PROCESSED;
+                                                       /* Either flush to 
preview or to the MTFace, if final */
+                                                       if(final){
+                                                               
mt->uv[element_iter->tfindex][0] = averageUvPosition[i].uv[0];
+                                                               
mt->uv[element_iter->tfindex][1] = averageUvPosition[i].uv[1];
+
+                                                               
uvedit_uv_select(scene, efa, mt, element_iter->tfindex);
+                                                       }else if(efa->tmp.l != 
STITCH_NO_PREVIEW){
+                                                               if(efa->v4){
+                                                                       
*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2) = 
averageUvPosition[i].uv[0];
+                                                                       
*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2 + 1) = 
averageUvPosition[i].uv[1];
+                                                               }else{
+                                                                       
*(preview->previewTris+efa->tmp.l + element_iter->tfindex*2) = 
averageUvPosition[i].uv[0];
+                                                                       
*(preview->previewTris+efa->tmp.l + element_iter->tfindex*2 + 1) = 
averageUvPosition[i].uv[1];
+                                                               }
                                                        }
-                                               } else {
-                                                       stitchable = 0;
-                                               }
+
+                                                       /* end of calculations, 
keep only the selection flag */
+                                                       if( 
(!state->snapIslands) || ((!stitchAtMidpoints) && (element_iter->island == 
state->static_island))) {
+                                                               
element_iter->flag &= STITCH_SELECTED;
+                                                       }
+
+                                                       element_iter = 
element_iter->next;
+                                               }while(element_iter && 
!element_iter->separate);
+
+                                               continue;
                                        }
-                                       /* propagate to coincident uvs */
-                                       if(stitchable){
-                                               element_iter->flag |= 
STITCH_PROCESSED;
-                                               /* Either flush to preview or 
to the MTFace, if final */
-                                               if(final){
-                                                       
mt->uv[element_iter->tfindex][0] = averageUvPosition[i].uv[0];
-                                                       
mt->uv[element_iter->tfindex][1] = averageUvPosition[i].uv[1];
+                                       element_iter = element_iter->next;
+                               }
+                       }
+               }
+               MEM_freeN(averageUvPosition);
+       }else{
+               /*****************  Edge Case ******************************/
+               UVVertAverage *averageUvPosition = 
MEM_callocN(state->em->totvert*sizeof(*averageUvPosition), "stitch_uv_average");
 
-                                                       uvedit_uv_select(scene, 
efa, mt, element_iter->tfindex);
-                                               }else if(efa->tmp.l != 
STITCH_NO_PREVIEW){
-                                                       if(efa->v4){
-                                                               
*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2) = 
averageUvPosition[i].uv[0];
-                                                               
*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2 + 1) = 
averageUvPosition[i].uv[1];
-                                                       }else{
-                                                               
*(preview->previewTris+efa->tmp.l + element_iter->tfindex*2) = 
averageUvPosition[i].uv[0];
-                                                               
*(preview->previewTris+efa->tmp.l + element_iter->tfindex*2 + 1) = 
averageUvPosition[i].uv[1];
+               /* First pass, accumulate final position for stitchable edges */
+               for(i = 0; i < state->selection_size; i++){
+                       UvEdge *edge = (UvEdge *)state->selection_stack[i];
+                       if(edge->flag & STITCH_STITCHABLE){
+                               UvElement *element1 = state->uvs[edge->uv1];
+                               UvElement *element2 = state->uvs[edge->uv2];
+
+                               UvElement *element_iter1 = 
state->elementMap->vert[(*(&element1->face->v1 + element1->tfindex))->tmp.l];
+
+                               for(;element_iter1; element_iter1 = 
element_iter1->next){
+                                       UvElement *element_iter2 = 
state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
+
+                                       for(;element_iter2; element_iter2 = 
element_iter2->next){
+                                               int uniqueIndex1;
+                                               int uniqueIndex2;
+                                               UvEdge tmp_edge, *edge_iter;
+
+                                               uniqueIndex1 = 
state->map[element_iter1 - state->elementMap->buf];
+                                               uniqueIndex2 = 
state->map[element_iter2 - state->elementMap->buf];
+
+                                               if(uniqueIndex2 > uniqueIndex1){
+                                                       tmp_edge.uv1 = 
uniqueIndex1;
+                                                       tmp_edge.uv2 = 
uniqueIndex2;
+                                               }else{
+                                                       tmp_edge.uv1 = 
uniqueIndex2;
+                                                       tmp_edge.uv2 = 
uniqueIndex1;
+                                               }
+
+                                               edge_iter = (UvEdge 
*)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
+
+                                               if(edge_iter && edge_iter->flag 
& STITCH_STITCHABLE){
+                                                       int index1, index2;
+                                                       EditFace *efa2;
+                                                       MTFace *mt1, *mt2;
+                                                       efa = 
element_iter1->face;
+                                                       efa2 = 
element_iter2->face;
+                                                       mt1 = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+                                                       mt2 = 
CustomData_em_get(&state->em->fdata, efa2->data, CD_MTFACE);
+
+                                                       index1 = 
(*(&element_iter1->face->v1 + element_iter1->tfindex))->tmp.l;
+                                                       index2 = 
(*(&element_iter2->face->v1 + element_iter2->tfindex))->tmp.l;
+
+                                                       if(stitchAtMidpoints){
+                                                               
averageUvPosition[index1].uv[0] += mt1->uv[element_iter1->tfindex][0];
+                                                               
averageUvPosition[index1].uv[1] += mt1->uv[element_iter1->tfindex][1];
+                                                               
averageUvPosition[index2].uv[0] += mt2->uv[element_iter2->tfindex][0];
+                                                               
averageUvPosition[index2].uv[1] += mt2->uv[element_iter2->tfindex][1];
+                                                               
averageUvPosition[index1].count++;
+                                                               
averageUvPosition[index2].count++;
+                                                       }else 
if(element_iter1->island == state->static_island){
+                                                               
averageUvPosition[index1].uv[0] = mt1->uv[element_iter1->tfindex][0];
+                                                               
averageUvPosition[index1].uv[1] = mt1->uv[element_iter1->tfindex][1];

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to