Revision: 37929
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37929
Author:   psy-fi
Date:     2011-06-28 22:14:40 +0000 (Tue, 28 Jun 2011)
Log Message:
-----------
smart stitch - more edge evaluation stuff, not quite there yet but closer

Modified Paths:
--------------
    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_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-28 21:24:20 UTC (rev 37928)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-28 22:14:40 UTC (rev 37929)
@@ -69,7 +69,7 @@
 #define TF_PIN_MASK(id) (TF_PIN1 << id)
 #define TF_SEL_MASK(id) (TF_SEL1 << id)
 
-/* margin for scale to differ from 1.0 for printing debug info */
+/* margin for scale to differ from 1.0 for printing unwrapping warning */
 #define UNWRAP_SCALE_EPSILON 0.00001
 
 /* geometric utilities */

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-28 21:24:20 UTC (rev 37928)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-28 22:14:40 UTC (rev 37929)
@@ -73,10 +73,6 @@
 
 #include "uvedit_intern.h"
 
-#define STITCH_PROCESSED 1
-#define STITCH_STITCHABLE 2
-#define STITCH_SELECTED        4
-
 /************************* state testing ************************/
 
 int ED_uvedit_test(Object *obedit)
@@ -1142,14 +1138,38 @@
        EditMesh *em;
        /* vertmap, contains vertices sharing uv's in linked lists. */
        UvVertMap *vmap;
+       /* gHash with operand edges */
+       GHash *edges;
 } 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
+
 /* 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)
 {
@@ -1246,8 +1266,6 @@
        MTFace *mt;
        short preview_enabled = preview->enabled;
        const char FACE_UVS_SELECTED = TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4;
-       /* This holds uv's that are coincident with the initial uv checked. */
-       UvMapVert **commonVertMaps;
 
        /* cleanup previous preview */
        stitch_preview_delete();
@@ -1262,6 +1280,7 @@
 
        /* This serves exactly as the EM_init_arrays with the added advantage 
that we can initialize the preview buffer position. */
        faceArray = (EditFace **)MEM_mallocN(state->em->totface*sizeof(EditFace 
*), "stitch preview faceArray");
+
        /* Store Indices to editVerts */
        for(editVert = state->em->verts.first, i = 0; editVert; editVert = 
editVert->next, i++){
                editVert->tmp.t = i;
@@ -1273,17 +1292,17 @@
                        editFace->tmp.l = -1;
                }
 
-       /* If mode is edge mode initialize the edge position on preview buffer 
to -1 (invalid) */
-       if(state->mode == EDGE_STITCH){
-               for(editEdge = state->em->edges.first; editEdge; editEdge = 
editEdge->next){
-                       editEdge->tmp.l = -1;
-               }
-       }
-       /* 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(UvMapVert *), 
"commonVertMaps");
 
+       /* Vert stitching case */
        if(state->mode == VERT_STITCH){
+               /* This holds uv's that must be updated if the initial uv is 
stitchable. */
+               UvMapVert **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(UvMapVert *), "commonVertMaps");
+
+
                /* Count number of points/faces so that we allocate appropriate 
buffer */
                for(editFace = state->em->faces.first ; editFace; 
editFace=editFace->next){
                        mt = CustomData_em_get(&state->em->fdata, 
editFace->data, CD_MTFACE);
@@ -1316,9 +1335,9 @@
                                                        }
                                                }
 
-                                               uv_average[averageIndex].count 
= 1;
-                                               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.t], iter = 0; mv_iter; mv_iter = mv_iter->next){
                                                        MTFace *tmptface;
@@ -1400,12 +1419,85 @@
                                }
                        }
                }
+
+               MEM_freeN(commonVertMaps);
+
+       /* Edge stitching case */
        } else {
 
+               /* 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");
+               GHashIterator* edgeIterator = 
BLI_ghashIterator_new(state->edges);
+
+               for(; !BLI_ghashIterator_isDone(edgeIterator); 
BLI_ghashIterator_step(edgeIterator)){
+                       /* simple check to see which of the two face vertices 
corresponds to the original */
+                       char vertCheck = 0;
+                       EditVert *v1, *v2;
+                       UvMapVert *mapVert;
+                       int stackSize = 0;
+                       /* initialize position in preview buffer */
+                       editEdge->tmp.l = -1;
+                       editEdge = BLI_ghashIterator_getKey(edgeIterator);
+
+                       v1 = editEdge->v1;
+                       v2 = editEdge->v2;
+
+                       /* search for faces with the corresponding UV's*/
+                       for(mapVert = vmap->vert[v1->tmp.t]; mapVert; mapVert = 
mapVert->next){
+                               int nverts;
+                               efa = faceArray[mapVert->f];
+                               nverts = efa->v4 ? 4 : 3;
+                               if((vertCheck = (*(&efa->v1 + (mapVert->tfindex 
+ 1)%nverts) == v2)) || (*(&efa->v1 + (mapVert->tfindex + nverts - 1)%nverts) 
== v2)){
+                                       mapVert->flag |= (vertCheck) ? 
STITCH_EDGE_PLUS : 0;
+                                       faceStack[stackSize++] = mapVert - 
vmap->buf;
+                               }
+                       }
+
+                       /* Check if faces found comply with stitchability 
restrictions */
+                       for(i = 0; i < stackSize; i++)
+                       {
+                               int faceIter;
+                               float uv1[2][2];
+                               int nverts;
+                               mapVert = vmap->buf + faceStack[i];
+                               editFace = faceArray[mapVert->f];
+                               nverts = (editFace->v4)? 4 : 3;
+                               mt = CustomData_em_get(&state->em->fdata, 
editFace->data, CD_MTFACE);
+
+                               /* Take uv's of first face */
+                               uv1[0][0] = mt->uv[mapVert->tfindex][0];
+                               uv1[0][1] = mt->uv[mapVert->tfindex][1];
+                               uv1[1][0] = (mapVert->flag & STITCH_EDGE_PLUS)? 
mt->uv[(mapVert->tfindex + 1)%nverts][0] : mt->uv[(mapVert->tfindex + nverts - 
1)%nverts][0];
+                               uv1[1][1] = (mapVert->flag & STITCH_EDGE_PLUS)? 
mt->uv[(mapVert->tfindex + 1)%nverts][1] : mt->uv[(mapVert->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;
+                                       UvMapVert *mapVertIter = vmap->buf + 
faceStack[faceIter];
+                                       efa = faceArray[mapVertIter->f];
+                                       nverts = (efa->v4)? 4 : 3;
+
+                                       tmptface = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+                                       /* Take uv's of first 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 check */
+                                       if(1)
+                                       {
+
+                                       }
+                               }
+                       }
+               }
+
+               BLI_ghashIterator_free(edgeIterator);
        }
 
-       MEM_freeN(commonVertMaps);
-
        if(!final)
        {
                /* Initialize the preview buffers */
@@ -1512,6 +1604,7 @@
        stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
        stitch_state->em = em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
        stitch_state->mode = VERT_STITCH;
+       stitch_state->edges = BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp, "stitch edge selection hash");
 
        EM_init_index_arrays(stitch_state->em, 0, 0, 1);
        stitch_state->vmap = EM_make_uv_vert_map(stitch_state->em, 1, 0, limit);
@@ -1558,6 +1651,7 @@
        /* remember to set vertices used for redo operator in an RNA array or 
something */
 
        EM_free_uv_vert_map(stitch_state->vmap);
+       BLI_ghash_free(stitch_state->edges, NULL, NULL);
 
        BKE_mesh_end_editmesh(obedit->data, stitch_state->em);
 
@@ -1659,8 +1753,12 @@
                                Scene *scene= CTX_data_scene(C);
 
                                UI_view2d_region_to_view(&ar->v2d, 
event->mval[0], event->mval[1], &co[0], &co[1]);
-                               if(stitch_state->mode == VERT_STITCH)
+                               if(stitch_state->mode == VERT_STITCH){
                                        find_nearest_uv_vert(scene, ima, 
stitch_state->em, co, NULL, &hit);
+                               }
+                               else{
+                                       find_nearest_uv_edge(scene, ima, 
stitch_state->em, co, &hit);
+                               }
 
                                if(hit.efa)
                                {
@@ -1675,9 +1773,12 @@
                                                else
                                                        tface->flag |= 
TF_SEL_MASK(hit.uv);
                                        }
-                                       if(stitch_state->mode == EDGE_STITCH)
+                                       else
                                        {
-
+                                               EditEdge *edge = *(&hit.efa->e1 
+ hit.edge);
+                                               
if(!BLI_ghash_haskey(stitch_state->edges,edge)){
+                                                       
BLI_ghash_insert(stitch_state->edges, edge, NULL);
+                                               }
                                        }
                                }
                                stitch_process_data(stitch_state, 0, scene);

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

Reply via email to