105 lines
4.0 KiB
C
105 lines
4.0 KiB
C
|
|
#ifndef OpenSimplex2F_h__
|
||
|
|
#define OpenSimplex2F_h__
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* K.jpg's OpenSimplex 2, faster variant
|
||
|
|
*
|
||
|
|
* - 2D is standard simplex implemented using a lookup table.
|
||
|
|
* - 3D is "Re-oriented 4-point BCC noise" which constructs a
|
||
|
|
* congruent BCC lattice in a much different way than usual.
|
||
|
|
* - 4D constructs the lattice as a union of five copies of its
|
||
|
|
* reciprocal. It successively finds the closest point on each.
|
||
|
|
*
|
||
|
|
* Multiple versions of each function are provided. See the
|
||
|
|
* documentation above each, for more info.
|
||
|
|
*
|
||
|
|
* Ported from Java to C by Stephen M. Cameron
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include <stdint.h>
|
||
|
|
|
||
|
|
struct OpenSimplex2F_context {
|
||
|
|
int16_t *perm;
|
||
|
|
struct Grad2 *permGrad2;
|
||
|
|
struct Grad3 *permGrad3;
|
||
|
|
struct Grad4 *permGrad4;
|
||
|
|
};
|
||
|
|
|
||
|
|
/* Allocate and initialize OpenSimplex2F context */
|
||
|
|
int OpenSimplex2F(int64_t seed, struct OpenSimplex2F_context **ctx);
|
||
|
|
|
||
|
|
/* Free OpenSimplex2F context */
|
||
|
|
void OpenSimplex2F_free(struct OpenSimplex2F_context * ctx);
|
||
|
|
|
||
|
|
/* Free singleton lattice point data */
|
||
|
|
void OpenSimplex2F_shutdown(void);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 2D Simplex noise, standard lattice orientation.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise2(struct OpenSimplex2F_context *ctx, double x, double y);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 2D Simplex noise, with Y pointing down the main diagonal.
|
||
|
|
* Might be better for a 2D sandbox style game, where Y is vertical.
|
||
|
|
* Probably slightly less optimal for heightmaps or continent maps.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise2_XBeforeY(struct OpenSimplex2F_context *ctx, double x, double y);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 3D Re-oriented 4-point BCC noise, classic orientation.
|
||
|
|
* Proper substitute for 3D Simplex in light of Forbidden Formulae.
|
||
|
|
* Use noise3_XYBeforeZ or noise3_XZBeforeY instead, wherever appropriate.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise3_Classic(struct OpenSimplex2F_context *ctx, double x, double y, double z);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 3D Re-oriented 4-point BCC noise, with better visual isotropy in (X, Y).
|
||
|
|
* Recommended for 3D terrain and time-varied animations.
|
||
|
|
* The Z coordinate should always be the "different" coordinate in your use case.
|
||
|
|
* If Y is vertical in world coordinates, call noise3_XYBeforeZ(x, z, Y) or use noise3_XZBeforeY.
|
||
|
|
* If Z is vertical in world coordinates, call noise3_XYBeforeZ(x, y, Z).
|
||
|
|
* For a time varied animation, call noise3_XYBeforeZ(x, y, T).
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise3_XYBeforeZ(struct OpenSimplex2F_context *ctx, double x, double y, double z);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 3D Re-oriented 4-point BCC noise, with better visual isotropy in (X, Z).
|
||
|
|
* Recommended for 3D terrain and time-varied animations.
|
||
|
|
* The Y coordinate should always be the "different" coordinate in your use case.
|
||
|
|
* If Y is vertical in world coordinates, call noise3_XZBeforeY(x, Y, z).
|
||
|
|
* If Z is vertical in world coordinates, call noise3_XZBeforeY(x, Z, y) or use noise3_XYBeforeZ.
|
||
|
|
* For a time varied animation, call noise3_XZBeforeY(x, T, y) or use noise3_XYBeforeZ.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise3_XZBeforeY(struct OpenSimplex2F_context *ctx, double x, double y, double z);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 4D OpenSimplex2F noise, classic lattice orientation.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise4_Classic(struct OpenSimplex2F_context *ctx, double x, double y, double z, double w);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 4D OpenSimplex2F noise, with XY and ZW forming orthogonal triangular-based planes.
|
||
|
|
* Recommended for 3D terrain, where X and Y (or Z and W) are horizontal.
|
||
|
|
* Recommended for noise(x, y, sin(time), cos(time)) trick.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise4_XYBeforeZW(struct OpenSimplex2F_context *ctx, double x, double y, double z, double w);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 4D OpenSimplex2F noise, with XZ and YW forming orthogonal triangular-based planes.
|
||
|
|
* Recommended for 3D terrain, where X and Z (or Y and W) are horizontal.
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise4_XZBeforeYW(struct OpenSimplex2F_context *ctx, double x, double y, double z, double w);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 4D OpenSimplex2F noise, with XYZ oriented like noise3_Classic,
|
||
|
|
* and W for an extra degree of freedom. W repeats eventually.
|
||
|
|
* Recommended for time-varied animations which texture a 3D object (W=time)
|
||
|
|
*/
|
||
|
|
double OpenSimplex2F_noise4_XYZBeforeW(struct OpenSimplex2F_context *ctx, double x, double y, double z, double w);
|
||
|
|
#endif
|
||
|
|
|