[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22388] branches/bmesh/blender/source/ blender: fixed some problems in weld, collapse, and collapse uvs

Joseph Eagar joeedh at gmail.com
Wed Aug 12 05:51:28 CEST 2009


Revision: 22388
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22388
Author:   joeedh
Date:     2009-08-12 05:51:28 +0200 (Wed, 12 Aug 2009)

Log Message:
-----------
fixed some problems in weld, collapse, and collapse uvs

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
    branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_layers.c
    branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-08-12 03:51:28 UTC (rev 22388)
@@ -67,6 +67,11 @@
  */
 int CustomData_layer_has_math(struct CustomData *data, int layern);
 
+/*copies the "value" (e.g. mloopuv uv or mloopcol colors) from one block to
+  another, while not overwriting anything else (e.g. flags).  probably only
+  implemented for mloopuv/mloopcol, for now.*/
+void CustomData_data_copy_value(int type, void *source, void *dest);
+
 /* compares if data1 is equal to data2.  type is a valid CustomData type
  * enum (e.g. CD_MLOOPUV). the layer type's equal function is used to compare
  * the data, if it exists, otherwise memcmp is used.*/

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-08-12 03:51:28 UTC (rev 22388)
@@ -98,6 +98,7 @@
 	void (*initminmax)(void *min, void *max);
 	void (*add)(void *data1, void *data2);
 	void (*dominmax)(void *data1, void *min, void *max);
+	void (*copyvalue)(void *source, void *dest);
 } LayerTypeInfo;
 
 static void layerCopy_mdeformvert(const void *source, void *dest,
@@ -541,6 +542,15 @@
 }
 
 /* --------- */
+static void layerCopyValue_mloopcol(void *source, void *dest)
+{
+	MLoopCol *m1 = source, *m2 = dest;
+	
+	m2->r = m1->r;
+	m2->g = m1->g;
+	m2->b = m1->b;
+	m2->a = m1->a;
+}
 
 static int layerEqual_mloopcol(void *data1, void *data2)
 {
@@ -662,6 +672,14 @@
 	mc->b = (int)col.b;
 }
 
+static void layerCopyValue_mloopuv(void *source, void *dest)
+{
+	MLoopUV *luv1 = source, *luv2 = dest;
+	
+	luv2->uv[0] = luv1->uv[0];
+	luv2->uv[1] = luv1->uv[1];
+}
+
 static int layerEqual_mloopuv(void *data1, void *data2)
 {
 	MLoopUV *luv1 = data1, *luv2 = data2;
@@ -838,10 +856,10 @@
 	{sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
 	{sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL,
 	 layerEqual_mloopuv, layerMultiply_mloopuv, layerInitMinMax_mloopuv, 
-	 layerAdd_mloopuv, layerDoMinMax_mloopuv},
+	 layerAdd_mloopuv, layerDoMinMax_mloopuv, layerCopyValue_mloopuv},
 	{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, 
 	 layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol, 
-	 layerAdd_mloopcol, layerDoMinMax_mloopcol},
+	 layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
 	{sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
 	 layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL},
@@ -2021,9 +2039,9 @@
 		/*ensure all current elements follow new customdata layout*/
 		BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
 			BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
-				CustomData_bmesh_copy_data(&destold, dest, h->data, &tmp);
-				CustomData_bmesh_free_block(&destold, &h->data);
-				h->data = tmp;
+				CustomData_bmesh_copy_data(&destold, dest, l->head.data, &tmp);
+				CustomData_bmesh_free_block(&destold, &l->head.data);
+				l->head.data = tmp;
 			}
 		}
 	}
@@ -2150,6 +2168,20 @@
 	return 0;
 }
 
+/*copies the "value" (e.g. mloopuv uv or mloopcol colors) from one block to
+  another, while not overwriting anything else (e.g. flags)*/
+void CustomData_data_copy_value(int type, void *source, void *dest)
+{
+	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
+
+	if(!dest) return;
+
+	if(typeInfo->copyvalue)
+		typeInfo->copyvalue(source, dest);
+	else
+		memcpy(dest, source, typeInfo->size);
+}
+
 int CustomData_data_equals(int type, void *data1, void *data2)
 {
 	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
@@ -2163,7 +2195,7 @@
 {
 	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
 
-	if (typeInfo->equal)
+	if (typeInfo->initminmax)
 		typeInfo->initminmax(min, max);
 }
 
@@ -2172,7 +2204,7 @@
 {
 	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
 
-	if (typeInfo->equal)
+	if (typeInfo->dominmax)
 		typeInfo->dominmax(data, min, max);
 }
 
@@ -2181,7 +2213,7 @@
 {
 	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
 
-	if (typeInfo->equal)
+	if (typeInfo->multiply)
 		typeInfo->multiply(data, fac);
 }
 
@@ -2190,7 +2222,7 @@
 {
 	const LayerTypeInfo *typeInfo = layerType_getInfo(type);
 
-	if (typeInfo->equal)
+	if (typeInfo->add)
 		typeInfo->add(data1, data2);
 }
 

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-08-12 03:51:28 UTC (rev 22388)
@@ -219,6 +219,8 @@
 void BMO_Get_Mat4(struct BMOperator *op, char *slotname, float mat[4][4]);
 void BMO_Get_Mat3(struct BMOperator *op, char *slotname, float mat[3][3]);
 
+void BMO_Clear_Flag_All(BMesh *bm, BMOperator *op, int type, int flag);
+
 /*puts every element of type type (which is a bitmask) with tool flag flag,
   into a slot.*/
 void BMO_Flag_To_Slot(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-08-12 03:51:28 UTC (rev 22388)
@@ -58,7 +58,7 @@
 	//tool flag.
 	//
 	//the flag parameter to BMW_Init maps to a loop customdata layer index.
-	BMW_UVISLAND,
+	BMW_LOOPDATA_ISLAND,
 	/*walk over an island of flagged faces.  note, that this doesn't work on
 	  non-manifold geometry.  it might be better to rewrite this to extract
 	  boundary info from the island walker, rather then directly walking

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c	2009-08-12 03:51:28 UTC (rev 22388)
@@ -207,7 +207,25 @@
 		return NULL;
 	
 	/*clear euler flags*/
-	for(i=0;i<len;i++) elist[i]->head.eflag1=elist[i]->head.eflag2 = 0;
+	for(i=0;i<len;i++) {
+		BMNode *diskbase;
+		BMEdge *curedge;
+		BMVert *v1;
+		int j;
+
+		for (j=0; j<2; j++) {
+			int a, len=0;
+			
+			v1 = j ? elist[i]->v2 : elist[i]->v1;
+			diskbase = bmesh_disk_getpointer(v1->edge, v1);
+			len = bmesh_cycle_length(diskbase);
+
+			for(a=0,curedge=v1->edge;a<len;a++,curedge = bmesh_disk_nextedge(curedge,v1)){
+				curedge->head.eflag1 = curedge->head.eflag2 = 0;
+			}
+		}
+	}
+
 	for(i=0;i<len;i++){
 		elist[i]->head.eflag1 |= MF_CANDIDATE;
 		

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-08-12 03:51:28 UTC (rev 22388)
@@ -433,6 +433,25 @@
 	return count;	
 }
 
+void BMO_Clear_Flag_All(BMesh *bm, BMOperator *op, int type, int flag) {
+	BMIter iter;
+	BMHeader *ele;
+	int i=0, types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH};
+
+	for (i=0; i<3; i++) {
+		if (i==0 && !(type & BM_VERT))
+			continue;
+		if (i==1 && !(type & BM_EDGE))
+			continue;
+		if (i==2 && !(type & BM_FACE))
+			continue;
+
+		BM_ITER(ele, &iter, bm, types[i], NULL) {
+			BMO_ClearFlag(bm, ele, flag);
+		}
+	}
+}
+
 int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, char *slotname)
 {
 	BMOpSlot *slot = BMO_GetSlot(op, slotname);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-08-12 03:51:28 UTC (rev 22388)
@@ -202,7 +202,7 @@
 			walker->yield = edgeringWalker_yield;
 			size = sizeof(edgeringWalker);
 			break;
-		case BMW_UVISLAND:
+		case BMW_LOOPDATA_ISLAND:
 			walker->begin = uvedgeWalker_begin;
 			walker->step = uvedgeWalker_step;
 			walker->yield = uvedgeWalker_yield;
@@ -335,6 +335,9 @@
 	if (!e) 
 		return;
 
+	if (BLI_ghash_haskey(walker->visithash, e))
+		return;
+
 	BMW_pushstate(walker);
 
 	shellWalk = walker->currentstate;

Modified: branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c	2009-08-12 02:00:44 UTC (rev 22387)
+++ branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c	2009-08-12 03:51:28 UTC (rev 22388)
@@ -89,7 +89,7 @@
 	BMLoop *l, *l2, **loops = NULL;
 	V_DECLARE(loops);
 	BMFace *f, *f2;
-	int a;
+	int a, b;
 
 	BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
 		if (BMO_Get_MapPointer(bm, op, "targetmap", v))
@@ -101,15 +101,17 @@
 	}
 	
 	BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
-		v = BMO_Get_MapPointer(bm, op, "targetmap", e->v1);
-		v2 = BMO_Get_MapPointer(bm, op, "targetmap", e->v2);
-		
-		if (!v) v = e->v1;
-		if (!v2) v2 = e->v2;
+		if (BMO_TestFlag(bm, e->v1, ELE_DEL) || BMO_TestFlag(bm, e->v2, ELE_DEL)) {
+			v = BMO_Get_MapPointer(bm, op, "targetmap", e->v1);
+			v2 = BMO_Get_MapPointer(bm, op, "targetmap", e->v2);
+			
+			if (!v) v = e->v1;
+			if (!v2) v2 = e->v2;
 
-		if ((e->v1 != v) || (e->v2 != v2)) {
-			if (v == v2) BMO_SetFlag(bm, e, EDGE_COL);
-			else BM_Make_Edge(bm, v, v2, e, 1);
+			if (v == v2)
+				BMO_SetFlag(bm, e, EDGE_COL);
+			else if (!BM_Edge_Exist(v, v2))
+				BM_Make_Edge(bm, v, v2, e, 1);
 
 			BMO_SetFlag(bm, e, ELE_DEL);
 		}
@@ -119,14 +121,16 @@
 		BMINDEX_SET(f, 0);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list