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