Revision: 37680
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37680
Author:   psy-fi
Date:     2011-06-21 00:33:45 +0000 (Tue, 21 Jun 2011)
Log Message:
-----------
smart welding - big refactor to better allow for adding/removing vertices on 
the go. This is a solid base commit to solidify the fun that is going to start 
in the next commits :)

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.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/mesh/editmesh_lib.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c  
2011-06-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c  
2011-06-21 00:33:45 UTC (rev 37680)
@@ -2311,49 +2311,52 @@
                }
        }
        
-       /* sort individual uvs for each vert */
-       for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
-               UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
-               UvMapVert *iterv, *v, *lastv, *next;
-               float *uv, *uv2, uvdiff[2];
+       if(limit)
+       {
+               /* sort individual uvs for each vert */
+               for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
+                       UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
+                       UvMapVert *iterv, *v, *lastv, *next;
+                       float *uv, *uv2, uvdiff[2];
 
-               while(vlist) {
-                       v= vlist;
-                       vlist= vlist->next;
-                       v->next= newvlist;
-                       newvlist= v;
+                       while(vlist) {
+                               v= vlist;
+                               vlist= vlist->next;
+                               v->next= newvlist;
+                               newvlist= v;
 
-                       efa = EM_get_face_for_index(v->f);
-                       tf = CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-                       uv = tf->uv[v->tfindex]; 
+                               efa = EM_get_face_for_index(v->f);
+                               tf = CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
+                               uv = tf->uv[v->tfindex];
                        
-                       lastv= NULL;
-                       iterv= vlist;
+                               lastv= NULL;
+                               iterv= vlist;
 
-                       while(iterv) {
-                               next= iterv->next;
-                               efa = EM_get_face_for_index(iterv->f);
-                               tf = CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-                               uv2 = tf->uv[iterv->tfindex];
+                               while(iterv) {
+                                       next= iterv->next;
+                                       efa = EM_get_face_for_index(iterv->f);
+                                       tf = CustomData_em_get(&em->fdata, 
efa->data, CD_MTFACE);
+                                       uv2 = tf->uv[iterv->tfindex];
                                
-                               sub_v2_v2v2(uvdiff, uv2, uv);
+                                       sub_v2_v2v2(uvdiff, uv2, uv);
 
-                               if(fabsf(uv[0]-uv2[0]) < limit[0] && 
fabsf(uv[1]-uv2[1]) < limit[1]) {
-                                       if(lastv) lastv->next= next;
-                                       else vlist= next;
-                                       iterv->next= newvlist;
-                                       newvlist= iterv;
+                                       if(fabsf(uv[0]-uv2[0]) < limit[0] && 
fabsf(uv[1]-uv2[1]) < limit[1]) {
+                                               if(lastv) lastv->next= next;
+                                               else vlist= next;
+                                               iterv->next= newvlist;
+                                               newvlist= iterv;
+                                       }
+                                       else
+                                               lastv=iterv;
+
+                                       iterv= next;
                                }
-                               else
-                                       lastv=iterv;
 
-                               iterv= next;
+                               newvlist->separate = 1;
                        }
 
-                       newvlist->separate = 1;
+                       vmap->vert[a]= newvlist;
                }
-
-               vmap->vert[a]= newvlist;
        }
        
        if (do_face_idx_array)

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-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-21 00:33:45 UTC (rev 37680)
@@ -49,9 +49,15 @@
        float *previewQuads;
        /* ...and here we'll store the triangles*/
        float *previewTris;
+       /* Preview points.These will be the selected vertices */
+       float *previewPoints;
+       /* Colors for selected vertices */
+       int *previewPointColors;
+
        /* here we'll store the number of triangles and quads to be drawn */
        unsigned int numOfTris;
        unsigned int numOfQuads;
+       unsigned int numOfPoints;
        /* stores whether user desires preview display */
        char enabled;
 } StitchPreviewer;

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-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-21 00:33:45 UTC (rev 37680)
@@ -1126,9 +1126,22 @@
 
 /* stitch state object */
 typedef struct StitchState {
-       int use_limit;
+       /* edge or vertex stitch mode */
+       short mode;
+       /* use limit flag */
+       short use_limit;
+       /* limit to operator, same as original operator */
        float limitDist;
-       short selectMode;
+       /* operate on vertex uvs or whole edge uvs */
+       short operationMode;
+       /* vertices used in the operation */
+       GHash *vertices;
+       /* faces affected by operation */
+       GHash *faces;
+       /* editmesh, cached for use in modal handler */
+       EditMesh *em;
+       /* vertmap, contains vertices sharing uv's in linked lists. */
+       UvVertMap *vmap;
 } StitchState;
 
 #define VERT_STITCH 1
@@ -1143,6 +1156,14 @@
        _stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), 
"stitch_previewer");
        _stitch_preview->previewQuads = NULL;
        _stitch_preview->previewTris = NULL;
+       _stitch_preview->previewPoints = NULL;
+       _stitch_preview->previewPointColors = NULL;
+
+       _stitch_preview->numOfQuads = 0;
+       _stitch_preview->numOfTris = 0;
+       _stitch_preview->numOfPoints = 0;
+
+       _stitch_preview->enabled = 1;
        return _stitch_preview;
 }
 
@@ -1161,6 +1182,16 @@
                        MEM_freeN(_stitch_preview->previewTris);
                        _stitch_preview->previewTris = NULL;
                }
+               if(_stitch_preview->previewPoints)
+               {
+                       MEM_freeN(_stitch_preview->previewPoints);
+                       _stitch_preview->previewPoints = NULL;
+               }
+               if(_stitch_preview->previewPointColors)
+               {
+                       MEM_freeN(_stitch_preview->previewPointColors);
+                       _stitch_preview->previewPointColors = NULL;
+               }
                MEM_freeN(_stitch_preview);
                _stitch_preview = NULL;
        }
@@ -1185,10 +1216,145 @@
        }
 }
 
+static void stitch_prepare_preview_data(StitchState *state)
+{
+       StitchPreviewer *preview = uv_get_stitch_previewer();
+       UVVertAverage *uv_average;
+       GHash *vertices = state->vertices;
+       GHash *faces = state->faces;
+       UvVertMap *vmap = state->vmap;
+       int numOfPoints = 0;
+       GHashIterator *ghiter;
+       int bufferIterator = 0;
+       int averageBufferIterator = 0;
+       EditFace *efa;
+       MTFace *mt;
+
+       /* cleanup previous preview(if any) */
+       if(preview->previewQuads){
+               MEM_freeN(preview->previewQuads);
+               preview->previewQuads = NULL;
+       }
+       if(preview->previewTris){
+               MEM_freeN(preview->previewTris);
+               preview->previewTris = NULL;
+       }
+       if(preview->previewPoints){
+               MEM_freeN(preview->previewPoints);
+               preview->previewPoints = NULL;
+       }
+       if(preview->previewPointColors){
+               MEM_freeN(preview->previewPointColors);
+               preview->previewPointColors = NULL;
+       }
+       ghiter = BLI_ghashIterator_new(faces);
+
+       uv_average = 
MEM_callocN(sizeof(UVVertAverage)*BLI_ghash_size(vertices), "stitch_averages");
+
+       BLI_ghashIterator_init(ghiter, vertices);
+
+       /* Count number of points/faces so that we allocate appropriate buffer 
*/
+       for( ; !BLI_ghashIterator_isDone(ghiter); 
BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+               EditVert *editVert =  BLI_ghashIterator_getKey(ghiter);
+               UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
+
+               while(mapVert){
+                       efa = EM_get_face_for_index(mapVert->f);
+                       mt = CustomData_em_get(&state->em->fdata, efa->data, 
CD_MTFACE);
+
+                       efa = EM_get_face_for_index(mapVert->f);
+                       mt = CustomData_em_get(&state->em->fdata, efa->data, 
CD_MTFACE);
+
+                       uv_average[averageBufferIterator].count++;
+                       uv_average[averageBufferIterator].uv[0] += 
mt->uv[mapVert->tfindex][0];
+                       uv_average[averageBufferIterator].uv[1] += 
mt->uv[mapVert->tfindex][1];
+
+                       mapVert = mapVert->next;
+                       numOfPoints++;
+                       if(!BLI_ghash_haskey(faces, efa))
+                       {
+                               BLI_ghash_insert(faces, efa, NULL);
+                               /* store position in the preview buffer */
+                               if(efa->v4)
+                               {
+                                       efa->tmp.l = preview->numOfQuads;
+                                       preview->numOfQuads++;
+                               }
+                               else {
+                                       efa->tmp.l = preview->numOfTris;
+                                       preview->numOfTris++;
+                               }
+                       }
+               }
+       }
+
+               /* 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");
+       preview->previewPoints = MEM_mallocN(numOfPoints*sizeof(float)*2, 
"stitch_preview_points");
+       preview->previewPointColors = MEM_mallocN(numOfPoints*sizeof(unsigned 
int)*2, "stitch_preview_point_colors");
+
+       BLI_ghashIterator_init(ghiter, faces);
+
+       /* Copy data from MTFaces to the preview display buffers */
+       for( ; !BLI_ghashIterator_isDone(ghiter); 
BLI_ghashIterator_step(ghiter)){
+               efa = BLI_ghashIterator_getKey(ghiter);
+               mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+               if(efa->v4)
+               {
+                       memcpy(preview->previewQuads+efa->tmp.l*8, 
&mt->uv[0][0], 8*sizeof(float));
+               }
+               else {
+                       memcpy(preview->previewTris+efa->tmp.l*6, 
&mt->uv[0][0], 6*sizeof(float));
+               }
+       }
+
+       BLI_ghashIterator_init(ghiter, vertices);
+       for(averageBufferIterator = 0; !BLI_ghashIterator_isDone(ghiter); 
BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+                       short stitchable;
+                       EditVert *editVert =  BLI_ghashIterator_getKey(ghiter);
+                       UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
+                       stitchable = (mapVert->next != NULL);
+
+                       while(mapVert){
+                               float uv[2];
+                               efa = EM_get_face_for_index(mapVert->f);
+                               mt = CustomData_em_get(&state->em->fdata, 
efa->data, CD_MTFACE);
+                               uv[0] = 
uv_average[averageBufferIterator].uv[0]/uv_average[averageBufferIterator].count;
+                               uv[1] = 
uv_average[averageBufferIterator].uv[1]/uv_average[averageBufferIterator].count;
+                               preview->previewPoints[bufferIterator*2] = 
uv[0];
+                               preview->previewPoints[bufferIterator*2 + 1] = 
uv[1];
+                               preview->previewPointColors[bufferIterator] = 
stitchable? (0x00FF0000):(0x0000FF00);
+
+                               if(efa->v4){
+                                       preview->previewQuads[efa->tmp.l*8 + 
2*mapVert->tfindex] = uv[0];
+                                       preview->previewQuads[efa->tmp.l*8 + 
2*mapVert->tfindex + 1] = uv[1];
+                               }
+                               else {
+                                       preview->previewTris[efa->tmp.l*6 + 
2*mapVert->tfindex]  = uv[0];
+                                       preview->previewTris[efa->tmp.l*6 + 
2*mapVert->tfindex + 1] = uv[1];
+                               }
+                               mapVert = mapVert->next;
+                               bufferIterator++;
+                       }
+               }
+
+       MEM_freeN(uv_average);
+
+       BLI_ghashIterator_free(ghiter);
+}
+
 static int stitch_init(bContext *C, wmOperator *op)
 {
+       EditFace *efa;
        StitchState *stitch_state = MEM_mallocN(sizeof(StitchState), 
"stitch_state");
        StitchPreviewer *preview = stitch_preview_init();
+       EditMesh *em;
+       Object *obedit = CTX_data_edit_object(C);
+       Scene *scene = CTX_data_scene(C);
+       GHash *tempHash;
+       GHashIterator *ghiter;
 
        preview->enabled = 1;
        op->customdata = stitch_state;
@@ -1198,7 +1364,48 @@
 
        stitch_state->use_limit = RNA_boolean_get(op->ptr, "use_limit");
        stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
+       stitch_state->vertices = BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp, "stitch_operator_vertices");

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