aboutsummaryrefslogtreecommitdiff
path: root/lib/main.js
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2024-05-06 22:28:48 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2024-05-06 22:28:48 +0200
commit5f6ef99eae91f53239f08143cead1249893fef81 (patch)
treefac495ea31140060ccd0b916897bbd7adf72fc2f /lib/main.js
Initial commit
Diffstat (limited to 'lib/main.js')
-rw-r--r--lib/main.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/main.js b/lib/main.js
new file mode 100644
index 0000000..6a2ea8f
--- /dev/null
+++ b/lib/main.js
@@ -0,0 +1,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();