20 float3 tmp = ray_D /
dot(ray_D, surface_Ng);
24 surface_dP->dx = tmpx -
dot(tmpx, surface_Ng) * tmp;
25 surface_dP->dy = tmpy -
dot(tmpy, surface_Ng) * tmp;
53 if (zn < xn || zn < yn) {
54 if (yn < xn || yn < zn) {
74 float det = (dPdu.
x * dPdv.
y - dPdv.
x * dPdu.
y);
79 du->dx = (dP.
dx.
x * dPdv.
y - dP.
dx.
y * dPdv.
x) * det;
80 dv->dx = (dP.
dx.
y * dPdu.
x - dP.
dx.
x * dPdu.
y) * det;
82 du->dy = (dP.
dy.
x * dPdv.
y - dP.
dy.
y * dPdv.
x) * det;
83 dv->dy = (dP.
dy.
y * dPdu.
x - dP.
dy.
x * dPdu.
y) * det;
119 return 0.5f * (
len(
D.dx) +
len(
D.dy));
131 float scale = ray_dP + ray_t * ray_dD;
135 surface_dP->dx = dx * scale;
136 surface_dP->dy = dy * scale;
#define ccl_device_forceinline
#define CCL_NAMESPACE_END
ccl_device void differential_dudv(ccl_private differential *du, ccl_private differential *dv, float3 dPdu, float3 dPdv, differential3 dP, float3 Ng)
ccl_device_forceinline void differential_incoming_compact(ccl_private differential3 *dI, const float3 D, const float dD)
ccl_device_forceinline void differential_transfer_compact(ccl_private differential3 *surface_dP, const float ray_dP, const float3, const float ray_dD, const float3 surface_Ng, const float ray_t)
ccl_device differential differential_zero()
ccl_device_forceinline float differential_make_compact(const differential3 D)
ccl_device differential3 differential3_zero()
CCL_NAMESPACE_BEGIN ccl_device void differential_transfer(ccl_private differential3 *surface_dP, const differential3 ray_dP, float3 ray_D, const differential3 ray_dD, float3 surface_Ng, float ray_t)
ccl_device_forceinline float differential_zero_compact()
ccl_device void differential_incoming(ccl_private differential3 *dI, const differential3 dD)
ccl_device_inline float3 zero_float3()
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)
BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z)