24 bool has_motion =
false;
36#ifdef __OBJECT_MOTION__
37 const float object_time = (time >= 0.0f) ? time : 0.5f;
60 return t * t / cos_pi;
79 const float distance_to_plane =
fabsf(
dot(
N, sd->wi * t)) /
dot(
N,
N);
80 const float area = 0.5f *
len(
N);
84 if (longest_edge_squared > distance_to_plane * distance_to_plane) {
87 const float3 Px = sd->P + sd->wi * t;
101 pdf = 1.0f / solid_angle;
113 float distribution_area = area;
115 if (has_motion && area != 0.0f) {
121 pdf *= distribution_area *
kernel_data.integrator.distribution_pdf_triangles;
127template<
bool in_volume_segment>
156 const float distance_to_plane =
dot(N0,
V[0] -
P) /
dot(N0, N0);
158 if (!in_volume_segment &&
166 const float area = 0.5f * Nl;
175 if (!in_volume_segment && (longest_edge_squared > distance_to_plane * distance_to_plane)) {
185 const float cos_a =
dot(
B,
C);
186 const float cos_b =
dot(
A,
C);
187 const float cos_c =
dot(
A,
B);
192 const float solid_angle = 2.0f *
fast_atan2f(mixed_product, (1.0f + cos_a + cos_b + cos_c));
201 const float A_hat = rand.
x * solid_angle;
205 const float u = cos_phi - cos_alpha;
206 const float v =
sin_phi + sin_alpha * cos_c;
207 const float num = (
v * cos_phi - u *
sin_phi) * cos_alpha -
v;
208 const float den = (
v *
sin_phi + u * cos_phi) * sin_alpha;
209 const float q = (den == 0.0f) ? 1.0f :
num / den;
216 const float z = 1.0f - rand.
y * (1.0f -
dot(C_,
B));
226 ls->P =
P + ls->D * ls->t;
230 if (
UNLIKELY(solid_angle == 0.0f)) {
234 ls->pdf = 1.0f / solid_angle;
254 const float t = 1.0f - u -
v;
255 ls->P = t *
V[0] + u *
V[1] +
v *
V[2];
265 float distribution_area = area;
267 if (has_motion && area != 0.0f) {
273 ls->pdf_selection = distribution_area *
kernel_data.integrator.distribution_pdf_triangles;
276 return (ls->pdf > 0.0f);
288 if ((shader_flag & SD_MIS_BOTH) == SD_MIS_BOTH) {
299template<
bool in_volume_segment>
322 bool shape_above_surface =
false;
323 for (
int i = 0;
i < 3;
i++) {
324 const float3 corner = vertices[
i];
325 float distance_point_to_corner;
327 cos_theta_u =
fminf(cos_theta_u,
dot(point_to_centroid, point_to_corner));
328 shape_above_surface |=
dot(point_to_corner,
N) > 0;
329 if (!in_volume_segment) {
334 const bool front_facing = bcone.
theta_o != 0.0f ||
dot(bcone.
axis, point_to_centroid) < 0;
336 return front_facing && shape_above_surface;
MINLINE float safe_acosf(float a)
ATTR_WARN_UNUSED_RESULT const size_t num
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.
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline void triangle_vertices(KernelGlobals kg, const int prim, float3 P[3])
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
ccl_device_inline int object_lightgroup(KernelGlobals kg, const int object)
ccl_device_inline Transform object_fetch_transform(KernelGlobals kg, const int object, enum ObjectTransform type)
ccl_device_inline Transform object_fetch_transform_motion_test(KernelGlobals kg, const int object, const float time, ccl_private Transform *itfm)
@ SD_OBJECT_NEGATIVE_SCALE
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_HAS_VERTEX_MOTION
ccl_device_inline bool triangle_light_valid_ray_segment(KernelGlobals kg, const float3 P, const float3 D, ccl_private Interval< float > *t_range, const ccl_private LightSample *ls)
ccl_device_forceinline bool triangle_light_sample(KernelGlobals kg, const int prim, const int object, const float2 rand, const float time, ccl_private LightSample *ls, const float3 P)
ccl_device_forceinline float triangle_light_pdf(KernelGlobals kg, const ccl_private ShaderData *sd, const float t)
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 KernelBoundingCone bcone, ccl_private float &cos_theta_u, ccl_private float2 &distance, ccl_private float3 &point_to_centroid)
CCL_NAMESPACE_BEGIN ccl_device_inline bool triangle_world_space_vertices(KernelGlobals kg, const int object, const int prim, const float time, float3 V[3])
ccl_device_inline float triangle_light_pdf_area_sampling(const float3 Ng, const float3 I, const float t)
ccl_device_inline float sin_from_cos(const float c)
ccl_device float fast_atan2f(const float y, const float x)
ccl_device void fast_sincosf(float x, ccl_private float *sine, ccl_private float *cosine)
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 triangle_area(const ccl_private float3 &v1, const ccl_private float3 &v2, const ccl_private float3 &v3)
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 Interval< float > *t_range)
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_NAMESPACE_BEGIN struct Window V