Files
2026-02-23 22:01:07 +07:00

126 lines
3.8 KiB
C#

using UnityEngine;
namespace AllIn13DShader
{
public class NoiseCreatorTool
{
private const string SHADER_NAME_FRACTAL_NOISE = "AllIn13DShaderFractalNoise";
private const string SHADER_NAME_WORLEY_NOISE = "AllIn13DShaderWorleyNoise";
public enum NoiseTypes
{
Fractal,
Perlin,
Billow,
Voronoi,
Water,
Cellular,
Cells1,
Cells2
}
public NoiseCreatorValues values;
public NoiseCreatorTool()
{
values = new NoiseCreatorValues();
NoiseSetMaterial();
CheckCreationNoiseTextures();
UpdateNoiseMatAndRender();
CreateNoiseTex();
}
public void CreateNoiseTex()
{
int texSize = (int)values.noiseSize;
values.finalNoiseTex = new Texture2D(texSize, texSize);
RenderTexture finalRenderTarget = new RenderTexture(values.finalNoiseTex.width, values.finalNoiseTex.height, 0, RenderTextureFormat.ARGB32);
Graphics.Blit(values.finalNoiseTex, finalRenderTarget, values.noiseMaterial);
values.finalNoiseTex.ReadPixels(new Rect(0, 0, finalRenderTarget.width, finalRenderTarget.height), 0, 0);
values.finalNoiseTex.Apply();
}
public void CheckCreationNoiseTextures()
{
if (values.noisePreview == null)
{
values.noisePreview = new Texture2D(256, 256);
}
if (values.noiseRenderTarget == null)
{
values.noiseRenderTarget = new RenderTexture(values.noisePreview.width, values.noisePreview.height, 0, RenderTextureFormat.ARGB32);
}
}
public void UpdateNoiseMatAndRender()
{
if (values.noiseType == NoiseTypes.Fractal || values.noiseType == NoiseTypes.Perlin || values.noiseType == NoiseTypes.Billow)
{
values.noiseMaterial.SetFloat("_EndBand", values.noiseFractalAmount);
}
else values.noiseMaterial.SetFloat("_Jitter", values.noiseJitter);
values.noiseMaterial.SetFloat("_ScaleX", values.noiseScaleX);
values.noiseMaterial.SetFloat("_ScaleY", values.noiseScaleY);
values.noiseMaterial.SetFloat("_Offset", (float)values.noiseSeed);
values.noiseMaterial.SetFloat("_Contrast", values.noiseContrast);
values.noiseMaterial.SetFloat("_Brightness", values.noiseBrightness);
values.noiseMaterial.SetFloat("_Invert", values.noiseInverted ? 1f : 0f);
Graphics.Blit(values.noisePreview, values.noiseRenderTarget, values.noiseMaterial);
values.noisePreview.ReadPixels(new Rect(0, 0, values.noiseRenderTarget.width, values.noiseRenderTarget.height), 0, 0);
values.noisePreview.Apply();
}
public void NoiseSetMaterial()
{
if (values.noiseType == NoiseTypes.Fractal || values.noiseType == NoiseTypes.Perlin || values.noiseType == NoiseTypes.Billow)
{
values.isFractalNoise = true;
values.noiseMaterial = new Material(EditorUtils.FindShader(SHADER_NAME_FRACTAL_NOISE));
values.noiseScaleX = 4f;
values.noiseScaleY = 4f;
}
else
{
values.isFractalNoise = false;
values.noiseMaterial = new Material(EditorUtils.FindShader(SHADER_NAME_WORLEY_NOISE));
values.noiseScaleX = 10f;
values.noiseScaleY = 10f;
}
switch (values.noiseType)
{
case NoiseTypes.Fractal:
values.noiseFractalAmount = 8f;
values.noiseMaterial.SetFloat("_Fractal", 1);
break;
case NoiseTypes.Perlin:
values.noiseFractalAmount = 1f;
values.noiseMaterial.SetFloat("_Fractal", 1);
break;
case NoiseTypes.Billow:
values.noiseFractalAmount = 4f;
values.noiseMaterial.SetFloat("_Fractal", 0);
break;
case NoiseTypes.Voronoi:
values.noiseMaterial.SetFloat("_NoiseType", 0f);
break;
case NoiseTypes.Water:
values.noiseMaterial.SetFloat("_NoiseType", 3f);
break;
case NoiseTypes.Cellular:
values.noiseMaterial.SetFloat("_NoiseType", 4f);
break;
case NoiseTypes.Cells1:
values.noiseMaterial.SetFloat("_NoiseType", 1f);
break;
case NoiseTypes.Cells2:
values.noiseMaterial.SetFloat("_NoiseType", 2f);
break;
}
}
}
}