1+ using System ;
12using UnityEngine ;
23
34namespace 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 ) ;
0 commit comments