## [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`.
