19#ifdef __SHADER_RAYTRACE__
28ccl_device float svm_bevel_cubic_eval(
const float radius,
const float r)
30 const float Rm = radius;
37 const float Rm5 = (Rm * Rm) * (Rm * Rm) * Rm;
38 const float f = Rm - r;
39 const float num = f * f * f;
44ccl_device float svm_bevel_cubic_pdf(
const float radius,
const float r)
46 return svm_bevel_cubic_eval(radius, r);
55 const float tolerance = 1e-6f;
56 const int max_iteration_count = 10;
60 for (
i = 0;
i < max_iteration_count;
i++) {
61 const float x2 =
x *
x;
62 const float x3 = x2 *
x;
63 const float nx = (1.0f -
x);
65 const float f = 10.0f * x2 - 20.0f * x3 + 15.0f * x2 * x2 - 4.0f * x2 * x3 - xi;
66 const float f_ = 20.0f * (
x * nx) * (nx * nx);
68 if (
fabsf(f) < tolerance || f_ == 0.0f) {
78ccl_device void svm_bevel_cubic_sample(
const float radius,
83 const float Rm = radius;
84 float r_ = svm_bevel_cubic_quintic_root_find(xi);
99# ifdef __KERNEL_OPTIX__
108 const int num_samples)
111 if (radius <= 0.0f || num_samples < 1 || sd->
object ==
OBJECT_NONE) {
154 const float axisu = rand_disk.
x;
162 else if (axisu < 0.75f) {
163 const float3 tmp = disk_N;
169 rand_disk.
x = (rand_disk.
x - 0.5f) * 4.0f;
172 const float3 tmp = disk_N;
178 rand_disk.
x = (rand_disk.
x - 0.75f) * 4.0f;
183 float disk_r = rand_disk.
y;
187 svm_bevel_cubic_sample(radius, disk_r, &disk_r, &disk_height);
193 ray.P = sd->P + disk_N * disk_height + disk_P;
196 ray.tmax = 2.0f * disk_height;
207 scene_intersect_local(kg, &ray, &isect, sd->object, &lcg_state,
LOCAL_MAX_HITS);
211 for (
int hit = 0; hit < num_eval_hits; hit++) {
218# ifdef __OBJECT_MOTION__
236 const int prim = isect.
hits[hit].
prim;
240 const float u = isect.
hits[hit].
u;
241 const float v = isect.
hits[hit].
v;
246# ifdef __OBJECT_MOTION__
260 const float pdf_N = pick_pdf_N *
fabsf(
dot(disk_N, hit_Ng));
261 const float pdf_T = pick_pdf_T *
fabsf(
dot(disk_T, hit_Ng));
262 const float pdf_B = pick_pdf_B *
fabsf(
dot(disk_B, hit_Ng));
267 float w = pdf_N / (
sqr(pdf_N) +
sqr(pdf_T) +
sqr(pdf_B));
273 const float r =
len(hit_P - sd->P);
276 const float pdf = svm_bevel_cubic_pdf(radius, r);
277 const float disk_pdf = svm_bevel_cubic_pdf(radius, disk_r);
291template<u
int node_feature_mask,
typename ConstIntegratorGenericState>
292# if defined(__KERNEL_OPTIX__)
299 ConstIntegratorGenericState
state,
316# ifdef __KERNEL_OPTIX__
317 bevel_N = optixDirectCall<float3>(1, kg,
state, sd, radius, num_samples);
319 bevel_N = svm_bevel(kg,
state, sd, radius, num_samples);
325 bevel_N =
normalize(ref_N + (bevel_N - sd->N));
MINLINE float safe_sqrtf(float a)
ATTR_WARN_UNUSED_RESULT const size_t num
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
ccl_device_inline float stack_load_float(const ccl_private float *stack, const uint a)
ccl_device_inline void stack_store_float3(ccl_private float *stack, const uint a, const float3 f)
ccl_device_forceinline void svm_unpack_node_uchar4(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ccl_device_inline bool stack_valid(const uint a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(const ccl_private float *stack, const uint a)
ccl_device_inline T to_global(const float2 p, const T X, const T Y)
ccl_device_inline float2 polar_to_cartesian(const float r, const float phi)
#define ccl_device_forceinline
#define IF_KERNEL_NODES_FEATURE(feature)
#define ccl_optional_struct_init
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_zero_compact()
ccl_device_inline float3 triangle_smooth_normal(KernelGlobals kg, const float3 Ng, const int prim, const float u, float v)
VecBase< float, D > normalize(VecOp< float, D >) RET
ccl_device_inline bool object_negative_scale_applied(const int object_flag)
ccl_device_inline void object_normal_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *N)
@ PRIMITIVE_MOTION_TRIANGLE
@ SD_OBJECT_TRANSFORM_APPLIED
ccl_device_inline uint lcg_state_init(const uint rng_hash, const uint rng_offset, const uint sample, const uint scramble)
ccl_device_inline bool is_zero(const float2 a)
ccl_device_inline float2 safe_normalize(const float2 a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)
ccl_device_inline void motion_triangle_vertices(KernelGlobals kg, const int object, const uint3 tri_vindex, const int numsteps, const int numverts, const int step, const float t, float3 verts[3])
ccl_device_inline float3 motion_triangle_smooth_normal(KernelGlobals kg, const float3 Ng, const int object, const uint3 tri_vindex, const int numsteps, const int step, const float t, const float u, const float v)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 motion_triangle_point_from_uv(KernelGlobals kg, ccl_private ShaderData *sd, const float u, const float v, const float3 verts[3])
ccl_device_inline void path_state_rng_load(ConstIntegratorState state, ccl_private RNGState *rng_state)
ccl_device_inline float2 path_branched_rng_2D(KernelGlobals kg, const ccl_private RNGState *rng_state, const int branch, const int num_branches, const int dimension)
#define INTEGRATOR_STATE(state, nested_struct, member)
const IntegratorStateCPU * ConstIntegratorState
struct Intersection hits[LOCAL_MAX_HITS]
float3 Ng[LOCAL_MAX_HITS]
ccl_device_inline float3 triangle_point_from_uv(KernelGlobals kg, ccl_private ShaderData *sd, const int isect_prim, const float u, const float v)