12# ifndef VOLUME_READ_LAMBDA
13# define VOLUME_READ_LAMBDA(function_call) \
14 auto volume_read_lambda_pass = [=](const int i) { return function_call; };
15# define VOLUME_WRITE_LAMBDA(function_call) \
16 auto volume_write_lambda_pass = [=](const int i, VolumeStack entry) { function_call; };
24template<
typename StackReadOp,
typename StackWriteOp>
27 StackReadOp stack_read,
28 StackWriteOp stack_write)
39 for (
int i = 0;; i++) {
45 if (entry.
object == sd->object && entry.
shader == sd->shader) {
48 entry = stack_read(i + 1);
49 stack_write(i, entry);
67 if (entry.
object == sd->object && entry.
shader == sd->shader) {
80 stack_write(i, new_entry);
81 stack_write(i + 1, empty_entry);
91 volume_stack_enter_exit(kg, sd, volume_read_lambda_pass, volume_write_lambda_pass);
100 volume_stack_enter_exit(kg, sd, volume_read_lambda_pass, volume_write_lambda_pass);
128template<
typename StackReadOp>
133 for (
int i = 0;; i++) {
141 bool heterogeneous =
false;
144 heterogeneous =
true;
150 int object = entry.
object;
154 heterogeneous =
true;
161 object_step_size *=
kernel_data.integrator.volume_step_rate;
162 step_size =
fminf(object_step_size, step_size);
169typedef enum VolumeSampleMethod {
170 VOLUME_SAMPLE_NONE = 0,
171 VOLUME_SAMPLE_DISTANCE = (1 << 0),
172 VOLUME_SAMPLE_EQUIANGULAR = (1 << 1),
173 VOLUME_SAMPLE_MIS = (VOLUME_SAMPLE_DISTANCE | VOLUME_SAMPLE_EQUIANGULAR),
178 VolumeSampleMethod method = VOLUME_SAMPLE_NONE;
180 for (
int i = 0;; i++) {
190 return VOLUME_SAMPLE_MIS;
194 if (method == VOLUME_SAMPLE_DISTANCE) {
195 return VOLUME_SAMPLE_MIS;
199 method = VOLUME_SAMPLE_EQUIANGULAR;
203 if (method == VOLUME_SAMPLE_EQUIANGULAR) {
204 return VOLUME_SAMPLE_MIS;
208 method = VOLUME_SAMPLE_DISTANCE;
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline float object_volume_step_size(KernelGlobals kg, int object)
@ SD_NEED_VOLUME_ATTRIBUTES
@ SD_HETEROGENEOUS_VOLUME
@ SD_OBJECT_HAS_VOLUME_ATTRIBUTES
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
IntegratorStateCPU *ccl_restrict IntegratorState
IntegratorShadowStateCPU *ccl_restrict IntegratorShadowState