aboutsummaryrefslogtreecommitdiff
path: root/lib/main.js
blob: 6a2ea8f9cc427f38372ec488f8298be956c4c6a7 (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
import Serpentity from '@serpentity/serpentity';
import WebGLRenderer from './systems/webgl_renderer';
import LissajousPositionUpdater from './systems/lissajous_position_updater';
import { lissajousCurve } from './factories/curves';
import { canvasId, fps } from './config';

const internals = {

  // State variables

  started: false,
  currentTime: 0,
  engine: null,

  load() {
    // Create entities
    const engine = new Serpentity();

    // Add Systems
    engine.addSystem(new LissajousPositionUpdater(canvasId));
    engine.addSystem(new WebGLRenderer(canvasId));

    // Add Entities
    engine.addEntity(lissajousCurve());

    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();