forked from runemadsen/programming-design-systems-projects
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rune.noise.js
208 lines (171 loc) · 6.86 KB
/
rune.noise.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.Rune || (g.Rune = {})).Noise = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
(function (global){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var _runeJs = (typeof window !== "undefined" ? window['Rune'] : typeof global !== "undefined" ? global['Rune'] : null);
var _runeJs2 = _interopRequireDefault(_runeJs);
// http://mrl.nyu.edu/~perlin/noise/
// Adapting from P5.js
// Which was adapted from PApplet.java
// which was adapted from toxi
// which was adapted from the german demo group farbrausch
// as used in their demo "art": http://www.farb-rausch.de/fr010src.zip
var PERLIN_YWRAPB = 4;
var PERLIN_YWRAP = 1 << PERLIN_YWRAPB;
var PERLIN_ZWRAPB = 8;
var PERLIN_ZWRAP = 1 << PERLIN_ZWRAPB;
var PERLIN_SIZE = 4095;
var SINCOS_PRECISION = 0.5;
var SINCOS_LENGTH = Math.floor(360 / SINCOS_PRECISION);
var sinLUT = new Array(SINCOS_LENGTH);
var cosLUT = new Array(SINCOS_LENGTH);
var DEG_TO_RAD = Math.PI / 180.0;
for (var i = 0; i < SINCOS_LENGTH; i++) {
sinLUT[i] = Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
cosLUT[i] = Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
}
var perlin_PI = SINCOS_LENGTH;
perlin_PI >>= 1;
var Noise = (function () {
function Noise(url) {
_classCallCheck(this, Noise);
this.perlin_octaves = 4; // default to medium smooth
this.perlin_amp_falloff = 0.5; // 50% reduction/octave
this.perlin = null;
}
_createClass(Noise, [{
key: "noiseDetail",
value: function noiseDetail(lod, falloff) {
if (lod > 0) {
this.perlin_octaves = lod;
}
if (falloff > 0) {
this.perlin_amp_falloff = falloff;
}
return this;
}
}, {
key: "noiseSeed",
value: function noiseSeed(seed) {
// Linear Congruential Generator
// Variant of a Lehman Generator
var lcg = (function () {
// Set to values from http://en.wikipedia.org/wiki/Numerical_Recipes
// m is basically chosen to be large (as it is the max period)
// and for its relationships to a and c
var m = 4294967296,
// a - 1 should be divisible by m's prime factors
a = 1664525,
// c and m should be co-prime
c = 1013904223,
seed,
z;
return {
setSeed: function setSeed(val) {
// pick a random seed if val is undefined or null
// the >>> 0 casts the seed to an unsigned 32-bit integer
z = seed = (val == null ? Math.random() * m : val) >>> 0;
},
getSeed: function getSeed() {
return seed;
},
rand: function rand() {
// define the recurrence relationship
z = (a * z + c) % m;
// return a float in [0, 1)
// if z = m then z / m = 0 therefore (z % m) / m < 1 always
return z / m;
}
};
})();
lcg.setSeed(seed);
this.perlin = new Array(PERLIN_SIZE + 1);
for (var i = 0; i < PERLIN_SIZE + 1; i++) {
this.perlin[i] = lcg.rand();
}
}
}, {
key: "get",
value: function get(x, y, z) {
y = y || 0;
z = z || 0;
if (this.perlin == null) {
this.perlin = new Array(PERLIN_SIZE + 1);
for (var i = 0; i < PERLIN_SIZE + 1; i++) {
this.perlin[i] = Math.random();
}
}
if (x < 0) {
x = -x;
}
if (y < 0) {
y = -y;
}
if (z < 0) {
z = -z;
}
var xi = Math.floor(x),
yi = Math.floor(y),
zi = Math.floor(z);
var xf = x - xi;
var yf = y - yi;
var zf = z - zi;
var rxf, ryf;
var r = 0;
var ampl = 0.5;
var n1, n2, n3;
// Is this right do just have this here?
var noise_fsc = function noise_fsc(i) {
// using cosine lookup table
return 0.5 * (1.0 - cosLUT[Math.floor(i * perlin_PI) % SINCOS_LENGTH]);
};
for (var o = 0; o < this.perlin_octaves; o++) {
var of = xi + (yi << PERLIN_YWRAPB) + (zi << PERLIN_ZWRAPB);
rxf = noise_fsc(xf);
ryf = noise_fsc(yf);
n1 = this.perlin[of & PERLIN_SIZE];
n1 += rxf * (this.perlin[of + 1 & PERLIN_SIZE] - n1);
n2 = this.perlin[of + PERLIN_YWRAP & PERLIN_SIZE];
n2 += rxf * (this.perlin[of + PERLIN_YWRAP + 1 & PERLIN_SIZE] - n2);
n1 += ryf * (n2 - n1);
of += PERLIN_ZWRAP;
n2 = this.perlin[of & PERLIN_SIZE];
n2 += rxf * (this.perlin[of + 1 & PERLIN_SIZE] - n2);
n3 = this.perlin[of + PERLIN_YWRAP & PERLIN_SIZE];
n3 += rxf * (this.perlin[of + PERLIN_YWRAP + 1 & PERLIN_SIZE] - n3);
n2 += ryf * (n3 - n2);
n1 += noise_fsc(zf) * (n2 - n1);
r += n1 * ampl;
ampl *= this.perlin_amp_falloff;
xi <<= 1;
xf *= 2;
yi <<= 1;
yf *= 2;
zi <<= 1;
zf *= 2;
if (xf >= 1.0) {
xi++;xf--;
}
if (yf >= 1.0) {
yi++;yf--;
}
if (zf >= 1.0) {
zi++;zf--;
}
}
return r;
}
}]);
return Noise;
})();
exports["default"] = Noise;
module.exports = exports["default"];
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[1])(1)
});
//# sourceMappingURL=rune.noise.js.map