Revision: 37965
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37965
Author:   psy-fi
Date:     2011-06-30 00:58:40 +0000 (Thu, 30 Jun 2011)
Log Message:
-----------
smart stitch - first 'complete' edge stitch commit - except that it's not 
working, bug fixing on the way

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

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c 
2011-06-29 23:52:09 UTC (rev 37964)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c 
2011-06-30 00:58:40 UTC (rev 37965)
@@ -866,18 +866,17 @@
                        glDisable(GL_BLEND);
                }
                glEnableClientState(GL_COLOR_ARRAY);
+
+               glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewOrig);
+               glColorPointer(4, GL_UNSIGNED_BYTE, 0, 
stitch_preview->previewOrigColors);
                if(stitch_preview->mode == VERT_STITCH){
                        /* draw vert preview */
-                       glVertexPointer(2, GL_FLOAT, 0, 
stitch_preview->previewOrig);
-                       glColorPointer(4, GL_UNSIGNED_BYTE, 0, 
stitch_preview->previewOrigColors);
                        glPointSize(5.0);
                        glDrawArrays(GL_POINTS, 0, stitch_preview->numOfOrig);
                }
                else
                {
                        /* draw edge preview */
-                       glVertexPointer(2, GL_FLOAT, 0, 
stitch_preview->previewOrig);
-                       glColorPointer(4, GL_UNSIGNED_BYTE, 0, 
stitch_preview->previewOrigColors);
                        glDrawArrays(GL_LINES, 0, stitch_preview->numOfOrig);
                }
                glPopClientAttrib();

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-29 23:52:09 UTC (rev 37964)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-30 00:58:40 UTC (rev 37965)
@@ -1395,7 +1395,7 @@
                                        {
                                                char edgeSelFlag = 
TF_SEL_MASK(i) | TF_SEL_MASK((i+1)%vertsPerFace);
 
-                                               /* need another one of there 
for each of the 2 verts*/
+                                               /* need another one of these 
for each of the 2 verts*/
                                                UvElement **commonVertMaps2 = 
MEM_mallocN(state->em->totface*sizeof(UvElement *), "commonVertMaps2");
 
                                                /* Is this edge selected? */
@@ -1405,7 +1405,12 @@
                                                        UvElement *el_iter, 
*element2;
                                                        float uv1[2][2];
                                                        int nverts;
+                                                       int stackSize = 0;
+                                                       int index1, index2;
+                                                       UVVertAverage 
uv_average_tmp[2];
 
+                                                       memset(uv_average_tmp, 
sizeof(uv_average_tmp), 0);
+
                                                        v1 = *(&editFace->v1 + 
i);
                                                        v2 = *(&editFace->v1 + 
(i + 1)%vertsPerFace);
 
@@ -1427,15 +1432,22 @@
                                                                }
                                                        }
 
+                                                       index1 = element - 
vmap->buf;
+                                                       index2 = element2 - 
vmap->buf;
+
                                                        element->flag |= 
STITCH_PROCESSED;
                                                        element2->flag |= 
STITCH_PROCESSED;
-                                                       //preview->numOfOrig++;
+                                                       element->flag |= 
STITCH_EDGE_PREVIEW;
+                                                       preview->numOfOrig++;
 
-                                                       uv1[0][0] = 
mt->uv[element->tfindex][0];
-                                                       uv1[0][1] = 
mt->uv[element->tfindex][1];
-                                                       uv1[1][0] = 
mt->uv[(element->tfindex + 1)%vertsPerFace][0];
-                                                       uv1[1][1] = 
mt->uv[(element->tfindex + 1)%vertsPerFace][1];
+                                                       
uv_average[index1].count++;
+                                                       
uv_average[index2].count++;
 
+                                                       
uv_average[index1].uv[0] = uv1[0][0] = mt->uv[element->tfindex][0];
+                                                       
uv_average[index1].uv[1] = uv1[0][1] = mt->uv[element->tfindex][1];
+                                                       
uv_average[index2].uv[0] = uv1[1][0] = mt->uv[(element2->tfindex)][0];
+                                                       
uv_average[index2].uv[1] = uv1[1][1] = mt->uv[(element2->tfindex)][1];
+
                                                        /* Now iterate through 
all faces and find potential stitchable edges */
                                                        for(el_iter = 
vmap->vert[v1->tmp.l]; el_iter; el_iter = el_iter->next){
                                                                char vertCheck 
= 0;
@@ -1478,129 +1490,112 @@
                                                                                
element->flag |= STITCH_STITCHABLE;
                                                                                
element2->flag |= STITCH_STITCHABLE;
 
+                                                                               
uv_average_tmp[0].count++;
+                                                                               
uv_average_tmp[1].count++;
+                                                                               
uv_average_tmp[0].uv[0] += uv2[0][0];
+                                                                               
uv_average_tmp[0].uv[1] += uv2[0][1];
+                                                                               
uv_average_tmp[1].uv[0] += uv2[1][0];
+                                                                               
uv_average_tmp[1].uv[1] += uv2[1][1];
+
                                                                                
/* We need the UvMapVert of the other uv too. */
                                                                                
for(el_iter2 = vmap->vert[v2->tmp.l]; el_iter2; el_iter2 = el_iter2->next){
                                                                                
        if(el_iter2->face == efa)
                                                                                
                break;
                                                                                
}
 
+                                                                               
commonVertMaps[stackSize] = el_iter;
+                                                                               
commonVertMaps2[stackSize++] = el_iter2;
+
                                                                                
if(vertCheck)
                                                                                
{
                                                                                
        /* convention is to use the vertex at the beginning of the edge. This 
avoids ambiguity
                                                                                
         * in situations where two adjacent edges on the same face need to be 
stitched.  */
-                                                                               
        el_iter->flag |= STITCH_STITCHABLE;
+                                                                               
        el_iter->flag |= STITCH_EDGE_PREVIEW;
                                                                                
}
                                                                                
else {
                                                                                
        /* We need to flag the UvMapVert corresponding to the other vert, for 
the reason
                                                                                
         * outlined above. */
-                                                                               
        el_iter2->flag |= STITCH_STITCHABLE;
+                                                                               
        el_iter2->flag |= STITCH_EDGE_PREVIEW;
                                                                                
}
-                                                                               
//uv_average[el_iter - vmap->buf].count++;
-                                                                               
//uv_average[el_iter - vmap->buf].uv[0] +=
                                                                        }
                                                                }
                                                        }
-                                               }
-                                               MEM_freeN(commonVertMaps2);
-                                       }
-                               }
-                       }
-               }
+                                                       if(element->flag & 
STITCH_STITCHABLE &&
+                                                       element2->flag & 
STITCH_STITCHABLE){
+                                                               
uv_average[index1].count += uv_average_tmp[0].count;
+                                                               
uv_average[index1].uv[0] += uv_average_tmp[0].uv[0];
+                                                               
uv_average[index1].uv[1] += uv_average_tmp[0].uv[1];
 
-               MEM_freeN(commonVertMaps);
+                                                               
uv_average[index2].count += uv_average_tmp[1].count;
+                                                               
uv_average[index2].uv[0] += uv_average_tmp[1].uv[0];
+                                                               
uv_average[index2].uv[1] += uv_average_tmp[1].uv[1];
 
+                                                               
if(editFace->tmp.l == -1)
+                                                               {
+                                                                       
if(editFace->v4)
+                                                                       {
+                                                                               
editFace->tmp.l = preview->numOfQuads*8;
+                                                                               
preview->numOfQuads++;
+                                                                       }
+                                                                       else {
+                                                                               
editFace->tmp.l = preview->numOfTris*6;
+                                                                               
preview->numOfTris++;
+                                                                       }
+                                                               }
 
-       if(0){
+                                                               for(; stackSize 
> -1; stackSize--)
+                                                               {
 
-               // Here we store the indices corresponding to UvMapVerts that 
contain the first vertex of the edge.*/
-               int *faceStack = 
MEM_mallocN(state->em->totface*sizeof(float)*8, "quad_uv_stitch_prev");
+                                                                       index1 
= commonVertMaps[stackSize] - vmap->buf, index2 = commonVertMaps2[stackSize] - 
vmap->buf;
+                                                                       efa = 
commonVertMaps[stackSize]->face;
 
-               for(; 0;){
-                       // simple check to see which of the two face vertices 
corresponds to the original */
-                       char vertCheck = 0;
-                       EditVert *v1, *v2;
-                       UvElement *element;
-                       int stackSize = 0;
+                                                                       
commonVertMaps[stackSize]->flag |= STITCH_STITCHABLE;
+                                                                       
commonVertMaps2[stackSize]->flag |= STITCH_STITCHABLE;
 
-                       v1 = editEdge->v1;
-                       v2 = editEdge->v2;
+                                                                       
uv_average[index1].count += uv_average_tmp[0].count;
+                                                                       
uv_average[index1].uv[0] += uv_average_tmp[0].uv[0];
+                                                                       
uv_average[index1].uv[1] += uv_average_tmp[0].uv[1];
 
-                       for(element = vmap->vert[v1->tmp.l]; element; element = 
element->next){
-                               int nverts;
-                               efa = element->face;
-                               nverts = efa->v4 ? 4 : 3;
-                               if((vertCheck = (*(&efa->v1 + (element->tfindex 
+ 1)%nverts) == v2)) || (*(&efa->v1 + (element->tfindex + nverts - 1)%nverts) 
== v2)){
-                                       //element->flag |= (vertCheck) ? 
STITCH_EDGE_PLUS : 0;
-                                       faceStack[stackSize++] = element - 
vmap->buf;
+                                                                       
uv_average[index2].count += uv_average_tmp[1].count;
+                                                                       
uv_average[index2].uv[0] += uv_average_tmp[1].uv[0];
+                                                                       
uv_average[index2].uv[1] += uv_average_tmp[1].uv[1];
+
+                                                                       
if(efa->tmp.l == -1)
+                                                                       {
+                                                                               
if(efa->v4)
+                                                                               
{
+                                                                               
        efa->tmp.l = preview->numOfQuads*8;
+                                                                               
        preview->numOfQuads++;
+                                                                               
} else {
+                                                                               
        efa->tmp.l = preview->numOfTris*6;
+                                                                               
        preview->numOfTris++;
+                                                                               
}
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                               MEM_freeN(commonVertMaps2);
+                                       }
                                }
                        }
+               }
 
-                       // Check if faces found comply with stitchability 
restrictions */
-                       for(i = 0; i < stackSize; i++)
-                       {
-                               int faceIter;
-                               float uv1[2][2];
-                               int nverts;
-                               element = vmap->buf + faceStack[i];
-                               editFace = element->face;
-                               nverts = (editFace->v4)? 4 : 3;
-                               mt = CustomData_em_get(&state->em->fdata, 
editFace->data, CD_MTFACE);
+               MEM_freeN(commonVertMaps);
 
-                               // Take uv's of first face */
-                               uv1[0][0] = mt->uv[element->tfindex][0];
-                               uv1[0][1] = mt->uv[element->tfindex][1];
-                               //uv1[1][0] = (element->flag & 
STITCH_EDGE_PLUS)? mt->uv[(element->tfindex + 1)%nverts][0] : 
mt->uv[(element->tfindex + nverts - 1)%nverts][0];
-                               //uv1[1][1] = (element->flag & 
STITCH_EDGE_PLUS)? mt->uv[(element->tfindex + 1)%nverts][1] : 
mt->uv[(element->tfindex + nverts - 1)%nverts][1];
 
-                               // iterate through all of the rest faces and 
check if they are */
-                               for(faceIter = i+1; faceIter < stackSize; 
faceIter++){
-                                       float uv2[2][2];
-                                       MTFace *tmptface;
-                                       UvElement *mapVertIter = vmap->buf + 
faceStack[faceIter];
-                                       efa = mapVertIter->face;
-                                       nverts = (efa->v4)? 4 : 3;
 
-                                       tmptface = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-
-                                       // Take uv's of second face */
-                                       uv2[0][0] = 
tmptface->uv[mapVertIter->tfindex][0];
-                                       uv2[0][1] = 
tmptface->uv[mapVertIter->tfindex][1];
-                                       //uv2[1][0] = (mapVertIter->flag & 
STITCH_EDGE_PLUS)? tmptface->uv[(mapVertIter->tfindex + 1)%nverts][0] : 
tmptface->uv[(mapVertIter->tfindex + nverts - 1)%nverts][0];
-                                       //uv2[1][1] = (mapVertIter->flag & 
STITCH_EDGE_PLUS)? tmptface->uv[(mapVertIter->tfindex + 1)%nverts][1] : 
tmptface->uv[(mapVertIter->tfindex + nverts - 1)%nverts][1];
-
-                                       // Actual checks */
-                                       if(fabs((uv1[0][0] - uv2[0][0]) < 
STD_UV_CONNECT_LIMIT) &&
-                                               (fabs(uv1[0][1] - uv2[0][1]) < 
STD_UV_CONNECT_LIMIT) &&
-                                               fabs((uv1[1][0] - uv2[1][0]) < 
STD_UV_CONNECT_LIMIT) &&
-                                               (fabs(uv1[1][1] - uv2[1][1]) < 
STD_UV_CONNECT_LIMIT))
-                                       {
-                                               // Coincident UV's so 
non-stitchable edge. */
-                                               continue;
-                                       }
-                                       else if(state->use_limit && ( 
fabs(uv1[0][0] - uv2[0][0]) > state->limitDist ||
-                                               fabs(uv1[0][1] - uv2[0][1]) > 
state->limitDist ||
-                                               fabs(uv1[1][0] - uv2[1][0]) > 
state->limitDist ||
-                                               fabs(uv1[1][1] - uv2[1][1]) > 
state->limitDist))
-                                       {
-                                               // Both UVs out of stitch range 
*/
-                                               continue;
-                                       }
-                                       else {
-                                               // Stitchable case, do the 
necessary stuff */
-                                       }
-                               }
-                       }
-               }
-       }
-
        if(!final)
        {
                /* Initialize the preview buffers */
                preview->previewQuads = (float 
*)MEM_mallocN(preview->numOfQuads*sizeof(float)*8, "quad_uv_stitch_prev");
                preview->previewTris = (float 
*)MEM_mallocN(preview->numOfTris*sizeof(float)*6, "tri_uv_stitch_prev");

@@ 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