@@ -34,7 +34,7 @@ struct CellNoise2D:Noise
34
34
}
35
35
36
36
public
37
- func evaluate ( _ x: Double , _ y: Double ) -> Double
37
+ func closest_point ( _ x: Double , _ y: Double ) -> ( point : ( Int , Int ) , r2 : Double )
38
38
{
39
39
let sample : Math . DoubleV2 = ( x * self . frequency, y * self . frequency)
40
40
@@ -80,14 +80,20 @@ struct CellNoise2D:Noise
80
80
let nearpoint_disp : Math . DoubleV2 = ( abs ( sample_rel. x - Double( ( quadrant. a + 1 ) >> 1 ) ) ,
81
81
abs ( sample_rel. y - Double( ( quadrant. b + 1 ) >> 1 ) ) )
82
82
83
- var r2 : Double = self . distance2 ( from: sample, generating_point: near)
83
+ var r2 : Double = self . distance2 ( from: sample, generating_point: near) ,
84
+ closest_point : Math . IntV2 = near
84
85
85
86
@inline ( __always)
86
87
func _inspect( generating_point: Math . IntV2 , dx: Double = 0 , dy: Double = 0 )
87
88
{
88
89
if dx*dx + dy*dy < r2
89
90
{
90
- r2 = min ( r2, self . distance2 ( from: sample, generating_point: generating_point) )
91
+ let dr2 : Double = self . distance2 ( from: sample, generating_point: generating_point)
92
+ if dr2 < r2
93
+ {
94
+ r2 = dr2
95
+ closest_point = generating_point
96
+ }
91
97
}
92
98
}
93
99
@@ -105,7 +111,7 @@ struct CellNoise2D:Noise
105
111
guard r2 > 0.25
106
112
else
107
113
{
108
- return self . amplitude * r2
114
+ return ( closest_point , r2 )
109
115
}
110
116
111
117
// This is the part where shit hits the fan. (`inner` and `outer` are never
@@ -143,7 +149,7 @@ struct CellNoise2D:Noise
143
149
guard r2 > 1.0
144
150
else
145
151
{
146
- return self . amplitude * r2
152
+ return ( closest_point , r2 )
147
153
}
148
154
149
155
// Cell group III:
@@ -159,6 +165,13 @@ struct CellNoise2D:Noise
159
165
_inspect ( generating_point: ( far. a, outer. b) , dx: nearpoint_disp. x - 0.5 , dy: nearpoint_disp. y - 1.5 )
160
166
_inspect ( generating_point: ( outer. a, far. b) , dx: nearpoint_disp. x - 1.5 , dy: nearpoint_disp. y - 0.5 )
161
167
168
+ return ( closest_point, r2)
169
+ }
170
+
171
+ public
172
+ func evaluate( _ x: Double , _ y: Double ) -> Double
173
+ {
174
+ let ( _, r2) : ( ( Int , Int ) , Double ) = self . closest_point ( x, y)
162
175
return self . amplitude * r2
163
176
}
164
177
@@ -214,13 +227,7 @@ struct CellNoise3D:Noise
214
227
}
215
228
216
229
public
217
- func evaluate( _ x: Double , _ y: Double ) -> Double
218
- {
219
- return self . evaluate ( x, y, 0 )
220
- }
221
-
222
- public
223
- func evaluate( _ x: Double , _ y: Double , _ z: Double ) -> Double
230
+ func closest_point( _ x: Double , _ y: Double , _ z: Double ) -> ( point: ( Int , Int , Int ) , r2: Double )
224
231
{
225
232
let sample : Math . DoubleV3 = ( x * self . frequency, y * self . frequency, z * self . frequency)
226
233
@@ -248,7 +255,8 @@ struct CellNoise3D:Noise
248
255
abs ( sample_rel. y - Double( ( quadrant. b + 1 ) >> 1 ) ) ,
249
256
abs ( sample_rel. z - Double( ( quadrant. c + 1 ) >> 1 ) ) )
250
257
251
- var r2 : Double = self . distance2 ( from: sample, generating_point: near)
258
+ var r2 : Double = self . distance2 ( from: sample, generating_point: near) ,
259
+ closest_point : Math . IntV3 = near
252
260
253
261
@inline ( __always)
254
262
func _inspect_cell( offset: Math . IntV3 )
@@ -286,7 +294,12 @@ struct CellNoise3D:Noise
286
294
let generating_point : Math . IntV3 = ( near. a + quadrant. a*offset. a,
287
295
near. b + quadrant. b*offset. b,
288
296
near. c + quadrant. c*offset. c)
289
- r2 = min ( r2, self . distance2 ( from: sample, generating_point: generating_point) )
297
+ let dr2 : Double = self . distance2 ( from: sample, generating_point: generating_point)
298
+ if dr2 < r2
299
+ {
300
+ r2 = dr2
301
+ closest_point = generating_point
302
+ }
290
303
}
291
304
292
305
// check each cell group, exiting early if we are guaranteed to have found
@@ -311,7 +324,7 @@ struct CellNoise3D:Noise
311
324
guard r2 > 0.25
312
325
else
313
326
{
314
- return self . amplitude * r2
327
+ return ( closest_point , r2 )
315
328
}
316
329
for offset in [ ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) ,
317
330
( 0 , - 1 , 1 ) , ( 0 , 1 , - 1 ) , ( 1 , 0 , - 1 ) , ( - 1 , 0 , 1 ) , ( - 1 , 1 , 0 ) , ( 1 , - 1 , 0 ) ,
@@ -326,7 +339,7 @@ struct CellNoise3D:Noise
326
339
guard r2 > 0.5
327
340
else
328
341
{
329
- return self . amplitude * r2
342
+ return ( closest_point , r2 )
330
343
}
331
344
for offset in [ ( 0 , 1 , 1 ) , ( 1 , 0 , 1 ) , ( 1 , 1 , 0 ) , ( - 1 , 1 , 1 ) , ( 1 , - 1 , 1 ) , ( 1 , 1 , - 1 ) ]
332
345
{
@@ -343,7 +356,7 @@ struct CellNoise3D:Noise
343
356
guard r2 > 1.0
344
357
else
345
358
{
346
- return self . amplitude * r2
359
+ return ( closest_point , r2 )
347
360
}
348
361
for offset in [ ( - 2 , 0 , 0 ) , ( 0 , - 2 , 0 ) , ( 0 , 0 , - 2 ) ,
349
362
( 0 , - 2 , - 1 ) , ( 0 , - 1 , - 2 ) , ( - 2 , 0 , - 1 ) , ( - 1 , 0 , - 2 ) , ( - 2 , - 1 , 0 ) , ( - 1 , - 2 , 0 ) ,
@@ -358,7 +371,7 @@ struct CellNoise3D:Noise
358
371
guard r2 > 1.25
359
372
else
360
373
{
361
- return self . amplitude * r2
374
+ return ( closest_point , r2 )
362
375
}
363
376
for offset in [ ( 0 , 1 , - 2 ) , ( 0 , - 2 , 1 ) , ( 1 , 0 , - 2 ) , ( - 2 , 0 , 1 ) , ( 1 , - 2 , 0 ) , ( - 2 , 1 , 0 ) ,
364
377
( - 2 , 1 , - 1 ) , ( - 2 , - 1 , 1 ) , ( 1 , - 2 , - 1 ) , ( - 1 , - 2 , 1 ) , ( 1 , - 1 , - 2 ) , ( - 1 , 1 , - 2 ) ]
@@ -376,7 +389,7 @@ struct CellNoise3D:Noise
376
389
guard r2 > 2.0
377
390
else
378
391
{
379
- return self . amplitude * r2
392
+ return ( closest_point , r2 )
380
393
}
381
394
for offset in [ ( 0 , - 2 , - 2 ) , ( - 2 , 0 , - 2 ) , ( - 2 , - 2 , 0 ) , ( - 1 , - 2 , - 2 ) , ( - 2 , - 1 , - 2 ) , ( - 2 , - 2 , - 1 ) ]
382
395
{
@@ -389,7 +402,7 @@ struct CellNoise3D:Noise
389
402
guard r2 > 2.25
390
403
else
391
404
{
392
- return self . amplitude * r2
405
+ return ( closest_point , r2 )
393
406
}
394
407
for offset in [ ( 2 , 0 , 0 ) , ( 0 , 2 , 0 ) , ( 0 , 0 , 2 ) ,
395
408
( 0 , - 1 , 2 ) , ( 0 , 2 , - 1 ) , ( - 1 , 0 , 2 ) , ( 2 , 0 , - 1 ) , ( - 1 , 2 , 0 ) , ( 2 , - 1 , 0 ) ,
@@ -404,7 +417,7 @@ struct CellNoise3D:Noise
404
417
guard r2 > 2.5
405
418
else
406
419
{
407
- return self . amplitude * r2
420
+ return ( closest_point , r2 )
408
421
}
409
422
for offset in [ ( 0 , 1 , 2 ) , ( 0 , 2 , 1 ) , ( 1 , 0 , 2 ) , ( 2 , 0 , 1 ) , ( 1 , 2 , 0 ) , ( 2 , 1 , 0 ) ,
410
423
( 2 , 1 , - 1 ) , ( 2 , - 1 , 1 ) , ( 1 , 2 , - 1 ) , ( - 1 , 2 , 1 ) , ( 1 , - 1 , 2 ) , ( - 1 , 1 , 2 ) ]
@@ -417,6 +430,19 @@ struct CellNoise3D:Noise
417
430
// cumulative sample coverage = 100%
418
431
419
432
// stop outside r^2 = 3.0
433
+ return ( closest_point, r2)
434
+ }
435
+
436
+ public
437
+ func evaluate( _ x: Double , _ y: Double ) -> Double
438
+ {
439
+ return self . evaluate ( x, y, 0 )
440
+ }
441
+
442
+ public
443
+ func evaluate( _ x: Double , _ y: Double , _ z: Double ) -> Double
444
+ {
445
+ let ( _, r2) : ( ( Int , Int , Int ) , Double ) = self . closest_point ( x, y, z)
420
446
return self . amplitude * r2
421
447
}
422
448
0 commit comments