Skip to content

Commit 5773f47

Browse files
committed
take advantage of cell occlusion to somewhat prune down the amount of cases that need to be checked for 3D worley noise
1 parent 2d9f746 commit 5773f47

File tree

2 files changed

+39
-74
lines changed

2 files changed

+39
-74
lines changed

sources/noise/cell.swift

Lines changed: 39 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ struct CellNoise3D:Noise
293293
// the closest point
294294

295295
// Cell group I:
296-
// within r^2 = 0.25
296+
// outside r^2 = 0
297297
// cumulative sample coverage = 47.85%
298298
_inspect_cell(offset: (-1, 0, 0))
299299
_inspect_cell(offset: ( 0, -1, 0))
@@ -304,140 +304,119 @@ struct CellNoise3D:Noise
304304
_inspect_cell(offset: (-1, -1, 0))
305305

306306
_inspect_cell(offset: (-1, -1, -1))
307+
308+
// Cell group II:
309+
// outside r^2 = 0.25
310+
// cumulative sample coverage = 88.60%
307311
guard r2 > 0.25
308312
else
309313
{
310314
return self.amplitude * r2
311315
}
312-
313-
// Cell group II:
314-
// within r^2 = 0.5
315-
// cumulative sample coverage = 88.60%
316316
for offset in [(1, 0, 0), ( 0, 1, 0), ( 0, 0, 1),
317317
(0, -1, 1), ( 0, 1, -1), ( 1, 0, -1), (-1, 0, 1), (-1, 1, 0), (1, -1, 0),
318318
(1, -1, -1), (-1, 1, -1), (-1, -1, 1)]
319319
{
320320
_inspect_cell(offset: offset)
321321
}
322+
323+
// Cell group III:
324+
// outside r^2 = 0.5
325+
// cumulative sample coverage = 98.26%
322326
guard r2 > 0.5
323327
else
324328
{
325329
return self.amplitude * r2
326330
}
327-
328-
// Cell group III:
329-
// within r^2 = 0.75
330-
// cumulative sample coverage = 98.26%
331331
for offset in [(0, 1, 1), (1, 0, 1), (1, 1, 0), (-1, 1, 1), (1, -1, 1), (1, 1, -1)]
332332
{
333333
_inspect_cell(offset: offset)
334334
}
335-
guard r2 > 0.75
336-
else
337-
{
338-
return self.amplitude * r2
339-
}
340335

341-
// Cell group IV:
342-
// within r^2 = 1.0
336+
// Cell group IV: [(1, 1, 1)] [ occluded ]
337+
// outside r^2 = 0.75
343338
// cumulative sample coverage = 99.94%
344-
_inspect_cell(offset: (1, 1, 1))
339+
340+
// Cell group V:
341+
// outside r^2 = 1.0
342+
// cumulative sample coverage > 99.99%
345343
guard r2 > 1.0
346344
else
347345
{
348346
return self.amplitude * r2
349347
}
350-
351-
// Cell group V:
352-
// within r^2 = 1.25
353-
// cumulative sample coverage > 99.99%
354348
for offset in [(-2, 0, 0), ( 0, -2, 0), ( 0, 0, -2),
355349
( 0, -2, -1), ( 0, -1, -2), (-2, 0, -1), (-1, 0, -2), (-2, -1, 0), (-1, -2, 0),
356350
(-2, -1, -1), (-1, -2, -1), (-1, -1, -2)]
357351
{
358352
_inspect_cell(offset: offset)
359353
}
354+
355+
// Cell group VI:
356+
// outside r^2 = 1.25
357+
// cumulative sample coverage > 99.99%
360358
guard r2 > 1.25
361359
else
362360
{
363361
return self.amplitude * r2
364362
}
365-
366-
// Cell group VI:
367-
// within r^2 = 1.5
368-
// cumulative sample coverage > 99.99%
369363
for offset in [( 0, 1, -2), ( 0, -2, 1), (1, 0, -2), (-2, 0, 1), (1, -2, 0), (-2, 1, 0),
370364
(-2, 1, -1), (-2, -1, 1), (1, -2, -1), (-1, -2, 1), (1, -1, -2), (-1, 1, -2)]
371365
{
372366
_inspect_cell(offset: offset)
373367
}
374-
guard r2 > 1.5
375-
else
376-
{
377-
return self.amplitude * r2
378-
}
379368

380-
// Cell group VII:
381-
// within r^2 = 2.0
369+
// Cell group VII: [(-2, 1, 1), (1, -2, 1), (1, 1, -2)] [ occluded ]
370+
// outside r^2 = 1.5
371+
// cumulative sample coverage > 99.99%
372+
373+
// Cell group VIII:
374+
// outside = 2.0
382375
// cumulative sample coverage > 99.99%
383-
_inspect_cell(offset: (-2, 1, 1))
384-
_inspect_cell(offset: ( 1, -2, 1))
385-
_inspect_cell(offset: ( 1, 1, -2))
386376
guard r2 > 2.0
387377
else
388378
{
389379
return self.amplitude * r2
390380
}
391-
392-
// Cell group VIII:
393-
// within r^2 = 2.25
394-
// cumulative sample coverage > 99.99%
395381
for offset in [(0, -2, -2), (-2, 0, -2), (-2, -2, 0), (-1, -2, -2), (-2, -1, -2), (-2, -2, -1)]
396382
{
397383
_inspect_cell(offset: offset)
398384
}
385+
386+
// Cell group IX: [(1, -2, -2), (-2, -2, 1), (-2, 1, -2)] [ occluded ]
387+
// outside r^2 = 2.25
388+
// cumulative sample coverage > 99.99%
399389
guard r2 > 2.25
400390
else
401391
{
402392
return self.amplitude * r2
403393
}
404-
405-
// Cell group IX:
406-
// within r^2 = 2.5
407-
// cumulative sample coverage > 99.99%
408-
for offset in [(2, 0, 0), (0, 2, 0), (0, 0, 2),
394+
for offset in [(2, 0, 0), (0, 2, 0), ( 0, 0, 2),
409395
(0, -1, 2), (0, 2, -1), (-1, 0, 2), ( 2, 0, -1), (-1, 2, 0), ( 2, -1, 0),
410-
(1, -2, -2), (2, -1, -1), (-2, -2, 1), (-1, -1, 2), (-2, 1, -2), (-1, 2, -1)]
396+
(2, -1, -1), (-1, -1, 2), (-1, 2, -1)]
411397
{
412398
_inspect_cell(offset: offset)
413399
}
400+
401+
// Cell group X:
402+
// outside r^2 = 2.5
403+
// cumulative sample coverage > 99.99%
414404
guard r2 > 2.5
415405
else
416406
{
417407
return self.amplitude * r2
418408
}
419-
420-
// Cell group X:
421-
// within r^2 = 2.75
422-
// cumulative sample coverage > 99.99%
423409
for offset in [(0, 1, 2), (0, 2, 1), (1, 0, 2), ( 2, 0, 1), (1, 2, 0), ( 2, 1, 0),
424410
(2, 1, -1), (2, -1, 1), (1, 2, -1), (-1, 2, 1), (1, -1, 2), (-1, 1, 2)]
425411
{
426412
_inspect_cell(offset: offset)
427413
}
428-
guard r2 > 2.75
429-
else
430-
{
431-
return self.amplitude * r2
432-
}
433414

434-
// Cell group XI:
435-
// within r^2 = 3.0
415+
// Cell group XI: [(2, 1, 1), (1, 2, 1), (1, 1, 2)] [ occluded ]
416+
// outside r^2 = 2.75
436417
// cumulative sample coverage = 100%
437-
for offset in [(2, 1, 1), (1, 2, 1), (1, 1, 2)]
438-
{
439-
_inspect_cell(offset: offset)
440-
}
418+
419+
// stop outside r^2 = 3.0
441420
return self.amplitude * r2
442421
}
443422

sources/noise/poisson.swift

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,6 @@
11
public
22
struct PoissonSampler
33
{
4-
public
5-
struct Point
6-
{
7-
public
8-
let x:Double,
9-
y:Double
10-
11-
init(_ x:Double, _ y:Double)
12-
{
13-
self.x = x
14-
self.y = y
15-
}
16-
}
17-
184
private
195
let candidate_ring:[Math.DoubleV2]
206

0 commit comments

Comments
 (0)