[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27840] branches/render25/source/blender/ render: Render Branch: Tangent space normal map baking should work again now.

Brecht Van Lommel brecht at blender.org
Mon Mar 29 18:13:32 CEST 2010


Revision: 27840
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27840
Author:   blendix
Date:     2010-03-29 18:13:32 +0200 (Mon, 29 Mar 2010)

Log Message:
-----------
Render Branch: Tangent space normal map baking should work again now.

Modified Paths:
--------------
    branches/render25/source/blender/render/extern/include/RE_raytrace.h
    branches/render25/source/blender/render/intern/raytrace/rayobject.cpp
    branches/render25/source/blender/render/intern/source/bake.c
    branches/render25/source/blender/render/intern/source/rayshade.c

Modified: branches/render25/source/blender/render/extern/include/RE_raytrace.h
===================================================================
--- branches/render25/source/blender/render/extern/include/RE_raytrace.h	2010-03-29 14:53:19 UTC (rev 27839)
+++ branches/render25/source/blender/render/extern/include/RE_raytrace.h	2010-03-29 16:13:32 UTC (rev 27840)
@@ -201,6 +201,7 @@
 #define RE_SKIP_VLR_NEIGHBOUR			(1 << 1)
 #define RE_SKIP_VLR_RENDER_CHECK		(1 << 2)
 #define RE_SKIP_VLR_NON_SOLID_MATERIAL	(1 << 3)
+#define RE_SKIP_VLR_BAKE_CHECK			(1 << 4)
 
 /* arbitrary, but can't use e.g. FLT_MAX because of precision issues */
 #define RE_RAYTRACE_MAXDIST	1e15f

Modified: branches/render25/source/blender/render/intern/raytrace/rayobject.cpp
===================================================================
--- branches/render25/source/blender/render/intern/raytrace/rayobject.cpp	2010-03-29 14:53:19 UTC (rev 27839)
+++ branches/render25/source/blender/render/intern/raytrace/rayobject.cpp	2010-03-29 16:13:32 UTC (rev 27840)
@@ -86,6 +86,11 @@
 		return 0;
 }
 
+static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+{
+	return (obi->obr->ob != is->userdata);
+}
+
 static inline int rayface_check_cullface(RayFace *face, Isect *is)
 {
 	float nor[3];
@@ -258,11 +263,18 @@
 		if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
 			return 0;
 	}
-	if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
+	else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
 	{
+		if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+			return 0;
 		if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
 			return 0;
 	}
+	else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) {
+		if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+			return 0;
+	}
+
 	if(is->skip & RE_SKIP_CULLFACE)
 	{
 		if(rayface_check_cullface(face, is) == 0)

Modified: branches/render25/source/blender/render/intern/source/bake.c
===================================================================
--- branches/render25/source/blender/render/intern/source/bake.c	2010-03-29 14:53:19 UTC (rev 27839)
+++ branches/render25/source/blender/render/intern/source/bake.c	2010-03-29 16:13:32 UTC (rev 27840)
@@ -323,22 +323,8 @@
 	}
 }
 
-#if 0
-static int bake_check_intersect(Isect *is, int ob, RayFace *face)
-{
-	BakeShade *bs = (BakeShade*)is->userdata;
-	Render *re= bs->re;
-	
-	/* no direction checking for now, doesn't always improve the result
-	 * (dot_v3v3(shi->geometry.facenor, bs->dir) > 0.0f); */
-
-	return (re->objectinstance[ob & ~RE_RAY_TRANSFORM_OFFS].obr->ob != bs->actob);
-}
-#endif
-
 static int bake_intersect_tree(Render *re, RayObject* raytree, Isect* isect, float *start, float *dir, float sign, float *hitco, float *dist)
 {
-	//TODO, validate against blender 2.4x, results may have changed.
 	float maxdist;
 	int hit;
 
@@ -346,7 +332,7 @@
 	if(re->params.r.bake_maxdist > 0.0f)
 		maxdist= re->params.r.bake_maxdist;
 	else
-		maxdist= FLT_MAX + re->params.r.bake_biasdist;
+		maxdist= RE_RAYTRACE_MAXDIST + re->params.r.bake_biasdist;
 	
 	/* 'dir' is always normalized */
 	madd_v3_v3v3fl(isect->start, start, dir, -re->params.r.bake_biasdist);
@@ -357,11 +343,6 @@
 
 	isect->labda = maxdist;
 
-	/* TODO, 2.4x had this...
-	hit = RE_ray_tree_intersect_check(R.raytree, isect, bake_check_intersect);
-	...the active object may NOT be ignored in some cases.
-	*/
-
 	hit = RE_rayobject_raycast(raytree, isect);
 	if(hit) {
 		hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
@@ -490,8 +471,9 @@
 
 			isec.orig.ob   = obi;
 			isec.orig.face = vlr;
-			isec.userdata= bs;
-			
+			isec.userdata= bs->actob;
+			isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_BAKE_CHECK;
+
 			if(bake_intersect_tree(re, re->db.raytree, &isec, shi->geometry.co, shi->geometry.vn, sign, co, &dist)) {
 				if(!hit || len_v3v3(shi->geometry.co, co) < len_v3v3(shi->geometry.co, minco)) {
 					minisec= isec;

Modified: branches/render25/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rayshade.c	2010-03-29 14:53:19 UTC (rev 27839)
+++ branches/render25/source/blender/render/intern/source/rayshade.c	2010-03-29 16:13:32 UTC (rev 27840)
@@ -1322,7 +1322,7 @@
 	RE_RC_INIT(isec, *shi);
 	isec.orig.ob   = shi->primitive.obi;
 	isec.orig.face = shi->primitive.vlr;
-	isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK | RE_SKIP_VLR_NON_SOLID_MATERIAL;
+	isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL;
 	isec.hint = 0;
 
 	isec.hit.ob   = 0;
@@ -1707,7 +1707,7 @@
 	isec->labda= 1.0f;
 
 	isec->mode= (nearest)? RE_RAY_SHADOW_TRA: RE_RAY_SHADOW;
-	isec->skip= RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_RENDER_CHECK|RE_SKIP_VLR_NON_SOLID_MATERIAL;
+	isec->skip= RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL;
 
 	isec->orig.ob = shi->primitive.obi;
 	isec->orig.face = shi->primitive.vlr;





More information about the Bf-blender-cvs mailing list