aboutsummaryrefslogtreecommitdiff
path: root/lib/main.js
blob: cc4392abfef133679c066b4197d2fd595b242bbd (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
87
88
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 PhaseAdjuster from './systems/phase_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 PhaseAdjuster(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();