/* * Copyright 2011-2013 Blender Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "kernel/kernel_differential.h" #include "kernel/kernel_projection.h" #include "kernel/kernel_shader.h" #include "kernel/geom/geom.h" CCL_NAMESPACE_BEGIN ccl_device void kernel_displace_evaluate(KernelGlobals kg, ccl_global const KernelShaderEvalInput *input, ccl_global float *output, const int offset) { /* Setup shader data. */ const KernelShaderEvalInput in = input[offset]; ShaderData sd; shader_setup_from_displace(kg, &sd, in.object, in.prim, in.u, in.v); /* Evaluate displacement shader. */ const float3 P = sd.P; shader_eval_displacement(kg, INTEGRATOR_STATE_NULL, &sd); float3 D = sd.P - P; object_inverse_dir_transform(kg, &sd, &D); #ifdef __KERNEL_DEBUG_NAN__ if (!isfinite3_safe(D)) { kernel_assert(!"Cycles displacement with non-finite value detected"); } #endif /* Ensure finite displacement, preventing BVH from becoming degenerate and avoiding possible * traversal issues caused by non-finite math. */ D = ensure_finite3(D); /* Write output. */ output[offset * 3 + 0] += D.x; output[offset * 3 + 1] += D.y; output[offset * 3 + 2] += D.z; } ccl_device void kernel_background_evaluate(KernelGlobals kg, ccl_global const KernelShaderEvalInput *input, ccl_global float *output, const int offset) { /* Setup ray */ const KernelShaderEvalInput in = input[offset]; const float3 ray_P = zero_float3(); const float3 ray_D = equirectangular_to_direction(in.u, in.v); const float ray_time = 0.5f; /* Setup shader data. */ ShaderData sd; shader_setup_from_background(kg, &sd, ray_P, ray_D, ray_time); /* Evaluate shader. * This is being evaluated for all BSDFs, so path flag does not contain a specific type. */ const uint32_t path_flag = PATH_RAY_EMISSION; shader_eval_surface( kg, INTEGRATOR_STATE_NULL, &sd, NULL, path_flag); float3 color = shader_background_eval(&sd); #ifdef __KERNEL_DEBUG_NAN__ if (!isfinite3_safe(color)) { kernel_assert(!"Cycles background with non-finite value detected"); } #endif /* Ensure finite color, avoiding possible numerical instabilities in the path tracing kernels. */ color = ensure_finite3(color); /* Write output. */ output[offset * 3 + 0] += color.x; output[offset * 3 + 1] += color.y; output[offset * 3 + 2] += color.z; } ccl_device void kernel_curve_shadow_transparency_evaluate( KernelGlobals kg, ccl_global const KernelShaderEvalInput *input, ccl_global float *output, const int offset) { /* Setup shader data. */ const KernelShaderEvalInput in = input[offset]; ShaderData sd; shader_setup_from_curve(kg, &sd, in.object, in.prim, __float_as_int(in.v), in.u); /* Evaluate transparency. */ shader_eval_surface( kg, INTEGRATOR_STATE_NULL, &sd, NULL, PATH_RAY_SHADOW); /* Write output. */ output[offset] = clamp(average(shader_bsdf_transparency(kg, &sd)), 0.0f, 1.0f); } CCL_NAMESPACE_END