35#define IMPULSES_COUNT 8
63 const float frequency,
64 const float orientation)
66 const float distance_squared =
dot(position, position);
67 const float hann_window = 0.5f + 0.5f *
cosf(
M_PI_F * distance_squared);
68 const float gaussian_envelop =
expf(-
M_PI_F * distance_squared);
69 const float windowed_gaussian_envelope = gaussian_envelop * hann_window;
113 const float integral_of_gabor_squared = 0.25f;
114 const float second_moment = 0.5f;
126 const float frequency,
127 const float isotropy,
128 const float base_orientation)
143 const float orientation = base_orientation + random_orientation * isotropy;
146 const float2 position_in_kernel_space = position - kernel_center;
150 if (
dot(position_in_kernel_space, position_in_kernel_space) >= 1.0f) {
166 const float frequency,
167 const float isotropy,
168 const float base_orientation)
171 const float2 local_position = coordinates - cell_position;
174 for (
int j = -1; j <= 1; j++) {
175 for (
int i = -1;
i <= 1;
i++) {
177 const float2 current_cell_position = cell_position + cell_offset;
178 const float2 position_in_cell_space = local_position - cell_offset;
180 current_cell_position, position_in_cell_space, frequency, isotropy, base_orientation);
192 const float frequency,
195 const float distance_squared =
dot(position, position);
196 const float hann_window = 0.5f + 0.5f *
cosf(
M_PI_F * distance_squared);
197 const float gaussian_envelop =
expf(-
M_PI_F * distance_squared);
198 const float windowed_gaussian_envelope = gaussian_envelop * hann_window;
200 const float3 frequency_vector = frequency * orientation;
201 const float angle = 2.0f *
M_PI_F *
dot(position, frequency_vector);
210 const float integral_of_gabor_squared = 1.0f / (4.0f *
M_SQRT2_F);
211 const float second_moment = 0.5f;
219 const float isotropy,
223 if (isotropy == 0.0f) {
228 float inclination =
acosf(orientation.
z);
229 float azimuth = (orientation.
y < 0.0f ? -1.0f : 1.0f) *
237 inclination += random_angles.
x * isotropy;
238 azimuth += random_angles.
y * isotropy;
246 const float frequency,
247 const float isotropy,
248 const float3 base_orientation)
259 base_orientation, isotropy, seed_for_orientation);
262 const float3 position_in_kernel_space = position - kernel_center;
266 if (
dot(position_in_kernel_space, position_in_kernel_space) >= 1.0f) {
281 const float frequency,
282 const float isotropy,
283 const float3 base_orientation)
286 const float3 local_position = coordinates - cell_position;
289 for (
int k = -1; k <= 1; k++) {
290 for (
int j = -1; j <= 1; j++) {
291 for (
int i = -1;
i <= 1;
i++) {
293 const float3 current_cell_position = cell_position + cell_offset;
294 const float3 position_in_cell_space = local_position - cell_offset;
296 current_cell_position, position_in_cell_space, frequency, isotropy, base_orientation);
307 const uint stack_offsets_1,
308 const uint stack_offsets_2,
311 uint coordinates_stack_offset;
312 uint scale_stack_offset;
313 uint frequency_stack_offset;
314 uint anisotropy_stack_offset;
315 uint orientation_2d_stack_offset;
316 uint orientation_3d_stack_offset;
319 &coordinates_stack_offset,
321 &frequency_stack_offset,
322 &anisotropy_stack_offset);
324 stack_offsets_2, &orientation_2d_stack_offset, &orientation_3d_stack_offset);
328 uint value_stack_offset;
329 uint phase_stack_offset;
330 uint intensity_stack_offset;
334 node_1.
x, &value_stack_offset, &phase_stack_offset, &intensity_stack_offset);
341 stack, orientation_2d_stack_offset, node_2.
x);
344 const float3 scaled_coordinates = coordinates * scale;
345 const float isotropy = 1.0f -
clamp(anisotropy, 0.0f, 1.0f);
346 frequency =
max(0.001f, frequency);
349 float standard_deviation = 1.0f;
369 const float normalization_factor = 6.0f * standard_deviation;
374 stack_store_float(stack, value_stack_offset, (phasor.
y / normalization_factor) * 0.5f + 0.5f);
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
static T sum(const btAlignedObjectArray< T > &items)
static unsigned long seed
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
ccl_device_inline void stack_store_float(ccl_private float *stack, const uint a, const float f)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *const offset)
ccl_device_inline float stack_load_float_default(const ccl_private float *stack, const uint a, const uint value)
ccl_device_forceinline void svm_unpack_node_uchar2(const uint i, ccl_private uint *x, ccl_private uint *y)
ccl_device_forceinline void svm_unpack_node_uchar3(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
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 float3 spherical_to_direction(const float theta, const float phi)
ccl_device_inline float2 polar_to_cartesian(const float r, const float phi)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_noinline int svm_node_tex_gabor(KernelGlobals kg, ccl_private float *stack, const uint type, const uint stack_offsets_1, const uint stack_offsets_2, int offset)
ccl_device float2 compute_2d_gabor_noise_cell(float2 cell, const float2 position, const float frequency, const float isotropy, const float base_orientation)
ccl_device float compute_3d_gabor_standard_deviation()
ccl_device float3 compute_3d_orientation(const float3 orientation, const float isotropy, const float4 seed)
ccl_device float2 compute_3d_gabor_kernel(const float3 position, const float frequency, const float3 orientation)
ccl_device float2 compute_3d_gabor_noise_cell(float3 cell, const float3 position, const float frequency, const float isotropy, const float3 base_orientation)
ccl_device float2 compute_2d_gabor_kernel(const float2 position, const float frequency, const float orientation)
ccl_device float2 compute_2d_gabor_noise(const float2 coordinates, const float frequency, const float isotropy, const float base_orientation)
ccl_device float compute_2d_gabor_standard_deviation()
ccl_device float2 compute_3d_gabor_noise(const float3 coordinates, const float frequency, const float isotropy, const float3 base_orientation)
VecBase< float, D > normalize(VecOp< float, D >) RET
constexpr T clamp(T, U, U) RET
ccl_device_inline float2 hash_float3_to_float2(const float3 k)
ccl_device_inline float hash_float3_to_float(const float3 k)
ccl_device_inline float hash_float4_to_float(const float4 k)
ccl_device_inline float2 hash_float4_to_float2(const float4 k)
ccl_device_inline float3 hash_float4_to_float3(const float4 k)
static float noise(int n)