30 lines
730 B
C
30 lines
730 B
C
#pragma once
|
|
|
|
#include "diffvg.h"
|
|
|
|
DEVICE int sample(const float *cdf, int num_entries, float u, float *updated_u = nullptr) {
|
|
// Binary search the cdf
|
|
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;
|
|
}
|