-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
100 lines (82 loc) · 2.15 KB
/
script.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
import {
html,
render
} from "https://unpkg.com/htm@2/preact/standalone.module.js";
import { Store } from "./store.js";
import { AudioPlayer } from "./audio-player.js";
import { Scene } from "./scene.js";
import { UI } from "./ui.js";
const store = new Store();
const audioPlayer = new AudioPlayer(store);
const requestPermissionButton = document.createElement("button");
requestPermissionButton.classList.add("fullscreen-button");
requestPermissionButton.addEventListener("click", () => {
if (
window.DeviceMotionEvent &&
typeof DeviceMotionEvent.requestPermission === "function"
) {
DeviceMotionEvent.requestPermission();
}
audioPlayer.resumeContext();
store.dispatch({ showTitle: false });
requestPermissionButton.parentElement.removeChild(requestPermissionButton);
});
document.body.appendChild(requestPermissionButton);
addEventListener("devicemotion", e => {
if (store.state.showTitle) return;
const { x, y, z } = e.acceleration;
const v = Math.sqrt(x * x + y * y + z * z) / e.interval;
if (v < 1000) return;
const power = parseInt(
parseInt(v)
.toString()
.substring(-3, 3)
);
store.dispatch({
waiting: false,
running: true,
power
});
});
let lastTimeStamp = performance.now();
const reducePower = timeStamp => {
const delta = (timeStamp - lastTimeStamp) / 1000;
let { power, seed, waiting } = store.state;
if (power > 10) {
power -= power * 0.9 * delta;
seed += store.state.power - power;
store.dispatch({
waiting: false,
seed,
power
});
} else if (!waiting) {
store.dispatch({
running: false
});
}
lastTimeStamp = timeStamp;
requestAnimationFrame(reducePower);
};
reducePower(performance.now());
document.addEventListener("DOMContentLoaded", () => {
const scene = new Scene(document.getElementById("canvas"), store);
const renderScene = () => {
requestAnimationFrame(renderScene);
scene.render();
};
renderScene();
window.addEventListener(
"resize",
() => {
scene.resize();
},
{ passive: true }
);
render(
html`
<${UI} store=${store} />
`,
document.getElementById("ui")
);
});