toosoon-utils 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/classes/_pool.d.ts +56 -0
- package/lib/classes/_pool.js +92 -0
- package/lib/classes/color-scale.d.ts +52 -0
- package/lib/classes/color-scale.js +160 -0
- package/lib/classes/frame-rate.d.ts +25 -0
- package/lib/classes/frame-rate.js +48 -0
- package/lib/colors.d.ts +155 -0
- package/lib/colors.js +367 -0
- package/lib/constants.d.ts +162 -0
- package/lib/constants.js +170 -0
- package/lib/dom.d.ts +25 -0
- package/lib/dom.js +47 -0
- package/lib/files.d.ts +14 -0
- package/lib/files.js +38 -0
- package/lib/functions.d.ts +22 -0
- package/lib/functions.js +53 -0
- package/lib/geometry.d.ts +89 -0
- package/lib/geometry.js +128 -0
- package/lib/maths.d.ts +161 -0
- package/lib/maths.js +219 -0
- package/lib/prng.d.ts +123 -0
- package/lib/prng.js +234 -0
- package/lib/random.d.ts +91 -0
- package/lib/random.js +162 -0
- package/lib/strings.d.ts +14 -0
- package/lib/strings.js +18 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types.d.ts +18 -0
- package/lib/types.js +1 -0
- package/package.json +1 -1
- package/tsconfig.json +2 -0
package/lib/maths.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a number is even
|
|
3
|
+
*
|
|
4
|
+
* @param {number} value Value to check
|
|
5
|
+
* @returns {boolean} True if the given number is even, false otherwise
|
|
6
|
+
*/
|
|
7
|
+
export function isEven(value) {
|
|
8
|
+
return !(value & 1);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if a number is odd
|
|
12
|
+
*
|
|
13
|
+
* @param {number} value Value to check
|
|
14
|
+
* @returns {boolean} True if the given number is odd, false otherwise
|
|
15
|
+
*/
|
|
16
|
+
export function isOdd(value) {
|
|
17
|
+
return !!(value & 1);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a number is a power of 2
|
|
21
|
+
*
|
|
22
|
+
* @param {number} value Value to check
|
|
23
|
+
* @returns {boolean} True if the given number is a power of 2, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
export function isPowerOf2(value) {
|
|
26
|
+
return (value & (value - 1)) === 0;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Find closest power of 2 that fits a number
|
|
30
|
+
*
|
|
31
|
+
* @param {number} value Incoming value
|
|
32
|
+
* @param {string} [mode='ceil'] Can be 'floor' | 'ceil' | 'round'
|
|
33
|
+
* @returns {number} Power of 2
|
|
34
|
+
*/
|
|
35
|
+
export function toPowerOf2(value, mode) {
|
|
36
|
+
if (mode === void 0) { mode = 'ceil'; }
|
|
37
|
+
return Math.pow(2, Math[mode](Math.log(value) / Math.log(2)));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Return the sign (positive or negative) of a number
|
|
41
|
+
*
|
|
42
|
+
* @param {number} value Value to check
|
|
43
|
+
* @returns {number} 1 if the given number is positive, -1 if it is negative, otherwise 0
|
|
44
|
+
*/
|
|
45
|
+
export function sign(value) {
|
|
46
|
+
if (value > 0)
|
|
47
|
+
return 1;
|
|
48
|
+
else if (value < 0)
|
|
49
|
+
return -1;
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clamp a value between two bounds
|
|
54
|
+
*
|
|
55
|
+
* @param {number} value Value to clamp
|
|
56
|
+
* @param {number} [min=0] Minimum boundary
|
|
57
|
+
* @param {number} [max=1] Maximum boundary
|
|
58
|
+
* @returns {number} Clamped value
|
|
59
|
+
*/
|
|
60
|
+
export function clamp(value, min, max) {
|
|
61
|
+
if (min === void 0) { min = 0; }
|
|
62
|
+
if (max === void 0) { max = 1; }
|
|
63
|
+
return Math.min(max, Math.max(min, value));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Linear interpolation between two values (lerping)
|
|
67
|
+
*
|
|
68
|
+
* @param {number} value Normalized value to interpolate
|
|
69
|
+
* @param {number} min Minimum value
|
|
70
|
+
* @param {number} max Maximum value
|
|
71
|
+
* @returns {number} Lerped value
|
|
72
|
+
*/
|
|
73
|
+
export function lerp(value, min, max) {
|
|
74
|
+
return min + (max - min) * value;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Triangular interpolation between two values
|
|
78
|
+
*
|
|
79
|
+
* @param {number} value Normalized value to interpolate
|
|
80
|
+
* @param {number} min Minimum value
|
|
81
|
+
* @param {number} max Maximum value
|
|
82
|
+
* @param {number} target Triangle target value
|
|
83
|
+
* @returns {number} Interpolated value
|
|
84
|
+
*/
|
|
85
|
+
export function triLerp(value, min, max, target) {
|
|
86
|
+
var x = Math.pow(1 + Math.abs(target - max) / Math.abs(target - min), -1);
|
|
87
|
+
return value <= x ? min - (min - target) * (value / x) : target - (target - max) * ((value - x) / (1 - x));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Exponential interpolation between two values
|
|
91
|
+
*
|
|
92
|
+
* @param {number} value Value to interpolate
|
|
93
|
+
* @param {number} currentMin Lower bound of the value's current range
|
|
94
|
+
* @param {number} currentMax Upper bound of the value's current range
|
|
95
|
+
* @param {number} targetMin Lower bound of the value's target range
|
|
96
|
+
* @param {number} targetMax Upper bound of the value's target range
|
|
97
|
+
* @returns {number} Interpolated value
|
|
98
|
+
*/
|
|
99
|
+
export function expLerp(value, currentMin, currentMax, targetMin, targetMax) {
|
|
100
|
+
return (targetMin *
|
|
101
|
+
Math.pow(targetMax / targetMin, (clamp(value, currentMin, currentMax) - currentMin) / (currentMax - currentMin)));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Normalize a value between two bounds
|
|
105
|
+
*
|
|
106
|
+
* @param {number} value Value to normalize
|
|
107
|
+
* @param {number} min Minimum boundary
|
|
108
|
+
* @param {number} max Maximum boundary
|
|
109
|
+
* @returns {number} Normalized value
|
|
110
|
+
*/
|
|
111
|
+
export function normalize(value, min, max) {
|
|
112
|
+
return (value - min) / (max - min);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Re-map a number from one range to another
|
|
116
|
+
*
|
|
117
|
+
* @param {number} value Value to re-map
|
|
118
|
+
* @param {number} currentMin Lower bound of the value's current range
|
|
119
|
+
* @param {number} currentMax Upper bound of the value's current range
|
|
120
|
+
* @param {number} targetMin Lower bound of the value's target range
|
|
121
|
+
* @param {number} targetMax Upper bound of the value's target range
|
|
122
|
+
* @returns {number} Re-mapped value
|
|
123
|
+
*/
|
|
124
|
+
export function map(value, currentMin, currentMax, targetMin, targetMax) {
|
|
125
|
+
return ((value - currentMin) / (currentMax - currentMin)) * (targetMax - targetMin) + targetMin;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Round a number up to a nearest multiple
|
|
129
|
+
*
|
|
130
|
+
* @param {number} value Value to round
|
|
131
|
+
* @param {number} [multiple=1] Multiple to round to
|
|
132
|
+
* @returns {number} Closest multiple
|
|
133
|
+
*/
|
|
134
|
+
export function roundTo(value, multiple) {
|
|
135
|
+
if (multiple === void 0) { multiple = 1; }
|
|
136
|
+
if (multiple === 0)
|
|
137
|
+
return value;
|
|
138
|
+
return Math.round(value / multiple) * multiple;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Modulo absolute a value based on a length
|
|
142
|
+
*
|
|
143
|
+
* @param {number} value Value to modulate
|
|
144
|
+
* @param {number} length Total length
|
|
145
|
+
* @returns {number} Modulated value
|
|
146
|
+
*/
|
|
147
|
+
export function modAbs(value, length) {
|
|
148
|
+
if (value < 0) {
|
|
149
|
+
return length + (value % length);
|
|
150
|
+
}
|
|
151
|
+
return value % length;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Move back and forth a value between 0 and length, so that it is never larger than length and never smaller than 0
|
|
155
|
+
*
|
|
156
|
+
* @param {number} value Value to modulate
|
|
157
|
+
* @param {number} length Total length
|
|
158
|
+
* @returns {number} PingPonged value
|
|
159
|
+
*/
|
|
160
|
+
export function pingPong(value, length) {
|
|
161
|
+
value = modAbs(value, length * 2);
|
|
162
|
+
return length - Math.abs(value - length);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Smooth a value using cubic Hermite interpolation
|
|
166
|
+
*
|
|
167
|
+
* @param {number} value Value to smooth
|
|
168
|
+
* @param {number} [min=0] Minimum boundary
|
|
169
|
+
* @param {number} [max=1] Maximum boundary
|
|
170
|
+
* @returns {number} Normalized smoothed value
|
|
171
|
+
*/
|
|
172
|
+
export function smoothstep(value, min, max) {
|
|
173
|
+
if (min === void 0) { min = 0; }
|
|
174
|
+
if (max === void 0) { max = 1; }
|
|
175
|
+
var x = clamp(normalize(value, min, max));
|
|
176
|
+
return x * x * (3 - 2 * x);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Re-map the [0, 1] interval into [0, 1] parabola, such that corners are remaped to 0 and the center to 1
|
|
180
|
+
* -> parabola(0) = parabola(1) = 0, and parabola(0.5) = 1
|
|
181
|
+
*
|
|
182
|
+
* @param {number} x Normalized coordinate on X axis
|
|
183
|
+
* @param {number} [power=1] Parabola power
|
|
184
|
+
* @returns {number} Normalized re-mapped value
|
|
185
|
+
*/
|
|
186
|
+
export function parabola(x, power) {
|
|
187
|
+
if (power === void 0) { power = 1; }
|
|
188
|
+
return Math.pow(4 * x * (1 - x), power);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Return the sum of numbers
|
|
192
|
+
*
|
|
193
|
+
* @param {number[]} array Array of numbers
|
|
194
|
+
* @returns {number} Total sum
|
|
195
|
+
*/
|
|
196
|
+
export function sum(array) {
|
|
197
|
+
return array.reduce(function (previous, current) { return previous + current; });
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Return the average of numbers
|
|
201
|
+
*
|
|
202
|
+
* @param {number[]} array Array of numbers
|
|
203
|
+
* @returns {number} Total average
|
|
204
|
+
*/
|
|
205
|
+
export function average(array) {
|
|
206
|
+
return sum(array) / array.length;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Smoothly interpolate a number toward another
|
|
210
|
+
*
|
|
211
|
+
* @param {number} value Value to interpolate
|
|
212
|
+
* @param {number} target Destination of the interpolation
|
|
213
|
+
* @param {number} damping A higher value will make the movement more sudden, and a lower value will make the movement more gradual
|
|
214
|
+
* @param {number} delta Delta time (in seconds)
|
|
215
|
+
* @returns {number} Interpolated number
|
|
216
|
+
*/
|
|
217
|
+
export function damp(value, target, damping, delta) {
|
|
218
|
+
return lerp(1 - Math.exp(-damping * delta), value, target);
|
|
219
|
+
}
|
package/lib/prng.d.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Produce a 128-bit hash value from a seed
|
|
3
|
+
*
|
|
4
|
+
* @param {string} seed Initial seed state
|
|
5
|
+
* @returns {[number, number, number, number]} Hash numbers
|
|
6
|
+
*/
|
|
7
|
+
export declare function cyrb128(seed: string): [number, number, number, number];
|
|
8
|
+
/**
|
|
9
|
+
* Simple Fast Counter, Generator with a 128-bit state
|
|
10
|
+
*
|
|
11
|
+
* @param {number} a
|
|
12
|
+
* @param {number} b
|
|
13
|
+
* @param {number} c
|
|
14
|
+
* @param {number} d
|
|
15
|
+
* @returns {number} Pseudo-random number
|
|
16
|
+
*/
|
|
17
|
+
export declare function sfc32(a: number, b: number, c: number, d: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* SplitMix32, Generator with a 32-bit state
|
|
20
|
+
*
|
|
21
|
+
* @param {number} a
|
|
22
|
+
* @returns {number} Pseudo-random number
|
|
23
|
+
*/
|
|
24
|
+
export declare function splitmix32(a: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Mulberry32, Generator with a 32-bit state
|
|
27
|
+
*
|
|
28
|
+
* @param {number} a
|
|
29
|
+
* @returns {number} Pseudo-random number
|
|
30
|
+
*/
|
|
31
|
+
export declare function mulberry32(a: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* Jenkins' Small Fast, Generator with a 32-bit state
|
|
34
|
+
*
|
|
35
|
+
* @param {number} a
|
|
36
|
+
* @returns {number} Pseudo-random number
|
|
37
|
+
*/
|
|
38
|
+
export declare function jsf32(a: number, b: number, c: number, d: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* xoshiro128**, Generator with a 128-bit state
|
|
41
|
+
*
|
|
42
|
+
* @param {number} a
|
|
43
|
+
* @returns {number} Pseudo-random number
|
|
44
|
+
*/
|
|
45
|
+
export declare function xoshiro128ss(a: number, b: number, c: number, d: number): number;
|
|
46
|
+
export type PRNGParameters = string | {
|
|
47
|
+
seed: string;
|
|
48
|
+
algorithm: (...args: number[]) => number;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Generate a pseudo-random number in the interval [0, 1]
|
|
52
|
+
* PRNG equivalent of `Math.random()`
|
|
53
|
+
*
|
|
54
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
55
|
+
* @returns {number} Pseudo-random number
|
|
56
|
+
*/
|
|
57
|
+
export declare function random(prng: PRNGParameters): number;
|
|
58
|
+
/**
|
|
59
|
+
* Generate a pseudo-random boolean (true or false)
|
|
60
|
+
*
|
|
61
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
62
|
+
* @param {number} [probability=0.5] Probability to get true
|
|
63
|
+
* @returns {boolean} Either `true` or `false`
|
|
64
|
+
*/
|
|
65
|
+
export declare function randomBoolean(prng: PRNGParameters, probability?: number): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Generate a pseudo-random sign (1 or -1)
|
|
68
|
+
*
|
|
69
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
70
|
+
* @param {number} [probability=0.5] Probability to get 1
|
|
71
|
+
* @returns {number} Either 1 or -1
|
|
72
|
+
*/
|
|
73
|
+
export declare function randomSign(prng: PRNGParameters, probability?: number): number;
|
|
74
|
+
/**
|
|
75
|
+
* Generate a pseudo-random floating-point number within a specified range
|
|
76
|
+
*
|
|
77
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
78
|
+
* @param {number} [min=0] Minimum boundary
|
|
79
|
+
* @param {number} [max=1] Maximum boundary
|
|
80
|
+
* @param {number} [precision=2] Number of digits after the decimal point
|
|
81
|
+
* @returns {number} Generated float
|
|
82
|
+
*/
|
|
83
|
+
export declare function randomFloat(prng: PRNGParameters, min?: number, max?: number, precision?: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* Generate a pseudo-random integer number within a specified range
|
|
86
|
+
*
|
|
87
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
88
|
+
* @param {number} min Minimum boundary
|
|
89
|
+
* @param {number} max Maximum boundary
|
|
90
|
+
* @returns {number} Generated integer
|
|
91
|
+
*/
|
|
92
|
+
export declare function randomInt(prng: PRNGParameters, min: number, max: number): number;
|
|
93
|
+
/**
|
|
94
|
+
* Generate a pseudo-random hexadecimal color
|
|
95
|
+
*
|
|
96
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
97
|
+
* @returns {string} Generated hexadecimal color
|
|
98
|
+
*/
|
|
99
|
+
export declare function randomHexColor(prng: PRNGParameters): string;
|
|
100
|
+
/**
|
|
101
|
+
* Pick a pseudo-random item from a given array
|
|
102
|
+
*
|
|
103
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
104
|
+
* @param {T[]} array Array to pick the item from
|
|
105
|
+
* @returns {T|undefined} Random item picked
|
|
106
|
+
*/
|
|
107
|
+
export declare function randomItem<T = unknown>(prng: PRNGParameters, array: T[]): T | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Pick a pseudo-random property value from a given object
|
|
110
|
+
*
|
|
111
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
112
|
+
* @param {object} object Object to pick the property from
|
|
113
|
+
* @returns {T|undefined} Random item picked
|
|
114
|
+
*/
|
|
115
|
+
export declare function randomObjectProperty<T = unknown>(prng: PRNGParameters, object: Record<string, T>): T | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* Select a pseudo-random index from an array of weighted items
|
|
118
|
+
*
|
|
119
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
120
|
+
* @param {number[]} weights Array of weights
|
|
121
|
+
* @returns {number} Random index based on weights
|
|
122
|
+
*/
|
|
123
|
+
export declare function randomIndex(prng: PRNGParameters, weights: number[]): number;
|
package/lib/prng.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Produce a 128-bit hash value from a seed
|
|
3
|
+
*
|
|
4
|
+
* @param {string} seed Initial seed state
|
|
5
|
+
* @returns {[number, number, number, number]} Hash numbers
|
|
6
|
+
*/
|
|
7
|
+
export function cyrb128(seed) {
|
|
8
|
+
var h1 = 1779033703;
|
|
9
|
+
var h2 = 3144134277;
|
|
10
|
+
var h3 = 1013904242;
|
|
11
|
+
var h4 = 2773480762;
|
|
12
|
+
for (var i = 0, k = void 0; i < seed.length; i++) {
|
|
13
|
+
k = seed.charCodeAt(i);
|
|
14
|
+
h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
|
|
15
|
+
h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
|
|
16
|
+
h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
|
|
17
|
+
h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
|
|
18
|
+
}
|
|
19
|
+
h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);
|
|
20
|
+
h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);
|
|
21
|
+
h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);
|
|
22
|
+
h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);
|
|
23
|
+
return [(h1 ^ h2 ^ h3 ^ h4) >>> 0, (h2 ^ h1) >>> 0, (h3 ^ h1) >>> 0, (h4 ^ h1) >>> 0];
|
|
24
|
+
}
|
|
25
|
+
// *********************
|
|
26
|
+
// PRNG Algorithms
|
|
27
|
+
// *********************
|
|
28
|
+
/**
|
|
29
|
+
* Simple Fast Counter, Generator with a 128-bit state
|
|
30
|
+
*
|
|
31
|
+
* @param {number} a
|
|
32
|
+
* @param {number} b
|
|
33
|
+
* @param {number} c
|
|
34
|
+
* @param {number} d
|
|
35
|
+
* @returns {number} Pseudo-random number
|
|
36
|
+
*/
|
|
37
|
+
export function sfc32(a, b, c, d) {
|
|
38
|
+
a >>>= 0;
|
|
39
|
+
b >>>= 0;
|
|
40
|
+
c >>>= 0;
|
|
41
|
+
d >>>= 0;
|
|
42
|
+
var t = (a + b) | 0;
|
|
43
|
+
a = b ^ (b >>> 9);
|
|
44
|
+
b = (c + (c << 3)) | 0;
|
|
45
|
+
c = (c << 21) | (c >>> 11);
|
|
46
|
+
d = (d + 1) | 0;
|
|
47
|
+
t = (t + d) | 0;
|
|
48
|
+
c = (c + t) | 0;
|
|
49
|
+
return (t >>> 0) / 4294967296;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* SplitMix32, Generator with a 32-bit state
|
|
53
|
+
*
|
|
54
|
+
* @param {number} a
|
|
55
|
+
* @returns {number} Pseudo-random number
|
|
56
|
+
*/
|
|
57
|
+
export function splitmix32(a) {
|
|
58
|
+
a |= 0;
|
|
59
|
+
a = (a + 0x9e3779b9) | 0;
|
|
60
|
+
var t = a ^ (a >>> 16);
|
|
61
|
+
t = Math.imul(t, 0x21f0aaad);
|
|
62
|
+
t = t ^ (t >>> 15);
|
|
63
|
+
t = Math.imul(t, 0x735a2d97);
|
|
64
|
+
return ((t = t ^ (t >>> 15)) >>> 0) / 4294967296;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Mulberry32, Generator with a 32-bit state
|
|
68
|
+
*
|
|
69
|
+
* @param {number} a
|
|
70
|
+
* @returns {number} Pseudo-random number
|
|
71
|
+
*/
|
|
72
|
+
export function mulberry32(a) {
|
|
73
|
+
var t = (a += 0x6d2b79f5);
|
|
74
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
75
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
76
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Jenkins' Small Fast, Generator with a 32-bit state
|
|
80
|
+
*
|
|
81
|
+
* @param {number} a
|
|
82
|
+
* @returns {number} Pseudo-random number
|
|
83
|
+
*/
|
|
84
|
+
export function jsf32(a, b, c, d) {
|
|
85
|
+
a |= 0;
|
|
86
|
+
b |= 0;
|
|
87
|
+
c |= 0;
|
|
88
|
+
d |= 0;
|
|
89
|
+
var t = (a - ((b << 27) | (b >>> 5))) | 0;
|
|
90
|
+
a = b ^ ((c << 17) | (c >>> 15));
|
|
91
|
+
b = (c + d) | 0;
|
|
92
|
+
c = (d + t) | 0;
|
|
93
|
+
d = (a + t) | 0;
|
|
94
|
+
return (d >>> 0) / 4294967296;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* xoshiro128**, Generator with a 128-bit state
|
|
98
|
+
*
|
|
99
|
+
* @param {number} a
|
|
100
|
+
* @returns {number} Pseudo-random number
|
|
101
|
+
*/
|
|
102
|
+
export function xoshiro128ss(a, b, c, d) {
|
|
103
|
+
var t = b << 9;
|
|
104
|
+
var r = a * 5;
|
|
105
|
+
r = ((r << 7) | (r >>> 25)) * 9;
|
|
106
|
+
c ^= a;
|
|
107
|
+
d ^= b;
|
|
108
|
+
b ^= c;
|
|
109
|
+
a ^= d;
|
|
110
|
+
c ^= t;
|
|
111
|
+
d = (d << 11) | (d >>> 21);
|
|
112
|
+
return (r >>> 0) / 4294967296;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate a pseudo-random number in the interval [0, 1]
|
|
116
|
+
* PRNG equivalent of `Math.random()`
|
|
117
|
+
*
|
|
118
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
119
|
+
* @returns {number} Pseudo-random number
|
|
120
|
+
*/
|
|
121
|
+
export function random(prng) {
|
|
122
|
+
var seed = typeof prng === 'string' ? prng : prng.seed;
|
|
123
|
+
var algorithm = typeof prng === 'string' ? splitmix32 : prng.algorithm;
|
|
124
|
+
var hashes = cyrb128(seed);
|
|
125
|
+
return algorithm.apply(void 0, hashes);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Generate a pseudo-random boolean (true or false)
|
|
129
|
+
*
|
|
130
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
131
|
+
* @param {number} [probability=0.5] Probability to get true
|
|
132
|
+
* @returns {boolean} Either `true` or `false`
|
|
133
|
+
*/
|
|
134
|
+
export function randomBoolean(prng, probability) {
|
|
135
|
+
if (probability === void 0) { probability = 0.5; }
|
|
136
|
+
return random(prng) < probability;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate a pseudo-random sign (1 or -1)
|
|
140
|
+
*
|
|
141
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
142
|
+
* @param {number} [probability=0.5] Probability to get 1
|
|
143
|
+
* @returns {number} Either 1 or -1
|
|
144
|
+
*/
|
|
145
|
+
export function randomSign(prng, probability) {
|
|
146
|
+
if (probability === void 0) { probability = 0.5; }
|
|
147
|
+
return randomBoolean(prng, probability) ? 1 : -1;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate a pseudo-random floating-point number within a specified range
|
|
151
|
+
*
|
|
152
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
153
|
+
* @param {number} [min=0] Minimum boundary
|
|
154
|
+
* @param {number} [max=1] Maximum boundary
|
|
155
|
+
* @param {number} [precision=2] Number of digits after the decimal point
|
|
156
|
+
* @returns {number} Generated float
|
|
157
|
+
*/
|
|
158
|
+
export function randomFloat(prng, min, max, precision) {
|
|
159
|
+
if (min === void 0) { min = 0; }
|
|
160
|
+
if (max === void 0) { max = 1; }
|
|
161
|
+
if (precision === void 0) { precision = 2; }
|
|
162
|
+
return parseFloat(Math.min(min + random(prng) * (max - min), max).toFixed(precision));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate a pseudo-random integer number within a specified range
|
|
166
|
+
*
|
|
167
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
168
|
+
* @param {number} min Minimum boundary
|
|
169
|
+
* @param {number} max Maximum boundary
|
|
170
|
+
* @returns {number} Generated integer
|
|
171
|
+
*/
|
|
172
|
+
export function randomInt(prng, min, max) {
|
|
173
|
+
return Math.floor(random(prng) * (max - min + 1) + min);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Generate a pseudo-random hexadecimal color
|
|
177
|
+
*
|
|
178
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
179
|
+
* @returns {string} Generated hexadecimal color
|
|
180
|
+
*/
|
|
181
|
+
export function randomHexColor(prng) {
|
|
182
|
+
return '#' + ('00000' + ((random(prng) * (1 << 24)) | 0).toString(16)).slice(-6);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Pick a pseudo-random item from a given array
|
|
186
|
+
*
|
|
187
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
188
|
+
* @param {T[]} array Array to pick the item from
|
|
189
|
+
* @returns {T|undefined} Random item picked
|
|
190
|
+
*/
|
|
191
|
+
export function randomItem(prng, array) {
|
|
192
|
+
if (array.length === 0)
|
|
193
|
+
return undefined;
|
|
194
|
+
return array[randomInt(prng, 0, array.length - 1)];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Pick a pseudo-random property value from a given object
|
|
198
|
+
*
|
|
199
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
200
|
+
* @param {object} object Object to pick the property from
|
|
201
|
+
* @returns {T|undefined} Random item picked
|
|
202
|
+
*/
|
|
203
|
+
export function randomObjectProperty(prng, object) {
|
|
204
|
+
var keys = Object.keys(object);
|
|
205
|
+
var key = randomItem(prng, keys);
|
|
206
|
+
if (key && object.hasOwnProperty(key)) {
|
|
207
|
+
return object[key];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Select a pseudo-random index from an array of weighted items
|
|
212
|
+
*
|
|
213
|
+
* @param {PRNGParameters} prng PRNG parameters
|
|
214
|
+
* @param {number[]} weights Array of weights
|
|
215
|
+
* @returns {number} Random index based on weights
|
|
216
|
+
*/
|
|
217
|
+
export function randomIndex(prng, weights) {
|
|
218
|
+
if (weights.length === 0)
|
|
219
|
+
return -1;
|
|
220
|
+
var totalWeight = 0;
|
|
221
|
+
for (var _i = 0, weights_1 = weights; _i < weights_1.length; _i++) {
|
|
222
|
+
var weight_1 = weights_1[_i];
|
|
223
|
+
totalWeight += weight_1;
|
|
224
|
+
}
|
|
225
|
+
if (totalWeight <= 0)
|
|
226
|
+
console.warn('PRNG randomIndex()', 'Weights must sum to > 0', totalWeight);
|
|
227
|
+
var weight = random(prng) * totalWeight;
|
|
228
|
+
for (var i = 0; i < weights.length; i++) {
|
|
229
|
+
if (weight < weights[i])
|
|
230
|
+
return i;
|
|
231
|
+
weight -= weights[i];
|
|
232
|
+
}
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
package/lib/random.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Vector2, Vector3 } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a random boolean (true or false)
|
|
4
|
+
*
|
|
5
|
+
* @param {number} [probability=0.5] Probability to get true
|
|
6
|
+
* @returns {boolean} Either `true` or `false`
|
|
7
|
+
*/
|
|
8
|
+
export declare function randomBoolean(probability?: number): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a random sign (1 or -1)
|
|
11
|
+
*
|
|
12
|
+
* @param {number} [probability=0.5] Probability to get 1
|
|
13
|
+
* @returns {number} Either 1 or -1
|
|
14
|
+
*/
|
|
15
|
+
export declare function randomSign(probability?: number): number;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a random floating-point number within a specified range
|
|
18
|
+
*
|
|
19
|
+
* @param {number} [min=0] Minimum boundary
|
|
20
|
+
* @param {number} [max=1] Maximum boundary
|
|
21
|
+
* @param {number} [precision=2] Number of digits after the decimal point
|
|
22
|
+
* @returns {number} Generated float
|
|
23
|
+
*/
|
|
24
|
+
export declare function randomFloat(min?: number, max?: number, precision?: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a random integer number within a specified range
|
|
27
|
+
*
|
|
28
|
+
* @param {number} min Minimum boundary
|
|
29
|
+
* @param {number} max Maximum boundary
|
|
30
|
+
* @returns {number} Generated integer
|
|
31
|
+
*/
|
|
32
|
+
export declare function randomInt(min: number, max: number): number;
|
|
33
|
+
/**
|
|
34
|
+
* Generate a random hexadecimal color
|
|
35
|
+
*
|
|
36
|
+
* @returns {string} Generated hexadecimal color
|
|
37
|
+
*/
|
|
38
|
+
export declare function randomHexColor(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Pick a random item from a given array
|
|
41
|
+
*
|
|
42
|
+
* @param {T[]} array Array to pick the item from
|
|
43
|
+
* @returns {T|undefined} Random item picked
|
|
44
|
+
*/
|
|
45
|
+
export declare function randomItem<T = unknown>(array: T[]): T | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Pick a random property value from a given object
|
|
48
|
+
*
|
|
49
|
+
* @param {object} object Object to pick the property from
|
|
50
|
+
* @returns {T|undefined} Random item picked
|
|
51
|
+
*/
|
|
52
|
+
export declare function randomObjectProperty<T = unknown>(object: Record<string, T>): T | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Select a random index from an array of weighted items
|
|
55
|
+
*
|
|
56
|
+
* @param {number[]} weights Array of weights
|
|
57
|
+
* @returns {number} Random index based on weights
|
|
58
|
+
*/
|
|
59
|
+
export declare function randomIndex(weights: number[]): number;
|
|
60
|
+
/**
|
|
61
|
+
* Produce a random 2D point around the perimiter of a unit circle
|
|
62
|
+
*
|
|
63
|
+
* @param {number} [radius=1] Radius of the circle
|
|
64
|
+
* @param {Vector2} [target] Target vector
|
|
65
|
+
* @returns {Vector2} Random 2D point on circle
|
|
66
|
+
*/
|
|
67
|
+
export declare function onCircle(radius?: number, target?: Vector2): Vector2;
|
|
68
|
+
/**
|
|
69
|
+
* Produce a random 2D point inside a unit circle
|
|
70
|
+
*
|
|
71
|
+
* @param {number} [radius=1] Radius of the circle
|
|
72
|
+
* @param {Vector2} [target] Target vector
|
|
73
|
+
* @returns {Vector2} Random 2D point inside circle
|
|
74
|
+
*/
|
|
75
|
+
export declare function insideCircle(radius?: number, target?: Vector2): Vector2;
|
|
76
|
+
/**
|
|
77
|
+
* Produce a random 3D point on the surface of a unit sphere
|
|
78
|
+
*
|
|
79
|
+
* @param {number} [radius=1] Radius of the sphere
|
|
80
|
+
* @param {Vector3} [target] Target vector
|
|
81
|
+
* @returns {Vector3} Random 3D point on sphere
|
|
82
|
+
*/
|
|
83
|
+
export declare function onSphere(radius?: number, target?: Vector3): Vector3;
|
|
84
|
+
/**
|
|
85
|
+
* Produce a random 3D point inside a unit sphere
|
|
86
|
+
*
|
|
87
|
+
* @param {number} [radius=1] Radius of the sphere
|
|
88
|
+
* @param {Vector3} [target] Target vector
|
|
89
|
+
* @returns {Vector3} Random 3D point inside sphere
|
|
90
|
+
*/
|
|
91
|
+
export declare function insideSphere(radius?: number, target?: Vector3): Vector3;
|