43
43
/* Voronoi / Worley like */
45
__device_noinline void voronoi(float3 p, NodeDistanceMetric distance_metric, float e, float da[4], float3 pa[4])
45
__device_noinline float4 voronoi_Fn(float3 p, float e, int n1, int n2)
49
NodeDistanceMetric distance_metric = NODE_VORONOI_DISTANCE_SQUARED;
47
51
/* returns distances in da and point coords in pa */
48
52
int xx, yy, zz, xi, yi, zi;
110
__device float voronoi_Fn(float3 p, int n)
115
voronoi(p, NODE_VORONOI_DISTANCE_SQUARED, 0, da, pa);
120
__device float voronoi_FnFn(float3 p, int n1, int n2)
125
voronoi(p, NODE_VORONOI_DISTANCE_SQUARED, 0, da, pa);
127
return da[n2] - da[n1];
130
__device float voronoi_F1(float3 p) { return voronoi_Fn(p, 0); }
131
__device float voronoi_F2(float3 p) { return voronoi_Fn(p, 1); }
132
__device float voronoi_F3(float3 p) { return voronoi_Fn(p, 2); }
133
__device float voronoi_F4(float3 p) { return voronoi_Fn(p, 3); }
134
__device float voronoi_F1F2(float3 p) { return voronoi_FnFn(p, 0, 1); }
113
float4 result = make_float4(pa[n1].x, pa[n1].y, pa[n1].z, da[n1]);
116
result = make_float4(pa[n2].x, pa[n2].y, pa[n2].z, da[n2]) - result;
121
__device float voronoi_F1(float3 p) { return voronoi_Fn(p, 0.0f, 0, -1).w; }
122
__device float voronoi_F2(float3 p) { return voronoi_Fn(p, 0.0f, 1, -1).w; }
123
__device float voronoi_F3(float3 p) { return voronoi_Fn(p, 0.0f, 2, -1).w; }
124
__device float voronoi_F4(float3 p) { return voronoi_Fn(p, 0.0f, 3, -1).w; }
125
__device float voronoi_F1F2(float3 p) { return voronoi_Fn(p, 0.0f, 0, 1).w; }
136
127
__device float voronoi_Cr(float3 p)
152
143
__device float noise_basis(float3 p, NodeNoiseBasis basis)
154
145
/* Only Perlin enabled for now, others break CUDA compile by making kernel
155
too big, with compile using > 4GB, due to everything being inlined. */
146
* too big, with compile using > 4GB, due to everything being inlined. */
158
149
if(basis == NODE_NOISE_PERLIN)
191
__device float noise_wave(NodeWaveType wave, float a)
182
__device float noise_wave(NodeWaveBasis wave, float a)
193
184
if(wave == NODE_WAVE_SINE) {
194
return 0.5f + 0.5f*sin(a);
185
return 0.5f + 0.5f * sinf(a);
196
187
else if(wave == NODE_WAVE_SAW) {
197
188
float b = 2.0f*M_PI_F;
223
214
octaves = clamp(octaves, 0.0f, 16.0f);
226
217
for(i = 0; i <= n; i++) {
227
218
float t = noise_basis(fscale*p, basis);