[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58942] branches/ soc-2013-meshdata_transfer/source/blender: Vertex Groups transfer through projection: using the MVertWeight to access the vertex weights -as they aren' t directly accessible through the CD_MDefomrVert-
Walid Shouman
eng.walidshouman at gmail.com
Mon Aug 5 21:06:37 CEST 2013
Revision: 58942
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58942
Author: walid
Date: 2013-08-05 19:06:37 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
Vertex Groups transfer through projection: using the MVertWeight to access the vertex weights -as they aren't directly accessible through the CD_MDefomrVert-
Modified Paths:
--------------
branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_vgroup.c
Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c 2013-08-05 18:58:19 UTC (rev 58941)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c 2013-08-05 19:06:37 UTC (rev 58942)
@@ -19,6 +19,7 @@
#include "DNA_object_types.h" //using the bDeformGroup
#include "BKE_bvhutils.h" //using the bvhutils.h
+#include "BKE_deform.h"
//should be replaced by the min_float and its inverse
#ifndef MY_MIN_FLOAT
@@ -2509,7 +2510,7 @@
}
-bool BM_mesh_vertex_group_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo replace_info, float tmp_mat[4][4])
+bool BM_mesh_vertex_group_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo replace_info,float tmp_mat[4][4])
{
//-----algorithm definitions start
struct BMBVHTree *bmtree_src = NULL;
@@ -2533,7 +2534,7 @@
int v_src_max_count, v_dst_max_count;
//====algorithm definitions end
- int CD_src, CD_dst;
+ int src_grp_ind, dst_grp_ind;
//used for iterating the destination's verts
BMVert *v;
@@ -2548,6 +2549,12 @@
int src_lay_start, src_lay_end;
int dst_lay_start;
+ MDeformVert *dv_dst, *dv_src;
+ MDeformWeight *dw_dst, *dw_src;
+
+ const int cd_dvert_dst_offset = CustomData_get_offset(&bm_dst->vdata, CD_MDEFORMVERT);
+ const int cd_dvert_src_offset = CustomData_get_offset(&bm_src->vdata, CD_MDEFORMVERT);
+
//Is that good to support edit mesh mode at the cost of receiving me_src too ?
//if (me_src->edit_btmesh != NULL) em_src = me_src->edit_btmesh; //edit mesh mode
//else
@@ -2579,9 +2586,8 @@
for (src_lay_iter = src_lay_start, dst_lay_iter = dst_lay_start; src_lay_iter <= src_lay_end;
src_lay_iter++, dst_lay_iter++) {
- //fix the layer index of the source & dest
- CD_src = CustomData_get_n_offset(&bm_src->vdata, CD_MDEFORMVERT, src_lay_iter); //get the offset of the
- CD_dst = CustomData_get_n_offset(&bm_dst->vdata, CD_MDEFORMVERT, dst_lay_iter); //lay_iter(th)CD_SHAPEKEY layer
+ src_grp_ind = src_lay_iter;
+ dst_grp_ind = dst_lay_start + dst_lay_iter;
//the way we do it is by looping over each face!!
BM_ITER_MESH (f_dst, &iter, bm_dst, BM_FACES_OF_MESH) {
@@ -2647,9 +2653,28 @@
// Interpolating according to the spatially found weights
// Get weights from face.
+
+ //getting the weight holder (MDeformWeight)
+ dv_dst = BM_ELEM_CD_GET_VOID_P(v, cd_dvert_dst_offset);
+ dw_dst = defvert_verify_index(dv_dst, dst_grp_ind); //use this to have a weight for the group assuming
+ //the vert may haven't been assigned in advance
+
+ ///use those to support/unsupport copying to vertices with NULL value (unassigned vertices!)
+ ///note we must take into consideration that some layers are new and by default have got no vertices
+ ///assigned
+/*
+ dw_dst = defvert_verify_index(dv_dst, dst_grp_ind);
+ if (dw_dst != NULL) {
+ //do nothing for now :)
+
+ }
+*/
+
weight_accu = 0;
BM_ITER_ELEM_INDEX (v2, &fiter2, f_src, BM_VERTS_OF_FACE, a) {
- weight_accu = BM_ELEM_CD_GET_FLOAT(v2, CD_src) * tmp_weight[a];
+ dv_src = BM_ELEM_CD_GET_VOID_P(v2, cd_dvert_src_offset);
+ dw_src = defvert_verify_index(dv_src, src_grp_ind);
+ weight_accu += dw_src->weight * tmp_weight[a];
}
weights_grp[v->head.index].fl[weights_grp[v->head.index].count] = weight_accu;
@@ -2668,7 +2693,12 @@
weight_accu += (weights_grp[v->head.index].fl[i]) / (float)(weights_grp[v->head.index].count);
}
- ((float*)BM_ELEM_CD_GET_VOID_P(v, CD_dst))[0] = weight_accu;
+ dv_dst = BM_ELEM_CD_GET_VOID_P(v, cd_dvert_dst_offset);
+ dw_dst = defvert_verify_index(dv_dst, dst_grp_ind);
+
+ if (dw_dst != NULL) { //this check isnt useful till we support/unsupport copying vertices to unassigned v
+ dw_dst->weight = weight_accu;
+ }
weights_grp[v->head.index].count = 0;
}
Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_vgroup.c 2013-08-05 18:58:19 UTC (rev 58941)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_vgroup.c 2013-08-05 19:06:37 UTC (rev 58942)
@@ -265,6 +265,9 @@
me_dst = ob_dst->data;
me_src = ob_src->data;
+ CustomData_add_layer(&me_dst->vdata, CD_MDEFORMVERT, 1, NULL, me_dst->totvert);
+ CustomData_add_layer(&me_src->vdata, CD_MDEFORMVERT, 1, NULL, me_src->totvert);
+
num_src_lay = BLI_countlist(&ob_src->defbase);
num_dst_lay = BLI_countlist(&ob_dst->defbase);
More information about the Bf-blender-cvs
mailing list