|  |  |  |  | using System; | 
					
						
							|  |  |  |  | using UnityEngine; | 
					
						
							|  |  |  |  | using Random = UnityEngine.Random; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace AllIn1VfxToolkit | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     public static class AllIn1VfxNoiseCreator | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         public static Texture2D PerlinNoise(Texture2D tex, float scale, int randomSeed, bool tileable) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int texWidth = tex.width; | 
					
						
							|  |  |  |  |             int texHeight = tex.height; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Random.InitState(randomSeed); | 
					
						
							|  |  |  |  |             float randomOffset = Random.Range(-100f, 100f); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             for(int i = 0; i < texHeight; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 for(int j = 0; j < texWidth; j++) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     tex.SetPixel(j, i, CalculatePerlinColor(j, i, scale, randomOffset, texWidth, texHeight)); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             tex.Apply(); | 
					
						
							|  |  |  |  |              | 
					
						
							|  |  |  |  |             Texture2D finalPerlin = new Texture2D(texHeight, texWidth); | 
					
						
							|  |  |  |  |             finalPerlin.SetPixels(tex.GetPixels()); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if(tileable) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 for(int i = 0; i < texHeight; i++) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     for(int j = 0; j < texWidth; j++) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         finalPerlin.SetPixel(j, i, PerlinBorderless(j, i, scale, randomOffset, texWidth, texHeight, tex)); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 }    | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             finalPerlin.Apply(); | 
					
						
							|  |  |  |  |             return finalPerlin; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static Color CalculatePerlinColor(int x, int y, float scale, float offset, int width, int height) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             float xCoord = (x + offset) / width * scale; | 
					
						
							|  |  |  |  |             float yCoord = (y + offset) / height * scale; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             float perlin = Mathf.PerlinNoise(xCoord, yCoord); | 
					
						
							|  |  |  |  |             return new Color(perlin, perlin, perlin, 1); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         private static Color PerlinBorderless(int x, int y, float scale, float offset, int width, int height, Texture2D previousPerlin) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int iniX = x; | 
					
						
							|  |  |  |  |             int iniY = y; | 
					
						
							|  |  |  |  |             float u = (float)x / width; | 
					
						
							|  |  |  |  |             float v = (float)y / height; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if(u > 0.5f) x = width - x; | 
					
						
							|  |  |  |  |             if(v > 0.5f) y = height - y; | 
					
						
							|  |  |  |  |              | 
					
						
							|  |  |  |  |             offset += 23.43f; | 
					
						
							|  |  |  |  |             float xCoord = (x + offset) / width * scale; | 
					
						
							|  |  |  |  |             float yCoord = (y + offset) / height * scale; | 
					
						
							|  |  |  |  |             float perlin = Mathf.PerlinNoise(xCoord, yCoord); | 
					
						
							|  |  |  |  |             Color newPerlin = new Color(perlin, perlin, perlin, 1); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             float edge = Mathf.Max(u, v); | 
					
						
							|  |  |  |  |             edge = Mathf.Max(edge, Mathf.Max(1f - u, 1f - v)); | 
					
						
							|  |  |  |  |             edge = Mathf.Pow(edge, 10f); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return Color.Lerp(previousPerlin.GetPixel(iniX, iniY), newPerlin, edge); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |