Revision: 16718
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16718
Author:   broken
Date:     2008-09-25 08:08:41 +0200 (Thu, 25 Sep 2008)

Log Message:
-----------
* Worked a bit on cleaning up the code involving layering volumes on 
solids, in front of other volumes, etc. Now there's a 'layer depth' 
value that works similarly to refraction depth - a limit for how many 
times the view ray will penetrate different volumetric surfaces.

I have it close to being able to return alpha, but it's still not 100% 
correct and needs a bit more work. Going to sit on this for a while.

Modified Paths:
--------------
    branches/sim_physics/source/blender/blenkernel/intern/material.c
    branches/sim_physics/source/blender/blenloader/intern/readfile.c
    branches/sim_physics/source/blender/makesdna/DNA_material_types.h
    branches/sim_physics/source/blender/render/extern/include/RE_shader_ext.h
    branches/sim_physics/source/blender/render/intern/source/shadeinput.c
    branches/sim_physics/source/blender/render/intern/source/volumetric.c
    branches/sim_physics/source/blender/src/buttons_shading.c

Modified: branches/sim_physics/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/sim_physics/source/blender/blenkernel/intern/material.c    
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/blenkernel/intern/material.c    
2008-09-25 06:08:41 UTC (rev 16718)
@@ -172,6 +172,7 @@
        ma->vol_absorption = 1.0f;
        ma->vol_scattering = 1.0f;
        ma->vol_absorption_col[0] = ma->vol_absorption_col[1] = 
ma->vol_absorption_col[2] = 0.0f;
+       ma->vol_raydepth = 15;
 
        ma->mode= 
MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR;
 

Modified: branches/sim_physics/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/sim_physics/source/blender/blenloader/intern/readfile.c    
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/blenloader/intern/readfile.c    
2008-09-25 06:08:41 UTC (rev 16718)
@@ -7871,6 +7871,7 @@
                                ma->vol_absorption = 1.0f;
                                ma->vol_scattering = 1.0f;
                                ma->vol_absorption_col[0] = 
ma->vol_absorption_col[1] = ma->vol_absorption_col[2] = 0.0f;
+                               if (ma->vol_raydepth == 0) ma->vol_raydepth = 
15;
                        }
                }
        }

Modified: branches/sim_physics/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/sim_physics/source/blender/makesdna/DNA_material_types.h   
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/makesdna/DNA_material_types.h   
2008-09-25 06:08:41 UTC (rev 16718)
@@ -71,8 +71,8 @@
        float vol_absorption, vol_scattering;
        float vol_absorption_col[3];
        float vpad2;
+       short vol_raydepth;
        short vol_shadeflag;
-       short vpad;
        
        float fresnel_mir, fresnel_mir_i;
        float fresnel_tra, fresnel_tra_i;

Modified: 
branches/sim_physics/source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- branches/sim_physics/source/blender/render/extern/include/RE_shader_ext.h   
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/render/extern/include/RE_shader_ext.h   
2008-09-25 06:08:41 UTC (rev 16718)
@@ -113,7 +113,7 @@
        
        /* internal face coordinates */
        float u, v, dx_u, dx_v, dy_u, dy_v;
-       float co[3], view[3];
+       float co[3], view[3], camera_co[3];
        
        /* copy from material, keep synced so we can do memcopy */
        /* current size: 23*4 */

Modified: branches/sim_physics/source/blender/render/intern/source/shadeinput.c
===================================================================
--- branches/sim_physics/source/blender/render/intern/source/shadeinput.c       
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/render/intern/source/shadeinput.c       
2008-09-25 06:08:41 UTC (rev 16718)
@@ -671,6 +671,10 @@
                }
        }
        
+       /* set camera coords - for scanline, it's always 0.0,0.0,0.0 (render is 
in camera space)
+        * however for raytrace it can be different - the position of the last 
intersection */
+       shi->camera_co[0] = shi->camera_co[1] = shi->camera_co[2] = 0.0f;
+       
        /* cannot normalize earlier, code above needs it at viewplane level */
        Normalize(shi->view);
 }

Modified: branches/sim_physics/source/blender/render/intern/source/volumetric.c
===================================================================
--- branches/sim_physics/source/blender/render/intern/source/volumetric.c       
2008-09-25 03:02:30 UTC (rev 16717)
+++ branches/sim_physics/source/blender/render/intern/source/volumetric.c       
2008-09-25 06:08:41 UTC (rev 16718)
@@ -55,7 +55,7 @@
 extern struct Render R;
 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
-#if 0
+
 static int vol_backface_intersect_check(Isect *is, int ob, RayFace *face)
 {
        VlakRen *vlr = (VlakRen *)face;
@@ -64,21 +64,33 @@
         * of foward facing geometry don't cause the ray to stop */
        return (INPR(is->vec, vlr->n) < 0.0f);
 }
-#endif
 
-#define VOL_IS_SAMEOBJECT              1
+static int vol_frontface_intersect_check(Isect *is, int ob, RayFace *face)
+{
+       VlakRen *vlr = (VlakRen *)face;
+       
+       /* only consider faces away, so overlapping layers
+        * of foward facing geometry don't cause the ray to stop */
+       return (INPR(is->vec, vlr->n) > 0.0f);
+}
+
+static int vol_always_intersect_check(Isect *is, int ob, RayFace *face)
+{
+       return 1;
+}
+
+#define VOL_IS_BACKFACE                        1
 #define VOL_IS_SAMEMATERIAL            2
 
 
 #define VOL_BOUNDS_DEPTH       0
 #define VOL_BOUNDS_SS          1
 
-static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float 
*hitco, Isect *isect, int intersect_type)
+/* TODO: Box or sphere intersection types could speed things up */
+static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float 
*hitco, Isect *isect, int intersect_type, int checkfunc)
 {
-       /* TODO: Box or sphere intersection types could speed things up */
-
-       /* raytrace method */
        float maxsize = RE_ray_tree_max_size(R.raytree);
+       int intersected=0;
 
        /* TODO: use object's bounding box to calculate max size */
        VECCOPY(isect->start, co);
@@ -86,16 +98,21 @@
        isect->end[1] = co[1] + vec[1] * maxsize;
        isect->end[2] = co[2] + vec[2] * maxsize;
        
-       if (intersect_type == VOL_BOUNDS_DEPTH) isect->faceorig= 
(RayFace*)shi->vlr;
-       else if (intersect_type == VOL_BOUNDS_SS) isect->faceorig= NULL;
-       
        isect->mode= RE_RAY_MIRROR;
        isect->oborig= RAY_OBJECT_SET(&R, shi->obi);
        isect->face_last= NULL;
        isect->ob_last= 0;
        isect->lay= -1;
        
-       if(RE_ray_tree_intersect(R.raytree, isect))
+       if (intersect_type == VOL_BOUNDS_DEPTH) isect->faceorig= 
(RayFace*)shi->vlr;
+       else if (intersect_type == VOL_BOUNDS_SS) isect->faceorig= NULL;
+       
+       if (checkfunc==VOL_IS_BACKFACE)
+               intersected = RE_ray_tree_intersect_check(R.raytree, isect, 
vol_backface_intersect_check);
+       else
+               intersected = RE_ray_tree_intersect(R.raytree, isect);
+       
+       if(intersected)
        {
                float isvec[3];
 
@@ -245,7 +262,7 @@
                VecMulf(lv, -1.0f);
                
                /* find minimum of volume bounds, or lamp coord */
-               if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS)) {
+               if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS, 0)) {
                        float dist = VecLenf(co, hitco);
                        
                        if (ELEM(lar->type, LA_SUN, LA_HEMI))
@@ -312,88 +329,8 @@
        VECCOPY(scatter, col);
 }
 
-static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
+static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, 
float *endco)
 {
-       ShadeInput shi_new;
-       ShadeResult shr_new;
-       
-       memset(&shi_new, 0, sizeof(ShadeInput)); 
-       
-       shi_new.mask= shi->mask;
-       shi_new.osatex= shi->osatex;
-       shi_new.depth= 1;                                       /* only used to 
indicate tracing */
-       shi_new.thread= shi->thread;
-       shi_new.xs= shi->xs;
-       shi_new.ys= shi->ys;
-       shi_new.lay= shi->lay;
-       shi_new.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass 
info */
-       shi_new.combinedflag= 0xFFFFFF;          /* ray trace does all options 
*/
-       shi_new.light_override= shi->light_override;
-       shi_new.mat_override= shi->mat_override;
-       
-       memset(&shr_new, 0, sizeof(ShadeResult));
-       
-       shade_ray(is, &shi_new, &shr_new);
-       
-       col[0]= shr_new.diff[0] + shr_new.spec[0];
-       col[1]= shr_new.diff[1] + shr_new.spec[1];
-       col[2]= shr_new.diff[2] + shr_new.spec[2];
-}
-
-
-static void vol_trace_behind(ShadeInput *shi, float *co, Isect *isect_first, 
float *col)
-{
-       RayFace *rforig=NULL;
-       Isect isect;
-       float maxsize = RE_ray_tree_max_size(R.raytree);
-       
-       if (isect_first != NULL) {
-               /* there was already a ray intersection - 
-                * either the back of volume object or another object */
-               ObjectInstanceRen *obi= RAY_OBJECT_GET(&R, isect_first->ob);
-
-               if (obi != shi->obi) {
-                       /* already intersected with another object, so shade it 
*/
-                       shade_intersection(shi, col, isect_first);
-                       return;
-               } else {
-                       rforig = isect_first->face;
-               }
-       }
-       
-       /* get ready to trace a new ray behind the volume */
-       VECCOPY(isect.start, co)
-       
-       if (rforig == NULL) {
-               /* if there's no original ray intersection then the original 
-                * shaded surface is the inside of the volume at the far 
bounds. 
-                * We can use this face for the raytrace orig face */
-               isect.faceorig= (RayFace *)shi->vlr;
-       } else {
-               isect.faceorig= rforig;
-       }
-       
-       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.mode= RE_RAY_MIRROR;
-       isect.oborig= RAY_OBJECT_SET(&R, shi->obi);
-       isect.face_last= NULL;
-       isect.ob_last= 0;
-       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)) {
-               shade_intersection(shi, col, &isect);
-       } else {
-               shadeSkyView(col, co, shi->view, NULL);
-       }
-       
-}
-
-static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, 
float *endco, Isect *isect)
-{
        float tr[3] = {1.0f, 1.0f, 1.0f};                       /* total 
transmittance */
        float radiance[3] = {0.f, 0.f, 0.f}, d_radiance[3] = {0.f, 0.f, 0.f};
        float stepsize = shi->mat->vol_stepsize;
@@ -403,18 +340,17 @@
        int s;
        float step_sta[3], step_end[3], step_mid[3];
        float col_behind[3];
-       float total_density = 0.f;
-       
+       float alpha;
        float density = vol_get_density(shi, co);
        
        /* multiply col_behind with beam transmittance over entire distance */
-       vol_trace_behind(shi, endco, isect, col_behind);
        vol_get_attenuation(shi, tau, co, endco, density, stepsize);
        tr[0] *= exp(-tau[0]);
        tr[1] *= exp(-tau[1]);
        tr[2] *= exp(-tau[2]);
-       VecMulVecf(radiance, tr, col_behind);   
+       VecMulVecf(radiance, tr, col);  
        tr[0] = tr[1] = tr[2] = 1.0f;
+       
 
        /* ray marching */
        nsteps = (int)ceil(VecLenf(co, endco) / stepsize);
@@ -444,7 +380,7 @@
                        tr[2] *= exp(-tau[2]);
                        
                        /* Terminate raymarching if transmittance is small */
-                       //if (rgb_to_luminance(tr[0], tr[1], tr[2]) < 1e-3) 
break;
+                       //if ((tr[0] + tr[1] + tr[2] * 0.333f) < 0.01f) 
continue;
                        
                        /* incoming light via emission or scattering (additive) 
*/
                        vol_get_emission(shi, step_emit, step_mid, density);
@@ -461,18 +397,14 @@
 
                VECCOPY(step_sta, step_end);
                VecAddf(step_end, step_end, stepvec);
-       
-               total_density += density;
        }
        
-       
-       
        col[0] = radiance[0];
        col[1] = radiance[1];
        col[2] = radiance[2];
        
-       col[3] = 1.0f;
-       //col[3] = total_density * stepsize;
+       alpha = 1.0f -(tr[0] + tr[1] + tr[2]) * 0.333f;
+       col[3] = alpha;
        
        /*
        Incoming radiance = 
@@ -492,56 +424,124 @@
        -- To find radiance from segments along the way:
                find radiance for one step:

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to