Revision: 21431
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21431
Author:   jaguarandi
Date:     2009-07-08 17:34:41 +0200 (Wed, 08 Jul 2009)

Log Message:
-----------
Hint support (only for first hiearchic level and shadow rays, lets see if this 
is useful)
That means each shadow ray tests:
        1st: last hit face
        2nd: last hit object
        3rd: tree of all objects

Modified Paths:
--------------
    
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
    
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h 
    2009-07-08 15:34:41 UTC (rev 21430)
+++ 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h 
    2009-07-08 15:34:41 UTC (rev 21431)
@@ -31,7 +31,10 @@
 #ifndef RE_RAYTRACE_H
 #define RE_RAYTRACE_H
 
+#define RT_USE_HINT    /* 1 level hint */
 #define RE_RAYCOUNTER
+
+
 #ifdef RE_RAYCOUNTER
 
 typedef struct RayCounter RayCounter;
@@ -42,9 +45,7 @@
        {
                unsigned long long test, hit;
                
-       } faces, bb, raycast;
-       
-       unsigned long long rayshadow_last_hit_optimization;
+       } faces, bb, raycast, raytrace_hint, rayshadow_last_hit;
 };
 
 /* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */
@@ -68,6 +69,9 @@
 /* Internals about raycasting structures can be found on intern/raytree.h */
 typedef struct RayObject RayObject;
 typedef struct Isect Isect;
+
+typedef struct RayTraceHint RayTraceHint;
+
 struct DerivedMesh;
 struct Mesh;
 
@@ -97,7 +101,6 @@
        int   bv_index[6];
        float idot_axis[3];
        float dist;
-       
 
 /*     float end[3];                    - not used */
 
@@ -107,11 +110,14 @@
        {
                void *ob;
                void *face;
-/*             RayObject *obj; */
        }
        hit, orig;
        
        RayObject *last_hit;    /* last hit optimization */
+
+#ifdef RT_USE_HINT
+       RayTraceHint *hint, *hit_hint;
+#endif
        
        short isect;                    /* which half of quad */
        short mode;                             /* RE_RAY_SHADOW, 
RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c    
    2009-07-08 15:34:41 UTC (rev 21430)
+++ 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c    
    2009-07-08 15:34:41 UTC (rev 21431)
@@ -317,23 +317,34 @@
 
        
        /* Last hit heuristic */
-       if(isec->mode==RE_RAY_SHADOW && isec->last_hit && 
RE_rayobject_intersect(isec->last_hit, isec))
+       if(isec->mode==RE_RAY_SHADOW && isec->last_hit)
        {
-               RE_RC_COUNT(isec->raycounter->raycast.hit);
-               RE_RC_COUNT(isec->raycounter->rayshadow_last_hit_optimization );
-               return 1;
+               RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.test);
+               
+               if(RE_rayobject_intersect(isec->last_hit, isec))
+               {
+                       RE_RC_COUNT(isec->raycounter->raycast.hit);
+                       RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.hit);
+                       return 1;
+               }
        }
 
-#ifdef RE_RAYCOUNTER
+#ifdef RT_USE_HINT
+       isec->hit_hint = 0;
+#endif
+
        if(RE_rayobject_intersect(r, isec))
        {
+#ifdef RE_RAYCOUNTER
                RE_RC_COUNT(isec->raycounter->raycast.hit);
+#endif
+
+#ifdef RT_USE_HINT
+               isec->hint = isec->hit_hint;
+#endif
                return 1;
        }
        return 0;
-#else
-       return RE_rayobject_intersect(r, isec);
-#endif
 }
 
 int RE_rayobject_intersect(RayObject *r, Isect *i)
@@ -398,15 +409,19 @@
        printf("\n");   
        printf("Primitives tests: %llu\n", info->faces.test );
        printf("Primitives hits: %llu\n", info->faces.hit );
+       printf("------------------------------------\n");
+       printf("Shadow last-hit tests per ray: %f\n", 
info->rayshadow_last_hit.test / ((float)info->raycast.test) );
+       printf("Shadow last-hit hits per ray: %f\n",  
info->rayshadow_last_hit.hit  / ((float)info->raycast.test) );
        printf("\n");
-       printf("Shadow Last hit reuse: %llu\n", 
info->rayshadow_last_hit_optimization);
+       printf("Hint tests per ray: %f\n", info->raytrace_hint.test / 
((float)info->raycast.test) );
+       printf("Hint hits per ray: %f\n",  info->raytrace_hint.hit  / 
((float)info->raycast.test) );
        printf("\n");
-       printf("Primitives tests per ray: %f\n", info->faces.test / 
((float)info->raycast.test) );
-       printf("Primitives hits per ray: %f\n", info->faces.hit / 
((float)info->raycast.test) );
-       printf("\n");
        printf("BB tests per ray: %f\n", info->bb.test / 
((float)info->raycast.test) );
        printf("BB hits per ray: %f\n", info->bb.hit / 
((float)info->raycast.test) );
        printf("\n");
+       printf("Primitives tests per ray: %f\n", info->faces.test / 
((float)info->raycast.test) );
+       printf("Primitives hits per ray: %f\n", info->faces.hit / 
((float)info->raycast.test) );
+       printf("------------------------------------\n");
 }
 
 void RE_RC_MERGE(RayCounter *dest, RayCounter *tmp)
@@ -420,7 +435,11 @@
        dest->raycast.test += tmp->raycast.test;
        dest->raycast.hit  += tmp->raycast.hit;
        
-       dest->rayshadow_last_hit_optimization += 
tmp->rayshadow_last_hit_optimization;
+       dest->rayshadow_last_hit.test += tmp->rayshadow_last_hit.test;
+       dest->rayshadow_last_hit.hit  += tmp->rayshadow_last_hit.hit;
+
+       dest->raytrace_hint.test += tmp->raytrace_hint.test;
+       dest->raytrace_hint.hit  += tmp->raytrace_hint.hit;
 }
 
 #endif
\ No newline at end of file

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
    2009-07-08 15:34:41 UTC (rev 21430)
+++ 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
    2009-07-08 15:34:41 UTC (rev 21431)
@@ -160,6 +160,9 @@
 {
        BVHNode *stack[DFS_STACK_SIZE];
        int hit = 0, stack_pos = 0;
+#ifdef RT_USE_HINT
+       BVHNode *last_processed_node = 0;
+#endif
        
        stack[stack_pos++] = root;
        
@@ -170,19 +173,29 @@
                {
                        if(RE_rayobject_bb_intersect(isec, (const 
float*)node->bb) != FLT_MAX)
                        {
+                               last_processed_node = node;
                                //push nodes in reverse visit order
                                if(isec->idot_axis[node->split_axis] < 0.0f)
                                {
                                        int i;
                                        for(i=0; i<BVH_NCHILDS; i++)
                                                if(node->child[i] == 0) break;
-                                               else stack[stack_pos++] = 
node->child[i];
+                                               else
+#ifdef RT_USE_HINT
+                                                       if(node->child[i] != 
(BVHNode*)isec->hint)
+#endif
+                                                       stack[stack_pos++] = 
node->child[i];
                                }
                                else
                                {
                                        int i;  
                                        for(i=0; i<BVH_NCHILDS; i++)
-                                               if(node->child[i] != 0) 
stack[stack_pos++] = node->child[i];
+                                               if(node->child[i] != 0
+#ifdef RT_USE_HINT
+                                               && node->child[i] != 
(BVHNode*)isec->hint
+#endif
+                                               )
+                                                       stack[stack_pos++] = 
node->child[i];
                                                else break;
                                }
                                assert(stack_pos <= DFS_STACK_SIZE);
@@ -190,7 +203,19 @@
                }
                else
                {
-                       hit |= RE_rayobject_intersect( (RayObject*)node, isec);
+                       int ghit;
+#ifdef RT_USE_HINT
+                       RayTraceHint *b_hint = isec->hint;
+                       isec->hint = 0;
+#endif
+                       ghit = RE_rayobject_intersect( (RayObject*)node, isec);
+
+#ifdef RT_USE_HINT
+                       isec->hint = b_hint;
+                       if(ghit)
+                               isec->hit_hint = 
(RayTraceHint*)last_processed_node;
+#endif
+                       hit |= ghit;
                        if(hit && isec->mode == RE_RAY_SHADOW) return hit;
                }
        }
@@ -200,7 +225,26 @@
 static int bvh_intersect_stack(BVHTree *obj, Isect *isec)
 {
        if(RayObject_isAligned(obj->root))
+       {
+#ifdef RT_USE_HINT
+               if(isec->hint)
+               {
+                       int hit;
+                       RE_RC_COUNT(isec->raycounter->raytrace_hint.test);      
                
+                       hit = dfs_raycast_stack((BVHNode*) isec->hint, isec);
+                       if(hit)
+                       {
+                               
RE_RC_COUNT(isec->raycounter->raytrace_hint.hit);
+
+                               if(isec->mode == RE_RAY_SHADOW) return hit;
+                       }
+                       else isec->hint = 0; //Clear HINT on non-hit?, that 
sounds good, but no tests where made
+                               
+                       return hit | dfs_raycast_stack(obj->root, isec);
+               }
+#endif
                return dfs_raycast_stack(obj->root, isec);
+       }
        else
                return RE_rayobject_intersect( (RayObject*)obj->root, isec);
 }

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c 
2009-07-08 15:34:41 UTC (rev 21430)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c 
2009-07-08 15:34:41 UTC (rev 21431)
@@ -606,6 +606,7 @@
        isec.labda = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
        isec.mode= RE_RAY_MIRROR;
        isec.skip = RE_SKIP_VLR_NEIGHBOUR;
+       isec.hint = 0;
 
        isec.orig.ob   = obi;
        isec.orig.face = vlr;
@@ -1511,6 +1512,7 @@
        isec.mode= RE_RAY_MIRROR;
        isec.orig.ob   = ship->obi;
        isec.orig.face = ship->vlr;
+       isec.hint = 0;
        RE_RC_INIT(isec, shi);
        
        for(a=0; a<8*8; a++) {
@@ -1720,6 +1722,7 @@
        isec.orig.ob   = shi->obi;
        isec.orig.face = shi->vlr;
        isec.skip = RE_SKIP_VLR_NEIGHBOUR;
+       isec.hint = 0;
 
        isec.hit.ob   = 0;
        isec.hit.face = 0;
@@ -1854,6 +1857,7 @@
        isec.orig.ob   = shi->obi;
        isec.orig.face = shi->vlr;
        isec.skip = RE_SKIP_VLR_NEIGHBOUR;
+       isec.hint = 0;
 
        isec.hit.ob   = 0;
        isec.hit.face = 0;
@@ -2290,6 +2294,7 @@
        RE_RC_INIT(isec, *shi);
        if(shi->mat->mode & MA_SHADOW_TRA) isec.mode= RE_RAY_SHADOW_TRA;
        else isec.mode= RE_RAY_SHADOW;
+       isec.hint = 0;
        
        if(lar->mode & (LA_LAYER|LA_LAYER_SHADOW))
                isec.lay= lar->lay;
@@ -2375,6 +2380,7 @@
        /* setup isec */
        RE_RC_INIT(isec, *shi);
        isec.mode= RE_RAY_SHADOW_TRA;
+       isec.hint = 0;
        
        if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
        


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

Reply via email to