UNPKG

value-noise-js

Version:

A light and simple way to generate 1D, 2D, and 3D value noise in javascript.

1 lines 11.1 kB
{"version":3,"sources":["../src/value-noise.ts"],"sourcesContent":["\r\nexport class ValueNoise {\r\n\r\n constructor(public seed?: string | undefined, public length: number | undefined = 32, public type: 'perlin' | 'cosine' | undefined = 'cosine') {\r\n this.$seed = (seed) ? seed : this.generateString(32);\r\n this.roots = this.cyrb128(this.$seed)\r\n this.len = (Math.floor(length) == 0) ? 32 : (Math.floor(length) < 8) ? 8 : 2 ** Math.round(Math.log2(Math.sqrt(Math.floor((length > 512) ? 512 : length) ** 2)));\r\n this.lenMax = this.len ** 2;\r\n this.p = new Uint32Array(new ArrayBuffer(this.lenMax * 8));\r\n this.fade = (type == 'perlin') ? this.perlinFade : this.cosFade;\r\n this.genPermutation();\r\n }\r\n\r\n\r\n public $seed: string;\r\n private roots: number[];\r\n private len: number;\r\n private lenMax: number;\r\n private count: number = 0;\r\n\r\n private p: Uint32Array;\r\n private n: number[] = [];\r\n\r\n private fade: Function;\r\n\r\n public refresh(seed?: string) {\r\n this.$seed = (seed) ? seed : this.generateString(32);\r\n this.count = (seed) ? 0 : this.count++;\r\n this.roots = this.cyrb128(this.$seed);\r\n this.p = new Uint32Array(new ArrayBuffer(this.lenMax * 8));\r\n this.n = [];\r\n this.genPermutation();\r\n }\r\n\r\n private genPermutation() {\r\n let rand = this.mulberry32(this.roots[0]);\r\n let shuffle = this.mulberry32(this.roots[this.count & 3]);\r\n for (let i = 0; i < this.lenMax; i++) {\r\n let r = this.lerp(0, 1, this.cosFade(rand()))\r\n this.n.push(r);\r\n this.p[i] = i;\r\n }\r\n\r\n for (let i = (this.p.length / 2) - 1; i > 0; i--) {\r\n let r = Math.round(shuffle() * ((this.p.length / 2) - 1)),\r\n iV = this.p[i]\r\n this.p[i] = this.p[r]\r\n this.p[r] = iV\r\n }\r\n\r\n for (let i of this.p) {\r\n this.p[i + (this.p.length / 2)] = this.p[i]\r\n }\r\n\r\n }\r\n\r\n public evalX(x: number): number {\r\n let min = Math.floor(x % this.lenMax),\r\n t = this.fade(x - min),\r\n max = min == this.lenMax - 1 ? 0 : min++;\r\n return this.lerp(this.n[min], this.n[max], t);\r\n }\r\n\r\n public evalXY(x: number, y: number): number {\r\n let iX = Math.floor(x),\r\n iY = Math.floor(y),\r\n tX = this.fade(x - iX),\r\n tY = this.fade(y - iY),\r\n iX0 = iX & (this.lenMax - 1),\r\n iY0 = iY & (this.lenMax - 1),\r\n iX1 = (iX0 + 1) & (this.lenMax - 1),\r\n iY1 = (iY0 + 1) & (this.lenMax - 1),\r\n c00 = this.n[this.p[this.p[iX0] + iY0]],\r\n c10 = this.n[this.p[this.p[iX1] + iY0]],\r\n c01 = this.n[this.p[this.p[iX0] + iY1]],\r\n c11 = this.n[this.p[this.p[iX1] + iY1]],\r\n evalX0 = this.lerp(c00, c10, tX),\r\n evalX1 = this.lerp(c01, c11, tX),\r\n evalXY = this.lerp(evalX0, evalX1, tY)\r\n return evalXY;\r\n }\r\n\r\n public evalXYZ(x: number, y: number, z: number): number {\r\n let iX = Math.floor(x) & (this.lenMax - 1),\r\n iY = Math.floor(y) & (this.lenMax - 1),\r\n iZ = Math.floor(z) & (this.lenMax - 1),\r\n tX = this.fade(x - Math.floor(x)),\r\n tY = this.fade(y - Math.floor(y)),\r\n tZ = this.fade(z - Math.floor(z)),\r\n iXY0 = this.p[iX] + iY,\r\n iXY0Z0 = this.p[iXY0] + iZ,\r\n iXY0Z1 = this.p[iXY0 + 1] + iZ,\r\n iXY1 = this.p[iX + 1] + iY,\r\n iXY1Z0 = this.p[iXY1] + iZ,\r\n iXY1Z1 = this.p[iXY1 + 1] + iZ,\r\n c000 = this.n[this.p[iXY0Z0]],\r\n c010 = this.n[this.p[iXY1Z0]],\r\n c001 = this.n[this.p[iXY0Z1]],\r\n c011 = this.n[this.p[iXY1Z1]],\r\n c100 = this.n[this.p[iXY0Z0 + 1]],\r\n c110 = this.n[this.p[iXY1Z0 + 1]],\r\n c101 = this.n[this.p[iXY0Z1 + 1]],\r\n c111 = this.n[this.p[iXY1Z1 + 1]],\r\n evalX00 = this.lerp(c000, c010, tX),\r\n evalX01 = this.lerp(c001, c011, tX),\r\n evalXY0 = this.lerp(evalX00, evalX01, tY),\r\n evalX10 = this.lerp(c100, c110, tX),\r\n evalX11 = this.lerp(c101, c111, tX),\r\n evalXY1 = this.lerp(evalX10, evalX11, tY),\r\n evalXYZ = this.lerp(evalXY0, evalXY1, tZ)\r\n return evalXYZ;\r\n }\r\n\r\n private cyrb128(str: string) {\r\n let h1 = 1779033703,\r\n h2 = 3144134277,\r\n h3 = 1013904242,\r\n h4 = 2773480762;\r\n for (let i = 0, k; i < str.length; i++) {\r\n k = str.charCodeAt(i);\r\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\r\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\r\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\r\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\r\n }\r\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\r\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\r\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\r\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\r\n (h1 ^= h2 ^ h3 ^ h4), (h2 ^= h1), (h3 ^= h1), (h4 ^= h1);\r\n return [h1 >>> 0, h2 >>> 0, h3 >>> 0, h4 >>> 0];\r\n }\r\n\r\n private generateString(length: number) {\r\n const characters =\r\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n const charactersLength = characters.length;\r\n for (let i = 0; i < length; i++) {\r\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\r\n }\r\n return result;\r\n }\r\n\r\n private mulberry32(a: any) {\r\n return () => {\r\n var t = (a += 0x6d2b79f5);\r\n t = Math.imul(t ^ (t >>> 15), t | 1);\r\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\r\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\r\n };\r\n }\r\n\r\n private lerp = (x: number, y: number, a: number) => x * (1 - a) + y * a;\r\n\r\n private cosFade = (t: number, amplitude: number = 2, offset: number = 0.5): number =>\r\n offset - Math.cos(t * Math.PI) / amplitude;\r\n\r\n private perlinFade = (t: number): number => ((6 * t - 15) * t + 10) * t * t * t;\r\n\r\n}\r\n"],"mappings":"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","names":[]}