[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37738] branches/soc-2011-onion/source/ blender/editors/uvedit: smart welding - implemented preview with uv selection mask but much to my annoyment crashes remain .

Antony Riakiotakis kalast at gmail.com
Wed Jun 22 19:35:06 CEST 2011


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



More information about the Bf-blender-cvs mailing list