with Ada.Numerics.Elementary_Functions; package body WL.Brownian_Noise is --------- -- Get -- --------- function Get (Noise : Brownian_Noise_Type'Class; Coordinate : WL.Noise.Noise_Vector; Octave : Float) return Signed_Unit_Real is Result : Float := 0.0; Temp : WL.Noise.Noise_Vector := Coordinate; Last_Octave : constant Octave_Range := Octave_Range (Octave); begin for I in 1 .. Last_Octave loop Result := Result + Noise.Get (Temp) * Noise.Exponents (I); for J in Temp'Range loop Temp (J) := Temp (J) * Noise.Lacunarity; end loop; end loop; declare Remainder : constant Float := Octave - Float'Truncation (Octave); begin if Remainder > 0.0 then Result := Result + Remainder * Noise.Get (Temp) * Noise.Exponents (Last_Octave + 1); end if; end; return (if Result < -1.0 then -1.0 elsif Result > 1.0 then 1.0 else Result); end Get; ----------- -- Reset -- ----------- procedure Reset (Noise : in out Brownian_Noise_Type'Class; Initiator : Integer; Roughness : Unit_Real; Lacunarity : Float) is use Ada.Numerics.Elementary_Functions; F : Float := 1.0; begin WL.Noise.Perlin_Noise (Noise).Reset (Initiator); Noise.Roughness := Roughness; Noise.Lacunarity := Lacunarity; for I in Noise.Exponents'Range loop Noise.Exponents (I) := F ** (-Roughness); F := F * Lacunarity; end loop; end Reset; end WL.Brownian_Noise;