Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/guzba/noisy
SIMD-accelerated noise generation.
https://github.com/guzba/noisy
nim noise perlin simd simplex
Last synced: 3 days ago
JSON representation
SIMD-accelerated noise generation.
- Host: GitHub
- URL: https://github.com/guzba/noisy
- Owner: guzba
- License: mit
- Created: 2020-08-07T02:35:49.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-08-28T18:45:46.000Z (over 1 year ago)
- Last Synced: 2024-11-28T07:24:09.711Z (2 months ago)
- Topics: nim, noise, perlin, simd, simplex
- Language: Nim
- Homepage:
- Size: 622 KB
- Stars: 28
- Watchers: 2
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Noisy
![Github Actions](https://github.com/guzba/noisy/workflows/Github%20Actions/badge.svg)
`nimble install noisy`
Noisy is a SIMD-accelerated Nim implementation of Simplex (Perlin) noise. The goal of this library is to be easy to use, performant and dependency-free.
Noisy works well using Nim's relatively new `--gc:arc` and `--gc:orc` as well as the default garbage collector. This library also works using both `nim c` and `nim cpp`, in addition to `--cc:vcc` on Windows.
I have also verified that Noisy builds with `--experimental:strictFuncs` on Nim 1.4.0.
![2D Simplex Noise](examples/noise.png)
## Example
```nim
import noisy, strformatvar simplex = initSimplex(1988)
simplex.frequency = 0.1# Starting at (0, 0) generate a 16x16 grid of 2D noise values.
let values = simplex.grid((0, 0), (16, 16))
for x in 0 ..< 16:
for y in 0 ..< 16:
let value = values[x, y]
echo &"({x},{y}): {value}"
```## Performance
Benchmarks can be run comparing methods for generating noise values. Check the performance yourself by running [tests/benchmark.nim](https://github.com/guzba/noisy/blob/master/tests/benchmark.nim).
`nim c -d:release -r .\tests\benchmark.nim` (256 x 256 x 256 cube of 3D simplex noise with 3 octaves, lower time is better)
Method | Time
--- | ---:
Point by point using `value(x, y, z)` | 1.6066s
Using `grid()` (SIMD accelerated, GCC default) | 1.0281s
Using `grid()` (SIMD accelerated, `--passC:"-mavx"`) | 0.7476s## Testing
`nimble test`
# API: noisy
```nim
import noisy
```## **type** Simplex
```nim
Simplex = object
octaves*: int
amplitude*, frequency*, lacunarity*, gain*: float32
```## **type** Grid
```nim
Grid = ref object
width*, height*, depth*: int
values*: seq[float32]
```## **type** NoisyError
```nim
NoisyError = object of ValueError
```## **func** initSimplex
```nim
func initSimplex(seed: int): Simplex
```## **func** `[]`
Returns the noise value at (x, y) or (x, y, z).
```nim
func `[]`(g: Grid; x, y: int; z = 0): float32 {.inline.}
```## **func** value
Generates the 2D noise value at (x, y) based on the Simplex parameters.
```nim
func value(simplex: Simplex; x, y: float32): float32 {.raises: [NoisyError], tags: [].}
```## **func** value
Generates the 3D noise value at (x, y, z) based on the Simplex parameters.
```nim
func value(simplex: Simplex; x, y, z: float32): float32 {.raises: [NoisyError], tags: [].}
```## **func** value
Helper for working with ints.
```nim
func value(simplex: Simplex; x, y: int): float32 {.inline, raises: [NoisyError], tags: [].}
```## **func** value
Helper for working with ints
```nim
func value(simplex: Simplex; x, y, z: int): float32 {.inline, raises: [NoisyError].}
```## **func** grid
Beginning at position start, generate a grid of 2D noise based on the Simplex parameters. The width and height of the grid is set by the dimens parameter.
```nim
func grid(simplex: Simplex; start: (float32, float32); dimens: (int, int)): Grid {.raises: [NoisyError].}
```## **func** grid
Helper for working with ints.
```nim
func grid(simplex: Simplex; start: (int, int); dimens: (int, int)): Grid {. inline, raises: [NoisyError].}
```## **func** grid
Beginning at position start, generate a grid of 3D noise based on the Simplex parameters. The width, depth, and height of the grid is set by the dimens parameter.
```nim
func grid(simplex: Simplex; start: (float32, float32, float32);
dimens: (int, int, int)): Grid {.raises: [NoisyError].}
```## **func** grid
Helper for working with ints.
```nim
func grid(simplex: Simplex; start: (int, int, int); dimens: (int, int, int)): Grid {. inline, raises: [NoisyError].}
```