Revision: 37738
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37738
Author:   psy-fi
Date:     2011-06-22 17:35:05 +0000 (Wed, 22 Jun 2011)
Log Message:
-----------
smart welding - implemented preview with uv selection mask but much to my 
annoyment crashes remain.

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-22 17:17:48 UTC (rev 37737)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h       
2011-06-22 17:35:05 UTC (rev 37738)
@@ -52,7 +52,7 @@
        /* Preview points.These will be the selected vertices */
        float *previewPoints;
        /* Colors for selected vertices */
-       int *previewPointColors;
+       unsigned int *previewPointColors;
 
        /* here we'll store the number of triangles and quads to be drawn */
        unsigned int numOfTris;

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-22 17:17:48 UTC (rev 37737)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c  
2011-06-22 17:35:05 UTC (rev 37738)
@@ -1134,10 +1134,6 @@
        float limitDist;
        /* 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. */
@@ -1220,56 +1216,77 @@
 {
        StitchPreviewer *preview = uv_get_stitch_previewer();
        UVVertAverage *uv_average;
-       GHash *vertices = state->vertices;
-       GHash *faces = BLI_ghash_new(BLI_ghashutil_ptrhash, 
BLI_ghashutil_ptrcmp, "stitch_operator_faces");
        UvVertMap *vmap = state->vmap;
-       int numOfPoints = 0;
-       GHashIterator *ghiter;
+       int i;
        int bufferIterator = 0;
-       int averageBufferIterator = 0;
-       EditFace *efa;
+       EditFace *editFace, *efa, **faceArray;
+       EditVert *editVert;
        MTFace *mt;
        short preview_enabled = preview->enabled;
+       const char FACE_UVS_SELECTED = TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4;
 
-       /* cleanup previous preview(if any) */
+       /* cleanup previous preview */
        stitch_preview_delete();
        preview = stitch_preview_init();
+       /*todo better store this in state */
        preview->enabled = preview_enabled;
 
-       EM_init_index_arrays(state->em, 0, 0, 1);
+       uv_average = (UVVertAverage 
*)MEM_callocN(state->em->totvert*sizeof(UVVertAverage), "stitch_averages");
 
-       ghiter = BLI_ghashIterator_new(vertices);
+       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;
+       }
 
-       uv_average = 
MEM_callocN(sizeof(UVVertAverage)*BLI_ghash_size(vertices), "stitch_averages");
+       /* Make face array and initialize position in preview buffer */
+       for(editFace = state->em->faces.first, i = 0; editFace; editFace = 
editFace->next, i++){
+                       faceArray[i] = editFace;
+                       editFace->tmp.l = -1;
+               }
 
        /* 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];
+       for(editFace = state->em->faces.first ; editFace; 
editFace=editFace->next){
+               mt = CustomData_em_get(&state->em->fdata, editFace->data, 
CD_MTFACE);
+               /* if face has UV selected... */
+               if(mt->flag & FACE_UVS_SELECTED){
+                       int vertsPerFace = editFace->v4 ? 4 : 3;
 
-               while(mapVert){
-                       efa = EM_get_face_for_index(mapVert->f);
-                       mt = CustomData_em_get(&state->em->fdata, efa->data, 
CD_MTFACE);
+                       for(i = 0; i < vertsPerFace; i++){
+                               if(mt->flag & TF_SEL_MASK(i))
+                               {
+                                       /* ...we'll iterate through all shared 
UV's of the corresponding vertex */
+                                       UvMapVert *mapVert = 
vmap->vert[(*(&(editFace->v1)+i))->tmp.t];
+                                       /* flag is not set anywhere so assuming 
it's safe to set to indicate use for preview */
+                                       mapVert->flag = 1;
 
-                       uv_average[averageBufferIterator].count++;
-                       uv_average[averageBufferIterator].uv[0] += 
mt->uv[mapVert->tfindex][0];
-                       uv_average[averageBufferIterator].uv[1] += 
mt->uv[mapVert->tfindex][1];
+                                       while(mapVert){
+                                               efa = faceArray[mapVert->f];
+                                               mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-                       mapVert = mapVert->next;
-                       numOfPoints++;
-                       if(!BLI_ghash_haskey(faces, efa)){
-                               BLI_ghash_insert(faces, efa, NULL);
+                                               preview->numOfPoints++;
 
-                               /* store position in the preview buffer */
-                               if(efa->v4)
-                               {
-                                       efa->tmp.l = preview->numOfQuads;
-                                       preview->numOfQuads++;
+                                               
uv_average[(*(&(editFace->v1)+i))->tmp.t].count++;
+                                               
uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[0] += mt->uv[mapVert->tfindex][0];
+                                               
uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[1] += mt->uv[mapVert->tfindex][1];
+
+                                               mapVert = mapVert->next;
+
+                                               /* store position in the 
preview buffer */
+                                               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++;
+                                                       }
+                                               }
+                                       }
                                }
-                               else {
-                                       efa->tmp.l = preview->numOfTris;
-                                       preview->numOfTris++;
-                               }
                        }
                }
        }
@@ -1277,74 +1294,71 @@
                /* 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 = (float 
*)MEM_mallocN(numOfPoints*sizeof(float)*2, "stitch_preview_points");
-       preview->previewPointColors = (float 
*)MEM_mallocN(numOfPoints*sizeof(unsigned int), "stitch_preview_point_colors");
+       preview->previewPoints = (float 
*)MEM_mallocN(preview->numOfPoints*sizeof(float)*2, "stitch_preview_points");
+       preview->previewPointColors = (unsigned int 
*)MEM_mallocN(preview->numOfPoints*sizeof(unsigned int), 
"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)
+       for(editFace = state->em->faces.first; editFace; editFace = 
editFace->next){
+               if(editFace->tmp.l != -1)
                {
-                       memcpy(preview->previewQuads+efa->tmp.l*8, 
&mt->uv[0][0], 8*sizeof(float));
+                       mt = CustomData_em_get(&state->em->fdata, 
editFace->data, CD_MTFACE);
+
+                       if(editFace->v4)
+                       {
+                               memcpy(preview->previewQuads+editFace->tmp.l, 
&mt->uv[0][0], 8*sizeof(float));
+                       }
+                       else {
+                               memcpy(preview->previewTris+editFace->tmp.l, 
&mt->uv[0][0], 6*sizeof(float));
+                       }
                }
-               else {
-                       memcpy(preview->previewTris+efa->tmp.l*6, 
&mt->uv[0][0], 6*sizeof(float));
-               }
        }
 
-       BLI_ghash_free(faces, NULL, NULL);
-
-       BLI_ghashIterator_init(ghiter, vertices);
-       for(averageBufferIterator = 0; !BLI_ghashIterator_isDone(ghiter); 
BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+       for(editVert = state->em->verts.first; editVert; editVert = 
editVert->next){
                        short stitchable;
-                       EditVert *editVert =  BLI_ghashIterator_getKey(ghiter);
-                       UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
-                       stitchable = (mapVert->next != NULL);
+                       UvMapVert *mapVert = vmap->vert[editVert->tmp.t];
 
-                       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(mapVert->flag){
+                               /* UV's that have a corresponding stitchable UV 
have a mapVert->next */
+                               stitchable = (mapVert->next != NULL);
 
-                               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];
+                               while(mapVert){
+                                       float uv[2];
+                                       int averageBufIndex;
+                                       efa = faceArray[mapVert->f];
+
+                                       averageBufIndex = (*(&(efa->v1) + 
mapVert->tfindex))->tmp.t;
+                                       uv[0] = 
uv_average[averageBufIndex].uv[0]/uv_average[averageBufIndex].count;
+                                       uv[1] = 
uv_average[averageBufIndex].uv[1]/uv_average[averageBufIndex].count;
+                                       
preview->previewPoints[bufferIterator*2] = uv[0];
+                                       preview->previewPoints[bufferIterator*2 
+ 1] = uv[1];
+                                       /* stitchable uv's will be green, 
non-stitchable red */
+                                       
preview->previewPointColors[bufferIterator] = stitchable? 
(0x00FF0000):(0x0000FF00);
+
+                                       if(efa->v4){
+                                               
preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex] = uv[0];
+                                               
preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+                                       }
+                                       else {
+                                               preview->previewTris[efa->tmp.l 
+ 2*mapVert->tfindex]  = uv[0];
+                                               preview->previewTris[efa->tmp.l 
+ 2*mapVert->tfindex + 1] = uv[1];
+                                       }
+                                       mapVert = mapVert->next;
+                                       bufferIterator++;
                                }
-                               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);
-
-       EM_free_index_arrays();
-
-       BLI_ghashIterator_free(ghiter);
+       MEM_freeN(faceArray);
 }
 
+
 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;
@@ -1354,43 +1368,10 @@
 
        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");
        stitch_state->em = em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
 

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