# libnoise
![format](https://github.com/cookiephone/libnoise-rs/actions/workflows/format.yaml/badge.svg)
![lint](https://github.com/cookiephone/libnoise-rs/actions/workflows/lint.yaml/badge.svg)
![test](https://github.com/cookiephone/libnoise-rs/actions/workflows/test.yaml/badge.svg)
[![codecov](https://coveralls.io/repos/github/cookiephone/libnoise-rs/badge.svg?branch=master)](https://coveralls.io/github/cookiephone/libnoise-rs?branch=master)
[![docs.rs](https://img.shields.io/docsrs/libnoise)](https://docs.rs/libnoise)
[![Crates.io](https://img.shields.io/crates/v/libnoise)](https://crates.io/crates/libnoise)
A simple, performant, and customizable procedural noise generation library
inspired by [libnoise for C++](https://libnoise.sourceforge.net/) featuring:
- Easy coherent noise generation through sources provided via `Source`
- Modular generator creation by chaining adapters to modify and combine
generator inputs and outputs, and the ability to flexibly create
custom generators and adapters, all through the `Generator` trait
- Efficient and cache friendly sampling of generators through
`NoiseBuffer` and much of the generator complexity resolving at
compile time
- Easy visualization of generator outputs for debugging through
`Visualizer`
Libnoise provides utilities to generate coherent noise and customize them
by applying a variety of operations which modify and combine generators.
With a focus on customizability, the library allows users to create custom
generators and modifiers.
Most immediately relevant [documentation](https://docs.rs/libnoise) can be found in
[`Source`](https://docs.rs/libnoise/latest/libnoise/struct.Source.html) and
[`Generator`](https://docs.rs/libnoise/latest/libnoise/trait.Generator.html) docs.
## Usage
First, add the dependency to your project by editing your `Cargo.toml`:
```toml
[dependencies]
libnoise = "1.1"
```
To get started easily, create a source generator using one of the many
sources found in [`Source`](https://docs.rs/libnoise/latest/libnoise/struct.Source.html),
and apply adapters documented in [`Generator`](https://docs.rs/libnoise/latest/libnoise/trait.Generator.html).
For a more detailed introduction, see the [quickstart guide](https://docs.rs/libnoise/latest/libnoise/).
```rs
use libnoise::prelude::*;
// build a simplex noise generator seeded with 42
let generator = Source::simplex(42);
// sample the generator for input point [0.2, 0.5]
let value = generator.sample([0.2, 0.5]);
```
Note how the dimensionality, which is internally represented as a constant
generic argument, is automatically inferred by sampling the generator with
a 2-dimensional input point.
Naturally, we can create more interesting complex generators:
```rs
use libnoise::prelude::*;
// build a generator
let generator = Source::simplex(42) // start with simplex noise
.fbm(5, 0.013, 2.0, 0.5) // apply fractal brownian motion
.blend( // apply blending...
Source::worley(43).scale([0.05, 0.05]), // ...with scaled worley noise
Source::worley(44).scale([0.02, 0.02])) // ...controlled by other worley noise
.lambda(|f| (f * 2.0).sin() * 0.3 + f * 0.7); // apply a closure to the noise
// sample the generator for input point [0.2, 0.5]
let value = generator.sample([0.2, 0.5]);
```
We can also use [`NoiseBuffer`](https://docs.rs/libnoise/latest/libnoise/struct.NoiseBuffer.html) for efficiently filling n-dimensional arrays
with noise, and [`Visualizer`](https://docs.rs/libnoise/latest/libnoise/struct.Visualizer.html) to get a visual representation of a given
generator. The above generator produces the following image, when sampled for
every pixel position:
![image](https://raw.githubusercontent.com/cookiephone/libnoise-rs/master/images/doc_image_000_f7049b4.png)
It is common to interpret the 3rd or 4th dimension as time, allowing us to
produce space-time noise such as:
![image](https://raw.githubusercontent.com/cookiephone/libnoise-rs/master/images/doc_image_001_f7049b4.gif)
## Contributing
Contributors and feature suggestions are welcome!
Should you want to contact me directly, it is best via discord (username: oogie).
## License
Libnoise is distributed under the terms of the MIT license.
See [LICENSE-MIT](LICENSE.md) for details.