103 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| 
 | |
| namespace CloudSkybox
 | |
| {
 | |
|     public class NoiseVolume : ScriptableObject
 | |
|     {
 | |
|         #region Asset creation
 | |
| 
 | |
|         enum NoiseType { Perlin, Worley }
 | |
| 
 | |
|         [SerializeField]
 | |
|         NoiseType _noiseType = NoiseType.Perlin;
 | |
| 
 | |
|         [SerializeField]
 | |
|         int _frequency = 1;
 | |
| 
 | |
|         [SerializeField]
 | |
|         int _fractalLevel = 0;
 | |
| 
 | |
|         [SerializeField]
 | |
|         int _seed;
 | |
| 
 | |
|         [SerializeField, HideInInspector]
 | |
|         Texture3D _texture;
 | |
| 
 | |
|         const int kDefaultResolution = 32;
 | |
| 
 | |
|         public Texture3D texture {
 | |
|             get { return _texture; }
 | |
|         }
 | |
| 
 | |
|         void OnEnable()
 | |
|         {
 | |
|             if (_texture == null)
 | |
|             {
 | |
|                 _texture = new Texture3D(
 | |
|                     kDefaultResolution,
 | |
|                     kDefaultResolution,
 | |
|                     kDefaultResolution,
 | |
|                     TextureFormat.Alpha8, false
 | |
|                 );
 | |
|                 _texture.name = "Texture3D";
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void ChangeResolution(int newResolution)
 | |
|         {
 | |
|             DestroyImmediate(_texture);
 | |
| 
 | |
|             _texture = new Texture3D(
 | |
|                 newResolution,
 | |
|                 newResolution,
 | |
|                 newResolution,
 | |
|                 TextureFormat.Alpha8, false
 | |
|             );
 | |
|             _texture.name = "Texture3D";
 | |
|         }
 | |
| 
 | |
|         public void RebuildTexture()
 | |
|         {
 | |
|             if (_texture == null)
 | |
|             {
 | |
|                 Debug.LogError("Texture3D asset is missing.");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var size = _texture.width;
 | |
|             var scale = 1.0f / size;
 | |
| 
 | |
|             NoiseTools.NoiseGeneratorBase noise;
 | |
|             if (_noiseType == NoiseType.Perlin)
 | |
|                 noise = new NoiseTools.PerlinNoise(_frequency, 1, _seed);
 | |
|             else
 | |
|                 noise = new NoiseTools.WorleyNoise(_frequency, 1, _seed);
 | |
| 
 | |
|             var buffer = new Color[size * size * size];
 | |
|             var index = 0;
 | |
| 
 | |
|             for (var ix = 0; ix < size; ix++)
 | |
|             {
 | |
|                 var x = scale * ix;
 | |
|                 for (var iy = 0; iy < size; iy++)
 | |
|                 {
 | |
|                     var y = scale * iy;
 | |
|                     for (var iz = 0; iz < size; iz++)
 | |
|                     {
 | |
|                         var z = scale * iz;
 | |
|                         var c = _fractalLevel > 1 ?
 | |
|                             noise.GetFractal(x, y, z, _fractalLevel) :
 | |
|                             noise.GetAt(x, y, z);
 | |
|                         buffer[index++] = new Color(c, c, c, c);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             _texture.SetPixels(buffer);
 | |
|             _texture.Apply();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 |