13#ifdef __SHADER_RAYTRACE__
22ccl_device float svm_bevel_cubic_eval(
const float radius,
float r)
24 const float Rm = radius;
31 const float Rm5 = (Rm * Rm) * (Rm * Rm) * Rm;
32 const float f = Rm - r;
33 const float num = f * f * f;
35 return (10.0f * num) / (Rm5 *
M_PI_F);
38ccl_device float svm_bevel_cubic_pdf(
const float radius,
float r)
40 return svm_bevel_cubic_eval(radius, r);
49 const float tolerance = 1e-6f;
50 const int max_iteration_count = 10;
54 for (i = 0; i < max_iteration_count; i++) {
57 float nx = (1.0f -
x);
59 float f = 10.0f * x2 - 20.0f * x3 + 15.0f * x2 * x2 - 4.0f * x2 * x3 - xi;
60 float f_ = 20.0f * (x * nx) * (nx * nx);
62 if (
fabsf(f) < tolerance || f_ == 0.0f) {
72ccl_device void svm_bevel_cubic_sample(
const float radius,
78 float r_ = svm_bevel_cubic_quintic_root_find(xi);
93# ifdef __KERNEL_OPTIX__
105 if (radius <= 0.0f || num_samples < 1 || sd->
object ==
OBJECT_NONE) {
138 float3 disk_N, disk_T, disk_B;
139 float pick_pdf_N, pick_pdf_T, pick_pdf_B;
144 float axisu = rand_disk.
x;
152 else if (axisu < 0.75f) {
159 rand_disk.
x = (rand_disk.
x - 0.5f) * 4.0f;
168 rand_disk.
x = (rand_disk.
x - 0.75f) * 4.0f;
173 float disk_r = rand_disk.
y;
177 svm_bevel_cubic_sample(radius, disk_r, &disk_r, &disk_height);
179 float3 disk_P = (disk_r *
cosf(phi)) * disk_T + (disk_r *
sinf(phi)) * disk_B;
183 ray.
P = sd->P + disk_N * disk_height + disk_P;
186 ray.tmax = 2.0f * disk_height;
198 scene_intersect_local(kg, &ray, &isect, sd->object, &lcg_state,
LOCAL_MAX_HITS);
202 for (
int hit = 0; hit < num_eval_hits; hit++) {
209# ifdef __OBJECT_MOTION__
231 float u = isect.
hits[hit].
u;
232 float v = isect.
hits[hit].
v;
237# ifdef __OBJECT_MOTION__
251 float pdf_N = pick_pdf_N *
fabsf(
dot(disk_N, hit_Ng));
252 float pdf_T = pick_pdf_T *
fabsf(
dot(disk_T, hit_Ng));
253 float pdf_B = pick_pdf_B *
fabsf(
dot(disk_B, hit_Ng));
258 float w = pdf_N / (
sqr(pdf_N) +
sqr(pdf_T) +
sqr(pdf_B));
264 float r =
len(hit_P - sd->P);
267 float pdf = svm_bevel_cubic_pdf(radius, r);
268 float disk_pdf = svm_bevel_cubic_pdf(radius, disk_r);
282template<u
int node_feature_mask,
typename ConstIntegratorGenericState>
283# if defined(__KERNEL_OPTIX__)
290 ConstIntegratorGenericState
state,
295 uint num_samples, radius_offset, normal_offset, out_offset;
304# ifdef __KERNEL_OPTIX__
305 bevel_N = optixDirectCall<float3>(1, kg,
state, sd, radius, num_samples);
307 bevel_N = svm_bevel(kg,
state, sd, radius, num_samples);
313 bevel_N =
normalize(ref_N + (bevel_N - sd->N));
MINLINE float safe_sqrtf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_forceinline
#define ccl_optional_struct_init
#define ccl_device_inline
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_zero_compact()
draw_view in_light_buf[] float
ccl_device_inline float3 triangle_smooth_normal(KernelGlobals kg, float3 Ng, int prim, float u, float v)
ccl_device_inline bool object_negative_scale_applied(const int object_flag)
ccl_device_inline void object_normal_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *N)
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device_inline float stack_load_float(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar4(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ccl_device_inline bool stack_valid(uint a)
@ PRIMITIVE_MOTION_TRIANGLE
#define IF_KERNEL_NODES_FEATURE(feature)
@ 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 float3 motion_triangle_smooth_normal(KernelGlobals kg, float3 Ng, int object, uint3 tri_vindex, int numsteps, int step, float t, float u, float v)
ccl_device_inline void motion_triangle_vertices(KernelGlobals kg, int object, uint3 tri_vindex, int numsteps, int numverts, int step, float t, float3 verts[3])
CCL_NAMESPACE_BEGIN ccl_device_inline float3 motion_triangle_point_from_uv(KernelGlobals kg, ccl_private ShaderData *sd, const float u, const float v, 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, ccl_private const RNGState *rng_state, const int branch, const int num_branches, const int dimension)
const IntegratorStateCPU *ccl_restrict ConstIntegratorState
#define INTEGRATOR_STATE(state, nested_struct, member)
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)
ccl_device_inline float sqr(float a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)