Commit: 187d77612bcc13a85c8017c872b99bccd7e8f28c
Author: Thomas Dinges
Date:   Wed Aug 20 23:15:30 2014 +0200
Branches: master
https://developer.blender.org/rB187d77612bcc13a85c8017c872b99bccd7e8f28c

Code refactor: Split __VOLUME__ defines in Cycles.

* __VOLUME__ is basic volume support with Emission and Absorption.
* __VOLUME_SCATTER__ enables volume Scattering support.
* __VOLUME_DECOUPLED__ enables Decoupled Ray Marching.

===================================================================

M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_volume.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/kernel_volume.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_path.h 
b/intern/cycles/kernel/kernel_path.h
index 7c06a89..25c285e 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -90,6 +90,8 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, Ray ray,
 
                        bool heterogeneous = volume_stack_is_heterogeneous(kg, 
state.volume_stack);
                        int sampling_method = volume_stack_sampling_method(kg, 
state.volume_stack);
+
+#ifdef __VOLUME_DECOUPLED__
                        bool decoupled = kernel_volume_use_decoupled(kg, 
heterogeneous, false, sampling_method);
 
                        if(decoupled) {
@@ -141,12 +143,15 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, 
RNG *rng, Ray ray,
                                                break;
                                }
                        }
-                       else {
+                       else
+#endif
+                       {
                                /* integrate along volume segment with distance 
sampling */
                                ShaderData volume_sd;
                                VolumeIntegrateResult result = 
kernel_volume_integrate(
                                        kg, &state, &volume_sd, &volume_ray, L, 
&throughput, rng);
 
+#ifdef __VOLUME_SCATTER__
                                if(result == VOLUME_PATH_SCATTERED) {
                                        /* direct lighting */
                                        kernel_path_volume_connect_light(kg, 
rng, &volume_sd, throughput, &state, L, 1.0f);
@@ -157,6 +162,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, Ray ray,
                                        else
                                                break;
                                }
+#endif
                        }
                }
 #endif
@@ -471,6 +477,8 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, 
RNG *rng, int sample,
 
                        bool heterogeneous = volume_stack_is_heterogeneous(kg, 
state.volume_stack);
                        int sampling_method = volume_stack_sampling_method(kg, 
state.volume_stack);
+
+#ifdef __VOLUME_DECOUPLED__
                        bool decoupled = kernel_volume_use_decoupled(kg, 
heterogeneous, true, sampling_method);
 
                        if(decoupled) {
@@ -522,12 +530,15 @@ ccl_device float4 kernel_path_integrate(KernelGlobals 
*kg, RNG *rng, int sample,
                                                break;
                                }
                        }
-                       else {
+                       else 
+#endif
+                       {
                                /* integrate along volume segment with distance 
sampling */
                                ShaderData volume_sd;
                                VolumeIntegrateResult result = 
kernel_volume_integrate(
                                        kg, &state, &volume_sd, &volume_ray, 
&L, &throughput, rng);
 
+#ifdef __VOLUME_SCATTER__
                                if(result == VOLUME_PATH_SCATTERED) {
                                        /* direct lighting */
                                        kernel_path_volume_connect_light(kg, 
rng, &volume_sd, throughput, &state, &L, 1.0f);
@@ -538,6 +549,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, 
RNG *rng, int sample,
                                        else
                                                break;
                                }
+#endif
                        }
                }
 #endif
@@ -804,7 +816,7 @@ ccl_device float4 
kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
                        Ray volume_ray = ray;
                        volume_ray.t = (hit)? isect.t: FLT_MAX;
 
-#ifdef __KERNEL_CPU__
+#ifdef __VOLUME_DECOUPLED__
                        /* decoupled ray marching only supported on CPU */
                        bool heterogeneous = volume_stack_is_heterogeneous(kg, 
state.volume_stack);
 
@@ -891,6 +903,7 @@ ccl_device float4 
kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
                                VolumeIntegrateResult result = 
kernel_volume_integrate(
                                        kg, &ps, &volume_sd, &volume_ray, &L, 
&tp, rng);
                                
+#ifdef __VOLUME_SCATTER__
                                if(result == VOLUME_PATH_SCATTERED) {
                                        /* todo: support equiangular, MIS and 
all light sampling.
                                         * alternatively get decoupled ray 
marching working on the GPU */
@@ -905,6 +918,7 @@ ccl_device float4 
kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
                                                
path_radiance_reset_indirect(&L);
                                        }
                                }
+#endif
                        }
 
                        /* todo: avoid this calculation using decoupled ray 
marching */
diff --git a/intern/cycles/kernel/kernel_path_volume.h 
b/intern/cycles/kernel/kernel_path_volume.h
index e7047f0..4d6bf47 100644
--- a/intern/cycles/kernel/kernel_path_volume.h
+++ b/intern/cycles/kernel/kernel_path_volume.h
@@ -16,7 +16,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-#ifdef __VOLUME__
+#ifdef __VOLUME_SCATTER__
 
 ccl_device void kernel_path_volume_connect_light(KernelGlobals *kg, RNG *rng,
        ShaderData *sd, float3 throughput, PathState *state, PathRadiance *L,
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 0ee7e60..8a99dbb 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -66,6 +66,8 @@ CCL_NAMESPACE_BEGIN
 #define __SUBSURFACE__
 #define __CMJ__
 #define __VOLUME__
+#define __VOLUME_DECOUPLED__
+#define __VOLUME_SCATTER__
 #define __SHADOW_RECORD_ALL__
 #endif
 
@@ -76,6 +78,7 @@ CCL_NAMESPACE_BEGIN
 
 /* Experimental on GPU */
 //#define __VOLUME__
+//#define __VOLUME_SCATTER__
 //#define __SUBSURFACE__
 #endif
 
diff --git a/intern/cycles/kernel/kernel_volume.h 
b/intern/cycles/kernel/kernel_volume.h
index 49e5f50..402867f 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -334,6 +334,7 @@ ccl_device VolumeIntegrateResult 
kernel_volume_integrate_homogeneous(KernelGloba
        float t = ray->t;
        float3 new_tp;
 
+#ifdef __VOLUME_SCATTER__
        /* randomly scatter, and if we do t is shortened */
        if(closure_flag & SD_SCATTER) {
                /* extinction coefficient */
@@ -387,7 +388,9 @@ ccl_device VolumeIntegrateResult 
kernel_volume_integrate_homogeneous(KernelGloba
                        new_tp = *throughput * transmittance / pdf;
                }
        }
-       else if(closure_flag & SD_ABSORPTION) {
+       else 
+#endif
+       if(closure_flag & SD_ABSORPTION) {
                /* absorption only, no sampling needed */
                float3 transmittance = 
volume_color_transmittance(coeff.sigma_a, t);
                new_tp = *throughput * transmittance;
@@ -464,6 +467,7 @@ ccl_device VolumeIntegrateResult 
kernel_volume_integrate_heterogeneous_distance(
                        bool scatter = false;
 
                        /* distance sampling */
+#ifdef __VOLUME_SCATTER__
                        if((closure_flag & SD_SCATTER) || (has_scatter && 
(closure_flag & SD_ABSORPTION))) {
                                has_scatter = true;
 
@@ -499,7 +503,9 @@ ccl_device VolumeIntegrateResult 
kernel_volume_integrate_heterogeneous_distance(
                                        xi = 1.0f - (1.0f - 
xi)/sample_transmittance;
                                }
                        }
-                       else if(closure_flag & SD_ABSORPTION) {
+                       else 
+#endif
+                       if(closure_flag & SD_ABSORPTION) {
                                /* absorption only, no sampling needed */
                                float3 sigma_a = coeff.sigma_a;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to