Revision: 40225
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40225
Author:   psy-fi
Date:     2011-09-15 12:58:22 +0000 (Thu, 15 Sep 2011)
Log Message:
-----------
Register faces for uv vertex stitching preview. This indeed feels easier to 
code now. I hope the trend continues.

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

Modified: 
branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 
2011-09-15 12:26:48 UTC (rev 40224)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 
2011-09-15 12:58:22 UTC (rev 40225)
@@ -1404,7 +1404,7 @@
 }
 
 /* Set preview buffer position of UV face in editface->tmp.l */
-static void stitch_update_face_preview_index(EditFace *efa, StitchPreviewer 
*preview)
+static void stitch_set_face_preview_buffer_position(EditFace *efa, 
StitchPreviewer *preview)
 {
        if(efa->tmp.l == -1)
        {
@@ -1669,7 +1669,7 @@
                                                        
island_stitch_data[element->island].addedForPreview = 1;
                                                }
                                                else {
-                                                       
stitch_update_face_preview_index(editFace, preview);
+                                                       
stitch_set_face_preview_buffer_position(editFace, preview);
                                                }
                                                for(iter2 = 0; iter2 < iter; 
iter2++)
                                                {
@@ -1691,7 +1691,7 @@
                                                                
island_stitch_data[el_iter->island].addedForPreview = 1;
                                                        }
                                                        else {
-                                                               
stitch_update_face_preview_index(efa, preview);
+                                                               
stitch_set_face_preview_buffer_position(efa, preview);
                                                        }
                                                }
                                        }
@@ -1886,7 +1886,7 @@
                                                                        
island_stitch_data[el_iter->island].addedForPreview = 1;
                                                                }
                                                                else {
-                                                                       
stitch_update_face_preview_index(efa, preview);
+                                                                       
stitch_set_face_preview_buffer_position(efa, preview);
                                                                }
                                                        }
                                                }
@@ -1903,7 +1903,7 @@
                                                                        
island_stitch_data[el_iter->island].addedForPreview = 1;
                                                                }
                                                                else {
-                                                                       
stitch_update_face_preview_index(efa, preview);
+                                                                       
stitch_set_face_preview_buffer_position(efa, preview);
                                                                }
                                                        }
                                                }
@@ -1928,7 +1928,7 @@
 
                                element = 
&state->elementMap->buf[state->elementMap->islandIndices[i]];
                                for(j = 0; j < previewIslandUVs; j++, 
element++){
-                                       
stitch_update_face_preview_index(element->face, preview);
+                                       
stitch_set_face_preview_buffer_position(element->face, preview);
                                }
                        }
                }
@@ -2205,9 +2205,78 @@
 }
 
 
-
+/* Main processing function. It calculates preview and final positions. */
 static int stitch_process_data(StitchState *state, int final, Scene *scene, 
int doIndexInit)
 {
+       int i;
+       StitchPreviewer *preview = uv_get_stitch_previewer();
+       IslandStitchData *island_stitch_data = NULL;
+       short preview_enabled = preview->enabled;
+       EditFace *efa;
+
+       /* cleanup previous preview */
+       stitch_preview_delete();
+       preview = stitch_preview_init();
+       if(preview == NULL)
+               return OPERATOR_CANCELLED;
+       preview->enabled = preview_enabled;
+       preview->mode = VERT_STITCH;
+       /* each face holds its position in the preview buffer in tmp. -1 is 
uninitialized */
+       for(efa = state->em->faces.first; efa; efa = efa->next){
+               efa->tmp.l = -1;
+       }
+
+       if(state->mode == VERT_STITCH){
+               for(i = 0; i < state->selection_size; i++){
+                       
if(determine_uv_stitchability(state->selection_stack[i], state)){
+                               UvElement *element_iter, *element = (UvElement 
*)state->selection_stack[i];
+                               element->flag = STITCH_STITCHABLE;
+                               for(element_iter = element; element_iter; 
element_iter = element_iter->next){
+                                       if(element_iter->separate && 
element_iter != element)
+                                               break;
+                                       
stitch_set_face_preview_buffer_position(element_iter->face, preview);
+                               }
+                       }
+               }
+       }
+
+               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");
+                       if(state->mode == VERT_STITCH){
+                               preview->previewOrig = (float 
*)MEM_mallocN(preview->numOfOrig*sizeof(float)*2, "stitch_preview_orig_data");
+                               preview->previewOrigColors = (unsigned int 
*)MEM_mallocN(preview->numOfOrig*sizeof(unsigned int), "stitch_preview_colors");
+                       } else {
+                               preview->previewOrig = (float 
*)MEM_mallocN(preview->numOfOrig*sizeof(float)*4, "stitch_preview_orig_data");
+                               preview->previewOrigColors = (unsigned int 
*)MEM_mallocN(preview->numOfOrig*sizeof(unsigned int)*2, 
"stitch_preview_colors");
+                       }
+
+                       /* Fill the preview buffers with stitchable only faces 
*/
+                       for(i = 0; i < state->selection_size; i++){
+                               UvElement *element = (UvElement 
*)state->selection_stack[i];
+                               if(element->flag == STITCH_STITCHABLE){
+                                       UvElement *element_iter = element;
+                                       for(element_iter = element; 
element_iter; element_iter = element_iter->next){
+                                               if(element_iter->separate && 
element_iter != element)
+                                                       break;
+                                               efa = element_iter->face;
+                                               if(efa->tmp.l != -1)
+                                               {
+                                                       MTFace *mt = 
CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+                                                       if(efa->v4) {
+                                                               
memcpy(preview->previewQuads+efa->tmp.l, &mt->uv[0][0], 8*sizeof(float));
+                                                       } else {
+                                                               
memcpy(preview->previewTris+efa->tmp.l, &mt->uv[0][0], 6*sizeof(float));
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+
        return 1;
 }
 
@@ -2610,7 +2679,7 @@
        /* properties */
        RNA_def_boolean(ot->srna, "use_limit", 0, "Use Limit", "Stitch UVs 
within a specified limit distance.");
        RNA_def_boolean(ot->srna, "snap_islands", 0, "Snap Islands", "Snap 
islands together. On edge stitch mode, rotates the islands too");
-       RNA_def_enum(ot->srna, "mode", mode, EDGE_STITCH, "Mode", "Vertex or 
edge stitching mode. In Edge stitching, both uv's must be stitchable to 
stitch");
+       RNA_def_enum(ot->srna, "mode", mode, VERT_STITCH, "Mode", "Vertex or 
edge stitching mode. In Edge stitching, both uv's must be stitchable to 
stitch");
        RNA_def_float(ot->srna, "limit", 0.01f, 0.0f, FLT_MAX, "Limit", "Limit 
distance in normalized coordinates.", -FLT_MAX, FLT_MAX);
 }
 

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

Reply via email to