[Bf-blender-cvs] [8469a69] mesh-transfer-data: WIP

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


Commit: 8469a6985e1fcb8140ef0e8193caa062ee7c4568
Author: Bastien Montagne
Date:   Mon Oct 27 17:10:42 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB8469a6985e1fcb8140ef0e8193caa062ee7c4568

WIP

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/editors/object/object_transfer_data.c

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index dbac8d1..ab13f82 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -411,14 +411,11 @@ enum {
 	CDT_MIX_REPLACE_ALL             = 0,
 	CDT_MIX_REPLACE_ABOVE_THRESHOLD = 1,
 	CDT_MIX_REPLACE_BELOW_THRESHOLD = 2,
-#if 0
 	CDT_MIX_MIX                     = 16,
 	CDT_MIX_ADD                     = 17,
 	CDT_MIX_SUB                     = 18,
 	CDT_MIX_MUL                     = 19,
-	CDT_MIX_DIV                     = 20,
 	/* etc. etc. */
-#endif
 };
 
 typedef struct DataTransferLayerMapping {
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 93c794d..9ecf9fe 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -48,6 +48,7 @@
 #include "BLI_string.h"
 #include "BLI_path_util.h"
 #include "BLI_math.h"
+#include "BLI_math_color_blend.h"
 #include "BLI_mempool.h"
 
 #include "BLF_translation.h"
@@ -664,26 +665,36 @@ static void layerCopyValue_mloopcol(const void *source, void *dest, const int mi
 {
 	const MLoopCol *m1 = source;
 	MLoopCol *m2 = dest;
+	unsigned char tmp_col[4];
 
 	switch (mixmode) {
-#if 0
 		case CDT_MIX_MIX:
+			blend_color_interpolate_byte((unsigned char *)&m2->r, (unsigned char *)&m2->r,
+			                             (unsigned char *)&m1->r, mixfactor);
+			break;
 		case CDT_MIX_ADD:
+			blend_color_add_byte(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte((unsigned char *)&m2->r, (unsigned char *)&m2->r, tmp_col, mixfactor);
+			break;
 		case CDT_MIX_SUB:
+			blend_color_sub_byte(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte((unsigned char *)&m2->r, (unsigned char *)&m2->r, tmp_col, mixfactor);
+			break;
 		case CDT_MIX_MUL:
-		case CDT_MIX_DIV:
+			blend_color_mul_byte(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte((unsigned char *)&m2->r, (unsigned char *)&m2->r, tmp_col, mixfactor);
+			break;
 		/* etc. etc. */
-#endif
 		case CDT_MIX_REPLACE_ABOVE_THRESHOLD:
 		case CDT_MIX_REPLACE_BELOW_THRESHOLD:
 			{
 				/* TODO: Check for a real valid way to get 'factor' value of our dest color? */
 				const float f = ((float)m2->r + (float)m2->g + (float)m2->b) / 3.0f;
 				if (mixmode == CDT_MIX_REPLACE_ABOVE_THRESHOLD && f < mixfactor) {
-					return;
+					break;
 				}
 				else if (mixmode == CDT_MIX_REPLACE_BELOW_THRESHOLD && f > mixfactor) {
-					return;
+					break;
 				}
 			}
 			/* Fall through. */
@@ -3624,6 +3635,7 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
 	cd_copy copy_cd = NULL;
 
 	void *tmp_dst = data_dst;
+	bool free_tmp_dst = false;
 
 	if (data_type & CD_FAKE) {
 		data_size = laymap->data_size;
@@ -3638,6 +3650,7 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
 
 	if (laymap->mix_mode != CDT_MIX_REPLACE_ALL) {
 		tmp_dst = MEM_mallocN(data_size, __func__);
+		free_tmp_dst = true;
 	}
 
 	if (count > 1 && !interp_cd) {
@@ -3703,6 +3716,10 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
 		}
 		/* Else we can do nothing by default, needs custom interp func! */
 	}
+
+	if (free_tmp_dst) {
+		MEM_freeN(tmp_dst);
+	}
 }
 
 void CustomData_data_transfer(const Mesh2MeshMapping *m2mmap, const DataTransferLayerMapping *laymap)
diff --git a/source/blender/editors/object/object_transfer_data.c b/source/blender/editors/object/object_transfer_data.c
index 120844c..cd5b5cc 100644
--- a/source/blender/editors/object/object_transfer_data.c
+++ b/source/blender/editors/object/object_transfer_data.c
@@ -154,7 +154,6 @@ static EnumPropertyItem MDT_mix_mode_items[] = {
 			"Only replace dest elements where data is above given threshold (exact behavior depends on data type)"},
 	{CDT_MIX_REPLACE_BELOW_THRESHOLD, "BELOW_THRESHOLD", 0, "Below Threshold",
 			"Only replace dest elements where data is below given threshold (exact behavior depends on data type)"},
-#if 0
 	{CDT_MIX_MIX, "MIX", 0, "Mix",
 			"Mix source value into destination one, using given threshold as factor"},
 	{CDT_MIX_ADD, "ADD", 0, "Add",
@@ -163,10 +162,7 @@ static EnumPropertyItem MDT_mix_mode_items[] = {
 			"Subtract source value to destination one, using given threshold as factor"},
 	{CDT_MIX_MUL, "MUL", 0, "Multiply",
 			"Multiply source value to destination one, using given threshold as factor"},
-	{CDT_MIX_DIV, "DIV", 0, "Divide",
-			"Divide destination value by source one, using given threshold as factor"},
 	/* etc. etc. */
-#endif
 	{0, NULL, 0, NULL, NULL}
 };




More information about the Bf-blender-cvs mailing list