[Bf-blender-cvs] [2a5cc75] mesh-transfer-data: Add advanced mix modes to vcol (theorical only for now) and vgroups (working).

Bastien Montagne noreply at git.blender.org
Wed Oct 29 09:38:24 CET 2014


Commit: 2a5cc75a2fb83e31359806225fb0d3ec4aac4849
Author: Bastien Montagne
Date:   Tue Oct 28 10:13:09 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB2a5cc75a2fb83e31359806225fb0d3ec4aac4849

Add advanced mix modes to vcol (theorical only for now) and vgroups (working).

Also fixed stupid bug with vgroups when mdef CD layer already existed.

===================================================================

M	source/blender/editors/object/object_vgroup.c

===================================================================

diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index edea2f5..7c81ca8 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -754,6 +754,10 @@ static void vgroups_datatransfer_interp(const DataTransferLayerMapping *laymap,
 	MDeformVert *data_dst = (MDeformVert *)dest;
 	const int idx_src = laymap->data_n_src;
 	const int idx_dst = laymap->data_n_dst;
+
+	const int mix_mode = laymap->mix_mode;
+	const int mix_factor = laymap->mix_factor;
+
 	int i, j;
 
 	MDeformWeight *dw_src;
@@ -769,6 +773,37 @@ static void vgroups_datatransfer_interp(const DataTransferLayerMapping *laymap,
 		}
 	}
 
+	if (mix_mode != CDT_MIX_REPLACE_ALL) {
+		if (!dw_dst && (mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD)) {
+			return;  /* Do not affect destination. */
+		}
+		if (dw_dst &&
+		    ((mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD && (dw_dst->weight <= mix_factor)) ||
+		     (mix_mode == CDT_MIX_REPLACE_BELOW_THRESHOLD && (dw_dst->weight >= mix_factor))))
+		{
+			return;  /* Do not affect destination. */
+		}
+		else {
+			float weight_dst_org = dw_dst ? dw_dst->weight : 0.0f;
+			switch (mix_mode) {
+				case CDT_MIX_MIX:
+					weight_dst = (weight_dst_org + weight_dst) / 2.0f;
+					break;
+				case CDT_MIX_ADD:
+					weight_dst = weight_dst_org + weight_dst;
+					break;
+				case CDT_MIX_SUB:
+					weight_dst = weight_dst_org - weight_dst;
+					break;
+				case CDT_MIX_MUL:
+					weight_dst = weight_dst_org * weight_dst;
+					break;
+			}
+			interpf(weight_dst, weight_dst_org, mix_factor);
+			CLAMP(weight_dst, 0.0f, 1.0f);
+		}
+	}
+
 	if (!dw_dst) {
 		defvert_add_index_notest(data_dst, idx_dst, weight_dst);
 	}
@@ -857,12 +892,15 @@ bool data_transfer_layersmapping_vgroups(
 	if ((data_src = CustomData_get_layer(cd_src, CD_MDEFORMVERT)) == NULL) {
 		return false;
 	}
+
 	if (!CustomData_has_layer(cd_dst, CD_MDEFORMVERT)) {
 		if (!num_create) {
 			return false;
 		}
 		ED_vgroup_data_create((ID *)ob_dst->data);
-		data_dst = CustomData_get_layer(cd_dst, CD_MDEFORMVERT);
+	}
+	if ((data_dst = CustomData_get_layer(cd_dst, CD_MDEFORMVERT)) == NULL) {
+		return false;
 	}
 
 	if (fromlayers_select == MDT_FROMLAYERS_ACTIVE) {
@@ -916,12 +954,24 @@ bool data_transfer_layersmapping_vgroups(
 		                                     data_src, data_dst, idx_src, idx_dst,
 		                                     elem_size, 0, 0, 0, vgroups_datatransfer_interp);
 	}
-	else if (fromlayers_select == MDT_FROMLAYERS_ALL) {
-		int num_src = BLI_countlist(&ob_src->defbase);
-		bool *use_layers_src = MEM_mallocN(sizeof(*use_layers_src) * (size_t)num_src, __func__);
+	else {
+		int num_src, num_sel_unused;
+		bool *use_layers_src = NULL;
 		bool ret;
 
-		memset(use_layers_src, true, sizeof(*use_layers_src) * num_src);
+		switch (fromlayers_select) {
+			case MDT_FROMLAYERS_ALL:
+				use_layers_src = ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_ALL, &num_src, &num_sel_unused);
+				break;
+			case MDT_FROMLAYERS_VGROUP_BONE_SELECTED:
+				use_layers_src = ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_BONE_SELECT,
+				                                                   &num_src, &num_sel_unused);
+				break;
+			case MDT_FROMLAYERS_VGROUP_BONE_DEFORM:
+				use_layers_src = ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_BONE_DEFORM,
+				                                                   &num_src, &num_sel_unused);
+				break;
+		}
 
 		ret = data_transfer_layersmapping_vgroups_multisrc_to_dst(r_map, mix_mode, mix_factor, num_create,
 		                                                          ob_src, ob_dst, data_src, data_dst,
@@ -930,10 +980,6 @@ bool data_transfer_layersmapping_vgroups(
 		MEM_freeN(use_layers_src);
 		return ret;
 	}
-	/* TODO: add vgroups-specific 'from-select' modes here! */
-	else {
-		return false;
-	}
 
 	return true;
 }




More information about the Bf-blender-cvs mailing list