Revision: 37964
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37964
Author:   psy-fi
Date:     2011-06-29 23:52:09 +0000 (Wed, 29 Jun 2011)
Log Message:
-----------
smart stitch - more edge stuff, and a change in select behavior. Now only one 
common uv can be selected in vertex mode or stitching behavior will be 
dependent on the order of face processing. This also has a nice side-effect: It 
is now possible to deselect the non-selected stitchable uv and it clears the 
selection completely.

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h
    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 20:22:14 UTC (rev 37963)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c 
2011-06-29 23:52:09 UTC (rev 37964)
@@ -866,11 +866,20 @@
                        glDisable(GL_BLEND);
                }
                glEnableClientState(GL_COLOR_ARRAY);
-               glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewPoints);
-               glColorPointer(4, GL_UNSIGNED_BYTE, 0, 
stitch_preview->previewPointColors);
-               glPointSize(5.0);
-               glDrawArrays(GL_POINTS, 0, stitch_preview->numOfPoints);
-
+               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();
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        }

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-29 20:22:14 UTC (rev 37963)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-29 23:52:09 UTC (rev 37964)
@@ -42,6 +42,12 @@
 struct Object;
 struct wmOperatorType;
 
+/*
+ * defines for operator stitch modes, usable both for operator and prevewer 
below
+ */
+#define VERT_STITCH 1
+#define EDGE_STITCH 2
+
 /* Object that stores display data for previewing before accepting stitching */
 typedef struct StitchPreviewer {
        /* OpenGL requires different calls for Triangles and Quads.
@@ -49,20 +55,19 @@
        float *previewQuads;
        /* ...and here we'll store the triangles*/
        float *previewTris;
-       /* Preview points.These will be the previewed vertices */
-       float *previewPoints;
-       /* Preview edges, for previewed edges */
-       float *previewEdges;
+       /* Preview data.These will be either the previewed vertices or edges 
depending on tool settings */
+       float *previewOrig;
        /* Colors for selected vertices */
-       unsigned int *previewPointColors;
+       unsigned int *previewOrigColors;
 
        /* here we'll store the number of triangles and quads to be drawn */
        unsigned int numOfTris;
        unsigned int numOfQuads;
-       unsigned int numOfPoints;
-       unsigned int numOfEdges;
+       unsigned int numOfOrig;
        /* stores whether user desires preview display */
        char enabled;
+       /* vertex or edge preview. Store it here too because operator will not 
be available in draw code */
+       char mode;
 } StitchPreviewer;
 
 /* id can be from 0 to 3 */

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 20:22:14 UTC (rev 37963)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-29 23:52:09 UTC (rev 37964)
@@ -1140,48 +1140,32 @@
        UvVertMap2 *vmap;
 } StitchState;
 
-/*
- * defines for operator
- */
-#define VERT_STITCH 1
-#define EDGE_STITCH 2
 
 /*
  * defines for UvMapVert flags
  */
 #define STITCH_PROCESSED 1
 #define STITCH_STITCHABLE 2
-#define STITCH_SELECTED        4
-#define STITCH_EDGE_PLUS 8
-#define STITCH_UV_SELECTED 16
+#define STITCH_EDGE_PREVIEW 4
+#define STITCH_FOR_STITCHING 8
 
+
 /* Previewer stuff (see uvedit_intern.h for more info) */
 static StitchPreviewer *_stitch_preview;
 
-typedef struct EdgeStitchData {
-       /* each edge corresponds to a UVVertMap, This is a hack I know, but 
essentially the same data
-        * will be used anyway */
-       int vmapPosition;
-       /* indices to uvVertmap for fast access */
-       int uvVertMap1Index, uvVertMap2Index;
-       /* */
-
-}EdgeStitchData;
-
 /* constructor */
 static StitchPreviewer * stitch_preview_init(void)
 {
        _stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), 
"stitch_previewer");
        _stitch_preview->previewQuads = NULL;
        _stitch_preview->previewTris = NULL;
-       _stitch_preview->previewEdges = NULL;
-       _stitch_preview->previewPoints = NULL;
-       _stitch_preview->previewPointColors = NULL;
+       _stitch_preview->previewOrig = NULL;
+       _stitch_preview->previewOrigColors = NULL;
 
        _stitch_preview->numOfQuads = 0;
        _stitch_preview->numOfTris = 0;
-       _stitch_preview->numOfPoints = 0;
-       _stitch_preview->numOfEdges = 0;
+       _stitch_preview->numOfOrig = 0;
+       _stitch_preview->mode = 0;
 
        _stitch_preview->enabled = 1;
        return _stitch_preview;
@@ -1202,21 +1186,16 @@
                        MEM_freeN(_stitch_preview->previewTris);
                        _stitch_preview->previewTris = NULL;
                }
-               if(_stitch_preview->previewPoints)
+               if(_stitch_preview->previewOrig)
                {
-                       MEM_freeN(_stitch_preview->previewPoints);
-                       _stitch_preview->previewPoints = NULL;
+                       MEM_freeN(_stitch_preview->previewOrig);
+                       _stitch_preview->previewOrig = NULL;
                }
-               if(_stitch_preview->previewPointColors)
+               if(_stitch_preview->previewOrigColors)
                {
-                       MEM_freeN(_stitch_preview->previewPointColors);
-                       _stitch_preview->previewPointColors = NULL;
+                       MEM_freeN(_stitch_preview->previewOrigColors);
+                       _stitch_preview->previewOrigColors = NULL;
                }
-               if(_stitch_preview->previewEdges)
-               {
-                       MEM_freeN(_stitch_preview->previewEdges);
-                       _stitch_preview->previewEdges = NULL;
-               }
                MEM_freeN(_stitch_preview);
                _stitch_preview = NULL;
        }
@@ -1255,13 +1234,16 @@
        StitchPreviewer *preview = uv_get_stitch_previewer();
        UVVertAverage *uv_average;
        UvVertMap2 *vmap = state->vmap;
-       UvElement *element = vmap->buf;
+       UvElement *element;
        int i;
-       int numOfEdges = 0;
        int bufferIterator = 0;
-       EditFace *editFace, *efa, **faceArray;
+       EditFace *editFace, *efa;
+       //**faceArray;
        EditVert *editVert;
        EditEdge *editEdge;
+       /* This holds uv's that must be updated if the initial uv is 
stitchable. */
+       UvElement **commonVertMaps;
+
        MTFace *mt;
        short preview_enabled = preview->enabled;
        const char FACE_UVS_SELECTED = TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4;
@@ -1272,7 +1254,7 @@
        if(preview == NULL)
                return OPERATOR_CANCELLED;
        preview->enabled = preview_enabled;
-
+       preview->mode = state->mode;
        /* UV average is stored for every UV since potentially every UV can be 
stitched with another. Highly unlikely, I know but possible
         * nevertheless :p */
        uv_average = (UVVertAverage 
*)MEM_callocN(state->vmap->numOfUVs*sizeof(UVVertAverage), "stitch_averages");
@@ -1289,12 +1271,6 @@
                        editFace->tmp.l = -1;
                }
 
-
-       /* Vertex stitching case */
-       if(state->mode == VERT_STITCH){
-               /* This holds uv's that must be updated if the initial uv is 
stitchable. */
-               UvElement **commonVertMaps;
-
                /* The maximum number of faces that a UV can be part of is 
totfaces. We allocate this here to avoid allocating
                * this too many times on the fly */
                commonVertMaps = 
MEM_mallocN(state->em->totface*sizeof(UvElement *), "commonVertMaps");
@@ -1308,110 +1284,224 @@
                                int vertsPerFace = editFace->v4 ? 4 : 3;
 
                                for(i = 0; i < vertsPerFace; i++){
-                                       if(mt->flag & TF_SEL_MASK(i))
-                                       {
-                                               int averageIndex;
-                                               int iter = 0;
-                                               int iter2;
-                                               UvElement *mv_iter;
-                                               EditVert *vt = 
*(&(editFace->v1)+i);
-                                               /* ...we'll iterate through all 
shared UV's of the corresponding vertex */
-                                               mv_iter = vmap->vert[vt->tmp.l];
-                                               /* Original vertex will be 
previewed, of course */
-                                               preview->numOfPoints++;
+                                       /************ Vert stitching case 
**********************/
+                                       if(state->mode == VERT_STITCH){
+                                               if(mt->flag & TF_SEL_MASK(i))
+                                               {
+                                                       int averageIndex;
+                                                       int iter = 0;
+                                                       int iter2;
+                                                       UvElement *el_iter;
+                                                       EditVert *vt = 
*(&(editFace->v1)+i);
+                                                       /* ...we'll iterate 
through all shared UV's of the corresponding vertex */
+                                                       el_iter = 
vmap->vert[vt->tmp.l];
+                                                       /* Original vertex will 
be previewed, of course */
+                                                       preview->numOfOrig++;
 
-                                               /* First we need the UVMapVert 
that corresponds to our uv */
-                                               for(;mv_iter; mv_iter =  
mv_iter->next)
-                                               {
-                                                       /* Here we assume face 
does not use the same vertex twice. */
-                                                       if(mv_iter->face == 
editFace)
+                                                       /* First we need the 
UVMapVert that corresponds to our uv */
+                                                       for(;el_iter; el_iter = 
 el_iter->next)
                                                        {
-                                                               /* Assign first 
UV coincident */
-                                                               element = 
mv_iter;
-                                                               averageIndex = 
element - vmap->buf;
+                                                               /* Here we 
assume face does not use the same vertex twice. */
+                                                               
if(el_iter->face == editFace)
+                                                               {
+                                                                       /* 
Assign first UV coincident */
+                                                                       element 
= el_iter;
+                                                                       
averageIndex = element - vmap->buf;
+                                                               }
                                                        }
-                                               }
 
-                                               uv_average[averageIndex].count 
++;
-                                               uv_average[averageIndex].uv[0] 
+= mt->uv[i][0];
-                                               uv_average[averageIndex].uv[1] 
+= mt->uv[i][1];
+                                                       
uv_average[averageIndex].count ++;
+                                                       
uv_average[averageIndex].uv[0] += mt->uv[i][0];
+                                                       
uv_average[averageIndex].uv[1] += mt->uv[i][1];
 
-                                               for(mv_iter = 
vmap->vert[vt->tmp.l], iter = 0; mv_iter; mv_iter = mv_iter->next){
-                                                       MTFace *tmptface;
+                                                       for(el_iter = 
vmap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
+                                                               MTFace 
*tmptface;
 
-                                                       if(mv_iter == element){
-                                                               continue;
-                                                       }
+                                                               if(el_iter == 
element){
+                                                                       
continue;
+                                                               }
 
-                                                       efa = mv_iter->face;
-                                                       tmptface = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+                                                               efa = 
el_iter->face;
+                                                               tmptface = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-                                                       if(fabs((mt->uv[i][0] - 
tmptface->uv[mv_iter->tfindex][0]) < STD_UV_CONNECT_LIMIT) &&
-                                                               
(fabs(mt->uv[i][1] - tmptface->uv[mv_iter->tfindex][1]) < STD_UV_CONNECT_LIMIT))
-                                                       {
+                                                               
if(fabs((mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < 
STD_UV_CONNECT_LIMIT) &&
+                                                                               
(fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < STD_UV_CONNECT_LIMIT))
+                                                               {
                                                                        /* if 
the uv being iterated is coincident with the original, just add it to be 
updated later if
                                                                         * 
original uv is stitchable */
-                                                                       
commonVertMaps[iter++] = mv_iter;
-                                                       } else {

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