[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