svn merge -r 23207:23528 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / render / intern / source / volumetric.c
index b2692c25b996b213285e3468835eede3bb488b0f..0e89a84c8d8c1fc75436658eabf8d0c107f60c3f 100644 (file)
@@ -75,8 +75,6 @@ inline float luminance(float* col)
 
 static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco, Isect *isect, int intersect_type)
 {
-       float maxsize = RE_ray_tree_max_size(R.raytree);
-       
        /* XXX TODO - get raytrace max distance from object instance's bounding box */
        /* need to account for scaling only, but keep coords in camera space...
         * below code is WIP and doesn't work!
@@ -86,20 +84,23 @@ static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco,
        */
        
        VECCOPY(isect->start, co);
+       VECCOPY(isect->vec, vec );
+       isect->labda = FLT_MAX;
+       /*
        isect->end[0] = co[0] + vec[0] * maxsize;
        isect->end[1] = co[1] + vec[1] * maxsize;
        isect->end[2] = co[2] + vec[2] * maxsize;
+       */
        
        isect->mode= RE_RAY_MIRROR;
-       isect->oborig= RAY_OBJECT_SET(&R, shi->obi);
-       isect->face_last= NULL;
-       isect->ob_last= 0;
+       isect->orig.ob = (void*)shi->obi;
+       isect->last_hit = NULL;
        isect->lay= -1;
        
-       if (intersect_type == VOL_BOUNDS_DEPTH) isect->faceorig= (RayFace*)shi->vlr;
-       else if (intersect_type == VOL_BOUNDS_SS) isect->faceorig= NULL;
+       if (intersect_type == VOL_BOUNDS_DEPTH) isect->orig.face = (void*)shi->vlr;
+       else if (intersect_type == VOL_BOUNDS_SS) isect->orig.face= NULL;
        
-       if(RE_ray_tree_intersect(R.raytree, isect))
+       if(RE_rayobject_raycast(R.raytree, isect))
        {
                hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
                hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
@@ -146,23 +147,19 @@ static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
 static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *col)
 {
        Isect isect;
-       float maxsize = RE_ray_tree_max_size(R.raytree);
        
        VECCOPY(isect.start, co);
-       isect.end[0] = isect.start[0] + shi->view[0] * maxsize;
-       isect.end[1] = isect.start[1] + shi->view[1] * maxsize;
-       isect.end[2] = isect.start[2] + shi->view[2] * maxsize;
-       
-       isect.faceorig= (RayFace *)vlr;
+       VECCOPY(isect.vec, shi->view);
+       isect.labda = FLT_MAX;
        
        isect.mode= RE_RAY_MIRROR;
-       isect.oborig= RAY_OBJECT_SET(&R, shi->obi);
-       isect.face_last= NULL;
-       isect.ob_last= 0;
+       isect.orig.ob = (void*) shi->obi;
+       isect.orig.face = (void*)vlr;
+       isect.last_hit = NULL;
        isect.lay= -1;
        
        /* check to see if there's anything behind the volume, otherwise shade the sky */
-       if(RE_ray_tree_intersect(R.raytree, &isect)) {
+       if(RE_rayobject_raycast(R.raytree, &isect)) {
                shade_intersection(shi, col, &isect);
        } else {
                shadeSkyView(col, co, shi->view, NULL, shi->thread);
@@ -448,7 +445,7 @@ void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, float *
                /* find minimum of volume bounds, or lamp coord */
                if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS)) {
                        float dist = VecLenf(co, hitco);
-                       VlakRen *vlr = (VlakRen *)is.face;
+                       VlakRen *vlr = (VlakRen *)is.hit.face;
                        
                        /* simple internal shadowing */
                        if (vlr->mat->material_type == MA_TYPE_SURFACE) {
@@ -645,7 +642,7 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
        /* (ray intersect ignores front faces here) */
        else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH))
        {
-               VlakRen *vlr = (VlakRen *)is.face;
+               VlakRen *vlr = (VlakRen *)is.hit.face;
                
                startco = shi->co;
                endco = hitco;
@@ -654,7 +651,7 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
                        /* if it's another face in the same material */
                        if (vlr->mat == shi->mat) {
                                /* trace behind the 2nd (raytrace) hit point */
-                               vol_trace_behind(shi, (VlakRen *)is.face, endco, col);
+                               vol_trace_behind(shi, (VlakRen *)is.hit.face, endco, col);
                        } else {
                                shade_intersection(shi, col, &is);
                        }