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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to