[Bf-blender-cvs] [dc5d503] mesh-transfer-data: Add support for using a vgroup as mix factor.

Bastien Montagne noreply at git.blender.org
Tue Nov 4 15:49:29 CET 2014


Commit: dc5d503f32a323ae84489794e53031fc80c8bdb1
Author: Bastien Montagne
Date:   Tue Nov 4 15:45:45 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBdc5d503f32a323ae84489794e53031fc80c8bdb1

Add support for using a vgroup as mix factor.

Useless for op version, but must-have for modifier one. Not Yet Tested(c).

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_transfer_data.c
M	source/blender/editors/object/object_vgroup.c

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index e523411..5443a9c 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -376,7 +376,7 @@ struct Mesh2MeshMapping;
 typedef struct DataTransferLayerMapping DataTransferLayerMapping;
 
 typedef void (*cd_datatransfer_interp)(const DataTransferLayerMapping *laymap, void *dest,
-                                       void **sources, const float *weights, const int count);
+                                       void **sources, const float *weights, const int count, const float mix_factor);
 
 /* Fake CD_LAYERS (those are actually 'real' data stored directly into elements' structs, or otherwise not (directly)
  * accessible to usual CDLayer system). */
@@ -425,7 +425,7 @@ typedef struct DataTransferLayerMapping {
 	int data_type;
 	int mix_mode;
 	float mix_factor;
-	/* TODO: we may want to add more mixing features, eg based on vgroups? */
+	const float *mix_weights;  /* If non-NULL, array of weights, one for each dest item, replaces mix_factor. */
 
 	void *data_src;      /* Data source array (can be regular CD data, vertices/edges/etc., keyblocks...). */
 	void *data_dst;      /* Data dest array (same type as dat_src). */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 4edd89e..23a7a85 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -3612,8 +3612,9 @@ static bool check_bit_flag(const size_t data_size, void *data, const uint64_t fl
 	}
 }
 
-static void customdata_data_transfer_interp_generic(const DataTransferLayerMapping *laymap, void *data_dst,
-                                                    void **sources, const float *weights, const int count)
+static void customdata_data_transfer_interp_generic(
+        const DataTransferLayerMapping *laymap, void *data_dst, void **sources, const float *weights, const int count,
+        const float mix_factor)
 {
 	/* Fake interpolation, we actually copy highest weighted source to dest.
 	 * Note we also handle bitflags here, in which case we rather choose to transfer value of elements totalizing
@@ -3623,7 +3624,6 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
 
 	const int data_type = laymap->data_type;
 	const int mix_mode = laymap->mix_mode;
-	const float mix_factor = laymap->mix_factor;
 
 	size_t data_size;
 	const uint64_t data_flag = laymap->data_flag;
@@ -3762,6 +3762,7 @@ void CustomData_data_transfer(const Mesh2MeshMapping *m2mmap, const DataTransfer
 
 	for (i = 0; i < totelem; i++, data_dst = (char *)data_dst + data_step, mapit++) {
 		const int nbr_sources = mapit->nbr_sources;
+		const float mix_factor = laymap->mix_weights ? laymap->mix_weights[i] : laymap->mix_factor;
 		int j;
 
 		if (!nbr_sources) {
@@ -3779,7 +3780,7 @@ void CustomData_data_transfer(const Mesh2MeshMapping *m2mmap, const DataTransfer
 			tmp_data_src[j] = (char *)data_src + data_step * src_idx + data_offset;
 		}
 
-		interp(laymap, (char *)data_dst + data_offset, tmp_data_src, mapit->weights_src, nbr_sources);
+		interp(laymap, (char *)data_dst + data_offset, tmp_data_src, mapit->weights_src, nbr_sources, mix_factor);
 	}
 
 	MEM_freeN(tmp_data_src);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 0d812ce..a10d5d3 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -256,13 +256,15 @@ bool ED_data_transfer(
         struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, const int data_type, const bool use_create,
         const int map_vert_mode, const int map_edge_mode, const int map_poly_mode, const int map_loop_mode,
         struct SpaceTransform *space_transform, const float max_distance, const float precision,
-        const int fromlayers_select, const int tolayers_select, const int mix_mode, const float mix_factor);
+        const int fromlayers_select, const int tolayers_select,
+        const int mix_mode, const float mix_factor, const char *vgroup_name);
 bool ED_data_transfer_dm(
         struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, struct DerivedMesh *dm_dst,
         const int data_type, const bool use_create,
         const int map_vert_mode, const int map_edge_mode, const int map_poly_mode, const int map_loop_mode,
         struct SpaceTransform *space_transform, const float max_distance, const float ray_radius,
-        const int fromlayers_select, const int tolayers_select, const int mix_mode, const float mix_factor);
+        const int fromlayers_select, const int tolayers_select,
+        const int mix_mode, const float mix_factor, const char *vgroup_name);
 
 
 
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 7b32020..24879f2 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -240,9 +240,9 @@ void OBJECT_OT_vertex_weight_normalize_active_vertex(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_weight_copy(struct wmOperatorType *ot);
 
 bool data_transfer_layersmapping_vgroups(
-        struct ListBase *r_map, const int mix_mode, const float mix_factor, const int num_create,
-        struct Object *ob_src, struct Object *ob_dst, const bool dup_dst,
-        struct CustomData *cd_src, struct CustomData *cd_dst, const int fromlayers_select, const int tolayers_select);
+        struct ListBase *r_map, const int mix_mode, const float mix_factor, const float *mix_weights, const int num_create,
+        struct Object *ob_src, struct Object *ob_dst, struct CustomData *cd_src, struct CustomData *cd_dst,
+        const bool dup_dst, const int fromlayers_select, const int tolayers_select);
 
 /* object_warp.c */
 void OBJECT_OT_vertex_warp(struct wmOperatorType *ot);
@@ -278,10 +278,10 @@ void OBJECT_OT_data_transfer(struct wmOperatorType *ot);
 
 /* Copied from BKE_customdata.h :( */
 typedef void (*cd_datatransfer_interp)(const struct DataTransferLayerMapping *laymap, void *dest,
-                                       void **sources, const float *weights, int count);
+                                       void **sources, const float *weights, const int count, const float mix_factor);
 
 void data_transfer_layersmapping_add_item(
-        struct ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor,
+        struct ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor, const float *mix_weights,
         void *data_src, void *data_dst, const int data_n_src, const int data_n_dst,
         const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag,
         cd_datatransfer_interp interp);
diff --git a/source/blender/editors/object/object_transfer_data.c b/source/blender/editors/object/object_transfer_data.c
index 4fd93a0..b4dfcd8 100644
--- a/source/blender/editors/object/object_transfer_data.c
+++ b/source/blender/editors/object/object_transfer_data.c
@@ -43,6 +43,7 @@
 
 #include "BKE_context.h"
 #include "BKE_customdata.h"
+#include "BKE_deform.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_object.h"
@@ -358,26 +359,55 @@ static loop_island_compute data_transfer_get_loop_islands_generator(const int da
 	return NULL;
 }
 
-static void data_transfer_interp_char(const DataTransferLayerMapping *UNUSED(laymap), void *dest,
-                                      void **sources, const float *weights, int count)
+static void data_transfer_interp_char(const DataTransferLayerMapping *laymap, void *dest,
+                                      void **sources, const float *weights, const int count, const float mix_factor)
 {
 	char **data_src = (char **)sources;
 	char *data_dst = (char *)dest;
-	int i;
 
-	float weight_dst = 0.0f;
+	const int mix_mode = laymap->mix_mode;
+	float val_dst = 0.0f;
+	const float val_dst_org = (float)(*data_dst) / 255.0f;
+
+	int i;
 
 	for (i = count; i--;) {
-		weight_dst += ((float)(*data_src[i]) / 255.0f) * weights[i];
+		val_dst += ((float)(*data_src[i]) / 255.0f) * weights[i];
 	}
 
-	*data_dst = (char)(weight_dst * 255.0f);
+	if (mix_mode != CDT_MIX_REPLACE_ALL) {
+		if (((mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD && (val_dst_org <= mix_factor)) ||
+		     (mix_mode == CDT_MIX_REPLACE_BELOW_THRESHOLD && (val_dst_org >= mix_factor))))
+		{
+			return;  /* Do not affect destination. */
+		}
+		else {
+			switch (mix_mode) {
+				case CDT_MIX_MIX:
+					/* Nothing to do, mere interp is enough here. */;
+					break;
+				case CDT_MIX_ADD:
+					val_dst = val_dst_org + val_dst;
+					break;
+				case CDT_MIX_SUB:
+					val_dst = val_dst_org - val_dst;
+					break;
+				case CDT_MIX_MUL:
+					val_dst = val_dst_org * val_dst;
+					break;
+			}
+			interpf(val_dst, val_dst_org, mix_factor);
+			CLAMP(val_dst, 0.0f, 1.0f);
+		}
+	}
+
+	*data_dst = (char)(val_dst * 255.0f);
 }
 
 /* Helpers to match sources and destinations data layers (also handles 'conversions' in CD_FAKE cases). */
 
 void data_transfer_layersmapping_add_item(
-        ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor,
+        ListBase *r_map, const int data_type, const int mix_mode, const float mix_factor, const float *mix_weights,
         void *data_src, void *data_dst, const int data_n_src, const int data_n_dst,
         const size_t elem_size, const size_t data_size, const size_t data_offset, const uint64_t data_flag,
         cd_datatransfer_interp interp)
@@ -389,6 +419,7 @@ void data_transfer_layersmapping_add_item(
 	item->data_type = data_type;
 	item->mix_mode = mix_mode;
 	item->mix_factor = mix_factor;
+	item->mix_weights = mix_weights;
 
 	item->data_src = data_src;
 	item->data_dst = data_dst;
@@ -405,15 +436,16 @@ void data_transfer_layersmapping_add_item(
 	BLI_addtail(r_map, item);
 }
 
-static void data_transfer_layersmapping_add_item_cd(ListBase *r_map, const int data_type,
-        const int mix_mode, const float mix_factor, void *data_src, void 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list