FractalNoise.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System;
  2. using UnityEngine;
  3. namespace Xft
  4. {
  5. public class FractalNoise
  6. {
  7. public FractalNoise(float inH, float inLacunarity, float inOctaves) : this(inH, inLacunarity, inOctaves, null)
  8. {
  9. }
  10. public FractalNoise(float inH, float inLacunarity, float inOctaves, Perlin noise)
  11. {
  12. this.m_Lacunarity = inLacunarity;
  13. this.m_Octaves = inOctaves;
  14. this.m_IntOctaves = (int)inOctaves;
  15. this.m_Exponent = new float[this.m_IntOctaves + 1];
  16. float num = 1f;
  17. for (int i = 0; i < this.m_IntOctaves + 1; i++)
  18. {
  19. this.m_Exponent[i] = (float)Math.Pow((double)this.m_Lacunarity, (double)(-(double)inH));
  20. num *= this.m_Lacunarity;
  21. }
  22. if (noise == null)
  23. {
  24. this.m_Noise = new Perlin();
  25. }
  26. else
  27. {
  28. this.m_Noise = noise;
  29. }
  30. }
  31. public float HybridMultifractal(float x, float y, float offset)
  32. {
  33. float num = (this.m_Noise.Noise(x, y) + offset) * this.m_Exponent[0];
  34. float num2 = num;
  35. x *= this.m_Lacunarity;
  36. y *= this.m_Lacunarity;
  37. int i;
  38. for (i = 1; i < this.m_IntOctaves; i++)
  39. {
  40. if (num2 > 1f)
  41. {
  42. num2 = 1f;
  43. }
  44. float num3 = (this.m_Noise.Noise(x, y) + offset) * this.m_Exponent[i];
  45. num += num2 * num3;
  46. num2 *= num3;
  47. x *= this.m_Lacunarity;
  48. y *= this.m_Lacunarity;
  49. }
  50. float num4 = this.m_Octaves - (float)this.m_IntOctaves;
  51. return num + num4 * this.m_Noise.Noise(x, y) * this.m_Exponent[i];
  52. }
  53. public float RidgedMultifractal(float x, float y, float offset, float gain)
  54. {
  55. float num = Mathf.Abs(this.m_Noise.Noise(x, y));
  56. num = offset - num;
  57. num *= num;
  58. float num2 = num;
  59. for (int i = 1; i < this.m_IntOctaves; i++)
  60. {
  61. x *= this.m_Lacunarity;
  62. y *= this.m_Lacunarity;
  63. float num3 = num * gain;
  64. num3 = Mathf.Clamp01(num3);
  65. num = Mathf.Abs(this.m_Noise.Noise(x, y));
  66. num = offset - num;
  67. num *= num;
  68. num *= num3;
  69. num2 += num * this.m_Exponent[i];
  70. }
  71. return num2;
  72. }
  73. public float BrownianMotion(float x, float y)
  74. {
  75. float num = 0f;
  76. long num2;
  77. for (num2 = 0L; num2 < (long)this.m_IntOctaves; num2 += 1L)
  78. {
  79. num = this.m_Noise.Noise(x, y) * this.m_Exponent[(int)(checked((IntPtr)num2))];
  80. x *= this.m_Lacunarity;
  81. y *= this.m_Lacunarity;
  82. }
  83. float num3 = this.m_Octaves - (float)this.m_IntOctaves;
  84. return num + num3 * this.m_Noise.Noise(x, y) * this.m_Exponent[(int)(checked((IntPtr)num2))];
  85. }
  86. private Perlin m_Noise;
  87. private float[] m_Exponent;
  88. private int m_IntOctaves;
  89. private float m_Octaves;
  90. private float m_Lacunarity;
  91. }
  92. }