[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40225] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: Register faces for uv vertex stitching preview.

Antony Riakiotakis kalast at gmail.com
Thu Sep 15 14:58:22 CEST 2011


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);
 }
 




More information about the Bf-blender-cvs mailing list