blob: 60189578f817e292f9d1745c9a8e7ecb60d15607 (
plain)
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
|
import Serpentity from '@serpentity/serpentity';
import { canvasId, settingsId, fps } from './config';
// Systems
import CameraRotator from './systems/camera_rotator';
import WebGLRenderer from './systems/webgl_renderer';
import LissajousPositionUpdater from './systems/lissajous_position_updater';
import CameraAdjuster from './systems/camera_adjuster';
import FrequencyAdjuster from './systems/frequency_adjuster';
import AmplitudeAdjuster from './systems/amplitude_adjuster';
import GlobalAdjuster from './systems/global_adjuster';
// Factories
import { lissajousCurve } from './factories/curves';
import { camera, configuration } from './factories/global';
const internals = {
// State variables
started: false,
currentTime: 0,
engine: null,
load() {
// Create entities
const engine = new Serpentity();
// Add Entities
engine.addEntity(camera());
engine.addEntity(lissajousCurve());
engine.addEntity(configuration());
// Select elements
const canvas = document.getElementById(canvasId);
const settings = document.getElementById(settingsId);
// Add Systems
engine.addSystem(new CameraRotator());
engine.addSystem(new LissajousPositionUpdater());
engine.addSystem(new WebGLRenderer(canvas));
// IMPROVEMENT NOTE: I believe adjusters can be generalized further.
// We could potentially have a factory for this.
engine.addSystem(new GlobalAdjuster(settings));
engine.addSystem(new CameraAdjuster(settings));
engine.addSystem(new FrequencyAdjuster(settings));
engine.addSystem(new AmplitudeAdjuster(settings));
internals.engine = engine;
},
unload() {
internals.engine = null;
},
run(time) {
const delta = time - internals.currentTime;
const interval = 1000 / fps;
if (delta >= interval) {
internals.engine.update(delta);
internals.currentTime = time;
}
internals.started && window.requestAnimationFrame(internals.run);
},
start() {
if (!internals.started) {
internals.started = true;
internals.load();
window.requestAnimationFrame(internals.run);
}
},
stop() {
if (internals.started) {
internals.started = false;
internals.unload();
}
}
};
internals.start();
|