[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37680] branches/soc-2011-onion/source/ blender/editors: smart welding - big refactor to better allow for adding/ removing vertices on the go.

Antony Riakiotakis kalast at gmail.com
Tue Jun 21 02:33:46 CEST 2011


Revision: 37680
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37680
Author:   psy-fi
Date:     2011-06-21 00:33:45 +0000 (Tue, 21 Jun 2011)
Log Message:
-----------
smart welding - big refactor to better allow for adding/removing vertices on the go. This is a solid base commit to solidify the fun that is going to start in the next commits :)

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c
    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/mesh/editmesh_lib.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c	2011-06-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c	2011-06-21 00:33:45 UTC (rev 37680)
@@ -2311,49 +2311,52 @@
 		}
 	}
 	
-	/* sort individual uvs for each vert */
-	for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
-		UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
-		UvMapVert *iterv, *v, *lastv, *next;
-		float *uv, *uv2, uvdiff[2];
+	if(limit)
+	{
+		/* sort individual uvs for each vert */
+		for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
+			UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
+			UvMapVert *iterv, *v, *lastv, *next;
+			float *uv, *uv2, uvdiff[2];
 
-		while(vlist) {
-			v= vlist;
-			vlist= vlist->next;
-			v->next= newvlist;
-			newvlist= v;
+			while(vlist) {
+				v= vlist;
+				vlist= vlist->next;
+				v->next= newvlist;
+				newvlist= v;
 
-			efa = EM_get_face_for_index(v->f);
-			tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-			uv = tf->uv[v->tfindex]; 
+				efa = EM_get_face_for_index(v->f);
+				tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+				uv = tf->uv[v->tfindex];
 			
-			lastv= NULL;
-			iterv= vlist;
+				lastv= NULL;
+				iterv= vlist;
 
-			while(iterv) {
-				next= iterv->next;
-				efa = EM_get_face_for_index(iterv->f);
-				tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-				uv2 = tf->uv[iterv->tfindex];
+				while(iterv) {
+					next= iterv->next;
+					efa = EM_get_face_for_index(iterv->f);
+					tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+					uv2 = tf->uv[iterv->tfindex];
 				
-				sub_v2_v2v2(uvdiff, uv2, uv);
+					sub_v2_v2v2(uvdiff, uv2, uv);
 
-				if(fabsf(uv[0]-uv2[0]) < limit[0] && fabsf(uv[1]-uv2[1]) < limit[1]) {
-					if(lastv) lastv->next= next;
-					else vlist= next;
-					iterv->next= newvlist;
-					newvlist= iterv;
+					if(fabsf(uv[0]-uv2[0]) < limit[0] && fabsf(uv[1]-uv2[1]) < limit[1]) {
+						if(lastv) lastv->next= next;
+						else vlist= next;
+						iterv->next= newvlist;
+						newvlist= iterv;
+					}
+					else
+						lastv=iterv;
+
+					iterv= next;
 				}
-				else
-					lastv=iterv;
 
-				iterv= next;
+				newvlist->separate = 1;
 			}
 
-			newvlist->separate = 1;
+			vmap->vert[a]= newvlist;
 		}
-
-		vmap->vert[a]= newvlist;
 	}
 	
 	if (do_face_idx_array)

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-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h	2011-06-21 00:33:45 UTC (rev 37680)
@@ -49,9 +49,15 @@
 	float *previewQuads;
 	/* ...and here we'll store the triangles*/
 	float *previewTris;
+	/* Preview points.These will be the selected vertices */
+	float *previewPoints;
+	/* Colors for selected vertices */
+	int *previewPointColors;
+
 	/* here we'll store the number of triangles and quads to be drawn */
 	unsigned int numOfTris;
 	unsigned int numOfQuads;
+	unsigned int numOfPoints;
 	/* stores whether user desires preview display */
 	char enabled;
 } StitchPreviewer;

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-21 00:03:38 UTC (rev 37679)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-21 00:33:45 UTC (rev 37680)
@@ -1126,9 +1126,22 @@
 
 /* stitch state object */
 typedef struct StitchState {
-	int use_limit;
+	/* edge or vertex stitch mode */
+	short mode;
+	/* use limit flag */
+	short use_limit;
+	/* limit to operator, same as original operator */
 	float limitDist;
-	short selectMode;
+	/* 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. */
+	UvVertMap *vmap;
 } StitchState;
 
 #define VERT_STITCH 1
@@ -1143,6 +1156,14 @@
 	_stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), "stitch_previewer");
 	_stitch_preview->previewQuads = NULL;
 	_stitch_preview->previewTris = NULL;
+	_stitch_preview->previewPoints = NULL;
+	_stitch_preview->previewPointColors = NULL;
+
+	_stitch_preview->numOfQuads = 0;
+	_stitch_preview->numOfTris = 0;
+	_stitch_preview->numOfPoints = 0;
+
+	_stitch_preview->enabled = 1;
 	return _stitch_preview;
 }
 
@@ -1161,6 +1182,16 @@
 			MEM_freeN(_stitch_preview->previewTris);
 			_stitch_preview->previewTris = NULL;
 		}
+		if(_stitch_preview->previewPoints)
+		{
+			MEM_freeN(_stitch_preview->previewPoints);
+			_stitch_preview->previewPoints = NULL;
+		}
+		if(_stitch_preview->previewPointColors)
+		{
+			MEM_freeN(_stitch_preview->previewPointColors);
+			_stitch_preview->previewPointColors = NULL;
+		}
 		MEM_freeN(_stitch_preview);
 		_stitch_preview = NULL;
 	}
@@ -1185,10 +1216,145 @@
 	}
 }
 
+static void stitch_prepare_preview_data(StitchState *state)
+{
+	StitchPreviewer *preview = uv_get_stitch_previewer();
+	UVVertAverage *uv_average;
+	GHash *vertices = state->vertices;
+	GHash *faces = state->faces;
+	UvVertMap *vmap = state->vmap;
+	int numOfPoints = 0;
+	GHashIterator *ghiter;
+	int bufferIterator = 0;
+	int averageBufferIterator = 0;
+	EditFace *efa;
+	MTFace *mt;
+
+	/* cleanup previous preview(if any) */
+	if(preview->previewQuads){
+		MEM_freeN(preview->previewQuads);
+		preview->previewQuads = NULL;
+	}
+	if(preview->previewTris){
+		MEM_freeN(preview->previewTris);
+		preview->previewTris = NULL;
+	}
+	if(preview->previewPoints){
+		MEM_freeN(preview->previewPoints);
+		preview->previewPoints = NULL;
+	}
+	if(preview->previewPointColors){
+		MEM_freeN(preview->previewPointColors);
+		preview->previewPointColors = NULL;
+	}
+	ghiter = BLI_ghashIterator_new(faces);
+
+	uv_average = MEM_callocN(sizeof(UVVertAverage)*BLI_ghash_size(vertices), "stitch_averages");
+
+	BLI_ghashIterator_init(ghiter, vertices);
+
+	/* 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];
+
+		while(mapVert){
+			efa = EM_get_face_for_index(mapVert->f);
+			mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+			efa = EM_get_face_for_index(mapVert->f);
+			mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+			uv_average[averageBufferIterator].count++;
+			uv_average[averageBufferIterator].uv[0] += mt->uv[mapVert->tfindex][0];
+			uv_average[averageBufferIterator].uv[1] += mt->uv[mapVert->tfindex][1];
+
+			mapVert = mapVert->next;
+			numOfPoints++;
+			if(!BLI_ghash_haskey(faces, efa))
+			{
+				BLI_ghash_insert(faces, efa, NULL);
+				/* store position in the preview buffer */
+				if(efa->v4)
+				{
+					efa->tmp.l = preview->numOfQuads;
+					preview->numOfQuads++;
+				}
+				else {
+					efa->tmp.l = preview->numOfTris;
+					preview->numOfTris++;
+				}
+			}
+		}
+	}
+
+		/* 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 = MEM_mallocN(numOfPoints*sizeof(float)*2, "stitch_preview_points");
+	preview->previewPointColors = MEM_mallocN(numOfPoints*sizeof(unsigned int)*2, "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)
+		{
+			memcpy(preview->previewQuads+efa->tmp.l*8, &mt->uv[0][0], 8*sizeof(float));
+		}
+		else {
+			memcpy(preview->previewTris+efa->tmp.l*6, &mt->uv[0][0], 6*sizeof(float));
+		}
+	}
+
+	BLI_ghashIterator_init(ghiter, vertices);
+	for(averageBufferIterator = 0; !BLI_ghashIterator_isDone(ghiter); BLI_ghashIterator_step(ghiter), averageBufferIterator++){
+			short stitchable;
+			EditVert *editVert =  BLI_ghashIterator_getKey(ghiter);
+			UvMapVert *mapVert = vmap->vert[editVert->tmp.l];
+			stitchable = (mapVert->next != NULL);
+
+			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(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];
+				}
+				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);
+
+	BLI_ghashIterator_free(ghiter);
+}
+
 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;
@@ -1198,7 +1364,48 @@
 
 	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");

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list