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;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to