[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41344] branches/soc-2011-onion-uv-tools/ source/blender: Smart stitch

Antony Riakiotakis kalast at gmail.com
Fri Oct 28 18:13:08 CEST 2011


Revision: 41344
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41344
Author:   psy-fi
Date:     2011-10-28 16:13:07 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
Smart stitch
=============
*Change the way selection is stored. Due to the fact that after stitching there is a rearrangement of islands, redoing the operator incorrectly added uvs for stitching. 
Now saving face and uv index which remain constant after stitching.

Modified Paths:
--------------
    branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
    branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.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-10-28 14:46:09 UTC (rev 41343)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c	2011-10-28 16:13:07 UTC (rev 41344)
@@ -1322,20 +1322,13 @@
 /*
  * defines for UvElement flags
  */
-#ifndef STITCHNEW
-#define STITCH_PROCESSED 1
-#define STITCH_STITCHABLE 2
-#define STITCH_EDGE_PREVIEW 4
-#define STITCH_EDGE_STITCHABLE 8
-#define STITCH_USE_FOR_STITCHING 16
-#define STITCH_DO_UPDATE 32
-#else
 #define STITCH_SELECTED 1
 #define STITCH_STITCHABLE 2
 #define STITCH_PROCESSED 4
 #define STITCH_BOUNDARY 8
 #define STITCH_STITCHABLE_CANDIDATE 16
-#endif
+
+#define STITCH_NO_PREVIEW -1
 /* Previewer stuff (see uvedit_intern.h for more info) */
 static StitchPreviewer *_stitch_preview;
 
@@ -1470,7 +1463,7 @@
 						mt->uv[element->tfindex][0] += island_stitch_data[i].translation[0];
 						mt->uv[element->tfindex][1] += island_stitch_data[i].translation[1];
 					}
-					else if(efa->tmp.l != -1){
+					else if(efa->tmp.l != STITCH_NO_PREVIEW){
 						if(efa->v4){
 							if(state->mode == EDGE_STITCH){
 								stitch_uv_rotate(island_stitch_data[i].rotation, island_stitch_data[i].medianPoint, &preview->previewQuads[efa->tmp.l + 2*element->tfindex]);
@@ -2179,7 +2172,7 @@
 /* Set preview buffer position of UV face in editface->tmp.l */
 static void stitch_set_face_preview_buffer_position(EditFace *efa, StitchPreviewer *preview)
 {
-	if(efa->tmp.l == -1)
+	if(efa->tmp.l == STITCH_NO_PREVIEW)
 	{
 		if(efa->v4)
 		{
@@ -2280,7 +2273,7 @@
 	preview->mode = state->mode;
 	/* 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;
+		efa->tmp.l = STITCH_NO_PREVIEW;
 	}
 
 	island_stitch_data = MEM_callocN(sizeof(*island_stitch_data)*state->elementMap->totalIslands, "stitch_island_data");
@@ -2415,7 +2408,7 @@
 		}
 	}
 
-	printf("st %d, ust %d\n",preview->numOfStitchable, preview->numOfUnstitchable);
+//	printf("st %d, ust %d\n",preview->numOfStitchable, preview->numOfUnstitchable);
 	/*****************************************
 	 *  Setup preview for stitchable islands *
 	 *****************************************/
@@ -2456,7 +2449,7 @@
 
 		/* Copy data from MTFaces to the preview display buffers */
 		for(efa = state->em->faces.first; efa; efa = efa->next){
-			if(efa->tmp.l != -1)
+			if(efa->tmp.l != STITCH_NO_PREVIEW)
 			{
 				MTFace *mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
@@ -2608,7 +2601,7 @@
 							mt->uv[element_iter->tfindex][1] = averageUvPosition[i].uv[1];
 
 							uvedit_uv_select(scene, efa, mt, element_iter->tfindex);
-						}else if(efa->tmp.l != -1){
+						}else if(efa->tmp.l != STITCH_NO_PREVIEW){
 							if(efa->v4){
 								*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2) = averageUvPosition[i].uv[0];
 								*(preview->previewQuads+efa->tmp.l + element_iter->tfindex*2 + 1) = averageUvPosition[i].uv[1];
@@ -2667,6 +2660,7 @@
 {
 	int counter = 0, i;
 	EditFace *efa;
+	EditMesh *em;
 	GHashIterator* ghi;
 	UvEdge *edges;
 	StitchState *stitch_state = MEM_mallocN(sizeof(StitchState), "stitch_state");
@@ -2685,7 +2679,7 @@
 	/* initialize state */
 	stitch_state->use_limit = RNA_boolean_get(op->ptr, "use_limit");
 	stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
-	stitch_state->em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
+	stitch_state->em = em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
 	stitch_state->mode = RNA_enum_get(op->ptr, "mode");
 	stitch_state->snapIslands = RNA_boolean_get(op->ptr, "snap_islands");
 	stitch_state->static_island = RNA_int_get(op->ptr, "static_island");
@@ -2817,16 +2811,23 @@
 
 	/* Fill selection stack */
 	if(RNA_property_is_set(op->ptr, "selection")){
-		int uniqueIndex;
+		int faceIndex, elementIndex, uniqueIndex;
+		UvElement *element;
+
+		EM_init_index_arrays(em, 0, 0, 1);
+
 		RNA_BEGIN(op->ptr, itemptr, "selection") {
-			/* This should change for redo */
-			uniqueIndex = stitch_state->map[RNA_int_get(&itemptr, "index")];
+			faceIndex = RNA_int_get(&itemptr, "face_index");
+			elementIndex = RNA_int_get(&itemptr, "element_index");
+			element = get_uv_element(stitch_state->elementMap, EM_get_face_for_index(faceIndex), elementIndex);
+			uniqueIndex = stitch_state->map[element - stitch_state->elementMap->buf];
 			if(!(stitch_state->uvs[uniqueIndex]->flag & STITCH_SELECTED)){
 				stitch_state->selection_stack[stitch_state->selection_size++] = stitch_state->uvs[uniqueIndex];
 				stitch_state->uvs[uniqueIndex]->flag |= STITCH_SELECTED;
 			}
 		}
 		RNA_END;
+		EM_free_index_arrays();
 	} else {
 		for(efa = stitch_state->em->faces.first ; efa; efa = efa->next){
 			int numOfVerts;
@@ -2884,6 +2885,7 @@
 	stitch_state = (StitchState *)op->customdata;
 
 	if(finished){
+		EditFace *efa;
 		int i;
 
 		RNA_float_set(op->ptr, "limit", stitch_state->limitDist);
@@ -2892,11 +2894,19 @@
 		RNA_int_set(op->ptr, "static_island", stitch_state->static_island);
 		RNA_enum_set(op->ptr, "mode", stitch_state->mode);
 		RNA_boolean_set(op->ptr, "midpoint_snap", stitch_state->midpoints);
+
+		for(i = 0, efa = stitch_state->em->faces.first; efa; efa = efa->next, i++){
+			efa->tmp.l = i;
+		}
 		/* Store selection for re-execution of stitch */
 		for(i = 0; i < stitch_state->selection_size; i++){
 			PointerRNA itemptr;
 			RNA_collection_add(op->ptr, "selection", &itemptr);
-			RNA_int_set(&itemptr, "index", (UvElement *)stitch_state->selection_stack[i] - stitch_state->elementMap->buf);
+			if(stitch_state->mode == VERT_STITCH){
+				UvElement *element = (UvElement *)stitch_state->selection_stack[i];
+				RNA_int_set(&itemptr, "face_index", element->face->tmp.l);
+				RNA_int_set(&itemptr, "element_index", element->tfindex);
+			}
 		}
 
 		uvedit_live_unwrap_update(sima, scene, obedit);
@@ -3112,7 +3122,7 @@
 			}
 			break;
 
-		/* Use Edge selection */
+		/* Switch between selection modes */
 		case TKEY:
 			if(event->val == KM_PRESS){
 				EditVert *ev;

Modified: branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c	2011-10-28 14:46:09 UTC (rev 41343)
+++ branches/soc-2011-onion-uv-tools/source/blender/makesrna/intern/rna_scene.c	2011-10-28 16:13:07 UTC (rev 41344)
@@ -3475,9 +3475,13 @@
 	RNA_def_struct_ui_text(srna, "Selected Uv Element", "");
 
 	/* store the index to the UV element selected */
-	prop= RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
+	prop= RNA_def_property(srna, "element_index", PROP_INT, PROP_UNSIGNED);
 	RNA_def_property_flag(prop, PROP_IDPROPERTY);
-	RNA_def_property_ui_text(prop, "Index", "");
+	RNA_def_property_ui_text(prop, "Element Index", "");
+
+	prop= RNA_def_property(srna, "face_index", PROP_INT, PROP_UNSIGNED);
+	RNA_def_property_flag(prop, PROP_IDPROPERTY);
+	RNA_def_property_ui_text(prop, "Face Index", "");
 }
 
 




More information about the Bf-blender-cvs mailing list