[0.5.0] - 2026-07-09

Added

  • musl support. native/noise/.cargo/config.toml disables crt-static for musl targets, which otherwise cannot produce the cdylib a NIF must be. Fixes cannot produce cdylib for 'noise' as the target 'x86_64-unknown-linux-musl' does not support these crate types.
  • Golden-vector regression suite (cargo test in native/noise) pinning noise output bit-for-bit, so the vendoring below cannot silently change results.

Changed

  • Cellular 2D :cell_value output has changed. It previously hashed the sample coordinates rather than the winning cell's, making it independent of jitter and distance_function — it was not cellular noise. It now matches the reference implementation and the existing 3D behaviour. Worlds generated with noise_type: :cellular and return_type: :cell_value will differ. All other noise types are bit-for-bit identical; this is enforced by 3,888 golden vectors captured before the change.
  • Vendored bracket-noise into native/noise/src/fastnoise.rs (MIT, see THIRD_PARTY_LICENSES). It was unmaintained since 2022, and reached us only through bracket-random, which pulled rand, getrandom, libc, lazy_static and a full regex stack — 13 transitive crates — to shuffle one 512-entry permutation table. The RNG it used is reimplemented bit-exactly in fastnoise::xorshift. Dependencies are now rustler and rayon only.
  • Bumped rustler to 0.38. This raises the minimum Rust to 1.91 (rustler requires 1.91, libloading 1.88). Distro toolchains lag: Debian stable, Ubuntu LTS and Alpine <= 3.23 all ship older rustc. Use rustup if your package manager's Rust is too old.
  • Package metadata now points at this fork rather than upstream isotope. @source_url, the Hex links and the ex_doc source-link pattern targeted github.com/viniciusmuller/isotope, so "view source" and issue links led to a repository that does not contain this code. README now carries a fork notice crediting the original authors.

Fixed

  • The Hex package shipped a compiled NIF (priv/native/noise.so) built on the maintainer's machine — a 640KB Mach-O arm64 binary, useless to everyone else. exclude_patterns listed priv/native/libnoise.so, but rustler copies the artifact to priv/native/noise.so, so the pattern never matched. Also present in 0.3.0 and 0.4.0. Rustler always rebuilds the NIF from source, so this was dead weight rather than something that could be loaded.
  • README installed the wrong package ({:isotope, "~> 0.3.0"}) and linked docs at hexdocs.pm/isotope instead of hexdocs.pm/isotope_118.
  • README described the backing crate as a port of FastNoise Lite and listed :simplex as OpenSimplex2. Both describe a different algorithm family; the vendored code is a port of the original FastNoise.
  • Cellular :distance2, :distance2add, :distance2sub, :distance2mul and :distance2div raised ErlangError: :nif_panicked for every input. The distance-insertion loop started at index 0 and read distance[i - 1], underflowing usize. Affected both 2D and 3D.
  • Cellular 2D :distance always returned 0.0; the computed distance was discarded. 3D was unaffected.
  • Cellular 2D :distance2 returned the nearest distance instead of the distance_index_1-th nearest.

[0.3.0] - 2026-02-18

Added

  • Isotope.NoiseMap struct — compact binary representation of noise maps (~4 bytes/value instead of ~32).
  • NoiseMap.get/3 — access a single noise value by column and row.
  • NoiseMap.row/2 — extract a row as a list of floats.
  • NoiseMap.to_list/1 — convert to the legacy [[float()]] nested list format.
  • NoiseMap.size/1 — returns {width, height}.
  • Enumerable protocol for NoiseMap — iterate rows with Enum functions.
  • Dirty CPU scheduler for noise_map/2 and chunk/4 — prevents blocking BEAM schedulers on large maps.

Changed

  • noise_map/2 and chunk/4 now return %Isotope.NoiseMap{} instead of [[float()]]. Use NoiseMap.to_list/1 to migrate existing code.
  • get_noise/2 and get_noise3d/3 no longer apply hardcoded coordinate divisors (/160.0, /100.0). Coordinates are passed directly to the noise algorithm. Use the frequency option to control noise scale.
  • show_noisemap/1 now accepts %Isotope.NoiseMap{} instead of a nested list.
  • Rust edition bumped from 2018 to 2021.

Fixed

  • Swapped width/height in internal Vec::with_capacity pre-allocation (replaced with flat binary).

[0.2.0] - 2023-05-20

Changed

  • Removed the dependency on the ex_png library, meaning that Isotope.Utils.write_to_file/2 is not available anymore.
  • Dependencies were bumped to their current stable version

[0.1.3-rc] - 2021-06-21

Changed

  • Replace the rust image crate with the pure elixir ex_png library. Resulting in cleaner dependencies and faster compilation times but slower performance on the Isotope.Utils.write_to_file/2 function.

[0.1.2-rc] - 2021-06-20

Changed

  • Improve aliases used in the code.

Fixed

  • Add rust source code to hex repository.

[0.1.1-rc] - 2021-06-20

Changed

  • Add project to hex.pm.