hadean-zig/open-simplex/include/OpenSimplex2F.h

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