128 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| 
 | |
| namespace NoiseTools
 | |
| {
 | |
|     public class WorleyNoise : NoiseGeneratorBase
 | |
|     {
 | |
|         #region Constructor
 | |
| 
 | |
|         public WorleyNoise(int frequency, int repeat, int seed = 0)
 | |
|         : base(frequency, repeat, seed)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region 2D noise
 | |
| 
 | |
|         const int kIDOffs1 = 100000;
 | |
|         const int kIDOffs2 = 200000;
 | |
| 
 | |
|         Vector2 Feature(int cx, int cy)
 | |
|         {
 | |
|             var id = CellID(cx, cy);
 | |
|             return new Vector2(
 | |
|                 Hash01(id           ) + cx,
 | |
|                 Hash01(id + kIDOffs1) + cy
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         float DistanceToFeature(Vector2 p, int cx, int cy)
 | |
|         {
 | |
|             return Vector2.Distance(p, Feature(cx, cy));
 | |
|         }
 | |
| 
 | |
|         protected override float Calculate2D(Vector2 point)
 | |
|         {
 | |
|             point *= Frequency;
 | |
| 
 | |
|             var cx = Mathf.FloorToInt(point.x);
 | |
|             var cy = Mathf.FloorToInt(point.y);
 | |
| 
 | |
|             var d = DistanceToFeature(point, cx, cy);
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy - 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy    ));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy    ));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy + 1));
 | |
| 
 | |
|             return d;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region 3D noise
 | |
| 
 | |
|         Vector3 Feature(int cx, int cy, int cz)
 | |
|         {
 | |
|             var id = CellID(cx, cy, cz);
 | |
|             return new Vector3(
 | |
|                 Hash01(id           ) + cx,
 | |
|                 Hash01(id + kIDOffs1) + cy,
 | |
|                 Hash01(id + kIDOffs2) + cz
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         float DistanceToFeature(Vector3 p, int cx, int cy, int cz)
 | |
|         {
 | |
|             return Vector3.Distance(p, Feature(cx, cy, cz));
 | |
|         }
 | |
| 
 | |
|         protected override float Calculate3D(Vector3 point)
 | |
|         {
 | |
|             point *= Frequency;
 | |
| 
 | |
|             var cx = Mathf.FloorToInt(point.x);
 | |
|             var cy = Mathf.FloorToInt(point.y);
 | |
|             var cz = Mathf.FloorToInt(point.z);
 | |
| 
 | |
|             var d = DistanceToFeature(point, cx, cy, cz);
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy - 1, cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy - 1, cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy - 1, cz - 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy    , cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy    , cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy    , cz - 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy + 1, cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy + 1, cz - 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy + 1, cz - 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy - 1, cz));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy - 1, cz));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy - 1, cz));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy    , cz));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy    , cz));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy + 1, cz));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy + 1, cz));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy + 1, cz));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy - 1, cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy - 1, cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy - 1, cz + 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy    , cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy    , cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy    , cz + 1));
 | |
| 
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx - 1, cy + 1, cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx    , cy + 1, cz + 1));
 | |
|             d = Mathf.Min(d, DistanceToFeature(point, cx + 1, cy + 1, cz + 1));
 | |
| 
 | |
|             return d;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 |