-
Notifications
You must be signed in to change notification settings - Fork 0
/
seedmap.js
113 lines (101 loc) · 3.07 KB
/
seedmap.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
const seedmap = function (seed = Math.random(), size = 64, count = 1) {
// params
size = Math.floor(size);
let k = {
map: [],
max: size / 4,
min: Math.max(4, size / 128),
dat: { pos: 0, neg: 0, time: performance.now() }
};
function gen(seed, uei = 1) {
// uid from seed (last or root)
let S = k.seed;
S = S ? S ** 1.5 : ((Math.PI - 3) * 5e11) / seed;
S = Number((S * uei).toFixed().slice(-8));
// output
k.seed = S;
return S;
}
function quad(pair, inc, major) {
const spec = pair.major.getContext("2d");
const base = pair.minor.getContext("2d");
for (let x = 0; x < size; x += inc) {
for (let y = 0; y < size; y += inc) {
// TO-DO: instead of linear continuous col/row,
// ...project to a cube face and iterate for a while
// ...i.e. scale, difference, position
// TO-DO: helper transforms matrix from one map face to another
// ... pos, heading, etc.
// quad
const color = gen(seed);
const label = color > "55555555" ? "pos" : "neg";
let fill = String(color);
let dst;
if (major) {
dst = spec;
// absolute
let cell = color % 2 === 0;
if (cell) {
if (label === "pos") {
fill = "80ff8080";
} else {
fill = "10104080";
}
} else {
continue;
}
} else {
dst = base;
// relative
let RGB =
label === "pos" ? fill.substring(2, 4) : fill.substring(4, 6);
fill = fill.replace(RGB, "80");
let A = label === "pos" ? "40" : "20";
fill = fill.replace(fill.substring(6, 8), A);
}
k.dat[label]++;
// draw
dst.fillStyle = "#" + fill;
dst.fillRect(x, y, inc, inc);
}
}
// iterate
if (!major && inc > k.min) {
inc /= 2;
quad(pair, inc);
}
}
// tiles increment detail from seed until size
for (let i = 0; i < count; i++) {
// special
let major = document.createElement("canvas");
major.width = major.height = size;
// generic
let minor = document.createElement("canvas");
minor.width = minor.height = size;
// generic base color
let base = minor.getContext("2d");
base.fillStyle = "#000000";
base.fillRect(0, 0, size, size);
// major: while seed origin
k.map[i] = { major: major, minor: minor };
quad(k.map[i], k.max, true);
}
for (let i = 0; i < count; i++) {
// minor: until size
quad(k.map[i], k.max);
}
// output
// TO-DO: re-order from (px,nx,py,ny,pz,nz) => (py,pz,ny,nz,nx,px)...?
for (let i = 0; i < k.map.length; i++) {
let pair = k.map[i];
let base = pair.minor.getContext("2d");
base.drawImage(pair.major, 0, 0, size, size);
pair.major = null;
k.map[i] = pair.minor;
}
k.dat.time = performance.now() - k.dat.time;
console.log("noise", k);
return k;
};
export { seedmap };