15 bool has_motion =
false;
27#ifdef __OBJECT_MOTION__
28 float object_time = (time >= 0.0f) ? time : 0.5f;
49 return t * t / cos_pi;
68 const float distance_to_plane =
fabsf(
dot(
N, sd->wi * t)) /
dot(
N,
N);
69 const float area = 0.5f *
len(
N);
73 if (longest_edge_squared > distance_to_plane * distance_to_plane) {
76 const float3 Px = sd->P + sd->wi * t;
91 pdf = 1.0f / solid_angle;
104 float distribution_area = area;
106 if (has_motion && area != 0.0f) {
112 pdf *= distribution_area *
kernel_data.integrator.distribution_pdf_triangles;
118template<
bool in_volume_segment>
147 const float distance_to_plane =
dot(N0,
V[0] -
P) /
dot(N0, N0);
149 if (!in_volume_segment &&
157 const float area = 0.5f * Nl;
167 if (!in_volume_segment && (longest_edge_squared > distance_to_plane * distance_to_plane)) {
177 const float cos_a =
dot(
B, C);
178 const float cos_b =
dot(A, C);
179 const float cos_c =
dot(A,
B);
184 const float solid_angle = 2.0f *
fast_atan2f(mixed_product, (1.0f + cos_a + cos_b + cos_c));
193 const float A_hat = rand.
x * solid_angle;
196 const float u = cos_phi - cos_alpha;
197 const float v =
sin_phi + sin_alpha * cos_c;
198 const float num = (
v * cos_phi - u *
sin_phi) * cos_alpha -
v;
199 const float den = (
v *
sin_phi + u * cos_phi) * sin_alpha;
200 const float q = (den == 0.0f) ? 1.0f : num / den;
207 const float z = 1.0f - rand.
y * (1.0f -
dot(C_,
B));
217 ls->P =
P + ls->D * ls->t;
221 if (
UNLIKELY(solid_angle == 0.0f)) {
226 ls->pdf = 1.0f / solid_angle;
247 const float t = 1.0f - u -
v;
248 ls->P = t *
V[0] + u *
V[1] +
v *
V[2];
258 float distribution_area = area;
260 if (has_motion && area != 0.0f) {
266 ls->pdf_selection = distribution_area *
kernel_data.integrator.distribution_pdf_triangles;
269 return (ls->pdf > 0.0f);
281 if ((shader_flag & SD_MIS_BOTH) == SD_MIS_BOTH) {
292template<
bool in_volume_segment>
308 distance =
make_float2(min_distance, min_distance);
315 bool shape_above_surface =
false;
316 for (
int i = 0; i < 3; i++) {
317 const float3 corner = vertices[i];
318 float distance_point_to_corner;
320 cos_theta_u =
fminf(cos_theta_u,
dot(point_to_centroid, point_to_corner));
321 shape_above_surface |=
dot(point_to_corner,
N) > 0;
322 if (!in_volume_segment) {
323 distance.x =
fmaxf(distance.x, distance_point_to_corner);
327 const bool front_facing = bcone.theta_o != 0.0f ||
dot(bcone.axis, point_to_centroid) < 0;
329 return front_facing && shape_above_surface;
MINLINE float safe_acosf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device float sin_phi(const float3 w)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
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_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline void triangle_vertices(KernelGlobals kg, int prim, float3 P[3])
ccl_device_inline Transform object_fetch_transform(KernelGlobals kg, int object, enum ObjectTransform type)
ccl_device_inline int object_lightgroup(KernelGlobals kg, int object)
ccl_device_inline Transform object_fetch_transform_motion_test(KernelGlobals kg, int object, float time, ccl_private Transform *itfm)
struct BoundingCone { packed_float3 axis; float theta_o; float theta_e;} BoundingCone
@ SD_OBJECT_NEGATIVE_SCALE
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_HAS_VERTEX_MOTION
ccl_device_forceinline bool triangle_light_tree_parameters(KernelGlobals kg, const ccl_global KernelLightTreeEmitter *kemitter, const float3 centroid, const float3 P, const float3 N, const BoundingCone bcone, ccl_private float &cos_theta_u, ccl_private float2 &distance, ccl_private float3 &point_to_centroid)
ccl_device_inline float triangle_light_pdf_area_sampling(const float3 Ng, const float3 I, float t)
ccl_device_forceinline bool triangle_light_sample(KernelGlobals kg, int prim, int object, const float2 rand, float time, ccl_private LightSample *ls, const float3 P)
CCL_NAMESPACE_BEGIN ccl_device_inline bool triangle_world_space_vertices(KernelGlobals kg, int object, int prim, float time, float3 V[3])
ccl_device_inline bool triangle_light_valid_ray_segment(KernelGlobals kg, const float3 P, const float3 D, ccl_private float2 *t_range, const ccl_private LightSample *ls)
ccl_device_forceinline float triangle_light_pdf(KernelGlobals kg, ccl_private const ShaderData *sd, float t)
ccl_device void fast_sincosf(float x, ccl_private float *sine, ccl_private float *cosine)
ccl_device float fast_atan2f(float y, float x)
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float2 safe_normalize(const float2 a)
ccl_device_inline float2 normalize_len(const float2 a, ccl_private float *t)
ccl_device_inline float cross(const float2 a, const float2 b)
ccl_device_inline float3 safe_normalize_len(const float3 a, ccl_private float *t)
ccl_device_forceinline bool ray_triangle_intersect(const float3 ray_P, const float3 ray_D, const float ray_tmin, const float ray_tmax, const float3 tri_a, const float3 tri_b, const float3 tri_c, ccl_private float *isect_u, ccl_private float *isect_v, ccl_private float *isect_t)
ccl_device bool ray_plane_intersect(const float3 N, const float3 P, const float3 ray_D, ccl_private float2 *t_range)
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_END CCL_NAMESPACE_BEGIN ccl_device_inline float triangle_area(ccl_private const float3 &v1, ccl_private const float3 &v2, ccl_private const float3 &v3)
ccl_device_inline float sin_from_cos(const float c)
CCL_NAMESPACE_BEGIN struct Window V