]> git.r.bdr.sh - rbdr/lissajous/blame - lib/main.js
Add a few comments
[rbdr/lissajous] / lib / main.js
CommitLineData
5f6ef99e 1import Serpentity from '@serpentity/serpentity';
362f9116
RBR
2import { canvasId, settingsId, fps } from './config';
3
4// Systems
5import CameraRotator from './systems/camera_rotator';
5f6ef99e
RBR
6import WebGLRenderer from './systems/webgl_renderer';
7import LissajousPositionUpdater from './systems/lissajous_position_updater';
362f9116
RBR
8import CameraAdjuster from './systems/camera_adjuster';
9import FrequencyAdjuster from './systems/frequency_adjuster';
2b9badac 10import PhaseAdjuster from './systems/phase_adjuster';
362f9116
RBR
11import AmplitudeAdjuster from './systems/amplitude_adjuster';
12import GlobalAdjuster from './systems/global_adjuster';
13
14// Factories
5f6ef99e 15import { lissajousCurve } from './factories/curves';
362f9116 16import { camera, configuration } from './factories/global';
5f6ef99e
RBR
17
18const 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
5f6ef99e 30 // Add Entities
362f9116 31 engine.addEntity(camera());
5f6ef99e 32 engine.addEntity(lissajousCurve());
362f9116
RBR
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));
2b9badac 49 engine.addSystem(new PhaseAdjuster(settings));
362f9116 50 engine.addSystem(new AmplitudeAdjuster(settings));
5f6ef99e
RBR
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
88internals.start();