]> git.r.bdr.sh - rbdr/lissajous/blob - lib/main.js
Add a few comments
[rbdr/lissajous] / lib / main.js
1 import Serpentity from '@serpentity/serpentity';
2 import { canvasId, settingsId, fps } from './config';
3
4 // Systems
5 import CameraRotator from './systems/camera_rotator';
6 import WebGLRenderer from './systems/webgl_renderer';
7 import LissajousPositionUpdater from './systems/lissajous_position_updater';
8 import CameraAdjuster from './systems/camera_adjuster';
9 import FrequencyAdjuster from './systems/frequency_adjuster';
10 import PhaseAdjuster from './systems/phase_adjuster';
11 import AmplitudeAdjuster from './systems/amplitude_adjuster';
12 import GlobalAdjuster from './systems/global_adjuster';
13
14 // Factories
15 import { lissajousCurve } from './factories/curves';
16 import { camera, configuration } from './factories/global';
17
18 const internals = {
19
20 // State variables
21
22 started: false,
23 currentTime: 0,
24 engine: null,
25
26 load() {
27 // Create entities
28 const engine = new Serpentity();
29
30 // Add Entities
31 engine.addEntity(camera());
32 engine.addEntity(lissajousCurve());
33 engine.addEntity(configuration());
34
35 // Select elements
36 const canvas = document.getElementById(canvasId);
37 const settings = document.getElementById(settingsId);
38
39 // Add Systems
40 engine.addSystem(new CameraRotator());
41 engine.addSystem(new LissajousPositionUpdater());
42 engine.addSystem(new WebGLRenderer(canvas));
43
44 // IMPROVEMENT NOTE: I believe adjusters can be generalized further.
45 // We could potentially have a factory for this.
46 engine.addSystem(new GlobalAdjuster(settings));
47 engine.addSystem(new CameraAdjuster(settings));
48 engine.addSystem(new FrequencyAdjuster(settings));
49 engine.addSystem(new PhaseAdjuster(settings));
50 engine.addSystem(new AmplitudeAdjuster(settings));
51
52 internals.engine = engine;
53 },
54
55 unload() {
56 internals.engine = null;
57 },
58
59 run(time) {
60
61 const delta = time - internals.currentTime;
62 const interval = 1000 / fps;
63
64 if (delta >= interval) {
65 internals.engine.update(delta);
66 internals.currentTime = time;
67 }
68
69 internals.started && window.requestAnimationFrame(internals.run);
70 },
71
72 start() {
73 if (!internals.started) {
74 internals.started = true;
75 internals.load();
76 window.requestAnimationFrame(internals.run);
77 }
78 },
79
80 stop() {
81 if (internals.started) {
82 internals.started = false;
83 internals.unload();
84 }
85 }
86 };
87
88 internals.start();