[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13755] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Feb 18 19:14:19 CET 2008


Revision: 13755
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13755
Author:   blendix
Date:     2008-02-18 19:14:19 +0100 (Mon, 18 Feb 2008)

Log Message:
-----------

Fix for bug #7936: render baking selected to active now has a Bias
value that is an offset along the normal when looking for the nearest
face, which allows baking faces further away, e.g. an ID badge onto a
shirt.

Also fixes a bug baking to float images, for things other than
displacement it didn't work sometimes, and a memory leak in the
extend filter.

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/filter.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/source/blender/imbuf/intern/filter.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/filter.c	2008-02-18 17:56:41 UTC (rev 13754)
+++ trunk/blender/source/blender/imbuf/intern/filter.c	2008-02-18 18:14:19 UTC (rev 13755)
@@ -299,6 +299,8 @@
 				}
 			}
 		}
+
+		MEM_freeN(temprect);
 	}
 	else if(ibuf->rect) {
 		int *temprect;

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-18 17:56:41 UTC (rev 13754)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-18 18:14:19 UTC (rev 13755)
@@ -273,7 +273,7 @@
 	/* Bake Render options */
 	short bake_osa, bake_filter, bake_mode, bake_flag;
 	short bake_normal_space, bpad;
-	float bake_maxdist;
+	float bake_maxdist, bake_biasdist, bake_pad;
 	
 	/* yafray: global panel params. TODO: move elsewhere */
 	short GIquality, GIcache, GImethod, GIphotons, GIdirect;

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-18 17:56:41 UTC (rev 13754)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-18 18:14:19 UTC (rev 13755)
@@ -1889,26 +1889,26 @@
 		}
 	}
 	
-	if(bs->rect) {
+	if(bs->rect_float) {
+		float *col= bs->rect_float + 4*(bs->rectx*y + x);
+		VECCOPY(col, shr.combined);
+		col[3]= 1.0f;
+	}
+	else {
 		char *col= (char *)(bs->rect + bs->rectx*y + x);
 		col[0]= FTOCHAR(shr.combined[0]);
 		col[1]= FTOCHAR(shr.combined[1]);
 		col[2]= FTOCHAR(shr.combined[2]);
 		col[3]= 255;
 	}
-	else {
-		float *col= bs->rect_float + 4*(bs->rectx*y + x);
-		VECCOPY(col, shr.combined);
-		col[3]= 1.0f;
-	}
 }
 
-static void bake_displacement(void *handle, ShadeInput *shi, Isect *isec, int dir, int x, int y)
+static void bake_displacement(void *handle, ShadeInput *shi, float dist, int x, int y)
 {
 	BakeShade *bs= handle;
 	float disp;
 	
-	disp = 0.5 + (isec->labda*VecLength(isec->vec) * -dir);
+	disp = 0.5 + dist;
 	
 	if(bs->rect_float) {
 		float *col= bs->rect_float + 4*(bs->rectx*y + x);
@@ -1933,7 +1933,7 @@
 	return (R.objectinstance[ob].obr->ob != bs->actob);
 }
 
-static int bake_intersect_tree(RayTree* raytree, Isect* isect, float *dir, float sign, float *hitco)
+static int bake_intersect_tree(RayTree* raytree, Isect* isect, float *start, float *dir, float sign, float *hitco, float *dist)
 {
 	float maxdist;
 	int hit;
@@ -1942,7 +1942,9 @@
 	if(R.r.bake_maxdist > 0.0f)
 		maxdist= R.r.bake_maxdist;
 	else
-		maxdist= RE_ray_tree_max_size(R.raytree);
+		maxdist= RE_ray_tree_max_size(R.raytree) + R.r.bake_biasdist;
+	
+	VECADDFAC(isect->start, start, dir, -R.r.bake_biasdist);
 
 	isect->end[0] = isect->start[0] + dir[0]*maxdist*sign;
 	isect->end[1] = isect->start[1] + dir[1]*maxdist*sign;
@@ -1953,6 +1955,8 @@
 		hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
 		hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
 		hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+
+		*dist= VecLenf(start, hitco);
 	}
 
 	return hit;
@@ -2007,7 +2011,7 @@
 	/* if we are doing selected to active baking, find point on other face */
 	if(bs->actob) {
 		Isect isec, minisec;
-		float co[3], minco[3];
+		float co[3], minco[3], dist, mindist=0.0f;
 		int hit, sign, dir=1;
 		
 		/* intersect with ray going forward and backward*/
@@ -2019,15 +2023,15 @@
 		
 		for(sign=-1; sign<=1; sign+=2) {
 			memset(&isec, 0, sizeof(isec));
-			VECCOPY(isec.start, shi->co);
 			isec.mode= RE_RAY_MIRROR;
 			isec.faceorig= (RayFace*)vlr;
 			isec.oborig= RAY_OBJECT_SET(&R, obi);
 			isec.userdata= bs;
 			
-			if(bake_intersect_tree(R.raytree, &isec, shi->vn, sign, co)) {
+			if(bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) {
 				if(!hit || VecLenf(shi->co, co) < VecLenf(shi->co, minco)) {
 					minisec= isec;
+					mindist= dist;
 					VECCOPY(minco, co);
 					hit= 1;
 					dir = sign;
@@ -2036,7 +2040,7 @@
 		}
 
 		if (hit && bs->type==RE_BAKE_DISPLACEMENT) {;
-			bake_displacement(handle, shi, &minisec, dir, x, y);
+			bake_displacement(handle, shi, mindist, x, y);
 			return;
 		}
 
@@ -2249,7 +2253,6 @@
 			for(a=0; a<re->r.bake_filter; a++)
 				IMB_filter_extend(ibuf);
 			ibuf->userflags |= IB_BITMAPDIRTY;
-			
 			if (ibuf->rect_float) IMB_rect_from_float(ibuf);
 		}
 	}

Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c	2008-02-18 17:56:41 UTC (rev 13754)
+++ trunk/blender/source/blender/src/buttons_scene.c	2008-02-18 18:14:19 UTC (rev 13755)
@@ -2075,12 +2075,13 @@
 
 	uiBlockBeginAlign(block);
 	uiDefButBitS(block, TOG, R_BAKE_TO_ACTIVE, B_DIFF, "Selected to Active", 10,120,190,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Bake shading on the surface of selected objects to the active object");
-	uiDefButF(block, NUM, B_DIFF, "Dist:", 10,100,(G.scene->r.bake_mode == RE_BAKE_NORMALS)? 95: 190,20,&G.scene->r.bake_maxdist, 0.0, 10.0, 1, 0, "Maximum distance from active object to other object");
+	uiDefButF(block, NUM, B_DIFF, "Dist:", 10,100,95,20,&G.scene->r.bake_maxdist, 0.0, 10.0, 1, 0, "Maximum distance from active object to other object");
+	uiDefButF(block, NUM, B_DIFF, "Bias:", 105,100,95,20,&G.scene->r.bake_biasdist, 0.0, 10.0, 1, 0, "Bias towards faces further away from the object");
+	uiBlockEndAlign(block);
 
 	if(G.scene->r.bake_mode == RE_BAKE_NORMALS)
 		uiDefButS(block, MENU, B_DIFF, "Normal Space %t|Camera %x0|World %x1|Object %x2|Tangent %x3", 
-			105,100,95,20, &G.scene->r.bake_normal_space, 0, 0, 0, 0, "Choose normal space for baking");
-	uiBlockEndAlign(block);
+			10,70,190,20, &G.scene->r.bake_normal_space, 0, 0, 0, 0, "Choose normal space for baking");
 
 #if 0	
 	uiBlockBeginAlign(block);





More information about the Bf-blender-cvs mailing list