2025-07-08 10:46:31 +00:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|