]>
Commit | Line | Data |
---|---|---|
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(); |