| | #pragma once |
| |
|
| | #include "diffvg.h" |
| |
|
| | DEVICE int sample(const float *cdf, int num_entries, float u, float *updated_u = nullptr) { |
| | |
| | auto lb = 0; |
| | auto len = num_entries - 1 - lb; |
| | while (len > 0) { |
| | auto half_len = len / 2; |
| | auto mid = lb + half_len; |
| | assert(mid >= 0 && mid < num_entries); |
| | if (u < cdf[mid]) { |
| | len = half_len; |
| | } else { |
| | lb = mid + 1; |
| | len = len - half_len - 1; |
| | } |
| | } |
| | lb = clamp(lb, 0, num_entries - 1); |
| | if (updated_u != nullptr) { |
| | if (lb > 0) { |
| | *updated_u = (u - cdf[lb - 1]) / (cdf[lb] - cdf[lb - 1]); |
| | } else { |
| | *updated_u = u / cdf[lb]; |
| | } |
| | } |
| | return lb; |
| | } |
| |
|