Revision: 50137
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50137
Author:   campbellbarton
Date:     2012-08-23 05:19:40 +0000 (Thu, 23 Aug 2012)
Log Message:
-----------
- add BM_data_interp_from_edges() function (matches BM_data_interp_from_verts).
- bridge-merged now merges edge customdata and flags for verts and edges.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
    trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
    trunk/blender/source/blender/bmesh/operators/bmo_connect.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-08-23 
04:55:59 UTC (rev 50136)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-08-23 
05:19:40 UTC (rev 50137)
@@ -45,47 +45,67 @@
 #include "bmesh.h"
 #include "intern/bmesh_private.h"
 
-/**
- * \brief Data, Interp From Verts
- *
- * Interpolates per-vertex data from two sources to a target.
- */
-void BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, 
const float fac)
+/* edge and vertex share, currently theres no need to have different logic */
+static void bm_data_interp_from_elem(BMesh *bm, BMElem *ele1, BMElem *ele2, 
BMElem *ele_dst, const float fac)
 {
-       if (v1->head.data && v2->head.data) {
+       if (ele1->head.data && ele2->head.data) {
                /* first see if we can avoid interpolation */
                if (fac <= 0.0f) {
-                       if (v1 == v) {
+                       if (ele1 == ele_dst) {
                                /* do nothing */
                        }
                        else {
-                               CustomData_bmesh_free_block(&bm->vdata, 
&v->head.data);
-                               CustomData_bmesh_copy_data(&bm->vdata, 
&bm->vdata, v1->head.data, &v->head.data);
+                               CustomData_bmesh_free_block(&bm->vdata, 
&ele_dst->head.data);
+                               CustomData_bmesh_copy_data(&bm->vdata, 
&bm->vdata, ele1->head.data, &ele_dst->head.data);
                        }
                }
                else if (fac >= 1.0f) {
-                       if (v2 == v) {
+                       if (ele2 == ele_dst) {
                                /* do nothing */
                        }
                        else {
-                               CustomData_bmesh_free_block(&bm->vdata, 
&v->head.data);
-                               CustomData_bmesh_copy_data(&bm->vdata, 
&bm->vdata, v2->head.data, &v->head.data);
+                               CustomData_bmesh_free_block(&bm->vdata, 
&ele_dst->head.data);
+                               CustomData_bmesh_copy_data(&bm->vdata, 
&bm->vdata, ele2->head.data, &ele_dst->head.data);
                        }
                }
                else {
                        void *src[2];
                        float w[2];
 
-                       src[0] = v1->head.data;
-                       src[1] = v2->head.data;
+                       src[0] = ele1->head.data;
+                       src[1] = ele2->head.data;
                        w[0] = 1.0f - fac;
                        w[1] = fac;
-                       CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, 
v->head.data);
+                       CustomData_bmesh_interp(&bm->vdata, src, w, NULL, 2, 
ele_dst->head.data);
                }
        }
 }
 
 /**
+ * \brief Data, Interp From Verts
+ *
+ * Interpolates per-vertex data from two sources to a target.
+ *
+ * \note This is an exact match to #BM_data_interp_from_edges
+ */
+void BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, 
const float fac)
+{
+       bm_data_interp_from_elem(bm, (BMElem *)v1, (BMElem *)v2, (BMElem *)v, 
fac);
+}
+
+/**
+ * \brief Data, Interp From Edges
+ *
+ * Interpolates per-edge data from two sources to a target.
+ *
+ * \note This is an exact match to #BM_data_interp_from_verts
+ */
+void BM_data_interp_from_edges(BMesh *bm, BMEdge *e1, BMEdge *e2, BMEdge *e, 
const float fac)
+{
+       bm_data_interp_from_elem(bm, (BMElem *)e1, (BMElem *)e2, (BMElem *)e, 
fac);
+}
+
+/**
  * \brief Data Vert Average
  *
  * Sets all the customdata (e.g. vert, loop) associated with a vert

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_interp.h    2012-08-23 
04:55:59 UTC (rev 50136)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.h    2012-08-23 
05:19:40 UTC (rev 50137)
@@ -31,6 +31,7 @@
 void  BM_vert_interp_from_face(BMesh *bm, BMVert *v, BMFace *source);
 
 void  BM_data_interp_from_verts(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, 
const float fac);
+void  BM_data_interp_from_edges(BMesh *bm, BMEdge *e1, BMEdge *e2, BMEdge *e, 
const float fac);
 void  BM_data_interp_face_vert_edge(BMesh *bm, BMVert *v1, BMVert *v2, BMVert 
*v, BMEdge *e1, const float fac);
 void  BM_data_layer_add(BMesh *em, CustomData *data, int type);
 void  BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const 
char *name);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_connect.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_connect.c  2012-08-23 
04:55:59 UTC (rev 50136)
+++ trunk/blender/source/blender/bmesh/operators/bmo_connect.c  2012-08-23 
05:19:40 UTC (rev 50137)
@@ -457,10 +457,12 @@
                                for (i = 0; i < vert_len; i++) {
                                        BM_data_interp_from_verts(bm, vv1[i], 
vv2[i], vv2[i], merge_factor);
                                        interp_v3_v3v3(vv2[i]->co, vv1[i]->co, 
vv2[i]->co, merge_factor);
+                                       BM_elem_flag_merge(vv1[i], vv2[i]);
                                        BM_vert_splice(bm, vv1[i], vv2[i]);
                                }
                                for (i = 0; i < edge_len; i++) {
-                                       //BM_data_interp_from_edge(bm, vv1[i], 
vv2[i], vv2[i], merge_factor);
+                                       BM_data_interp_from_edges(bm, ee1[i], 
ee2[i], ee2[i], merge_factor);
+                                       BM_elem_flag_merge(ee1[i], ee2[i]);
                                        BM_edge_splice(bm, ee1[i], ee2[i]);
                                }
                        }

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

Reply via email to