[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12290] trunk/blender/source/blender: Mesh edit option 'AutoMerge' - access from the mesh menu, basically runs remove doubles after transform.

Campbell Barton cbarton at metavr.com
Thu Oct 18 23:47:55 CEST 2007


Revision: 12290
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12290
Author:   campbellbarton
Date:     2007-10-18 23:47:55 +0200 (Thu, 18 Oct 2007)

Log Message:
-----------
Mesh edit option 'AutoMerge' - access from the mesh menu, basically runs remove doubles after transform. but only merges 
unselected verts into selected verts, so it wont merge verts your not editing.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editmesh.h
    trunk/blender/source/blender/include/editmesh.h
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/python/api2_2x/Mesh.c
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/editmesh_add.c
    trunk/blender/source/blender/src/editmesh_mods.c
    trunk/blender/source/blender/src/editmesh_tools.c
    trunk/blender/source/blender/src/editobject.c
    trunk/blender/source/blender/src/header_view3d.c
    trunk/blender/source/blender/src/transform_conversions.c

Modified: trunk/blender/source/blender/include/BIF_editmesh.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editmesh.h	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/include/BIF_editmesh.h	2007-10-18 21:47:55 UTC (rev 12290)
@@ -206,7 +206,7 @@
 #define SUBDIV_SELECT_LOOPCUT 3
 
 extern void convert_to_triface(int direction);
-extern int removedoublesflag(short flag, float limit);
+extern int removedoublesflag(short flag, short automerge, float limit);
 extern void xsortvert_flag(int flag);
 extern void hashvert_flag(int flag);
 

Modified: trunk/blender/source/blender/include/editmesh.h
===================================================================
--- trunk/blender/source/blender/include/editmesh.h	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/include/editmesh.h	2007-10-18 21:47:55 UTC (rev 12290)
@@ -90,6 +90,7 @@
 
 /* ******************* editmesh_mods.c */
 extern EditEdge *findnearestedge(int *dist);
+extern void EM_automerge(int update);
 
 /**
  * findnearestvert

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2007-10-18 21:47:55 UTC (rev 12290)
@@ -418,8 +418,10 @@
 	float editbutsize;                      /* size of normals */
 	short selectmode;
 	short proportional, prop_mode;
+	short automerge, pad5, pad6, pad7;
 	
 	short use_nodes;
+	
 	struct bNodeTree *nodetree;	
 	
 	void *ed;								/* sequence editor data is allocated here */

Modified: trunk/blender/source/blender/python/api2_2x/Mesh.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mesh.c	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/python/api2_2x/Mesh.c	2007-10-18 21:47:55 UTC (rev 12290)
@@ -3526,7 +3526,7 @@
 	basact = BASACT;
 	BASACT = base;
 	
-	removedoublesflag( 1, 0.0 );
+	removedoublesflag( 1, 0, 0.0 );
 	/* make mesh's object active, enter mesh edit mode */
 	G.obedit = object;
 	
@@ -7214,7 +7214,7 @@
 		esubdivideflag( 1, 0.0, *((int *)args[0]), 1, 0 );
 		break;
 	case MESH_TOOL_REMDOUB:
-		result = removedoublesflag( 1, *((float *)args[0]) );
+		result = removedoublesflag( 1, 0, *((float *)args[0]) );
 
 		attr = PyInt_FromLong( result );
 		if( !attr )

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/src/buttons_editing.c	2007-10-18 21:47:55 UTC (rev 12290)
@@ -4226,7 +4226,7 @@
 		G.f -= G_DISABLE_OK;
 		break;
 	case B_REMDOUB:
-		count= removedoublesflag(1, G.scene->toolsettings->doublimit);
+		count= removedoublesflag(1, 1, G.scene->toolsettings->doublimit);
 		notice("Removed: %d", count);
 		if (count) { /* only undo and redraw if an action is taken */
 			countall ();

Modified: trunk/blender/source/blender/src/editmesh_add.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_add.c	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/src/editmesh_add.c	2007-10-18 21:47:55 UTC (rev 12290)
@@ -960,7 +960,7 @@
 			rotateflag(2, v1->co, cmat);
 		}
 
-		removedoublesflag(4, 0.0001);
+		removedoublesflag(4, 0, 0.0001);
 
 		/* and now do imat */
 		eve= em->verts.first;

Modified: trunk/blender/source/blender/src/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_mods.c	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/src/editmesh_mods.c	2007-10-18 21:47:55 UTC (rev 12290)
@@ -131,6 +131,18 @@
 	}
 }
 
+void EM_automerge(int update) {
+	if  (G.scene->automerge) {
+		if (G.obedit && G.obedit->type==OB_MESH) {
+			if (removedoublesflag(1, 1, G.scene->toolsettings->doublimit)) {
+				if (update) {
+					DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+				}
+			}
+		}
+	}
+}
+
 /* ****************************** SELECTION ROUTINES **************** */
 
 unsigned int em_solidoffs=0, em_wireoffs=0, em_vertoffs=0;	/* set in drawobject.c ... for colorindices */
@@ -3331,7 +3343,7 @@
 	switch(ret)
 	{
 		case 1:
-			notice("Removed %d Vertices", removedoublesflag(1, G.scene->toolsettings->doublimit));
+			notice("Removed %d Vertices", removedoublesflag(1, 0, G.scene->toolsettings->doublimit));
 			BIF_undo_push("Remove Doubles");
 			break;
 		case 2:	

Modified: trunk/blender/source/blender/src/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_tools.c	2007-10-18 20:43:39 UTC (rev 12289)
+++ trunk/blender/source/blender/src/editmesh_tools.c	2007-10-18 21:47:55 UTC (rev 12290)
@@ -195,8 +195,15 @@
 	
 }
 
-int removedoublesflag(short flag, float limit)		/* return amount */
+int removedoublesflag(short flag, short automerge, float limit)		/* return amount */
 {
+	/*
+		flag -	Test with vert->flags
+		weld -	Alternative operation, merge unselected into selected.
+				Used for "Auto Weld" mode. warning.
+		limit -	Quick manhattan distance between verts.
+	*/
+	
 	EditMesh *em = G.editMesh;
 	/* all verts with (flag & 'flag') are being evaluated */
 	EditVert *eve, *v1, *nextve;
@@ -209,12 +216,15 @@
 	
 	if(multires_test()) return 0;
 
+	
 	/* flag 128 is cleared, count */
+
+	/* Normal non weld operation */
 	eve= em->verts.first;
 	amount= 0;
 	while(eve) {
 		eve->f &= ~128;
-		if(eve->h==0 && (eve->f & flag)) amount++;
+		if(eve->h==0 && (automerge || (eve->f & flag))) amount++;
 		eve= eve->next;
 	}
 	if(amount==0) return 0;
@@ -223,7 +233,7 @@
 	sb= sortblock= MEM_mallocN(sizeof(xvertsort)*amount,"sortremovedoub");
 	eve= em->verts.first;
 	while(eve) {
-		if(eve->h==0 && (eve->f & flag)) {
+		if(eve->h==0 && (automerge || (eve->f & flag))) {
 			sb->x= eve->co[0]+eve->co[1]+eve->co[2];
 			sb->v1= eve;
 			sb++;
@@ -232,44 +242,72 @@
 	}
 	qsort(sortblock, amount, sizeof(xvertsort), vergxco);
 
+	
 	/* test for doubles */
-	sb= sortblock;
-	for(a=0; a<amount; a++) {
-		eve= sb->v1;
-		if( (eve->f & 128)==0 ) {
-			sb1= sb+1;
-			for(b=a+1; b<amount; b++) {
-				/* first test: simpel dist */
-				dist= sb1->x - sb->x;
-				if(dist > limit) break;
-				
-				/* second test: is vertex allowed */
-				v1= sb1->v1;
-				if( (v1->f & 128)==0 ) {
+	sb= sortblock;	
+	if (automerge) {
+		for(a=0; a<amount; a++, sb++) {
+			eve= sb->v1;
+			if( (eve->f & 128)==0 ) {
+				sb1= sb+1;
+				for(b=a+1; b<amount && (eve->f & 128)==0; b++, sb1++) {
+					if(sb1->x - sb->x > limit) break;
 					
-					dist= (float)fabs(v1->co[0]-eve->co[0]);
-					if(dist<=limit) {
-						dist= (float)fabs(v1->co[1]-eve->co[1]);
-						if(dist<=limit) {
-							dist= (float)fabs(v1->co[2]-eve->co[2]);
-							if(dist<=limit) {
+					/* when welding, only allow selected-> unselected*/
+					v1= sb1->v1;
+					if( (v1->f & 128)==0 ) {
+						if ((eve->f & flag)==0 && (v1->f & flag)==1) {
+							if(	(float)fabs(v1->co[0]-eve->co[0])<=limit && 
+								(float)fabs(v1->co[1]-eve->co[1])<=limit &&
+								(float)fabs(v1->co[2]-eve->co[2])<=limit)
+							{	/* unique bit */
+								eve->f|= 128;
+								eve->tmp.v = v1;
+							}
+						} else if(	(eve->f & flag)==1 && (v1->f & flag)==0 ) {
+							if(	(float)fabs(v1->co[0]-eve->co[0])<=limit && 
+								(float)fabs(v1->co[1]-eve->co[1])<=limit &&
+								(float)fabs(v1->co[2]-eve->co[2])<=limit)
+							{	/* unique bit */
 								v1->f|= 128;
 								v1->tmp.v = eve;
 							}
 						}
 					}
 				}
-				sb1++;
 			}
 		}
-		sb++;
+	} else {
+		for(a=0; a<amount; a++, sb++) {
+			eve= sb->v1;
+			if( (eve->f & 128)==0 ) {
+				sb1= sb+1;
+				for(b=a+1; b<amount; b++, sb1++) {
+					/* first test: simpel dist */
+					if(sb1->x - sb->x > limit) break;
+					v1= sb1->v1;
+					
+					/* second test: is vertex allowed */
+					if( (v1->f & 128)==0 ) {
+						if(	(float)fabs(v1->co[0]-eve->co[0])<=limit && 
+							(float)fabs(v1->co[1]-eve->co[1])<=limit &&
+							(float)fabs(v1->co[2]-eve->co[2])<=limit)
+						{
+							v1->f|= 128;
+							v1->tmp.v = eve;
+						}
+					}
+				}
+			}
+		}
 	}
 	MEM_freeN(sortblock);
-
-	for(eve = em->verts.first; eve; eve=eve->next)
-		if((eve->f & flag) && (eve->f & 128))
-			EM_data_interp_from_verts(eve, eve->tmp.v, eve->tmp.v, 0.5f);
-
+	
+	if (!automerge)
+		for(eve = em->verts.first; eve; eve=eve->next)
+			if((eve->f & flag) && (eve->f & 128))
+				EM_data_interp_from_verts(eve, eve->tmp.v, eve->tmp.v, 0.5f);
+	
 	/* test edges and insert again */
 	eed= em->edges.first;
 	while(eed) {
@@ -445,7 +483,7 @@
 	eve= (struct EditVert *)em->verts.first;
 	while(eve) {
 		nextve= eve->next;
-		if(eve->f & flag) {
+		if(automerge || eve->f & flag) {
 			if(eve->f & 128) {
 				a++;
 				BLI_remlink(&em->verts, eve);
@@ -4023,7 +4061,7 @@
 
 	waitcursor(1);
 
-	removedoublesflag(1, limit);
+	removedoublesflag(1, 0, limit);
 
 	/* tag all original faces */
 	efa= em->faces.first;
@@ -4378,7 +4416,7 @@
 	allqueue(REDRAWVIEW3D, 0);
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 	
-	removedoublesflag(1, limit);
+	removedoublesflag(1, 0, limit);
 
 	/* flush selected vertices to edges/faces */
 	EM_select_flush();
@@ -4531,7 +4569,7 @@
 		return 0;
 	}
 	select_more();
-	removedoublesflag(1,0.001);
+	removedoublesflag(1,0, 0.001);
 	EM_select_flush();
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 	return 1;
@@ -5079,6 +5117,8 @@
 	}
 	
 	force_draw(0);
+	
+	EM_automerge(0);
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 	scrarea_queue_winredraw(curarea);		 
 	
@@ -6113,7 +6153,7 @@
 		
 	}
 	freecollections(&allcollections);
-	removedoublesflag(1, MERGELIMIT);
+	removedoublesflag(1, 0, MERGELIMIT);
 	/*get rid of this!*/
 	countall();
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
@@ -6157,7 +6197,7 @@
 	}
 	
 	countall();
-	return removedoublesflag(1,MERGELIMIT);
+	return removedoublesflag(1, 0, MERGELIMIT);
 }
 
 int merge_target(int target, int uvmerge)
@@ -6180,7 +6220,7 @@
 	countall();
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 	allqueue(REDRAWVIEW3D, 0);
-	return removedoublesflag(1,MERGELIMIT);
+	return removedoublesflag(1, 0, MERGELIMIT);
 	
 }

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list