@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
89 lines (88 loc) • 2.68 kB
JavaScript
;
import { Vector2, Vector3, Vector4 } from "three";
import { NamedFunction8 } from "./_Base";
import { SimplexNoise } from "three/examples/jsm/math/SimplexNoise";
import { randFloat } from "../../core/math/_Module";
const _v2 = new Vector2();
const _v3 = new Vector3();
const _v4 = new Vector4();
const _simplexBySeed = /* @__PURE__ */ new Map();
function _getOrCreateSimplex(seed) {
let simplex = _simplexBySeed.get(seed);
if (!simplex) {
const random_generator = {
random: function() {
return randFloat(seed);
}
};
simplex = new SimplexNoise(random_generator);
_simplexBySeed.set(seed, simplex);
}
return simplex;
}
function _fbm2d(simplex, x, y, octaves, ampMult, freqMult) {
let value = 0;
let amplitude = 1;
for (let i = 0; i < octaves; i++) {
value += amplitude * simplex.noise(x, y);
x *= freqMult;
y *= freqMult;
amplitude *= ampMult;
}
return value;
}
function _fbm3d(simplex, x, y, z, octaves, ampMult, freqMult) {
let value = 0;
let amplitude = 1;
for (let i = 0; i < octaves; i++) {
value += amplitude * simplex.noise3d(x, y, z);
x *= freqMult;
y *= freqMult;
z *= freqMult;
amplitude *= ampMult;
}
return value;
}
function _fbm4d(simplex, x, y, z, w, octaves, ampMult, freqMult) {
let value = 0;
let amplitude = 1;
for (let i = 0; i < octaves; i++) {
value += amplitude * simplex.noise4d(x, y, z, w);
x *= freqMult;
y *= freqMult;
z *= freqMult;
w *= freqMult;
amplitude *= ampMult;
}
return value;
}
export class noiseSimplexVector2 extends NamedFunction8 {
static type() {
return "noiseSimplexVector2";
}
func(position, amp, freq, offset, octaves, ampMult, freqMult, seed) {
const simplex = _getOrCreateSimplex(seed);
_v2.copy(position).add(offset).multiply(freq);
return amp * _fbm2d(simplex, _v2.x, _v2.y, octaves, ampMult, freqMult);
}
}
export class noiseSimplexVector3 extends NamedFunction8 {
static type() {
return "noiseSimplexVector3";
}
func(position, amp, freq, offset, octaves, ampMult, freqMult, seed) {
const simplex = _getOrCreateSimplex(seed);
_v3.copy(position).add(offset).multiply(freq);
return amp * _fbm3d(simplex, _v3.x, _v3.y, _v3.z, octaves, ampMult, freqMult);
}
}
export class noiseSimplexVector4 extends NamedFunction8 {
static type() {
return "noiseSimplexVector4";
}
func(position, amp, freq, offset, octaves, ampMult, freqMult, seed) {
const simplex = _getOrCreateSimplex(seed);
_v4.copy(position).add(offset).multiply(freq);
return amp * _fbm4d(simplex, _v4.x, _v4.y, _v4.z, _v4.w, octaves, ampMult, freqMult);
}
}