diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 3a89208262e..53090f7d94e 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -570,10 +570,7 @@ ccl_device void svm_eval_nodes(KernelGlobals kg, #endif SVM_CASE(NODE_TEX_VOXEL) - IF_KERNEL_NODES_FEATURE(VOLUME) - { - offset = svm_node_tex_voxel(kg, sd, stack, node, offset); - } + offset = svm_node_tex_voxel(kg, sd, stack, node, offset); break; SVM_CASE(NODE_AOV_START) if (!svm_node_aov_check(path_flag, render_buffer)) { diff --git a/intern/cycles/kernel/svm/voxel.h b/intern/cycles/kernel/svm/voxel.h index 05f326810df..e07c8b8bc67 100644 --- a/intern/cycles/kernel/svm/voxel.h +++ b/intern/cycles/kernel/svm/voxel.h @@ -9,30 +9,41 @@ CCL_NAMESPACE_BEGIN /* TODO(sergey): Think of making it more generic volume-type attribute * sampler. */ +template ccl_device_noinline int svm_node_tex_voxel( KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset) { uint co_offset, density_out_offset, color_out_offset, space; svm_unpack_node_uchar4(node.z, &co_offset, &density_out_offset, &color_out_offset, &space); -#ifdef __VOLUME__ - int id = node.y; - float3 co = stack_load_float3(stack, co_offset); - if (space == NODE_TEX_VOXEL_SPACE_OBJECT) { - co = volume_normalized_position(kg, sd, co); - } - else { - kernel_assert(space == NODE_TEX_VOXEL_SPACE_WORLD); - Transform tfm; - tfm.x = read_node_float(kg, &offset); - tfm.y = read_node_float(kg, &offset); - tfm.z = read_node_float(kg, &offset); - co = transform_point(&tfm, co); - } - float4 r = kernel_tex_image_interp_3d(kg, id, co, INTERPOLATION_NONE); -#else float4 r = zero_float4(); + +#ifdef __VOLUME__ + IF_KERNEL_NODES_FEATURE(VOLUME) + { + int id = node.y; + float3 co = stack_load_float3(stack, co_offset); + if (space == NODE_TEX_VOXEL_SPACE_OBJECT) { + co = volume_normalized_position(kg, sd, co); + } + else { + kernel_assert(space == NODE_TEX_VOXEL_SPACE_WORLD); + Transform tfm; + tfm.x = read_node_float(kg, &offset); + tfm.y = read_node_float(kg, &offset); + tfm.z = read_node_float(kg, &offset); + co = transform_point(&tfm, co); + } + + r = kernel_tex_image_interp_3d(kg, id, co, INTERPOLATION_NONE); + } + else if (space != NODE_TEX_VOXEL_SPACE_OBJECT) { + read_node_float(kg, &offset); + read_node_float(kg, &offset); + read_node_float(kg, &offset); + } #endif + if (stack_valid(density_out_offset)) stack_store_float(stack, density_out_offset, r.w); if (stack_valid(color_out_offset)) diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 342617b9926..3366fd331a4 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1735,9 +1735,9 @@ enum KernelFeatureFlag : uint32_t { #define KERNEL_FEATURE_NODE_MASK_SURFACE_BACKGROUND \ (KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT | KERNEL_FEATURE_NODE_AOV) #define KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW \ - (KERNEL_FEATURE_NODE_BSDF | KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_VOLUME | \ - KERNEL_FEATURE_NODE_BUMP | KERNEL_FEATURE_NODE_BUMP_STATE | \ - KERNEL_FEATURE_NODE_VORONOI_EXTRA | KERNEL_FEATURE_NODE_LIGHT_PATH) + (KERNEL_FEATURE_NODE_BSDF | KERNEL_FEATURE_NODE_EMISSION | KERNEL_FEATURE_NODE_BUMP | \ + KERNEL_FEATURE_NODE_BUMP_STATE | KERNEL_FEATURE_NODE_VORONOI_EXTRA | \ + KERNEL_FEATURE_NODE_LIGHT_PATH) #define KERNEL_FEATURE_NODE_MASK_SURFACE \ (KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW | KERNEL_FEATURE_NODE_RAYTRACE | \ KERNEL_FEATURE_NODE_AOV | KERNEL_FEATURE_NODE_LIGHT_PATH)