UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

89 lines (88 loc) 2.68 kB
"use strict"; 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); } }