Commit: 771d2f7a24252942e6dfc0e94ae0a1316a910dbf
Author: Thomas Dinges
Date:   Tue Aug 5 01:32:35 2014 +0200
Branches: soc-2014-cycles
https://developer.blender.org/rB771d2f7a24252942e6dfc0e94ae0a1316a910dbf

Cycles: Optimize Equi-Angular sampling using binary range search.

Patch by Lukas Tönne and myself.

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

M       intern/cycles/kernel/kernel_volume.h

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

diff --git a/intern/cycles/kernel/kernel_volume.h 
b/intern/cycles/kernel/kernel_volume.h
index b13168c..8b1ae63 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -848,15 +848,33 @@ ccl_device VolumeIntegrateResult 
kernel_volume_decoupled_scatter(
                float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f);
 
                if(segment->numsteps > 1) {
-                       /* todo: optimize using binary search */
                        float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 
0.0f);
 
-                       for(int i = 0; i < segment->numsteps-1; i++, step++) {
-                               if(sample_t < step->t)
+                       int numsteps = segment->numsteps;
+                       int high = numsteps - 1;
+                       int low = 0;
+                       int mid;
+
+                       while(low < high) {
+                               mid = (low + high) >> 1;
+
+                               if(sample_t < step[mid].t)
+                                       high = mid;
+                               else if(sample_t >= step[mid + 1].t)
+                                       low = mid + 1;
+                               else {
+                                       /* found our interval in step[mid] .. 
step[mid+1] */
+                                       prev_t = step[mid].t;
+                                       prev_cdf_distance = 
step[mid].cdf_distance;
+                                       step += mid+1;
                                        break;
+                               }
+                       }
 
-                               prev_t = step->t;
-                               prev_cdf_distance = step->cdf_distance;
+                       if(low >= numsteps - 1) {
+                               prev_t = step[numsteps - 1].t;
+                               prev_cdf_distance = 
step[numsteps-1].cdf_distance;
+                               step += numsteps - 1;
                        }
 
                        /* pdf for picking step with distance sampling */

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

Reply via email to