[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