[Bf-blender-cvs] [093bfb9] compositor-2016: Dynapaint: fix use of normal normalization in dynamicPaint_generateBakeData().

Bastien Montagne noreply at git.blender.org
Wed Jun 8 21:48:07 CEST 2016


Commit: 093bfb941af2620ee36a7fffe61d4cb1e840607f
Author: Bastien Montagne
Date:   Thu May 19 14:06:46 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rB093bfb941af2620ee36a7fffe61d4cb1e840607f

Dynapaint: fix use of normal normalization in dynamicPaint_generateBakeData().

Vertex's normal is always normalized - and its conversion from short to float should not change that!
On the other hand, linear interpolation of three normals **does not give a normalized vector**
(unless all three inputs are exactly the same).

Also, minor optimization, avoid recomputing that interpolated normal twice for each PaintUVPoint.

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

M	source/blender/blenkernel/intern/dynamicpaint.c

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

diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 18672b9..8ea1c6c 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -4718,6 +4718,8 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const Sce
 #pragma omp parallel for schedule(static)
 	for (index = 0; index < sData->total_points; index++) {
 		float prev_point[3] = {0.0f, 0.0f, 0.0f};
+		float temp_nor[3];
+
 		if (do_velocity_data && !new_bdata) {
 			copy_v3_v3(prev_point, bData->realCoord[bData->s_pos[index]].v);
 		}
@@ -4726,15 +4728,14 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const Sce
 		 */
 		if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
 			float n1[3], n2[3], n3[3];
-			ImgSeqFormatData *f_data = (ImgSeqFormatData *)sData->format_data;
-			PaintUVPoint *tPoint = &((PaintUVPoint *)f_data->uv_p)[index];
-			int ss;
+			const ImgSeqFormatData *f_data = (ImgSeqFormatData *)sData->format_data;
+			const PaintUVPoint *tPoint = &((PaintUVPoint *)f_data->uv_p)[index];
 
 			bData->s_num[index] = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
 			bData->s_pos[index] = index * bData->s_num[index];
 
 			/* per sample coordinates */
-			for (ss = 0; ss < bData->s_num[index]; ss++) {
+			for (int ss = 0; ss < bData->s_num[index]; ss++) {
 				interp_v3_v3v3v3(bData->realCoord[bData->s_pos[index] + ss].v,
 				                 canvas_verts[tPoint->v1].v,
 				                 canvas_verts[tPoint->v2].v,
@@ -4747,11 +4748,18 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const Sce
 			normal_short_to_float_v3(n2, mvert[tPoint->v2].no);
 			normal_short_to_float_v3(n3, mvert[tPoint->v3].no);
 
-			interp_v3_v3v3v3(bData->bNormal[index].invNorm,
-			                 n1, n2, n3, f_data->barycentricWeights[index * bData->s_num[index]].v);
-			mul_mat3_m4_v3(ob->obmat, bData->bNormal[index].invNorm);
-			normalize_v3(bData->bNormal[index].invNorm);
-			negate_v3(bData->bNormal[index].invNorm);
+			interp_v3_v3v3v3(temp_nor, n1, n2, n3, f_data->barycentricWeights[index * bData->s_num[index]].v);
+			normalize_v3(temp_nor);
+			if (ELEM(surface->type, MOD_DPAINT_SURFACE_T_DISPLACE, MOD_DPAINT_SURFACE_T_WAVE)) {
+				/* Prepare surface normal directional scale to easily convert
+				 * brush intersection amount between global and local space */
+				float scaled_nor[3];
+				mul_v3_v3v3(scaled_nor, temp_nor, ob->size);
+				bData->bNormal[index].normal_scale = len_v3(scaled_nor);
+			}
+			mul_mat3_m4_v3(ob->obmat, temp_nor);
+			normalize_v3(temp_nor);
+			negate_v3_v3(bData->bNormal[index].invNorm, temp_nor);
 		}
 		else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
 			int ss;
@@ -4778,35 +4786,17 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const Sce
 			}
 
 			/* normal */
-			normal_short_to_float_v3(bData->bNormal[index].invNorm, mvert[index].no);
-			mul_mat3_m4_v3(ob->obmat, bData->bNormal[index].invNorm);
-			normalize_v3(bData->bNormal[index].invNorm);
-			negate_v3(bData->bNormal[index].invNorm);
-		}
-
-		/* Prepare surface normal directional scale to easily convert
-		 *  brush intersection amount between global and local space */
-		if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
-		    surface->type == MOD_DPAINT_SURFACE_T_WAVE)
-		{
-			float temp_nor[3];
-			if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
-				normal_short_to_float_v3(temp_nor, mvert[index].no);
-				normalize_v3(temp_nor);
+			normal_short_to_float_v3(temp_nor, mvert[index].no);
+			if (ELEM(surface->type, MOD_DPAINT_SURFACE_T_DISPLACE, MOD_DPAINT_SURFACE_T_WAVE)) {
+				/* Prepare surface normal directional scale to easily convert
+				 * brush intersection amount between global and local space */
+				float scaled_nor[3];
+				mul_v3_v3v3(scaled_nor, temp_nor, ob->size);
+				bData->bNormal[index].normal_scale = len_v3(scaled_nor);
 			}
-			else {
-				float n1[3], n2[3], n3[3];
-				ImgSeqFormatData *f_data = (ImgSeqFormatData *)sData->format_data;
-				PaintUVPoint *tPoint = &((PaintUVPoint *)f_data->uv_p)[index];
-
-				normal_short_to_float_v3(n1, mvert[tPoint->v1].no);
-				normal_short_to_float_v3(n2, mvert[tPoint->v2].no);
-				normal_short_to_float_v3(n3, mvert[tPoint->v3].no);
-				interp_v3_v3v3v3(temp_nor, n1, n2, n3, f_data->barycentricWeights[index * bData->s_num[index]].v);
-			}
-
-			mul_v3_v3(temp_nor, ob->size);
-			bData->bNormal[index].normal_scale = len_v3(temp_nor);
+			mul_mat3_m4_v3(ob->obmat, temp_nor);
+			normalize_v3(temp_nor);
+			negate_v3_v3(bData->bNormal[index].invNorm, temp_nor);
 		}
 
 		/* calculate speed vector */




More information about the Bf-blender-cvs mailing list