SIMDNoise

Super fast SIMD noise library for Rust. PRs welcome!
Available on crates.io.
See above crates.io link for Docs.

Features

Benchmarks

Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz Single Threaded using Criterion.rs

2D 4k (3840 × 2160) Fbm Noise, 3 Octaves

| SIMD Set | Time | |----------|------| | scalar| 888 ms| | sse2 | 225 ms| | sse41 | 186 ms| | avx2 | 108 ms|

3D 128 × 128 x 128 Cell Noise

| SIMD Set | Time | |----------|------| | scalar| 1,400 ms| | sse2 | 128 ms| | sse41 | 94 ms| | avx2 | 47 ms|

Todo

Get a block of noise with runtime SIMD detection

The library will, at runtime, pick the fastest available options between SSE2, SSE41, and AVX2

```rust use simdnoise::*;

// Get a block of 2d fbm noise with default settings, 100 x 100, with values scaled to the range [0,1] let noise = NoiseBuilder::fbm2d(100, 100).generatescaled(0.0,1.0);

// Get a block of 3d ridge noise, custom settings, 32x32x32 unscaled let (noise,min,max) = NoiseBuilder::ridge3d(32,32,32) .withfreq(0.05) .withoctaves(5) .withgain(2.0) .with_lacunarity(0.5) .generate();

``

Call noise functions directly

Sometimes you need something other than a block, like the points on the surface of a sphere. Sometimes you may want to use SSE41 even with AVX2 is available

```rust let noisesetting = NoiseBuilder::ridge3d(32,32,32) .withfreq(0.05) .withoctaves(5) .withgain(2.0) .withlacunarity(0.5) .wrap();

// get a block of noise with the sse41 version, using the above settings let (noise,min,max) = unsafe { simdnoise::sse41::get2dnoise(&noise_setting); }

// send your own SIMD x,y values to the noise functions directly unsafe { // sse2 simplex noise let x = mmset1ps(5.0); let y = _mmset1ps(10.0); let f : _m128 = simdnoise::sse2::simplex_2d(x,y);

// avx2 turbulence let x = mm256set1ps(5.0); let y = _mm256set1ps(10.0); let freq = _mm256set1ps(1.0); let lacunarity = mm256set1ps(0.5); let gain = _mm256set1ps(2.0); let octaves = 3; let fturbulence : _m256 = simdnoise::avx2::turbulence2d(x,y,lacunarity,gain,octaves);

} ```