项目作者: guzba

项目描述 :
SIMD-accelerated noise generation.
高级语言: Nim
项目地址: git://github.com/guzba/noisy.git
创建时间: 2020-08-07T02:35:49Z
项目社区:https://github.com/guzba/noisy

开源协议:MIT License

下载


Noisy

Github Actions

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

Example

  1. import noisy, strformat
  2. var simplex = initSimplex(1988)
  3. simplex.frequency = 0.1
  4. # Starting at (0, 0) generate a 16x16 grid of 2D noise values.
  5. let values = simplex.grid((0, 0), (16, 16))
  6. for x in 0 ..< 16:
  7. for y in 0 ..< 16:
  8. let value = values[x, y]
  9. echo &"({x},{y}): {value}"

Performance

Benchmarks can be run comparing methods for generating noise values. Check the performance yourself by running 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

  1. import noisy

type Simplex

  1. Simplex = object
  2. octaves*: int
  3. amplitude*, frequency*, lacunarity*, gain*: float32

type Grid

  1. Grid = ref object
  2. width*, height*, depth*: int
  3. values*: seq[float32]

type NoisyError

  1. NoisyError = object of ValueError

func initSimplex

  1. func initSimplex(seed: int): Simplex

func []

Returns the noise value at (x, y) or (x, y, z).

  1. 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.

  1. 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.

  1. func value(simplex: Simplex; x, y, z: float32): float32 {.raises: [NoisyError], tags: [].}

func value

Helper for working with ints.

  1. func value(simplex: Simplex; x, y: int): float32 {.inline, raises: [NoisyError], tags: [].}

func value

Helper for working with ints

  1. 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.

  1. func grid(simplex: Simplex; start: (float32, float32); dimens: (int, int)): Grid {.raises: [NoisyError].}

func grid

Helper for working with ints.

  1. 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.

  1. func grid(simplex: Simplex; start: (float32, float32, float32);
  2. dimens: (int, int, int)): Grid {.raises: [NoisyError].}

func grid

Helper for working with ints.

  1. func grid(simplex: Simplex; start: (int, int, int); dimens: (int, int, int)): Grid {. inline, raises: [NoisyError].}