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) {
78 const VolumeStack new_entry = {sd->object, 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);
140 const int object = entry.object;
156template<
typename StackReadOp>
161 for (
int i = 0;;
i++) {
167 if (!volume_is_homogeneous(kg, entry)) {
169 object_step_size *=
kernel_data.integrator.volume_step_rate;
170 step_size =
fminf(object_step_size, step_size);
177enum VolumeSampleMethod {
178 VOLUME_SAMPLE_NONE = 0,
179 VOLUME_SAMPLE_DISTANCE = (1 << 0),
180 VOLUME_SAMPLE_EQUIANGULAR = (1 << 1),
181 VOLUME_SAMPLE_MIS = (VOLUME_SAMPLE_DISTANCE | VOLUME_SAMPLE_EQUIANGULAR),
186 VolumeSampleMethod method = VOLUME_SAMPLE_NONE;
188 for (
int i = 0;;
i++) {
198 return VOLUME_SAMPLE_MIS;
202 if (method == VOLUME_SAMPLE_DISTANCE) {
203 return VOLUME_SAMPLE_MIS;
207 method = VOLUME_SAMPLE_EQUIANGULAR;
211 if (method == VOLUME_SAMPLE_EQUIANGULAR) {
212 return VOLUME_SAMPLE_MIS;
216 method = VOLUME_SAMPLE_DISTANCE;
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline float object_volume_step_size(KernelGlobals kg, const int object)
@ SD_NEED_VOLUME_ATTRIBUTES
@ SD_HETEROGENEOUS_VOLUME
@ SD_OBJECT_HAS_VOLUME_ATTRIBUTES
IntegratorShadowStateCPU * IntegratorShadowState
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
IntegratorStateCPU * IntegratorState