[Bf-blender-cvs] [f4c1562] mesh-transfer-data: Add vcol, rework BLI color blending to handle non-alpha colors, some fixes.

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


Commit: f4c1562d28856b1de97cbe1404ed122d9b64d7d0
Author: Bastien Montagne
Date:   Tue Oct 28 12:25:50 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBf4c1562d28856b1de97cbe1404ed122d9b64d7d0

Add vcol, rework BLI color blending to handle non-alpha colors, some fixes.

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

M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/mesh_mapping.c
M	source/blender/blenlib/BLI_math_color_blend.h
M	source/blender/blenlib/intern/math_color_blend_inline.c
M	source/blender/editors/object/object_transfer_data.c

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

diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 9ecf9fe..3d15334 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -669,20 +669,20 @@ static void layerCopyValue_mloopcol(const void *source, void *dest, const int mi
 
 	switch (mixmode) {
 		case CDT_MIX_MIX:
-			blend_color_interpolate_byte((unsigned char *)&m2->r, (unsigned char *)&m2->r,
-			                             (unsigned char *)&m1->r, mixfactor);
+			blend_color_interpolate_byte_noalpha((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);
+			blend_color_add_byte_noalpha(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte_noalpha((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);
+			blend_color_sub_byte_noalpha(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte_noalpha((unsigned char *)&m2->r, (unsigned char *)&m2->r, tmp_col, mixfactor);
 			break;
 		case CDT_MIX_MUL:
-			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);
+			blend_color_mul_byte_noalpha(tmp_col, (unsigned char *)&m2->r, (unsigned char *)&m1->r);
+			blend_color_interpolate_byte_noalpha((unsigned char *)&m2->r, (unsigned char *)&m2->r, tmp_col, mixfactor);
 			break;
 		/* etc. etc. */
 		case CDT_MIX_REPLACE_ABOVE_THRESHOLD:
@@ -703,9 +703,9 @@ static void layerCopyValue_mloopcol(const void *source, void *dest, const int mi
 			m2->r = m1->r;
 			m2->g = m1->g;
 			m2->b = m1->b;
-			m2->a = m1->a;
 			break;
 	}
+	m2->a = m1->a;
 }
 
 static bool layerEqual_mloopcol(const void *data1, const void *data2)
@@ -3626,7 +3626,7 @@ static void customdata_data_transfer_interp_generic(const DataTransferLayerMappi
 
 	const int data_type = laymap->data_type;
 	const int mix_mode = laymap->mix_mode;
-	const int mix_factor = laymap->mix_factor;
+	const float mix_factor = laymap->mix_factor;
 
 	size_t data_size;
 	const uint64_t data_flag = laymap->data_flag;
diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c
index 3edf471..f564ba9 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -1653,7 +1653,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 		bool polys_allocated_src;
 		MPoly *polys_src = DM_get_poly_array(dm_src, &polys_allocated_src);
 		const int num_polys_src = dm_src->getNumPolys(dm_src);
-		bool faces_allocated_src;
+		bool faces_allocated_src = false;
 		MFace *faces_src = NULL;
 		int num_faces_src;
 
@@ -1826,7 +1826,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 				MEM_freeN(faces_active);
 			}
 			else {
-				BLI_assert(num_tress == 1);
+				BLI_assert(num_trees == 1);
 				bvhtree_from_mesh_faces(&treedata[0], dm_src, 0.0f, 2, 6);
 				orig_poly_idx_src = dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
 			}
diff --git a/source/blender/blenlib/BLI_math_color_blend.h b/source/blender/blenlib/BLI_math_color_blend.h
index d966676..6913063 100644
--- a/source/blender/blenlib/BLI_math_color_blend.h
+++ b/source/blender/blenlib/BLI_math_color_blend.h
@@ -69,6 +69,35 @@ MINLINE void blend_color_luminosity_byte(unsigned char dst[4], unsigned const ch
 
 MINLINE void blend_color_interpolate_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], float t);
 
+/* Same as above, but does not consider alpha. */
+MINLINE void blend_color_mix_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_add_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_sub_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_mul_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_lighten_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_darken_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_erase_alpha_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+MINLINE void blend_color_add_alpha_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4]);
+
+MINLINE void blend_color_overlay_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_hardlight_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_burn_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_linearburn_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_dodge_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_screen_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_softlight_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_pinlight_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_linearlight_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_vividlight_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_difference_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_exclusion_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_color_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_hue_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_saturation_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+MINLINE void blend_color_luminosity_byte_noalpha(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4]);
+
+MINLINE void blend_color_interpolate_byte_noalpha(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], float t);
+
 MINLINE void blend_color_mix_float(float dst[4], const float src1[4], const float src2[4]);
 MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4]);
 MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4]);
diff --git a/source/blender/blenlib/intern/math_color_blend_inline.c b/source/blender/blenlib/intern/math_color_blend_inline.c
index 73a7259..59ef9ef 100644
--- a/source/blender/blenlib/intern/math_color_blend_inline.c
+++ b/source/blender/blenlib/intern/math_color_blend_inline.c
@@ -52,9 +52,15 @@
 
 /* straight alpha byte blending modes */
 
-MINLINE void blend_color_mix_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
+MINLINE void blend_color_mix_byte_do(
+        unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], const bool use_alpha)
 {
-	if (src2[3] != 0) {
+	if (!use_alpha) {
+		dst[0] = (src1[0] + src2[0]) / 2;
+		dst[1] = (src1[1] + src2[1]) / 2;
+		dst[2] = (src1[2] + src2[2]) / 2;
+	}
+	else if (src2[3] != 0) {
 		/* straight over operation */
 		const int t = src2[3];
 		const int mt = 255 - t;
@@ -76,9 +82,15 @@ MINLINE void blend_color_mix_byte(unsigned char dst[4], const unsigned char src1
 	}
 }
 
-MINLINE void blend_color_add_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
+MINLINE void blend_color_add_byte_do(
+        unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], const bool use_alpha)
 {
-	if (src2[3] != 0) {
+	if (!use_alpha) {
+		dst[0] = (unsigned char)min_ii(src1[0] + src2[0], 255);
+		dst[1] = (unsigned char)min_ii(src1[1] + src2[1], 255);
+		dst[2] = (unsigned char)min_ii(src1[2] + src2[2], 255);
+	}
+	else if (src2[3] != 0) {
 		/* straight add operation */
 		const int t = src2[3];
 		int tmp[3];
@@ -98,9 +110,15 @@ MINLINE void blend_color_add_byte(unsigned char dst[4], const unsigned char src1
 	}
 }
 
-MINLINE void blend_color_sub_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
+MINLINE void blend_color_sub_byte_do(
+        unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4], const bool use_alpha)
 {
-	if (src2[3] != 0) {
+	if (!use_alpha) {
+		dst[0] = (unsigned char)max_ii(src1[0] - src2[0], 0);
+		dst[1] = (unsigned char)max_ii(src1[1] - src2[1], 0);
+		dst[2] = (unsigned char)max_ii(src1[2] - src2[2], 0);
+	}
+	else if (src2[3] != 0) {
 		/* straight sub operation */
 		const int t = src2[3];
 		int tmp[3];
@@ -120,9 +138,15 @@ MINLINE void blend_color_sub_byte(unsigned char dst[4], const unsigned char src1
 	}
 }
 
-MINLINE void blend_color_mul_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
+MINLINE void blend_color_mul_byte_do(
+        unsigned char dst[4], const unsigned char src1[4], co

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list