16template<const
bool shadow,
typename IntegratorGenericState>
20 if constexpr (shadow) {
21 return integrator_state_read_shadow_volume_stack(
state,
i);
24 return integrator_state_read_volume_stack(
state,
i);
34template<const
bool shadow,
typename IntegratorGenericState>
39 if constexpr (shadow) {
40 integrator_state_write_shadow_volume_stack(
state,
i, entry);
43 integrator_state_write_volume_stack(
state,
i, entry);
47template<const
bool shadow,
typename IntegratorGenericState>
49 IntegratorGenericState
state,
52# ifdef __KERNEL_USE_DATA_CONSTANTS__
70 for (
int i = 0;;
i++) {
76 if (entry.
object == sd->object && entry.
shader == sd->shader) {
79 entry = volume_stack_read<shadow>(
state,
i + 1);
80 volume_stack_write<shadow>(
state,
i, entry);
98 if (entry.
object == sd->object && entry.
shader == sd->shader) {
109 const VolumeStack new_entry = {sd->object, sd->shader};
111 volume_stack_write<shadow>(
state,
i, new_entry);
112 volume_stack_write<shadow>(
state,
i + 1, empty_entry);
153 const int object = entry.object;
154 if (
object ==
kernel_data.background.object_index) {
169template<const
bool shadow,
typename IntegratorGenericState>
172 for (
int i = 0;;
i++) {
179 if (!volume_is_homogeneous(kg, entry)) {
188template<const
bool shadow,
typename IntegratorGenericState>
195 for (
int i = 0;;
i++) {
201 if (!volume_is_homogeneous(kg, entry)) {
203 step_size =
fminf(object_step_size, step_size);
210enum VolumeSampleMethod {
211 VOLUME_SAMPLE_NONE = 0,
212 VOLUME_SAMPLE_DISTANCE = (1 << 0),
213 VOLUME_SAMPLE_EQUIANGULAR = (1 << 1),
214 VOLUME_SAMPLE_MIS = (VOLUME_SAMPLE_DISTANCE | VOLUME_SAMPLE_EQUIANGULAR),
219 VolumeSampleMethod method = VOLUME_SAMPLE_NONE;
221 for (
int i = 0;;
i++) {
231 return VOLUME_SAMPLE_MIS;
235 if (method == VOLUME_SAMPLE_DISTANCE) {
236 return VOLUME_SAMPLE_MIS;
240 method = VOLUME_SAMPLE_EQUIANGULAR;
244 if (method == VOLUME_SAMPLE_EQUIANGULAR) {
245 return VOLUME_SAMPLE_MIS;
249 method = VOLUME_SAMPLE_DISTANCE;
#define kernel_assert(cond)
#define KERNEL_FEATURE_VOLUME
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ SD_NEED_VOLUME_ATTRIBUTES
@ SD_HETEROGENEOUS_VOLUME
@ SD_OBJECT_HAS_VOLUME_ATTRIBUTES
#define INTEGRATOR_STATE_ARRAY_WRITE(state, nested_struct, array_index, member)
IntegratorStateCPU * IntegratorState