[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43165] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_smart_stitch.c: smart stitch

Antony Riakiotakis kalast at gmail.com
Thu Jan 5 13:51:23 CET 2012


Revision: 43165
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43165
Author:   psy-fi
Date:     2012-01-05 12:51:22 +0000 (Thu, 05 Jan 2012)
Log Message:
-----------
smart stitch
============

-move edge related code to initialisation, remove from state.

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

Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_smart_stitch.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-01-05 12:50:23 UTC (rev 43164)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-01-05 12:51:22 UTC (rev 43165)
@@ -129,11 +129,6 @@
 	int selection_size;
 	/* island that stays in place */
 	int static_island;
-	/* for fast edge lookup... */
-	GHash *edgeHash;
-	/* ...and actual edge storage */
-	UvEdge *edges;
-	int total_edges;
 	/* store number of primitives per face so that we can allocate the active island buffer later */
 	unsigned int *quads_per_island;
 	unsigned int *tris_per_island;
@@ -372,12 +367,6 @@
 		if(stitch_state->map){
 			MEM_freeN(stitch_state->map);
 		}
-		if(stitch_state->edgeHash){
-			BLI_ghash_free(stitch_state->edgeHash, NULL, NULL);
-		}
-		if(stitch_state->edges){
-			MEM_freeN(stitch_state->edges);
-		}
 		if(stitch_state->quads_per_island){
 			MEM_freeN(stitch_state->quads_per_island);
 		}
@@ -825,11 +814,16 @@
 
 static int stitch_init(bContext *C, wmOperator *op)
 {
+	/* for fast edge lookup... */
+	GHash *edgeHash;
+	/* ...and actual edge storage */
+	UvEdge *edges;
+	int total_edges;
 	int counter = 0, i;
 	EditFace *efa;
 	EditMesh *em;
 	GHashIterator* ghi;
-	UvEdge *edges;
+	UvEdge *all_edges;
 	StitchState *state = MEM_mallocN(sizeof(StitchState), "stitch state");
 	Scene *scene = CTX_data_scene(C);
 	ToolSettings *ts = scene->toolsettings;
@@ -877,11 +871,11 @@
 	 * unique uvs for processing but I am accounting for all bizarre cases, especially for edges, this way */
 	state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack)*state->element_map->totalUVs, "uv_stitch_selection_stack");
 	state->map = MEM_mallocN(sizeof(*state->map)*state->element_map->totalUVs, "uv_stitch_unique_map");
-	/* Allcate the edge stack */
-	state->edgeHash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
-	edges = MEM_mallocN(sizeof(*edges)*state->element_map->totalUVs, "stitch_all_edges");
+	/* Allocate the edge stack */
+	edgeHash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
+	all_edges = MEM_mallocN(sizeof(*all_edges)*state->element_map->totalUVs, "stitch_all_edges");
 
-	if(!state->selection_stack || !state->uvs || !state->map || !state->edgeHash || !edges){
+	if(!state->selection_stack || !state->uvs || !state->map || !edgeHash || !all_edges){
 		stitch_state_delete(state);
 		return 0;
 	}
@@ -893,10 +887,6 @@
 		UvElement *element = state->element_map->vert[i];
 		for(; element; element = element->next){
 			if(element->separate){
-				MTFace *mt;
-				efa = element->face;
-				mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-
 				counter++;
 				state->uvs[counter] = element;
 			}
@@ -918,27 +908,27 @@
 				offset1 = state->map[itmp1];
 				offset2 = state->map[itmp2];
 
-				edges[counter].flag = 0;
-				edges[counter].element = element;
+				all_edges[counter].flag = 0;
+				all_edges[counter].element = element;
 				/* using an order policy, sort uvs according to address space. This avoids
 				 * Having two different UvEdges with the same uvs on different positions  */
 				if(offset1 < offset2){
-					edges[counter].uv1 = offset1;
-					edges[counter].uv2 = offset2;
+					all_edges[counter].uv1 = offset1;
+					all_edges[counter].uv2 = offset2;
 				}
 				else{
-					edges[counter].uv1 = offset2;
-					edges[counter].uv2 = offset1;
+					all_edges[counter].uv1 = offset2;
+					all_edges[counter].uv2 = offset1;
 				}
 				/* Hack! Set the value of the key to its flag. Now we can set the flag when an edge exists twice :) */
-				if(BLI_ghash_haskey(state->edgeHash, &edges[counter])){
-					char *flag = BLI_ghash_lookup(state->edgeHash, &edges[counter]);
+				if(BLI_ghash_haskey(edgeHash, &all_edges[counter])){
+					char *flag = BLI_ghash_lookup(edgeHash, &all_edges[counter]);
 					*flag = 0;
 				}
 				else{
 					/* Hack mentioned */
-					BLI_ghash_insert(state->edgeHash, &edges[counter], &(edges[counter].flag));
-					edges[counter].flag = STITCH_BOUNDARY;
+					BLI_ghash_insert(edgeHash, &all_edges[counter], &(all_edges[counter].flag));
+					all_edges[counter].flag = STITCH_BOUNDARY;
 				}
 				counter++;
 			}
@@ -946,40 +936,40 @@
 	}
 
 
-	ghi = BLI_ghashIterator_new(state->edgeHash);
-	state->edges = MEM_mallocN(sizeof(*state->edges)*BLI_ghash_size(state->edgeHash), "stitch_edges");
-	if(!ghi || !state->edges){
-		MEM_freeN(edges);
+	ghi = BLI_ghashIterator_new(edgeHash);
+	edges = MEM_mallocN(sizeof(*edges)*BLI_ghash_size(edgeHash), "stitch_edges");
+	if(!ghi || !edges){
+		MEM_freeN(all_edges);
 		stitch_state_delete(state);
 		return 0;
 	}
 	/* fill the edges with data */
 	for(i = 0; !BLI_ghashIterator_isDone(ghi); BLI_ghashIterator_step(ghi)){
-		state->edges[i++] = *((UvEdge *)BLI_ghashIterator_getKey(ghi));
+		edges[i++] = *((UvEdge *)BLI_ghashIterator_getKey(ghi));
 	}
-	state->total_edges = BLI_ghash_size(state->edgeHash);
+	total_edges = BLI_ghash_size(edgeHash);
 
 	/* cleanup temporary stuff */
 	BLI_ghashIterator_free(ghi);
-	MEM_freeN(edges);
+	MEM_freeN(all_edges);
 
-	/* refill hash with new pointers */
-	BLI_ghash_free(state->edgeHash, NULL, NULL);
-	state->edgeHash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
-	for(i = 0; i < state->total_edges; i++){
-		BLI_ghash_insert(state->edgeHash, state->edges + i, state->edges + i);
+	/* refill hash with new pointers to cleanup duplicates */
+	BLI_ghash_free(edgeHash, NULL, NULL);
+	edgeHash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
+	for(i = 0; i < total_edges; i++){
+		BLI_ghash_insert(edgeHash, edges + i, edges + i);
 	}
 
-	for(i = 0; i < state->total_edges; i++){
-		if(state->edges[i].flag & STITCH_BOUNDARY){
-			state->uvs[state->edges[i].uv1]->flag |= STITCH_BOUNDARY;
-			state->uvs[state->edges[i].uv2]->flag |= STITCH_BOUNDARY;
+	for(i = 0; i < total_edges; i++){
+		if(edges[i].flag & STITCH_BOUNDARY){
+			state->uvs[edges[i].uv1]->flag |= STITCH_BOUNDARY;
+			state->uvs[edges[i].uv2]->flag |= STITCH_BOUNDARY;
 		}
 	}
 
 	state->selection_size = 0;
 
-	/***** Fill selection stack *******/
+	/***** fill selection stack *******/
 
 	/* Load old selection if redoing operator with different settings */
 	if(RNA_property_is_set(op->ptr, "selection")){
@@ -1011,16 +1001,15 @@
 
 			for(i = 0; i < numOfVerts; i++){
 				if(uvedit_uv_selected(scene, efa, mt, i)){
-					int uniqueIndex;
 					UvElement *element = ED_get_uv_element(state->element_map, efa, i);
-					uniqueIndex = state->map[element - state->element_map->buf];
 					stitch_select_uv(element, state, state->selection_stack, &state->selection_size, 1);
 				}
 			}
 		}
 	}
 
-	/* initialise static island preview */
+	/***** initialise static island preview data *****/
+
 	state->quads_per_island = MEM_mallocN(sizeof(*state->quads_per_island)*state->element_map->totalIslands,
 			"stitch island quads");
 	state->tris_per_island = MEM_mallocN(sizeof(*state->tris_per_island)*state->element_map->totalIslands,
@@ -1041,6 +1030,9 @@
 		}
 	}
 
+	BLI_ghash_free(edgeHash, NULL, NULL);
+	MEM_freeN(edges);
+
 	if(!stitch_process_data(state, scene, 0)){
 		stitch_state_delete(state);
 		return 0;
@@ -1143,11 +1135,7 @@
 static int stitch_modal(bContext *C, wmOperator *op, wmEvent *event)
 {
 	StitchState *stitch_state;
-	Object *obedit;
-	StitchPreviewer *preview;
 	Scene *scene = CTX_data_scene(C);
-	obedit= CTX_data_edit_object(C);
-	preview = uv_get_stitch_previewer();
 
 	stitch_state = (StitchState *)op->customdata;
 
@@ -1230,7 +1218,7 @@
 			}
 			break;
 
-		/* Select geometry based on mode (vertex or edges)*/
+		/* Select geometry*/
 		case RIGHTMOUSE:
 			if(!event->shift){
 					return stitch_cancel(C, op);




More information about the Bf-blender-cvs mailing list