[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