[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54693] trunk/blender/source/blender: Fix visible seams on normal map bake due to clear colour being black:

Antony Riakiotakis kalast at gmail.com
Wed Feb 20 16:06:13 CET 2013


Revision: 54693
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54693
Author:   psy-fi
Date:     2013-02-20 15:06:13 +0000 (Wed, 20 Feb 2013)
Log Message:
-----------
Fix visible seams on normal map bake due to clear colour being black:

 This is a special case, tangent space normal maps should be cleared to
0.5, 0.5, 1.0. This is good practice but there's no reason why not to
automate this (for artists whose bump map fu may be a bit shallow).

Thanks to Morten Mikkelsen for reporting.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_bake.c
    trunk/blender/source/blender/render/intern/source/bake.c

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c	2013-02-20 14:53:31 UTC (rev 54692)
+++ trunk/blender/source/blender/editors/object/object_bake.c	2013-02-20 15:06:13 UTC (rev 54693)
@@ -257,11 +257,18 @@
 	return dm;
 }
 
-static void clear_images(MTFace *mtface, int totface)
+typedef enum ClearFlag {
+	CLEAR_NORMAL = 1
+} ClearFlag;
+
+
+static void clear_images(MTFace *mtface, int totface, ClearFlag flag)
 {
 	int a;
 	const float vec_alpha[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 	const float vec_solid[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+	const float nor_alpha[4] = {0.5f, 0.5f, 1.0f, 0.0f};
+	const float nor_solid[4] = {0.5f, 0.5f, 1.0f, 1.0f};
 
 	for (a = 0; a < totface; a++)
 		mtface[a].tpage->id.flag &= ~LIB_DOIT;
@@ -272,7 +279,11 @@
 		if ((ima->id.flag & LIB_DOIT) == 0) {
 			ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
 
-			IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
+			if (flag == CLEAR_NORMAL)
+				IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? nor_alpha : nor_solid);
+			else
+				IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
+
 			ima->id.flag |= LIB_DOIT;
 
 			BKE_image_release_ibuf(ima, ibuf, NULL);
@@ -300,7 +311,10 @@
 			ob = base->object;
 			me = (Mesh *)ob->data;
 
-			clear_images(me->mtface, me->totface);
+			if (scene->r.bake_mode == RE_BAKE_NORMALS && scene->r.bake_normal_space == R_BAKE_SPACE_TANGENT)
+				clear_images(me->mtface, me->totface, CLEAR_NORMAL);
+			else
+				clear_images(me->mtface, me->totface, 0);
 		}
 		CTX_DATA_END;
 	}
@@ -395,7 +409,10 @@
 			DerivedMesh *dm = data->lores_dm;
 			MTFace *mtface = CustomData_get_layer(&dm->faceData, CD_MTFACE);
 
-			clear_images(mtface, dm->getNumTessFaces(dm));
+			if (bkj->mode == RE_BAKE_NORMALS)
+				clear_images(mtface, dm->getNumTessFaces(dm), CLEAR_NORMAL);
+			else
+				clear_images(mtface, dm->getNumTessFaces(dm), 0);
 		}
 	}
 

Modified: trunk/blender/source/blender/render/intern/source/bake.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/bake.c	2013-02-20 14:53:31 UTC (rev 54692)
+++ trunk/blender/source/blender/render/intern/source/bake.c	2013-02-20 15:06:13 UTC (rev 54693)
@@ -648,6 +648,8 @@
 					ImBuf *ibuf = NULL;
 					const float vec_alpha[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 					const float vec_solid[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+					const float nor_alpha[4] = {0.5f, 0.5f, 1.0f, 0.0f};
+					const float nor_solid[4] = {0.5f, 0.5f, 1.0f, 1.0f};
 
 					tface = RE_vlakren_get_tface(obr, vlr, obr->bakemtface, NULL, 0);
 
@@ -684,9 +686,12 @@
 						if (ibuf->rect_float)
 							imb_freerectImBuf(ibuf);
 						/* clear image */
-						if (R.r.bake_flag & R_BAKE_CLEAR)
-							IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
-
+						if (R.r.bake_flag & R_BAKE_CLEAR) {
+							if (R.r.bake_mode == RE_BAKE_NORMALS && R.r.bake_normal_space == R_BAKE_SPACE_TANGENT)
+								IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? nor_alpha : nor_solid);
+							else
+								IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
+						}
 						/* might be read by UI to set active image for display */
 						R.bakebuf = ima;
 					}




More information about the Bf-blender-cvs mailing list