-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathactivators.js
More file actions
115 lines (104 loc) · 3 KB
/
Copy pathactivators.js
File metadata and controls
115 lines (104 loc) · 3 KB
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
export const clamp = (x) => (x < 0 ? 0 : x > 1 ? 1 : x);
export const sigmoid = (x) => {
if (x >= 0) return 1 / (1 + Math.exp(-x));
const ex = Math.exp(x);
return ex / (1 + ex);
};
export const wrap = (x) => ((x % 1) + 1) % 1;
export const fold = (n) => {
const x = Math.abs(n % 2);
return x > 1 ? 2 - x : x;
};
export const valleys = (n) => {
const x = ((n + 1) % 2 + 2) % 2 - 1;
return Math.pow(Math.abs(x), 2 / 3);
};
let fractal_octaves = 5;
const normalizeOctaves = (octaves) => {
const parsed = Number(octaves);
if (!Number.isFinite(parsed)) return fractal_octaves;
return Math.max(1, Math.round(parsed));
};
export const setFractalOctaves = (octaves) => {
fractal_octaves = normalizeOctaves(octaves);
return fractal_octaves;
};
const hashNoise = (x, seed = 0.5) => {
const h = Math.sin(x * 12.9898 + seed * 78.233) * 43758.5453123;
return h - Math.floor(h);
};
export const value_noise = (n) => {
const scale = 2;
const pos = scale * n;
const i = Math.floor(pos);
const f = pos - i;
const a = hashNoise(i);
const b = hashNoise(i + 1);
return a * (1 - f) + b * f;
};
export const smooth_value_noise = (n) => {
const scale = 2;
const pos = scale * n;
const i = Math.floor(pos);
const f = pos - i;
const eased = f * f * (3 - 2 * f);
const a = hashNoise(i);
const b = hashNoise(i + 1);
return a * (1 - eased) + b * eased;
};
const fractal_sample = (func, n, octaves) => {
const falloff = 2;
const shift = 437.585453123;
let value = 0;
let amplitude = 1 / falloff;
let x = n;
for (let i = 0; i < octaves; i++) {
value += amplitude * func(x);
x = falloff * x + shift;
amplitude /= falloff;
}
return value;
};
export const fractal_func = (func, octaves = fractal_octaves) => {
const resolvedOctaves = normalizeOctaves(octaves);
return (n) => fractal_sample(func, n, resolvedOctaves);
};
export const fractal_sin = (n) => fractal_sample(sin, n, fractal_octaves);
export const fractal_fold = (n) => fractal_sample(fold, n, fractal_octaves);
export const fractal_value_noise = (n) => fractal_sample(value_noise, n * 0.75, fractal_octaves) * 1.75;
export const fractal_smooth_value_noise = (n) => fractal_sample(smooth_value_noise, n * 0.75, fractal_octaves) * 1.75;
export const sin = (n) => 0.5 * (Math.sin(Math.PI * (n - 0.5)) + 1);
export const tan = (n) => clamp(0.5 * (Math.tan(n * 0.9) + 1));
export const invSin = (n) => {
const s = Math.max(sin(n), 1e-6);
return clamp(1 / Math.pow(s, 0.2) - 1);
};
export const tanh = (n) => {
const x = ((n + 2) % 4) - 2;
return clamp(0.5 * (Math.tanh(x) + 1));
};
export const splitHalf = (n) => (n < 0 ? 0 : 1);
export const steps = (n) => {
const x = clamp(n);
return Math.min(1, Math.max(0, Math.floor(8 * x) / 7));
};
export const activators = [sin];
export const activator_options = {
clamp,
sigmoid,
fold,
sin,
tan,
invSin,
valleys,
splitHalf,
steps,
tanh,
wrap,
value_noise,
smooth_value_noise,
fractal_sin,
fractal_fold,
fractal_value_noise,
fractal_smooth_value_noise
};