102 lines
2.1 KiB
C#
102 lines
2.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
public class vp_FractalNoise
|
|
{
|
|
private vp_Perlin m_Noise;
|
|
|
|
private float[] m_Exponent;
|
|
|
|
private int m_IntOctaves;
|
|
|
|
private float m_Octaves;
|
|
|
|
private float m_Lacunarity;
|
|
|
|
public vp_FractalNoise(float inH, float inLacunarity, float inOctaves)
|
|
: this(inH, inLacunarity, inOctaves, null)
|
|
{
|
|
}
|
|
|
|
public vp_FractalNoise(float inH, float inLacunarity, float inOctaves, vp_Perlin noise)
|
|
{
|
|
m_Lacunarity = inLacunarity;
|
|
m_Octaves = inOctaves;
|
|
m_IntOctaves = (int)inOctaves;
|
|
m_Exponent = new float[m_IntOctaves + 1];
|
|
float num = 1f;
|
|
for (int i = 0; i < m_IntOctaves + 1; i++)
|
|
{
|
|
m_Exponent[i] = (float)Math.Pow(m_Lacunarity, 0f - inH);
|
|
num *= m_Lacunarity;
|
|
}
|
|
if (noise == null)
|
|
{
|
|
m_Noise = new vp_Perlin();
|
|
}
|
|
else
|
|
{
|
|
m_Noise = noise;
|
|
}
|
|
}
|
|
|
|
public float HybridMultifractal(float x, float y, float offset)
|
|
{
|
|
float num = (m_Noise.Noise(x, y) + offset) * m_Exponent[0];
|
|
float num2 = num;
|
|
x *= m_Lacunarity;
|
|
y *= m_Lacunarity;
|
|
int i;
|
|
for (i = 1; i < m_IntOctaves; i++)
|
|
{
|
|
if (num2 > 1f)
|
|
{
|
|
num2 = 1f;
|
|
}
|
|
float num3 = (m_Noise.Noise(x, y) + offset) * m_Exponent[i];
|
|
num += num2 * num3;
|
|
num2 *= num3;
|
|
x *= m_Lacunarity;
|
|
y *= m_Lacunarity;
|
|
}
|
|
float num4 = m_Octaves - (float)m_IntOctaves;
|
|
return num + num4 * m_Noise.Noise(x, y) * m_Exponent[i];
|
|
}
|
|
|
|
public float RidgedMultifractal(float x, float y, float offset, float gain)
|
|
{
|
|
float num = Mathf.Abs(m_Noise.Noise(x, y));
|
|
num = offset - num;
|
|
num *= num;
|
|
float num2 = num;
|
|
float num3 = 1f;
|
|
for (int i = 1; i < m_IntOctaves; i++)
|
|
{
|
|
x *= m_Lacunarity;
|
|
y *= m_Lacunarity;
|
|
num3 = num * gain;
|
|
num3 = Mathf.Clamp01(num3);
|
|
num = Mathf.Abs(m_Noise.Noise(x, y));
|
|
num = offset - num;
|
|
num *= num;
|
|
num *= num3;
|
|
num2 += num * m_Exponent[i];
|
|
}
|
|
return num2;
|
|
}
|
|
|
|
public float BrownianMotion(float x, float y)
|
|
{
|
|
float num = 0f;
|
|
long num2;
|
|
for (num2 = 0L; num2 < m_IntOctaves; num2++)
|
|
{
|
|
num = m_Noise.Noise(x, y) * m_Exponent[num2];
|
|
x *= m_Lacunarity;
|
|
y *= m_Lacunarity;
|
|
}
|
|
float num3 = m_Octaves - (float)m_IntOctaves;
|
|
return num + num3 * m_Noise.Noise(x, y) * m_Exponent[num2];
|
|
}
|
|
}
|