Skip to content

Commit 68c9f5b

Browse files
author
Cory Leach
committed
Fractal 3D simplex.
1 parent dd7c6ea commit 68c9f5b

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

Runtime/Utility/SimplexGradientNoise.cs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using UnityEngine;
23

34
namespace Gameframe.Procgen
@@ -11,7 +12,7 @@ public static class SimplexGradientNoise
1112
private static readonly float SimplexScale1D = 64f / 27f;
1213

1314
#region 1D
14-
public static NoiseSample SampleValue1D(float pointX, uint seed, float frequency)
15+
public static NoiseSample Value1D(float pointX, uint seed, float frequency)
1516
{
1617
pointX *= frequency;
1718

@@ -44,7 +45,7 @@ private static NoiseSample _Value1DPart(float pointX, int ix, uint seed)
4445
}
4546
};
4647
}
47-
public static NoiseSample SampleGradient1D(float pointX, uint seed, float frequency)
48+
public static NoiseSample Gradient1D(float pointX, uint seed, float frequency)
4849
{
4950
pointX *= frequency;
5051

@@ -86,7 +87,7 @@ private static float Hash1D(int value, uint seed)
8687
#endregion
8788

8889
#region 2D
89-
public static NoiseSample SampleValue2D(float x, float y, uint seed, float frequency)
90+
public static NoiseSample Value2D(float x, float y, uint seed, float frequency)
9091
{
9192
x *= frequency;
9293
y *= frequency;
@@ -115,7 +116,7 @@ public static NoiseSample SampleValue2D(float x, float y, uint seed, float frequ
115116

116117
return sample * 8;
117118
}
118-
public static NoiseSample SampleGradient2D(float x, float y, uint seed, float frequency)
119+
public static NoiseSample Gradient2D(float x, float y, uint seed, float frequency)
119120
{
120121
x *= frequency;
121122
y *= frequency;
@@ -212,7 +213,7 @@ private static float Hash2D(int x, int y, uint seed)
212213
#endregion
213214

214215
#region 3D
215-
public static NoiseSample SampleValue3D(float x, float y, float z, uint seed, float frequency)
216+
public static NoiseSample Value3D(float x, float y, float z, uint seed, float frequency)
216217
{
217218
x *= frequency;
218219
y *= frequency;
@@ -280,7 +281,7 @@ public static NoiseSample SampleValue3D(float x, float y, float z, uint seed, fl
280281

281282
return sample * 8;
282283
}
283-
public static NoiseSample SampleGradient3D(float x, float y, float z, uint seed, float frequency)
284+
public static NoiseSample Gradient3D(float x, float y, float z, uint seed, float frequency)
284285
{
285286
x *= frequency;
286287
y *= frequency;
@@ -351,6 +352,28 @@ public static NoiseSample SampleGradient3D(float x, float y, float z, uint seed,
351352

352353
return sample;
353354
}
355+
public static NoiseSample FractalGradient3D(float x, float y, float z, uint seed, float frequency, int octaves, float lacunarity = 2f, float persistence = 0.5f)
356+
{
357+
return _SampleFractal3D(Gradient3D, x, y, z, seed, frequency, octaves, lacunarity, persistence);
358+
}
359+
public static NoiseSample FractalValue3D(float x, float y, float z, uint seed, float frequency, int octaves, float lacunarity = 2f, float persistence = 0.5f)
360+
{
361+
return _SampleFractal3D(Value3D, x, y, z, seed, frequency, octaves, lacunarity, persistence);
362+
}
363+
private static NoiseSample _SampleFractal3D(Func<float, float, float, uint, float, NoiseSample> action, float x, float y, float z, uint seed, float frequency, int octaves, float lacunarity = 2f, float persistence = 0.5f)
364+
{
365+
var sum = action(x, y, z, seed, frequency);
366+
var amplitude = 1f;
367+
var range = 1f;
368+
for (var i = 1; i < octaves; i++)
369+
{
370+
frequency *= lacunarity;
371+
amplitude *= persistence;
372+
range += amplitude;
373+
sum += action(x, y, z, seed, frequency) * amplitude;
374+
}
375+
return sum * (1 / range);
376+
}
354377
private static NoiseSample _Value3DPart(float x, float y, float z, int ix, int iy, int iz, uint seed)
355378
{
356379
var unskew = (ix + iy + iz) * (1f / 6f);

Runtime/Visualizers/NoiseVisualizer2D.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,22 +144,22 @@ private void Generate()
144144
lacunarity, persistence).value;
145145
break;
146146
case Dimension.SimplexValue1D:
147-
v = SimplexGradientNoise.SampleValue1D(point.x, seed, frequency).value;
147+
v = SimplexGradientNoise.Value1D(point.x, seed, frequency).value;
148148
break;
149149
case Dimension.SimplexValue2D:
150-
v = SimplexGradientNoise.SampleValue2D(point.x, point.y, seed, frequency).value;
150+
v = SimplexGradientNoise.Value2D(point.x, point.y, seed, frequency).value;
151151
break;
152152
case Dimension.SimplexValue3D:
153-
v = SimplexGradientNoise.SampleValue3D(point.x, point.y, point.z, seed, frequency).value;
153+
v = SimplexGradientNoise.Value3D(point.x, point.y, point.z, seed, frequency).value;
154154
break;
155155
case Dimension.SimplexGradient1D:
156-
v = SimplexGradientNoise.SampleGradient1D(point.x, seed, frequency).value;
156+
v = SimplexGradientNoise.Gradient1D(point.x, seed, frequency).value;
157157
break;
158158
case Dimension.SimplexGradient2D:
159-
v = SimplexGradientNoise.SampleGradient2D(point.x, point.y, seed, frequency).value;
159+
v = SimplexGradientNoise.Gradient2D(point.x, point.y, seed, frequency).value;
160160
break;
161161
case Dimension.SimplexGradient3D:
162-
v = SimplexGradientNoise.SampleGradient3D(point.x, point.y, point.z, seed, frequency).value;
162+
v = SimplexGradientNoise.FractalGradient3D(point.x, point.y, point.z, seed, frequency, octaves, lacunarity, persistence).value;
163163
break;
164164
default:
165165
throw new ArgumentOutOfRangeException();
@@ -172,7 +172,7 @@ private void Generate()
172172
}
173173
}
174174

175-
Debug.Log($"Min: {minValue} Max: {maxValue}");
175+
//Debug.Log($"Min: {minValue} Max: {maxValue}");
176176

177177
_texture.Apply();
178178

Runtime/Visualizers/SurfaceMeshVisualizer.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,22 +184,22 @@ private NoiseSample Noise(Vector3 point)
184184
sample = PerlinGradientNoise.FractalSample3D(point.x, point.y, point.z, seed, frequency, octaves, lacunarity, persistence);
185185
break;
186186
case Dimension.SimplexValue1D:
187-
sample = SimplexGradientNoise.SampleValue1D(point.x, seed, frequency);
187+
sample = SimplexGradientNoise.Value1D(point.x, seed, frequency);
188188
break;
189189
case Dimension.SimplexValue2D:
190-
sample = SimplexGradientNoise.SampleValue2D(point.x, point.y, seed, frequency);
190+
sample = SimplexGradientNoise.Value2D(point.x, point.y, seed, frequency);
191191
break;
192192
case Dimension.SimplexValue3D:
193-
sample = SimplexGradientNoise.SampleValue3D(point.x, point.y, point.z, seed, frequency);
193+
sample = SimplexGradientNoise.Value3D(point.x, point.y, point.z, seed, frequency);
194194
break;
195195
case Dimension.SimplexGradient1D:
196-
sample = SimplexGradientNoise.SampleGradient1D(point.x, seed, frequency);
196+
sample = SimplexGradientNoise.Gradient1D(point.x, seed, frequency);
197197
break;
198198
case Dimension.SimplexGradient2D:
199-
sample = SimplexGradientNoise.SampleGradient2D(point.x, point.y, seed, frequency);
199+
sample = SimplexGradientNoise.Gradient2D(point.x, point.y, seed, frequency);
200200
break;
201201
case Dimension.SimplexGradient3D:
202-
sample = SimplexGradientNoise.SampleGradient3D(point.x, point.y, point.z, seed, frequency);
202+
sample = SimplexGradientNoise.Gradient3D(point.x, point.y, point.z, seed, frequency);
203203
break;
204204
}
205205
return sample;

0 commit comments

Comments
 (0)