From 6de25f122c4e52327e58adbfaef0362a7d6f8f7f Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Wed, 17 Dec 2025 22:21:42 +0300 Subject: [PATCH 1/6] Export resources from animation module --- src/animation/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/animation/index.js b/src/animation/index.js index 52c77a08..f69d436b 100644 --- a/src/animation/index.js +++ b/src/animation/index.js @@ -1,4 +1,5 @@ export * from './assets/index.js' export * from './components/index.js' +export * from './resources/index.js' export * from './core/index.js' export * from './plugin.js' From b4397fc2ab0fd64a4279cc813cf889dba185224a Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Wed, 17 Dec 2025 22:22:53 +0300 Subject: [PATCH 2/6] Move assets to root directory --- {demos/assets => assets}/audio/bad-apple.m4a | Bin {demos/assets => assets}/audio/hit.mp3 | Bin {demos/assets => assets}/warrior.png | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename {demos/assets => assets}/audio/bad-apple.m4a (100%) rename {demos/assets => assets}/audio/hit.mp3 (100%) rename {demos/assets => assets}/warrior.png (100%) diff --git a/demos/assets/audio/bad-apple.m4a b/assets/audio/bad-apple.m4a similarity index 100% rename from demos/assets/audio/bad-apple.m4a rename to assets/audio/bad-apple.m4a diff --git a/demos/assets/audio/hit.mp3 b/assets/audio/hit.mp3 similarity index 100% rename from demos/assets/audio/hit.mp3 rename to assets/audio/hit.mp3 diff --git a/demos/assets/warrior.png b/assets/warrior.png similarity index 100% rename from demos/assets/warrior.png rename to assets/warrior.png From 02afbfc47e6d041d3dbc09aeb6b72d0bab43413c Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Wed, 17 Dec 2025 22:25:26 +0300 Subject: [PATCH 3/6] Refactor examples to be self contained --- demos/demos/animation/index.js | 2 - demos/demos/audio/audioOscillator.js | 33 ----- demos/demos/audio/audioPlayer.js | 38 ------ demos/demos/audio/index.js | 4 - demos/demos/ecs/index.js | 2 - demos/demos/gizmos/arcs.js | 96 ------------- demos/demos/gizmos/grid.js | 43 ------ demos/demos/gizmos/index.js | 4 - demos/demos/gizmos/shapes.js | 47 ------- demos/demos/index.js | 8 -- demos/demos/input/index.js | 3 - demos/demos/render/canvas-2d/index.js | 1 - demos/demos/render/index.js | 2 - demos/demos/render/webgl/basictriangle.js | 41 ------ demos/demos/render/webgl/index.js | 8 -- demos/demos/render/webgl/rotationtriangle.js | 56 -------- demos/demos/transform/2d/index.js | 5 - demos/demos/transform/3d/index.js | 5 - demos/demos/transform/index.js | 2 - demos/demos/tween/index.js | 1 - demos/index.html | 49 ------- demos/main.js | 109 --------------- demos/webgl.html | 27 ---- demos/webgl.js | 94 ------------- examples/example.html | 63 +++++++++ examples/example.js | 55 ++++++++ examples/index.html | 32 +++++ examples/main.js | 73 ++++++++++ .../samples/animation/2d}/basic.js | 49 ++++++- examples/samples/animation/2d/index.js | 5 + .../samples/animation/3d/basic.js | 25 +++- examples/samples/animation/3d/index.js | 5 + examples/samples/animation/index.js | 7 + .../samples}/audio/audioGraph.js | 41 ++++-- examples/samples/audio/audioOscillator.js | 46 +++++++ .../samples}/audio/audioPlayback.js | 46 +++++-- examples/samples/audio/audioPlayer.js | 64 +++++++++ examples/samples/audio/index.js | 11 ++ .../demos => examples/samples}/ecs/despawn.js | 28 +++- examples/samples/ecs/index.js | 7 + .../demos => examples/samples}/ecs/spawn.js | 27 +++- examples/samples/gizmos/2d/arcs.js | 128 ++++++++++++++++++ examples/samples/gizmos/2d/grid.js | 76 +++++++++++ examples/samples/gizmos/2d/index.js | 11 ++ .../samples/gizmos/2d}/linestyle.js | 50 ++++++- examples/samples/gizmos/2d/shapes.js | 77 +++++++++++ examples/samples/gizmos/index.js | 5 + examples/samples/index.js | 19 +++ examples/samples/input/index.js | 9 ++ .../samples}/input/keyboard.js | 35 +++-- .../demos => examples/samples}/input/mouse.js | 44 ++++-- .../demos => examples/samples}/input/touch.js | 30 ++-- examples/samples/render/canvas-2d/index.js | 5 + .../samples}/render/canvas-2d/material.js | 29 ++-- examples/samples/render/index.js | 6 + .../samples/render/webgl/basictriangle.js | 50 ++++--- .../render/webgl/cameraorthographic.js | 29 +++- .../render/webgl/cameraperspective.js | 29 +++- .../samples}/render/webgl/camerarotate.js | 29 +++- .../render/webgl/colorchangetriangle.js | 35 +++-- .../samples}/render/webgl/geometries.js | 31 +++-- examples/samples/render/webgl/index.js | 15 ++ examples/samples/transform/2d/index.js | 13 ++ .../samples}/transform/2d/lookat.js | 37 +++-- .../samples}/transform/2d/propagate.js | 28 +++- .../samples}/transform/2d/rotate.js | 29 ++-- .../samples}/transform/2d/scale.js | 28 +++- .../samples}/transform/2d/translate.js | 28 +++- examples/samples/transform/3d/index.js | 13 ++ .../samples}/transform/3d/lookat.js | 41 ++++-- .../samples}/transform/3d/propagate.js | 30 ++-- .../samples}/transform/3d/rotate.js | 30 ++-- .../samples}/transform/3d/scale.js | 30 ++-- .../samples}/transform/3d/translate.js | 31 +++-- examples/samples/transform/index.js | 7 + .../samples}/tween/easing.js | 27 +++- examples/samples/tween/index.js | 5 + {demos/demos => examples/samples}/utils.js | 68 +++++++--- 78 files changed, 1507 insertions(+), 944 deletions(-) delete mode 100644 demos/demos/animation/index.js delete mode 100644 demos/demos/audio/audioOscillator.js delete mode 100644 demos/demos/audio/audioPlayer.js delete mode 100644 demos/demos/audio/index.js delete mode 100644 demos/demos/ecs/index.js delete mode 100644 demos/demos/gizmos/arcs.js delete mode 100644 demos/demos/gizmos/grid.js delete mode 100644 demos/demos/gizmos/index.js delete mode 100644 demos/demos/gizmos/shapes.js delete mode 100644 demos/demos/index.js delete mode 100644 demos/demos/input/index.js delete mode 100644 demos/demos/render/canvas-2d/index.js delete mode 100644 demos/demos/render/index.js delete mode 100644 demos/demos/render/webgl/basictriangle.js delete mode 100644 demos/demos/render/webgl/index.js delete mode 100644 demos/demos/render/webgl/rotationtriangle.js delete mode 100644 demos/demos/transform/2d/index.js delete mode 100644 demos/demos/transform/3d/index.js delete mode 100644 demos/demos/transform/index.js delete mode 100644 demos/demos/tween/index.js delete mode 100644 demos/index.html delete mode 100644 demos/main.js delete mode 100644 demos/webgl.html delete mode 100644 demos/webgl.js create mode 100644 examples/example.html create mode 100644 examples/example.js create mode 100644 examples/index.html create mode 100644 examples/main.js rename {demos/demos/animation => examples/samples/animation/2d}/basic.js (66%) create mode 100644 examples/samples/animation/2d/index.js rename demos/demos/animation/basic3d.js => examples/samples/animation/3d/basic.js (79%) create mode 100644 examples/samples/animation/3d/index.js create mode 100644 examples/samples/animation/index.js rename {demos/demos => examples/samples}/audio/audioGraph.js (53%) create mode 100644 examples/samples/audio/audioOscillator.js rename {demos/demos => examples/samples}/audio/audioPlayback.js (60%) create mode 100644 examples/samples/audio/audioPlayer.js create mode 100644 examples/samples/audio/index.js rename {demos/demos => examples/samples}/ecs/despawn.js (69%) create mode 100644 examples/samples/ecs/index.js rename {demos/demos => examples/samples}/ecs/spawn.js (66%) create mode 100644 examples/samples/gizmos/2d/arcs.js create mode 100644 examples/samples/gizmos/2d/grid.js create mode 100644 examples/samples/gizmos/2d/index.js rename {demos/demos/gizmos => examples/samples/gizmos/2d}/linestyle.js (58%) create mode 100644 examples/samples/gizmos/2d/shapes.js create mode 100644 examples/samples/gizmos/index.js create mode 100644 examples/samples/index.js create mode 100644 examples/samples/input/index.js rename {demos/demos => examples/samples}/input/keyboard.js (83%) rename {demos/demos => examples/samples}/input/mouse.js (80%) rename {demos/demos => examples/samples}/input/touch.js (72%) create mode 100644 examples/samples/render/canvas-2d/index.js rename {demos/demos => examples/samples}/render/canvas-2d/material.js (51%) create mode 100644 examples/samples/render/index.js rename demos/demos/render/webgl/movingtriangle.js => examples/samples/render/webgl/basictriangle.js (50%) rename {demos/demos => examples/samples}/render/webgl/cameraorthographic.js (66%) rename {demos/demos => examples/samples}/render/webgl/cameraperspective.js (64%) rename {demos/demos => examples/samples}/render/webgl/camerarotate.js (64%) rename {demos/demos => examples/samples}/render/webgl/colorchangetriangle.js (68%) rename {demos/demos => examples/samples}/render/webgl/geometries.js (68%) create mode 100644 examples/samples/render/webgl/index.js create mode 100644 examples/samples/transform/2d/index.js rename {demos/demos => examples/samples}/transform/2d/lookat.js (79%) rename {demos/demos => examples/samples}/transform/2d/propagate.js (75%) rename {demos/demos => examples/samples}/transform/2d/rotate.js (58%) rename {demos/demos => examples/samples}/transform/2d/scale.js (61%) rename {demos/demos => examples/samples}/transform/2d/translate.js (61%) create mode 100644 examples/samples/transform/3d/index.js rename {demos/demos => examples/samples}/transform/3d/lookat.js (76%) rename {demos/demos => examples/samples}/transform/3d/propagate.js (74%) rename {demos/demos => examples/samples}/transform/3d/rotate.js (56%) rename {demos/demos => examples/samples}/transform/3d/scale.js (58%) rename {demos/demos => examples/samples}/transform/3d/translate.js (59%) create mode 100644 examples/samples/transform/index.js rename {demos/demos => examples/samples}/tween/easing.js (70%) create mode 100644 examples/samples/tween/index.js rename {demos/demos => examples/samples}/utils.js (64%) diff --git a/demos/demos/animation/index.js b/demos/demos/animation/index.js deleted file mode 100644 index c2805ea8..00000000 --- a/demos/demos/animation/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { default as animation } from './basic.js' -export { default as basicAnimation3D } from './basic3d.js' diff --git a/demos/demos/audio/audioOscillator.js b/demos/demos/audio/audioOscillator.js deleted file mode 100644 index 8d27f911..00000000 --- a/demos/demos/audio/audioOscillator.js +++ /dev/null @@ -1,33 +0,0 @@ -import { - Demo, - World, - AudioOscillator, - EntityCommands, - Cleanup, - Timer, - TimerMode -} from 'wima' -import { addDefaultCamera3D } from '../utils.js' - -export default new Demo( - 'audio/audio oscillator', - [init, addDefaultCamera3D] -) - -/** - * @param {World} world - */ -function init(world) { - const commands = world.getResource(EntityCommands) - - commands - .spawn() - .insertPrefab([ - new AudioOscillator(), - new Timer({ - mode: TimerMode.Repeat - }), - new Cleanup() - ]) - .build() -} diff --git a/demos/demos/audio/audioPlayer.js b/demos/demos/audio/audioPlayer.js deleted file mode 100644 index 828a9989..00000000 --- a/demos/demos/audio/audioPlayer.js +++ /dev/null @@ -1,38 +0,0 @@ -import { - Demo, - World, - AssetServer, - AudioPlayer, - TimerMode, - EntityCommands, - Cleanup, - Audio, - Timer -} from 'wima' -import { addDefaultCamera3D } from '../utils.js' - -export default new Demo( - 'audio/audio player', - [init, addDefaultCamera3D] -) - -/** - * @param {World} world - */ -function init(world) { - const server = world.getResource(AssetServer) - const commands = world.getResource(EntityCommands) - - commands - .spawn() - .insertPrefab([ - new AudioPlayer({ - audio: server.load(Audio, 'assets/audio/bad-apple.m4a') - }), - new Timer({ - mode: TimerMode.Repeat - }), - new Cleanup() - ]) - .build() -} diff --git a/demos/demos/audio/index.js b/demos/demos/audio/index.js deleted file mode 100644 index 1858d78c..00000000 --- a/demos/demos/audio/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { default as audioGraph } from './audioGraph.js' -export { default as audioPlayer } from './audioPlayer.js' -export { default as audioPlayback } from './audioPlayback.js' -export { default as audioOscillator } from './audioOscillator.js' diff --git a/demos/demos/ecs/index.js b/demos/demos/ecs/index.js deleted file mode 100644 index a1ae3871..00000000 --- a/demos/demos/ecs/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { default as spawn } from './spawn.js' -export { default as despawn } from './despawn.js' diff --git a/demos/demos/gizmos/arcs.js b/demos/demos/gizmos/arcs.js deleted file mode 100644 index 2279968b..00000000 --- a/demos/demos/gizmos/arcs.js +++ /dev/null @@ -1,96 +0,0 @@ -import { - World, - Color, - Demo, - GizmoLineStyle, - PI, - HALF_PI -} from 'wima' -import { Demo1Gizmo2D } from '../utils.js' - -const QUATER_PI = Math.PI / 4 - -export default new Demo('gizmo2d/arcs', [init], [drawCirclularArcs, drawEllipticalArcs]) - -/** - * @param {World} world - */ -function init(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - - gizmo.settings.lineWidth = 2 - gizmo.settings.lineStyle = GizmoLineStyle.Solid -} - -/** - * @param {World} world - */ -function drawCirclularArcs(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - const radius = 40 - - gizmo - .translate(100, 100) - .arc(0, QUATER_PI, radius, radius, new Color(0.5, 0.5, 0.5, 1)) - .axes(20) - .translate(100, 0) - .arc(0, HALF_PI, radius, radius, new Color(1, 0, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, HALF_PI + QUATER_PI, radius, radius, new Color(1, 1, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI, radius, radius, new Color(0, 1, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI + QUATER_PI, radius, radius, new Color(0, 1, 1, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI + HALF_PI, radius, radius, new Color(0, 0, 1, 1)) - .axes(20) - .reset() - .translate(100, 200) - .arc(0, PI + HALF_PI + QUATER_PI, radius, radius, new Color(1, 0, 1, 1)) - .axes(20) - .translate(100, 0) - .circle(radius, new Color(1, 1, 1, 1)) - .axes(20) - .reset() -} - -/** - * @param {World} world - */ -function drawEllipticalArcs(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - const radiusX = 40 - const radiusY = 20 - - gizmo - .translate(100, 300) - .arc(0, QUATER_PI, radiusX, radiusY, new Color(0.5, 0.5, 0.5, 1)) - .axes(20) - .translate(100, 0) - .arc(0, HALF_PI, radiusX, radiusY, new Color(1, 0, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, HALF_PI + QUATER_PI, radiusX, radiusY, new Color(1, 1, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI, radiusX, radiusY, new Color(0, 1, 0, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI + QUATER_PI, radiusX, radiusY, new Color(0, 1, 1, 1)) - .axes(20) - .translate(100, 0) - .arc(0, PI + HALF_PI, radiusX, radiusY, new Color(0, 0, 1, 1)) - .axes(20) - .reset() - .translate(100, 400) - .arc(0, PI + HALF_PI + QUATER_PI, radiusX, radiusY, new Color(1, 0, 1, 1)) - .axes(20) - .translate(100, 0) - .ellipse(radiusX, radiusY, new Color(1, 1, 1, 1)) - .axes(20) - .reset() -} diff --git a/demos/demos/gizmos/grid.js b/demos/demos/gizmos/grid.js deleted file mode 100644 index aefbd57c..00000000 --- a/demos/demos/gizmos/grid.js +++ /dev/null @@ -1,43 +0,0 @@ -import { - World, - Color, - Demo, - Vector2, - BVector2, - GizmoLineStyle -} from 'wima' -import { Demo1Gizmo2D } from '../utils.js' - -export default new Demo('gizmo2d/grid', [init], [drawGrid]) - -/** - * @param {World} world - */ -function init(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - - gizmo.settings.lineWidth = 2 - gizmo.settings.lineStyle = GizmoLineStyle.Solid -} - -/** - * @param {World} world - */ -function drawGrid(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - - gizmo - .translate(200, 200) - .grid( - new Vector2(10, 10), - new Vector2(25, 25) - ) - .translate(0, 300) - .grid( - new Vector2(10, 10), - new Vector2(25, 25), - Color.WHITE.clone(), - new BVector2(true, true) - ) - .reset() -} diff --git a/demos/demos/gizmos/index.js b/demos/demos/gizmos/index.js deleted file mode 100644 index 0c9db427..00000000 --- a/demos/demos/gizmos/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { default as lineStyle2d } from './linestyle.js' -export { default as arcs2d } from './arcs.js' -export { default as shapes2d } from './shapes.js' -export { default as grid2d } from './grid.js' diff --git a/demos/demos/gizmos/shapes.js b/demos/demos/gizmos/shapes.js deleted file mode 100644 index bf561bc7..00000000 --- a/demos/demos/gizmos/shapes.js +++ /dev/null @@ -1,47 +0,0 @@ -/** @import {Entity} from 'wima' */ -import { - World, - Color, - Demo, - Vector2, - GizmoLineStyle -} from 'wima' -import { Demo1Gizmo2D } from '../utils.js' - -export default new Demo('gizmo2d/shapes', [init], [update]) - -/** - * @param {World} world - */ -function init(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - - gizmo.settings.lineWidth = 2 - gizmo.settings.lineStyle = GizmoLineStyle.Solid -} - -/** - * @param {World} world - */ -function update(world) { - const gizmo = world.getResource(Demo1Gizmo2D) - - gizmo - .translate(100, 150) - .aabb(50, 50, new Color(1, 1, 1, 1)) - .axes(20) - .translate(150, 0) - .ellipse(60, 40, new Color(1, 1, 1, 1)) - .axes(20) - .translate(150, 0) - .circle(50, new Color(1, 1, 1, 1)) - .axes(20) - .reset() - .translate(100, 300) - .grid(new Vector2(10, 10), new Vector2(10, 10)) - .axes(20) - .translate(150, 0) - .line(new Vector2(-50, 0), new Vector2(50, 0)) - .axes(20) - .reset() -} diff --git a/demos/demos/index.js b/demos/demos/index.js deleted file mode 100644 index aa8bb72d..00000000 --- a/demos/demos/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export * from './audio/index.js' -export * from './animation/index.js' -export * from './transform/index.js' -export * from './render/index.js' -export * from './ecs/index.js' -export * from './input/index.js' -export * from './tween/index.js' -export * from './gizmos/index.js' diff --git a/demos/demos/input/index.js b/demos/demos/input/index.js deleted file mode 100644 index 86252a65..00000000 --- a/demos/demos/input/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { default as keyboard } from './keyboard.js' -export { default as mouse } from './mouse.js' -export { default as touch } from './touch.js' diff --git a/demos/demos/render/canvas-2d/index.js b/demos/demos/render/canvas-2d/index.js deleted file mode 100644 index 0f18cac9..00000000 --- a/demos/demos/render/canvas-2d/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as materials } from './material.js' diff --git a/demos/demos/render/index.js b/demos/demos/render/index.js deleted file mode 100644 index 409835c4..00000000 --- a/demos/demos/render/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './canvas-2d/index.js' -export * from './webgl/index.js' diff --git a/demos/demos/render/webgl/basictriangle.js b/demos/demos/render/webgl/basictriangle.js deleted file mode 100644 index b2302ddc..00000000 --- a/demos/demos/render/webgl/basictriangle.js +++ /dev/null @@ -1,41 +0,0 @@ -import { - Demo, - Mesh, - World, - Cleanup, - EntityCommands, - createTransform3D, - BasicMaterial, - Meshed, - BasicMaterial3D, - BasicMaterialAssets, - MeshAssets -} from 'wima' -import { addDefaultCamera3D } from '../../utils.js' - -export const basictriangle = new Demo( - 'basic triangle', - [addmesh, addDefaultCamera3D] -) - -/** - * @param {World} world - */ -function addmesh(world) { - const commands = world.getResource(EntityCommands) - const meshes = world.getResource(MeshAssets) - const materials = world.getResource(BasicMaterialAssets) - - const mesh = meshes.add(Mesh.triangle3D()) - const material = materials.add(new BasicMaterial()) - - commands - .spawn() - .insertPrefab([ - ...createTransform3D(), - new Meshed(mesh), - new BasicMaterial3D(material), - new Cleanup() - ]) - .build() -} diff --git a/demos/demos/render/webgl/index.js b/demos/demos/render/webgl/index.js deleted file mode 100644 index 94452234..00000000 --- a/demos/demos/render/webgl/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export * from './basictriangle.js' -export * from './colorchangetriangle.js' -export * from './geometries.js' -export * from './rotationtriangle.js' -export * from './movingtriangle.js' -export * from './camerarotate.js' -export * from './cameraperspective.js' -export * from './cameraorthographic.js' diff --git a/demos/demos/render/webgl/rotationtriangle.js b/demos/demos/render/webgl/rotationtriangle.js deleted file mode 100644 index 68a1d3c7..00000000 --- a/demos/demos/render/webgl/rotationtriangle.js +++ /dev/null @@ -1,56 +0,0 @@ -import { - Demo, - Mesh, - World, - Cleanup, - Rotation3D, - EntityCommands, - Meshed, - BasicMaterial3D, - BasicMaterial, - createMovable3D, - Query, - BasicMaterialAssets, - MeshAssets -} from 'wima' -import { addDefaultCamera3D } from '../../utils.js' - -export const rotatingtriangle = new Demo( - 'rotating triangle', - [addmesh, addDefaultCamera3D], - [update] -) - -/** - * @param {World} world - */ -function addmesh(world) { - const commands = world.getResource(EntityCommands) - const meshes = world.getResource(MeshAssets) - const materials = world.getResource(BasicMaterialAssets) - - const mesh = meshes.add(Mesh.triangle3D()) - const material = materials.add(new BasicMaterial()) - - commands - .spawn() - .insertPrefab([ - ...createMovable3D(), - new Meshed(mesh), - new BasicMaterial3D(material), - new Cleanup() - ]) - .insert(new Rotation3D()) - .build() -} - -/** - * @param {World} world - */ -function update(world) { - const rotable = new Query(world, [Rotation3D]) - - rotable.each(([rotation]) => { - rotation.z = Math.PI / 4 - }) -} diff --git a/demos/demos/transform/2d/index.js b/demos/demos/transform/2d/index.js deleted file mode 100644 index 80837f34..00000000 --- a/demos/demos/transform/2d/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export { default as translate2d } from './translate.js' -export { default as rotate2d } from './rotate.js' -export { default as scale2d } from './scale.js' -export { default as propagate2d } from './propagate.js' -export { default as lookat2d } from './lookat.js' diff --git a/demos/demos/transform/3d/index.js b/demos/demos/transform/3d/index.js deleted file mode 100644 index 7d2065ed..00000000 --- a/demos/demos/transform/3d/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export { default as translate3d } from './translate.js' -export { default as rotate3d } from './rotate.js' -export { default as scale3d } from './scale.js' -export { default as lookAt3d } from './lookat.js' -export { default as propagate3d } from './propagate.js' diff --git a/demos/demos/transform/index.js b/demos/demos/transform/index.js deleted file mode 100644 index a0e135fc..00000000 --- a/demos/demos/transform/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './2d/index.js' -export * from './3d/index.js' diff --git a/demos/demos/tween/index.js b/demos/demos/tween/index.js deleted file mode 100644 index aee5fa88..00000000 --- a/demos/demos/tween/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as easing } from './easing.js' diff --git a/demos/index.html b/demos/index.html deleted file mode 100644 index 0151531e..00000000 --- a/demos/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - ES8 Project - - - - - - -
-
-
-
-
- -
-
- -
-
- - - \ No newline at end of file diff --git a/demos/main.js b/demos/main.js deleted file mode 100644 index 8a03aae0..00000000 --- a/demos/main.js +++ /dev/null @@ -1,109 +0,0 @@ -import { - App, - AppSchedule, - World, - FPSDebugger, - Gizmo2DPlugin, - Gizmo3DPlugin, - DOMWindowPlugin, - AnimationPlugin, - DemoPlugin, - MainWindow, - Query, - warn, - Entity, - WindowCommands, - DefaultPlugin, - Canvas2DRendererPlugin -} from 'wima' -import { - spawn, - despawn, - audioGraph, - audioPlayer, - audioPlayback, - audioOscillator, - keyboard, - mouse, - touch, - easing, - materials, - lineStyle2d, - arcs2d, - shapes2d, - grid2d, - translate2d, - rotate2d, - scale2d, - propagate2d, - lookat2d, - animation -} from './demos/index.js' -import { Demo1, Demo2, ResourceAliasPlugin } from './demos/utils.js' - -const app = new App() - -app - .registerPlugin(new ResourceAliasPlugin()) - .registerPlugin(new DefaultPlugin()) - .registerPlugin(new DOMWindowPlugin()) - .registerPlugin(new AnimationPlugin()) - .registerPlugin(new Canvas2DRendererPlugin()) - .registerPlugin(new Gizmo2DPlugin({ - label: Demo1 - })) - .registerPlugin(new Gizmo2DPlugin({ - label: Demo2 - })) - .registerPlugin(new Gizmo3DPlugin({ - label: Demo1 - })) - .registerPlugin(new Gizmo3DPlugin({ - label: Demo2 - })) - .registerPlugin(new DemoPlugin({ - demos: [ - animation, - spawn, - despawn, - materials, - easing, - keyboard, - mouse, - touch, - audioGraph, - audioPlayer, - audioPlayback, - audioOscillator, - lineStyle2d, - arcs2d, - shapes2d, - grid2d, - shapes2d, - grid2d, - translate2d, - rotate2d, - scale2d, - propagate2d, - lookat2d - ] - })) - .registerSystem(AppSchedule.Update, setupViewport) - .registerDebugger(new FPSDebugger()) - .run() - -/** - * @param {World} world - */ -function setupViewport(world) { - const windowcommands = world.getResource(WindowCommands) - const window = new Query(world, [Entity, MainWindow]).single() - - if (!window) return warn('No main window defined.') - - windowcommands - .window(window[0]) - .resize(innerWidth, innerHeight) -} - -addEventListener('contextmenu', (e) => e.preventDefault()) diff --git a/demos/webgl.html b/demos/webgl.html deleted file mode 100644 index 4a966343..00000000 --- a/demos/webgl.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - Document - - - - - - - - - - \ No newline at end of file diff --git a/demos/webgl.js b/demos/webgl.js deleted file mode 100644 index 6bc20977..00000000 --- a/demos/webgl.js +++ /dev/null @@ -1,94 +0,0 @@ -import { - App, - AppSchedule, - World, - FPSDebugger, - DemoPlugin, - DOMWindowPlugin, - WebglRendererPlugin, - MainWindow, - Query, - warn, - WindowCommands, - Entity, - DefaultPlugin, - Windows, - AnimationPlugin -} from 'wima' -import { - basictriangle, - changecolortriangle, - geometries, - rotatingtriangle, - movingtriangle, - cameraRotate, - orthograhicCamera, - perspectiveCamera, - translate3d, - rotate3d, - scale3d, - lookAt3d, - propagate3d, - basicAnimation3D - -} from './demos/index.js' -import { ResourceAliasPlugin } from './demos/utils.js' - -const app = new App() - -app - .registerPlugin(new ResourceAliasPlugin()) - .registerPlugin(new WebglRendererPlugin()) - .registerPlugin(new DefaultPlugin()) - .registerPlugin(new DOMWindowPlugin()) - .registerPlugin(new AnimationPlugin()) - .registerPlugin(new DemoPlugin({ - demos: [ - basictriangle, - changecolortriangle, - geometries, - rotatingtriangle, - movingtriangle, - cameraRotate, - orthograhicCamera, - perspectiveCamera, - translate3d, - rotate3d, - scale3d, - lookAt3d, - propagate3d, - basicAnimation3D - ] - })) - .registerDebugger(new FPSDebugger()) - .registerSystem(AppSchedule.Update, setupViewport) - .run() - -/** - * @param {World} world - */ -function setupViewport(world) { - const windowcommands = world.getResource(WindowCommands) - const window = new Query(world, [Entity, MainWindow]).single() - const canvases = world.getResource(Windows) - const width = innerWidth - const height = innerHeight - - if (!window) return warn('No main window defined.') - - const [entity] = window - const canvas = canvases.getWindow(entity) - - if (!canvas) return - - const gl = canvas.getContext('webgl2') - - if (!gl) return - - gl.viewport(0, 0, width, height) - windowcommands - .window(entity) - .resize(width, height) -} - -addEventListener('contextmenu', (e) => e.preventDefault()) diff --git a/examples/example.html b/examples/example.html new file mode 100644 index 00000000..afdaa3ed --- /dev/null +++ b/examples/example.html @@ -0,0 +1,63 @@ + + + + Wima engine example + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/example.js b/examples/example.js new file mode 100644 index 00000000..61d6feee --- /dev/null +++ b/examples/example.js @@ -0,0 +1,55 @@ +import samples from "./samples/index.js"; + +init() + +function init() { + const params = new URLSearchParams(window.location.search); + const name = params.get("example") + + if(!name || name === '') { + const warning = "No example selected." + document.body.append(document.createTextNode(warning)) + return + } + + const demo = recursiveSelect( + name.split('/').filter(e=>e.length !== 0), + samples + ) + + if(!demo) { + const warning = "The example selected does not exist." + document.body.append(document.createTextNode(warning)) + return + } + + const script = document.createElement('script') + + script.type = 'module' + script.src = demo + document.head.append(script) +} + +/** + * @param {string[]} items + * @param {Record} map + * @returns {string | undefined} + */ +function recursiveSelect(items,map){ + const name = items.shift() + + if(!name){ + return undefined + } + + const item = map[name] + + if(item instanceof URL) { + return item.pathname + } + if(item === undefined) { + return undefined + } + + return recursiveSelect(items,item) +} diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 00000000..8a39c73f --- /dev/null +++ b/examples/index.html @@ -0,0 +1,32 @@ + + + + + + + Webgl demos + + + + + + Open in another page + + + diff --git a/examples/main.js b/examples/main.js new file mode 100644 index 00000000..1d33718a --- /dev/null +++ b/examples/main.js @@ -0,0 +1,73 @@ +import samples from "./samples/index.js" + +const container = document.body.appendChild(document.createElement("div")) +const opts = container.appendChild(document.createElement("select")) + +container.style.position = "absolute" +container.style.top = "0px" +container.style.left = "0px" +opts.addEventListener('change', (e) => { + const { target } = e + if (!(target instanceof HTMLSelectElement)) return + localStorage.setItem("play", target.value) + + switchDemo(target.value) +}) + +/** + * @param {string} name + */ +async function switchDemo(name) { + const frame = document.getElementById("example-frame") + const link = document.getElementById("popper") + + if (!(frame instanceof HTMLIFrameElement)) { + throw "The element selected is not an iframe" + } + if (!(link instanceof HTMLAnchorElement)) { + throw "The element selected is not an anchor" + } + const linkSource = `./example.html?example=${name}` + frame.src = linkSource + link.href = linkSource +} + +/** + * @param {Record} demos + * @param {string} prefix + */ +function setupOpts(demos, prefix = '') { + if (prefix != '') { + prefix += '/' + } + + for (const name in demos) { + const prename = prefix + name + if (demos[name] instanceof URL) { + const opt = document.createElement("option") + opt.append(document.createTextNode(prefix + name)) + opts.append(opt) + continue + } + setupOpts(demos[name], prename) + } +} + +/** + * @param {Item} demos + */ +function init(demos) { + let name = localStorage.getItem("play") + if (!name) + name = Object.keys(demos)[0] || null + if (!name) return + + switchDemo(name) +} + +init(samples) +setupOpts(samples) + +/** + * @typedef {{ [x: string]: URL | Item}} Item + */ \ No newline at end of file diff --git a/demos/demos/animation/basic.js b/examples/samples/animation/2d/basic.js similarity index 66% rename from demos/demos/animation/basic.js rename to examples/samples/animation/2d/basic.js index 53829c83..b186d33f 100644 --- a/demos/demos/animation/basic.js +++ b/examples/samples/animation/2d/basic.js @@ -2,7 +2,6 @@ import { Mesh, createTransform2D, World, - Demo, Cleanup, AnimationClip, AnimationTrack, @@ -20,17 +19,55 @@ import { BasicMaterial2D, HALF_PI, PI, - TAU + TAU, + AnimationClipAssets, + AppSchedule, + AnimationPlugin, + App, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + Entity, + FPSDebugger, + MainWindow, + Query, + warn, + WindowCommands } from 'wima' -import { AnimationClipAssets } from '../../../src/animation/resources/aliases.js' -import { addDefaultCamera2D } from '../utils.js' +import { addDefaultCamera2D, HackPlugin } from '../../utils.js' -export default new Demo('animation/basic2d', [init, addDefaultCamera2D]) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new AnimationPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function setupViewport(world) { + const windowcommands = world.getResource(WindowCommands) + const window = new Query(world, [Entity, MainWindow]).single() + + if (!window) return warn('No main window defined.') + + windowcommands + .window(window[0]) + .resize(innerWidth, innerHeight) +} /** * @param {World} world */ -export function init(world) { +function init(world) { const commands = world.getResource(EntityCommands) const clips = world.getResource(AnimationClipAssets) const meshes = world.getResource(MeshAssets) diff --git a/examples/samples/animation/2d/index.js b/examples/samples/animation/2d/index.js new file mode 100644 index 00000000..07f1e1dd --- /dev/null +++ b/examples/samples/animation/2d/index.js @@ -0,0 +1,5 @@ +const basic = new URL("./basic.js", import.meta.url) + +export default { + "basic": basic +} \ No newline at end of file diff --git a/demos/demos/animation/basic3d.js b/examples/samples/animation/3d/basic.js similarity index 79% rename from demos/demos/animation/basic3d.js rename to examples/samples/animation/3d/basic.js index e298d07c..b96ecee4 100644 --- a/demos/demos/animation/basic3d.js +++ b/examples/samples/animation/3d/basic.js @@ -22,13 +22,30 @@ import { Position3DAnimationEffector, Scale3DAnimationEffector, Quaternion, - Vector3 + Vector3, + AnimationClipAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { AnimationClipAssets } from '../../../src/animation/resources/aliases.js' -import { addDefaultCamera3D } from '../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo('animation/basic3d', [init, addDefaultCamera3D]) +const app = new App() +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Update, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .run() + /** * @param {World} world */ diff --git a/examples/samples/animation/3d/index.js b/examples/samples/animation/3d/index.js new file mode 100644 index 00000000..74628dd4 --- /dev/null +++ b/examples/samples/animation/3d/index.js @@ -0,0 +1,5 @@ +const basic = new URL("./basic.js", import.meta.url) + +export default { + "basic": basic +} diff --git a/examples/samples/animation/index.js b/examples/samples/animation/index.js new file mode 100644 index 00000000..2d83ac05 --- /dev/null +++ b/examples/samples/animation/index.js @@ -0,0 +1,7 @@ +import { default as d2 } from "./2d/index.js"; +import { default as d3 } from "./2d/index.js"; + +export default { + "2d": d2, + "3d": d3 +} \ No newline at end of file diff --git a/demos/demos/audio/audioGraph.js b/examples/samples/audio/audioGraph.js similarity index 53% rename from demos/demos/audio/audioGraph.js rename to examples/samples/audio/audioGraph.js index 313418f3..56308a23 100644 --- a/demos/demos/audio/audioGraph.js +++ b/examples/samples/audio/audioGraph.js @@ -1,19 +1,20 @@ import { - Demo, World, AudioAssets, AudioGraph, Handle, Audio, - AssetServer + AssetServer, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Plugin } from 'wima' -import { addDefaultCamera3D } from '../utils.js' +import { HackPlugin, setupViewport } from '../utils.js' -export default new Demo( - 'audio/graph', - [init, addDefaultCamera3D], - [playAudio] -) class Playing { handle @@ -30,6 +31,30 @@ class Playing { } } +// Why use a plugin? The current implentation does not have system sets and +// systems registered directly on the App are precede ones registered by plugins. +// This conflict is between internal engine system and external engine systems ordering. +class MyPlugin extends Plugin { + /** + * @param {App} app + */ + register(app){ + app.registerSystem(AppSchedule.Startup, init) + } +} +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new MyPlugin()) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, playAudio) + .registerDebugger(new FPSDebugger()) + .run() + /** * @param {World} world */ diff --git a/examples/samples/audio/audioOscillator.js b/examples/samples/audio/audioOscillator.js new file mode 100644 index 00000000..a240dbdc --- /dev/null +++ b/examples/samples/audio/audioOscillator.js @@ -0,0 +1,46 @@ +import { + Demo, + World, + AudioOscillator, + EntityCommands, + Cleanup, + Timer, + TimerMode, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger +} from 'wima' +import { HackPlugin, setupViewport } from '../utils.js' + +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function init(world) { + const commands = world.getResource(EntityCommands) + + commands + .spawn() + .insertPrefab([ + new AudioOscillator(), + new Timer({ + mode: TimerMode.Repeat + }), + new Cleanup() + ]) + .build() +} \ No newline at end of file diff --git a/demos/demos/audio/audioPlayback.js b/examples/samples/audio/audioPlayback.js similarity index 60% rename from demos/demos/audio/audioPlayback.js rename to examples/samples/audio/audioPlayback.js index 39e5dc13..135b9b6c 100644 --- a/demos/demos/audio/audioPlayback.js +++ b/examples/samples/audio/audioPlayback.js @@ -9,15 +9,43 @@ import { Timer, Query, VirtualClock, - AssetServer + AssetServer, + DefaultPlugin, + App, + AppSchedule, + Canvas2DRendererPlugin, + DOMWindowPlugin, + FPSDebugger, + Plugin } from 'wima' -import { addDefaultCamera3D } from '../utils.js' +import { HackPlugin, setupViewport } from '../utils.js' -export default new Demo( - 'audio/audio playback', - [init, addDefaultCamera3D], - [update] -) +class AudioTimer extends Timer {} + +// Why use a plugin? The current implentation does not have system sets and +// systems registered directly on the App are precede ones registered by plugins. +// This conflict is between internal engine system and external engine systems ordering. +class MyPlugin extends Plugin { + /** + * @param {App} app + */ + register(app){ + app.registerSystem(AppSchedule.Startup, init) + } +} + +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new MyPlugin()) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world @@ -34,7 +62,7 @@ function init(world) { .spawn() .insertPrefab([ new AudioPlayer({ - audio: server.load(Audio, 'assets/audio/bad-apple.m4a') + audio: server.load(Audio, '../assets/audio/bad-apple.m4a') }), new Timer({ mode: TimerMode.Once, @@ -82,5 +110,3 @@ function update(world) { timer.update(clock.getDelta()) } - -class AudioTimer extends Timer {} diff --git a/examples/samples/audio/audioPlayer.js b/examples/samples/audio/audioPlayer.js new file mode 100644 index 00000000..015ac030 --- /dev/null +++ b/examples/samples/audio/audioPlayer.js @@ -0,0 +1,64 @@ +import { + Demo, + World, + AssetServer, + AudioPlayer, + TimerMode, + EntityCommands, + Cleanup, + Audio, + Timer, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Plugin +} from 'wima' +import { HackPlugin, setupViewport } from '../utils.js' + +// Why use a plugin? The current implentation does not have system sets and +// systems registered directly on the App are precede ones registered by plugins. +// This conflict is between internal engine system and external engine systems ordering. +class MyPlugin extends Plugin { + /** + * @param {App} app + */ + register(app){ + app.registerSystem(AppSchedule.Startup, init) + } +} + +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new MyPlugin()) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function init(world) { + const server = world.getResource(AssetServer) + const commands = world.getResource(EntityCommands) + + commands + .spawn() + .insertPrefab([ + new AudioPlayer({ + audio: server.load(Audio, '../assets/audio/bad-apple.m4a') + }), + new Timer({ + mode: TimerMode.Repeat + }), + new Cleanup() + ]) + .build() +} \ No newline at end of file diff --git a/examples/samples/audio/index.js b/examples/samples/audio/index.js new file mode 100644 index 00000000..0f69d2cf --- /dev/null +++ b/examples/samples/audio/index.js @@ -0,0 +1,11 @@ +const audioGraph = new URL("./audioGraph.js", import.meta.url) +const audioPlayer = new URL("./audioPlayer.js", import.meta.url) +const audioPlayback = new URL("./audioPlayback.js", import.meta.url) +const audioOscillator = new URL("./audioOscillator.js", import.meta.url) + +export default { + "audioGraph": audioGraph, + "audioPlayer": audioPlayer, + "audioPlayback": audioPlayback, + "audioOscillator": audioOscillator +} diff --git a/demos/demos/ecs/despawn.js b/examples/samples/ecs/despawn.js similarity index 69% rename from demos/demos/ecs/despawn.js rename to examples/samples/ecs/despawn.js index 6b089a50..681f4069 100644 --- a/demos/demos/ecs/despawn.js +++ b/examples/samples/ecs/despawn.js @@ -2,7 +2,6 @@ import { Mesh, createTransform2D, World, - Demo, Query, EntityCommands, Cleanup, @@ -11,16 +10,35 @@ import { Meshed, BasicMaterial2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' -export default new Demo('despawn', [init, addDefaultCamera2D], [update]) +class Marker { } const itemWidth = 50 const itemHeight = 50 const paddingWidth = 10 const paddingHeight = 10 +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world @@ -68,5 +86,3 @@ function update(world) { commands.despawn(entity[0]) } - -class Marker { } diff --git a/examples/samples/ecs/index.js b/examples/samples/ecs/index.js new file mode 100644 index 00000000..ba87ec7b --- /dev/null +++ b/examples/samples/ecs/index.js @@ -0,0 +1,7 @@ +const spawn = new URL("./spawn.js", import.meta.url) +const despawn = new URL("./despawn.js", import.meta.url) + +export default { + "spawn": spawn, + "despawn": despawn +} diff --git a/demos/demos/ecs/spawn.js b/examples/samples/ecs/spawn.js similarity index 66% rename from demos/demos/ecs/spawn.js rename to examples/samples/ecs/spawn.js index bf06828d..6959bb61 100644 --- a/demos/demos/ecs/spawn.js +++ b/examples/samples/ecs/spawn.js @@ -2,7 +2,6 @@ import { Mesh, createTransform2D, World, - Demo, Query, EntityCommands, Cleanup, @@ -11,16 +10,34 @@ import { Meshed, BasicMaterial2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + Canvas2DRendererPlugin, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' -export default new Demo('spawn', [addDefaultCamera2D], [update]) +class Marker { } const itemWidth = 50 const itemHeight = 50 const paddingWidth = 10 const paddingHeight = 10 +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world @@ -53,5 +70,3 @@ function update(world) { ]) .build() } - -class Marker { } diff --git a/examples/samples/gizmos/2d/arcs.js b/examples/samples/gizmos/2d/arcs.js new file mode 100644 index 00000000..2a5363dc --- /dev/null +++ b/examples/samples/gizmos/2d/arcs.js @@ -0,0 +1,128 @@ +import { + World, + Color, + GizmoLineStyle, + PI, + HALF_PI, + QUARTER_PI, + Gizmo2D, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Gizmo2DPlugin, + typeidGeneric +} from 'wima' +import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' + +class Demo { } +/** + * @augments {Gizmo2D} + */ +class DemoGizmo2D extends Gizmo2D { } + +const app = new App() + +// We have to alias the gizmo resource manually +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new Gizmo2DPlugin({ + label: Demo + })) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, drawCirclularArcs) + .registerSystem(AppSchedule.Update, drawEllipticalArcs) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function init(world) { + const gizmo = world.getResource(DemoGizmo2D) + + gizmo.settings.lineWidth = 2 + gizmo.settings.lineStyle = GizmoLineStyle.Solid +} + +/** + * @param {World} world + */ +function drawCirclularArcs(world) { + const gizmo = world.getResource(DemoGizmo2D) + const radius = 40 + + gizmo + .translate(100, 100) + .arc(0, QUARTER_PI, radius, radius, new Color(0.5, 0.5, 0.5, 1)) + .axes(20) + .translate(100, 0) + .arc(0, HALF_PI, radius, radius, new Color(1, 0, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, HALF_PI + QUARTER_PI, radius, radius, new Color(1, 1, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI, radius, radius, new Color(0, 1, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI + QUARTER_PI, radius, radius, new Color(0, 1, 1, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI + HALF_PI, radius, radius, new Color(0, 0, 1, 1)) + .axes(20) + .reset() + .translate(100, 200) + .arc(0, PI + HALF_PI + QUARTER_PI, radius, radius, new Color(1, 0, 1, 1)) + .axes(20) + .translate(100, 0) + .circle(radius, new Color(1, 1, 1, 1)) + .axes(20) + .reset() +} + +/** + * @param {World} world + */ +function drawEllipticalArcs(world) { + const gizmo = world.getResource(DemoGizmo2D) + const radiusX = 40 + const radiusY = 20 + + gizmo + .translate(100, 300) + .arc(0, QUARTER_PI, radiusX, radiusY, new Color(0.5, 0.5, 0.5, 1)) + .axes(20) + .translate(100, 0) + .arc(0, HALF_PI, radiusX, radiusY, new Color(1, 0, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, HALF_PI + QUARTER_PI, radiusX, radiusY, new Color(1, 1, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI, radiusX, radiusY, new Color(0, 1, 0, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI + QUARTER_PI, radiusX, radiusY, new Color(0, 1, 1, 1)) + .axes(20) + .translate(100, 0) + .arc(0, PI + HALF_PI, radiusX, radiusY, new Color(0, 0, 1, 1)) + .axes(20) + .reset() + .translate(100, 400) + .arc(0, PI + HALF_PI + QUARTER_PI, radiusX, radiusY, new Color(1, 0, 1, 1)) + .axes(20) + .translate(100, 0) + .ellipse(radiusX, radiusY, new Color(1, 1, 1, 1)) + .axes(20) + .reset() +} \ No newline at end of file diff --git a/examples/samples/gizmos/2d/grid.js b/examples/samples/gizmos/2d/grid.js new file mode 100644 index 00000000..1546ac80 --- /dev/null +++ b/examples/samples/gizmos/2d/grid.js @@ -0,0 +1,76 @@ +import { + World, + Color, + Vector2, + BVector2, + GizmoLineStyle, + AppSchedule, + App, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Gizmo2D, + Gizmo2DPlugin, + typeidGeneric +} from 'wima' +import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' + +class Demo { } + +/** + * @augments {Gizmo2D} + */ +class DemoGizmo2D extends Gizmo2D { } + +const app = new App() + +// We have to alias the gizmo resource manually +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new Gizmo2DPlugin({ + label: Demo + })) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, drawGrid) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function init(world) { + const gizmo = world.getResource(DemoGizmo2D) + + gizmo.settings.lineWidth = 2 + gizmo.settings.lineStyle = GizmoLineStyle.Solid +} + +/** + * @param {World} world + */ +function drawGrid(world) { + const gizmo = world.getResource(DemoGizmo2D) + + gizmo + .translate(200, 200) + .grid( + new Vector2(10, 10), + new Vector2(25, 25) + ) + .translate(0, 300) + .grid( + new Vector2(10, 10), + new Vector2(25, 25), + Color.WHITE.clone(), + new BVector2(true, true) + ) + .reset() +} \ No newline at end of file diff --git a/examples/samples/gizmos/2d/index.js b/examples/samples/gizmos/2d/index.js new file mode 100644 index 00000000..35e0aecc --- /dev/null +++ b/examples/samples/gizmos/2d/index.js @@ -0,0 +1,11 @@ +const lineStyle = new URL("./linestyle.js", import.meta.url) +const arcs = new URL("./arcs.js", import.meta.url) +const shapes = new URL("./shapes.js", import.meta.url) +const grid = new URL("./grid.js", import.meta.url) + +export default { + "arcs": arcs, + "shapes": shapes, + "grid": grid, + "line styles": lineStyle, +} diff --git a/demos/demos/gizmos/linestyle.js b/examples/samples/gizmos/2d/linestyle.js similarity index 58% rename from demos/demos/gizmos/linestyle.js rename to examples/samples/gizmos/2d/linestyle.js index eb8d4619..f015fd55 100644 --- a/demos/demos/gizmos/linestyle.js +++ b/examples/samples/gizmos/2d/linestyle.js @@ -1,14 +1,54 @@ -/** @import {Entity} from 'wima' */ import { World, Color, - Demo, Vector2, - GizmoLineStyle + GizmoLineStyle, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Gizmo2D, + Gizmo2DPlugin, + typeidGeneric } from 'wima' -import { Demo1Gizmo2D, Demo2Gizmo2D } from '../utils.js' +import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' -export default new Demo('gizmo2d/line style', [init], [update]) +class Demo1 { } +class Demo2 { } +/** + * @augments {Gizmo2D} + */ +class Demo1Gizmo2D extends Gizmo2D { } +/** + * @augments {Gizmo2D} + */ +class Demo2Gizmo2D extends Gizmo2D { } + +const app = new App() + +// We have to alias the gizmo resource manually +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo1]), Demo1Gizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo2]), Demo2Gizmo2D) + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new Gizmo2DPlugin({ + label: Demo1 + })) + .registerPlugin(new Gizmo2DPlugin({ + label: Demo2 + })) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/examples/samples/gizmos/2d/shapes.js b/examples/samples/gizmos/2d/shapes.js new file mode 100644 index 00000000..2fc316fc --- /dev/null +++ b/examples/samples/gizmos/2d/shapes.js @@ -0,0 +1,77 @@ +import { + World, + Color, + Vector2, + GizmoLineStyle, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + Gizmo2D, + Gizmo2DPlugin, + typeidGeneric +} from 'wima' +import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' +class Demo { } +/** + * @augments {Gizmo2D} + */ +class DemoGizmo2D extends Gizmo2D { } + +const app = new App() + +// We have to alias the gizmo resource manually +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerPlugin(new Gizmo2DPlugin({ + label: Demo + })) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() + +/** + * @param {World} world + */ +function init(world) { + const gizmo = world.getResource(DemoGizmo2D) + + gizmo.settings.lineWidth = 2 + gizmo.settings.lineStyle = GizmoLineStyle.Solid +} + +/** + * @param {World} world + */ +function update(world) { + const gizmo = world.getResource(DemoGizmo2D) + + gizmo + .translate(100, 150) + .aabb(50, 50, new Color(1, 1, 1, 1)) + .axes(20) + .translate(150, 0) + .ellipse(60, 40, new Color(1, 1, 1, 1)) + .axes(20) + .translate(150, 0) + .circle(50, new Color(1, 1, 1, 1)) + .axes(20) + .reset() + .translate(100, 300) + .grid(new Vector2(10, 10), new Vector2(10, 10)) + .axes(20) + .translate(150, 0) + .line(new Vector2(-50, 0), new Vector2(50, 0)) + .axes(20) + .reset() +} \ No newline at end of file diff --git a/examples/samples/gizmos/index.js b/examples/samples/gizmos/index.js new file mode 100644 index 00000000..0a887089 --- /dev/null +++ b/examples/samples/gizmos/index.js @@ -0,0 +1,5 @@ +import { default as d2 } from "./2d/index.js"; + +export default { + "2d": d2 +} \ No newline at end of file diff --git a/examples/samples/index.js b/examples/samples/index.js new file mode 100644 index 00000000..527ce896 --- /dev/null +++ b/examples/samples/index.js @@ -0,0 +1,19 @@ +import { default as audio } from './audio/index.js' +import { default as animation } from './animation/index.js' +import { default as transform } from './transform/index.js' +import { default as render } from './render/index.js' +import { default as ecs } from './ecs/index.js' +import { default as input } from './input/index.js' +import { default as tween } from './tween/index.js' +import { default as gizmos } from './gizmos/index.js' + +export default { + "animation": animation, + "audio": audio, + "transform": transform, + "render": render, + "ecs": ecs, + "input": input, + "tween": tween, + "gizmos": gizmos +} \ No newline at end of file diff --git a/examples/samples/input/index.js b/examples/samples/input/index.js new file mode 100644 index 00000000..d11c7b78 --- /dev/null +++ b/examples/samples/input/index.js @@ -0,0 +1,9 @@ +const keyboard = new URL("./keyboard.js", import.meta.url) +const mouse = new URL("./mouse.js", import.meta.url) +const touch = new URL("./touch.js", import.meta.url) + +export default { + "keyboard": keyboard, + "mouse": mouse, + "touch": touch +} diff --git a/demos/demos/input/keyboard.js b/examples/samples/input/keyboard.js similarity index 83% rename from demos/demos/input/keyboard.js rename to examples/samples/input/keyboard.js index 0629cd24..19f282eb 100644 --- a/demos/demos/input/keyboard.js +++ b/examples/samples/input/keyboard.js @@ -14,15 +14,18 @@ import { Meshed, BasicMaterial2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' -export default new Demo( - 'keyboard', - [init, spawnDigits, spawnAlphabet, addDefaultCamera2D], - [update] -) +/** @type {Map} */ +class KeytoEntityMap extends Map { } const offsetX = -400 const offsetY = -100 @@ -30,9 +33,21 @@ const itemWidth = 50 const itemHeight = 50 const paddingWidth = 10 const paddingHeight = 10 - -/** @type {Map} */ -class KeytoEntityMap extends Map { } +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, spawnAlphabet) + .registerSystem(AppSchedule.Startup, spawnDigits) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/demos/demos/input/mouse.js b/examples/samples/input/mouse.js similarity index 80% rename from demos/demos/input/mouse.js rename to examples/samples/input/mouse.js index 2939c5a1..0c5ac046 100644 --- a/demos/demos/input/mouse.js +++ b/examples/samples/input/mouse.js @@ -3,7 +3,6 @@ import { createTransform2D, World, Color, - Demo, Query, EntityCommands, Cleanup, @@ -16,21 +15,15 @@ import { Meshed, BasicMaterial, BasicMaterial2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + DOMWindowPlugin, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' - -export default new Demo( - 'mouse', - [spawnButtons, spawnMouseFollower, addDefaultCamera2D], - [updateFollower, updateButtons] -) - -const offsetX = 100 -const offsetY = 100 -const itemWidth = 50 -const itemHeight = 50 -const paddingWidth = 10 +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' /** @type {Map} */ class KeytoEntityMap extends Map { } @@ -44,6 +37,27 @@ class MouseEntity { } } +const offsetX = 100 +const offsetY = 100 +const itemWidth = 50 +const itemHeight = 50 +const paddingWidth = 10 +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, spawnButtons) + .registerSystem(AppSchedule.Startup, spawnMouseFollower) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, updateFollower) + .registerSystem(AppSchedule.Update, updateButtons) + .registerDebugger(new FPSDebugger()) + .run() + /** * @param {World} world */ diff --git a/demos/demos/input/touch.js b/examples/samples/input/touch.js similarity index 72% rename from demos/demos/input/touch.js rename to examples/samples/input/touch.js index 68de7de2..f166f5c0 100644 --- a/demos/demos/input/touch.js +++ b/examples/samples/input/touch.js @@ -15,19 +15,33 @@ import { BasicMaterial2D, Meshed, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' - -export default new Demo( - 'touch', - [init, addDefaultCamera2D], - [update] -) +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' /** @type {Map} */ class TouchtoEntityMap extends Map { } +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, update) + .registerDebugger(new FPSDebugger()) + .run() + /** * @param {World} world */ diff --git a/examples/samples/render/canvas-2d/index.js b/examples/samples/render/canvas-2d/index.js new file mode 100644 index 00000000..908e100c --- /dev/null +++ b/examples/samples/render/canvas-2d/index.js @@ -0,0 +1,5 @@ +const materials = new URL("./material.js", import.meta.url) + +export default { + "materials": materials +} diff --git a/demos/demos/render/canvas-2d/material.js b/examples/samples/render/canvas-2d/material.js similarity index 51% rename from demos/demos/render/canvas-2d/material.js rename to examples/samples/render/canvas-2d/material.js index 30a3e74a..313a85bf 100644 --- a/demos/demos/render/canvas-2d/material.js +++ b/examples/samples/render/canvas-2d/material.js @@ -2,26 +2,39 @@ import { Mesh, createTransform2D, World, - Demo, Cleanup, EntityCommands, BasicMaterial, Meshed, BasicMaterial2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' -export default new Demo( - 'materials', - [init, addDefaultCamera2D] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world */ -export async function init(world) { +function init(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const basicMaterials = world.getResource(BasicMaterialAssets) diff --git a/examples/samples/render/index.js b/examples/samples/render/index.js new file mode 100644 index 00000000..d92a1ad0 --- /dev/null +++ b/examples/samples/render/index.js @@ -0,0 +1,6 @@ +import webgl from "./webgl/index.js" +import canvas2d from "./canvas-2d/index.js" +export default { + "canvas2d": canvas2d, + "webgl": webgl +} diff --git a/demos/demos/render/webgl/movingtriangle.js b/examples/samples/render/webgl/basictriangle.js similarity index 50% rename from demos/demos/render/webgl/movingtriangle.js rename to examples/samples/render/webgl/basictriangle.js index f0885382..7d9be598 100644 --- a/demos/demos/render/webgl/movingtriangle.js +++ b/examples/samples/render/webgl/basictriangle.js @@ -1,31 +1,41 @@ import { Demo, Mesh, - Position3D, World, Cleanup, - Query, EntityCommands, - VirtualClock, + createTransform3D, BasicMaterial, Meshed, BasicMaterial3D, - createTransform3D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DOMWindowPlugin, + DefaultPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' -export const movingtriangle = new Demo( - 'moving triangle', - [addmesh, addDefaultCamera3D], - [updateMesh] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .run() /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) @@ -42,18 +52,4 @@ function addmesh(world) { new Cleanup() ]) .build() -} - -/** - * @param {World} world - */ -function updateMesh(world) { - const query = new Query(world, [Position3D, Meshed]) - const clock = world.getResource(VirtualClock) - const dt = clock.getElapsed() - - query.each(([position]) => { - position.x = Math.sin(dt) * 0.5 - position.y = Math.cos(dt) * 0.5 - }) -} +} \ No newline at end of file diff --git a/demos/demos/render/webgl/cameraorthographic.js b/examples/samples/render/webgl/cameraorthographic.js similarity index 66% rename from demos/demos/render/webgl/cameraorthographic.js rename to examples/samples/render/webgl/cameraorthographic.js index 53eeb9c1..dda48b1c 100644 --- a/demos/demos/render/webgl/cameraorthographic.js +++ b/examples/samples/render/webgl/cameraorthographic.js @@ -14,14 +14,29 @@ import { createMovable3D, Query, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' +import { HackPlugin, setupViewportWebgl } from '../../utils.js' -export const orthograhicCamera = new Demo( - 'orthograhic camera', - [addmesh, addCamera3D], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world @@ -43,7 +58,7 @@ function addCamera3D(world) { /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/render/webgl/cameraperspective.js b/examples/samples/render/webgl/cameraperspective.js similarity index 64% rename from demos/demos/render/webgl/cameraperspective.js rename to examples/samples/render/webgl/cameraperspective.js index 2c076d16..32289dda 100644 --- a/demos/demos/render/webgl/cameraperspective.js +++ b/examples/samples/render/webgl/cameraperspective.js @@ -14,14 +14,29 @@ import { Query, Rotation3D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' +import { HackPlugin, setupViewportWebgl } from '../../utils.js' -export const perspectiveCamera = new Demo( - 'perspective camera', - [addmesh, addCamera3D], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world @@ -41,7 +56,7 @@ function addCamera3D(world) { /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/render/webgl/camerarotate.js b/examples/samples/render/webgl/camerarotate.js similarity index 64% rename from demos/demos/render/webgl/camerarotate.js rename to examples/samples/render/webgl/camerarotate.js index 78297845..e10a96ab 100644 --- a/demos/demos/render/webgl/camerarotate.js +++ b/examples/samples/render/webgl/camerarotate.js @@ -13,14 +13,29 @@ import { createRawMovable3D, Query, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' +import { HackPlugin, setupViewportWebgl } from '../../utils.js' -export const cameraRotate = new Demo( - 'camera rotate', - [addmesh, addCamera3D], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world @@ -42,7 +57,7 @@ function addCamera3D(world) { /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/render/webgl/colorchangetriangle.js b/examples/samples/render/webgl/colorchangetriangle.js similarity index 68% rename from demos/demos/render/webgl/colorchangetriangle.js rename to examples/samples/render/webgl/colorchangetriangle.js index a13e0596..c5bfc47b 100644 --- a/demos/demos/render/webgl/colorchangetriangle.js +++ b/examples/samples/render/webgl/colorchangetriangle.js @@ -10,26 +10,39 @@ import { BasicMaterial3D, Meshed, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' - -const MATERIAL_PATH = 'colorChange' - -export const changecolortriangle = new Demo( - 'color changing triangle', - [addmesh, addDefaultCamera3D], - [changeColor] -) +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' class ChangeColor { color = new Color(0.003, 0.006, 0.012) } +const MATERIAL_PATH = 'colorChange' +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, changeColor) + .run() + /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { world.setResource(new ChangeColor()) const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) diff --git a/demos/demos/render/webgl/geometries.js b/examples/samples/render/webgl/geometries.js similarity index 68% rename from demos/demos/render/webgl/geometries.js rename to examples/samples/render/webgl/geometries.js index 9caf6463..21a508d7 100644 --- a/demos/demos/render/webgl/geometries.js +++ b/examples/samples/render/webgl/geometries.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, Position3D, Rotation3D, @@ -12,20 +11,34 @@ import { createMovable3D, Query, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' -export const geometries = new Demo( - 'mesh geometries', - [addmeshes, addDefaultCamera3D], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMeshes) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world */ -function addmeshes(world) { +function spawnMeshes(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/examples/samples/render/webgl/index.js b/examples/samples/render/webgl/index.js new file mode 100644 index 00000000..8e6a1927 --- /dev/null +++ b/examples/samples/render/webgl/index.js @@ -0,0 +1,15 @@ +const basictriangle = new URL("./basictriangle.js", import.meta.url) +const colorchangetriangle = new URL("./colorchangetriangle.js", import.meta.url) +const geometries = new URL("./geometries.js", import.meta.url) +const camerarotate = new URL("./camerarotate.js", import.meta.url) +const cameraperspective = new URL("./cameraperspective.js", import.meta.url) +const cameraorthographic = new URL("./cameraorthographic.js", import.meta.url) + +export default { + "basictriangle": basictriangle, + "colorchangetriangle": colorchangetriangle, + "geometries": geometries, + "camerarotate": camerarotate, + "cameraperspective": cameraperspective, + "cameraorthographic": cameraorthographic +} diff --git a/examples/samples/transform/2d/index.js b/examples/samples/transform/2d/index.js new file mode 100644 index 00000000..a19d9791 --- /dev/null +++ b/examples/samples/transform/2d/index.js @@ -0,0 +1,13 @@ +const translate2d = new URL("./translate.js", import.meta.url) +const rotate2d = new URL("./rotate.js", import.meta.url) +const scale2d = new URL("./scale.js", import.meta.url) +const propagate2d = new URL("./propagate.js", import.meta.url) +const lookat2d = new URL("./lookat.js", import.meta.url) + +export default { + "translate2d": translate2d, + "rotate2d": rotate2d, + "scale2d": scale2d, + "propagate2d": propagate2d, + "lookat2d": lookat2d +} diff --git a/demos/demos/transform/2d/lookat.js b/examples/samples/transform/2d/lookat.js similarity index 79% rename from demos/demos/transform/2d/lookat.js rename to examples/samples/transform/2d/lookat.js index e1f6c735..086ecc04 100644 --- a/demos/demos/transform/2d/lookat.js +++ b/examples/samples/transform/2d/lookat.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, World, Cleanup, @@ -19,15 +18,34 @@ import { Color, HALF_PI, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' -export default new Demo( - 'transform2d/lookAt', - [spawnLookers, spawnTarget, addDefaultCamera2D], - [updateLookers, updateTarget] -) +class Target { } +class Looker { } + +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, spawnLookers) + .registerSystem(AppSchedule.Startup, spawnTarget) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerSystem(AppSchedule.Update, updateLookers) + .registerSystem(AppSchedule.Update, updateTarget) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world @@ -131,6 +149,3 @@ function updateTarget(world) { position.x = amplitudeX * Math.cos(dt * frequencyX * speed) position.y = amplitudeY * Math.sin(dt * frequencyY * speed) } - -class Target { } -class Looker { } diff --git a/demos/demos/transform/2d/propagate.js b/examples/samples/transform/2d/propagate.js similarity index 75% rename from demos/demos/transform/2d/propagate.js rename to examples/samples/transform/2d/propagate.js index 1cf88c5f..f211402f 100644 --- a/demos/demos/transform/2d/propagate.js +++ b/examples/samples/transform/2d/propagate.js @@ -19,15 +19,29 @@ import { has, PI, QUARTER_PI, - Rotary + Rotary, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + App } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' -export default new Demo( - 'transform2d/propagate', - [addDefaultCamera2D, addMeshes], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addMeshes) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, update) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/demos/demos/transform/2d/rotate.js b/examples/samples/transform/2d/rotate.js similarity index 58% rename from demos/demos/transform/2d/rotate.js rename to examples/samples/transform/2d/rotate.js index 15eb9a72..fa776115 100644 --- a/demos/demos/transform/2d/rotate.js +++ b/examples/samples/transform/2d/rotate.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, World, Cleanup, @@ -12,16 +11,28 @@ import { PI, Query, BasicMaterialAssets, - MeshAssets + MeshAssets, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + App } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' - -export default new Demo( - 'transform2d/rotate', - [addmesh, addDefaultCamera2D], - [update] -) +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' +const app = new App() +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addmesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, update) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world */ diff --git a/demos/demos/transform/2d/scale.js b/examples/samples/transform/2d/scale.js similarity index 61% rename from demos/demos/transform/2d/scale.js rename to examples/samples/transform/2d/scale.js index 92f73343..89bd555f 100644 --- a/demos/demos/transform/2d/scale.js +++ b/examples/samples/transform/2d/scale.js @@ -12,15 +12,29 @@ import { BasicMaterial2D, createTransform2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' -export default new Demo( - 'transform2d/scale', - [addmesh, addDefaultCamera2D], - [updateMesh] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addmesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, updateMesh) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/demos/demos/transform/2d/translate.js b/examples/samples/transform/2d/translate.js similarity index 61% rename from demos/demos/transform/2d/translate.js rename to examples/samples/transform/2d/translate.js index bf551f31..b670a6c4 100644 --- a/demos/demos/transform/2d/translate.js +++ b/examples/samples/transform/2d/translate.js @@ -12,15 +12,29 @@ import { Meshed, createTransform2D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + Canvas2DRendererPlugin, + DOMWindowPlugin, + DefaultPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' -export default new Demo( - 'transform2d/translate', - [addmesh, addDefaultCamera2D], - [updateMesh] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, addmesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, updateMesh) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/examples/samples/transform/3d/index.js b/examples/samples/transform/3d/index.js new file mode 100644 index 00000000..ad561ee2 --- /dev/null +++ b/examples/samples/transform/3d/index.js @@ -0,0 +1,13 @@ +const translate3d = new URL("./translate.js", import.meta.url) +const rotate3d = new URL("./rotate.js", import.meta.url) +const scale3d = new URL("./scale.js", import.meta.url) +const lookAt3d = new URL("./lookat.js", import.meta.url) +const propagate3d = new URL("./propagate.js", import.meta.url) + +export default { + "translate3d": translate3d, + "rotate3d": rotate3d, + "scale3d": scale3d, + "lookAt3d": lookAt3d, + "propagate3d": propagate3d +} diff --git a/demos/demos/transform/3d/lookat.js b/examples/samples/transform/3d/lookat.js similarity index 76% rename from demos/demos/transform/3d/lookat.js rename to examples/samples/transform/3d/lookat.js index 1bf13c03..1cc8a648 100644 --- a/demos/demos/transform/3d/lookat.js +++ b/examples/samples/transform/3d/lookat.js @@ -17,20 +17,40 @@ import { Position3D, Color, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo( - 'transform3d/lookAt', - [addLookers, addTarget, addDefaultCamera3D], - [updateLookers, updateTarget] -) + +class Target { } +class Looker { } + +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnLookers) + .registerSystem(AppSchedule.Startup, spawnTarget) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, updateLookers) + .registerSystem(AppSchedule.Update, updateTarget) + .run() /** * @param {World} world */ -function addLookers(world) { +function spawnLookers(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) @@ -58,7 +78,7 @@ function addLookers(world) { /** * @param {World} world */ -function addTarget(world) { +function spawnTarget(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) @@ -130,6 +150,3 @@ function updateTarget(world) { position.x = amplitudeX * Math.cos(dt * frequencyX * speed) position.y = amplitudeY * Math.sin(dt * frequencyY * speed) } - -class Target { } -class Looker { } diff --git a/demos/demos/transform/3d/propagate.js b/examples/samples/transform/3d/propagate.js similarity index 74% rename from demos/demos/transform/3d/propagate.js rename to examples/samples/transform/3d/propagate.js index 7652178a..2aa1b8b9 100644 --- a/demos/demos/transform/3d/propagate.js +++ b/examples/samples/transform/3d/propagate.js @@ -18,20 +18,34 @@ import { MeshAssets, has, QUARTER_PI, - without + without, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo( - 'transform3d/propagate', - [addDefaultCamera3D, addMeshes], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMeshes) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world */ -function addMeshes(world) { +function spawnMeshes(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/transform/3d/rotate.js b/examples/samples/transform/3d/rotate.js similarity index 56% rename from demos/demos/transform/3d/rotate.js rename to examples/samples/transform/3d/rotate.js index 67933de6..585be8e7 100644 --- a/demos/demos/transform/3d/rotate.js +++ b/examples/samples/transform/3d/rotate.js @@ -12,20 +12,34 @@ import { PI, Query, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo( - 'transform3d/rotate', - [addmesh, addDefaultCamera3D], - [update] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, update) + .run() /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/transform/3d/scale.js b/examples/samples/transform/3d/scale.js similarity index 58% rename from demos/demos/transform/3d/scale.js rename to examples/samples/transform/3d/scale.js index b38bd3d6..96d58db5 100644 --- a/demos/demos/transform/3d/scale.js +++ b/examples/samples/transform/3d/scale.js @@ -12,20 +12,34 @@ import { BasicMaterial3D, createTransform3D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo( - 'transform3d/scale', - [addmesh, addDefaultCamera3D], - [updateMesh] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, updateMesh) + .run() /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/demos/demos/transform/3d/translate.js b/examples/samples/transform/3d/translate.js similarity index 59% rename from demos/demos/transform/3d/translate.js rename to examples/samples/transform/3d/translate.js index b7eb5d3e..ef1ffa16 100644 --- a/demos/demos/transform/3d/translate.js +++ b/examples/samples/transform/3d/translate.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, Position3D, World, @@ -12,20 +11,34 @@ import { Meshed, createTransform3D, BasicMaterialAssets, - MeshAssets + MeshAssets, + App, + AppSchedule, + DOMWindowPlugin, + DefaultPlugin, + FPSDebugger, + WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' -export default new Demo( - 'transform3d/translate', - [addmesh, addDefaultCamera3D], - [updateMesh] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new WebglRendererPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerDebugger(new FPSDebugger()) + .registerSystem(AppSchedule.Startup, spawnMesh) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) + .registerSystem(AppSchedule.Update, setupViewportWebgl) + .registerSystem(AppSchedule.Update, updateMesh) + .run() /** * @param {World} world */ -function addmesh(world) { +function spawnMesh(world) { const commands = world.getResource(EntityCommands) const meshes = world.getResource(MeshAssets) const materials = world.getResource(BasicMaterialAssets) diff --git a/examples/samples/transform/index.js b/examples/samples/transform/index.js new file mode 100644 index 00000000..379f0c48 --- /dev/null +++ b/examples/samples/transform/index.js @@ -0,0 +1,7 @@ +import { default as d2 } from "./2d/index.js"; +import { default as d3 } from "./3d/index.js"; + +export default { + "2d": d2, + "3d": d3 +} \ No newline at end of file diff --git a/demos/demos/tween/easing.js b/examples/samples/tween/easing.js similarity index 70% rename from demos/demos/tween/easing.js rename to examples/samples/tween/easing.js index 978d42cb..26961600 100644 --- a/demos/demos/tween/easing.js +++ b/examples/samples/tween/easing.js @@ -7,21 +7,34 @@ import { TweenFlip, createTransform2D, World, - Demo, Cleanup, EntityCommands, Assets, typeidGeneric, BasicMaterial, Meshed, - BasicMaterial2D + BasicMaterial2D, + App, + AppSchedule, + Canvas2DRendererPlugin, + DefaultPlugin, + DOMWindowPlugin, + FPSDebugger } from 'wima' -import { addDefaultCamera2D } from '../utils.js' +import { addDefaultCamera2D, HackPlugin, setupViewport } from '../utils.js' -export default new Demo( - 'easing', - [init, addDefaultCamera2D] -) +const app = new App() + +app + .registerPlugin(new HackPlugin()) + .registerPlugin(new DefaultPlugin()) + .registerPlugin(new DOMWindowPlugin()) + .registerPlugin(new Canvas2DRendererPlugin()) + .registerSystem(AppSchedule.Startup, init) + .registerSystem(AppSchedule.Startup, addDefaultCamera2D) + .registerSystem(AppSchedule.Update, setupViewport) + .registerDebugger(new FPSDebugger()) + .run() /** * @param {World} world diff --git a/examples/samples/tween/index.js b/examples/samples/tween/index.js new file mode 100644 index 00000000..2db184a6 --- /dev/null +++ b/examples/samples/tween/index.js @@ -0,0 +1,5 @@ +const easing = new URL("./easing.js", import.meta.url) + +export default { + "easing": easing +} diff --git a/demos/demos/utils.js b/examples/samples/utils.js similarity index 64% rename from demos/demos/utils.js rename to examples/samples/utils.js index 8e2a7825..0f2ef215 100644 --- a/demos/demos/utils.js +++ b/examples/samples/utils.js @@ -17,19 +17,15 @@ import { BasicMaterial, Parser, AudioParser, - ImageParser + ImageParser, + Query, + WindowCommands, + Entity, + MainWindow, + warn, + Windows } from 'wima' -// gizmo labels -export class Demo1 { } -export class Demo2 { } - -/** @augments Gizmo2D */ -export class Demo1Gizmo2D extends Gizmo2D { } - -/** @augments Gizmo2D */ -export class Demo2Gizmo2D extends Gizmo2D { } - /** * @param {World} world */ @@ -54,17 +50,55 @@ export function addDefaultCamera2D(world) { .build() } -export class ResourceAliasPlugin extends Plugin { +/** + * @param {World} world + */ +export function setupViewport(world) { + const windowcommands = world.getResource(WindowCommands) + const window = new Query(world, [Entity, MainWindow]).single() + + if (!window) return warn('No main window defined.') + + windowcommands + .window(window[0]) + .resize(innerWidth, innerHeight) +} + +/** +* @param {World} world +*/ +export function setupViewportWebgl(world) { + const windowcommands = world.getResource(WindowCommands) + const window = new Query(world, [Entity, MainWindow]).single() + const canvases = world.getResource(Windows) + const width = innerWidth + const height = innerHeight + + if (!window) return warn('No main window defined.') + + const [entity] = window + const canvas = canvases.getWindow(entity) + + if (!canvas) return + + const gl = canvas.getContext('webgl2') + + if (!gl) return + + gl.viewport(0, 0, width, height) + windowcommands + .window(entity) + .resize(width, height) +} + +// Sometimes features that are supposed to be there arent, this plugin +// provides some hacks to "just enable" code to work until they land. +export class HackPlugin extends Plugin { /** * @param {App} app */ register(app) { - const world = app.getWorld() - - world.setResourceAlias(typeidGeneric(Gizmo2D, [Demo1]), Demo1Gizmo2D) - world.setResourceAlias(typeidGeneric(Gizmo2D, [Demo2]), Demo2Gizmo2D) - // HACK: This is a hack until system sets and ordering is introduced. { app From 8bd4d3dd3d0eed811be16d86e94bd0febfd21125 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Wed, 17 Dec 2025 23:16:24 +0300 Subject: [PATCH 4/6] Update configuration files --- .config/lint.config.js | 2 +- .config/tsc.lint.json | 2 +- .config/vite.config.js | 3 ++- package.json | 10 +++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.config/lint.config.js b/.config/lint.config.js index 9d178572..975472fd 100644 --- a/.config/lint.config.js +++ b/.config/lint.config.js @@ -1,4 +1,4 @@ export default { "src/**/*.js":"npm run eslint -- --fix", - "demos/**/*.js":"npm run eslint -- --fix" + "examples/**/*.js":"npm run eslint -- --fix" } \ No newline at end of file diff --git a/.config/tsc.lint.json b/.config/tsc.lint.json index 5e107b90..1014648a 100644 --- a/.config/tsc.lint.json +++ b/.config/tsc.lint.json @@ -1,7 +1,7 @@ { "include": [ "../src", - "../demos" + "../examples" ], "exclude":[ ], diff --git a/.config/vite.config.js b/.config/vite.config.js index 8b347aa3..5e07a986 100644 --- a/.config/vite.config.js +++ b/.config/vite.config.js @@ -3,10 +3,11 @@ import {resolve} from 'path' import { cwd } from "process" export default defineConfig({ + publicDir:'assets', server: { port: 8082, strictPort: true, - open: "/demos/index.html", + open: "/examples/index.html", }, resolve: { alias: [{ diff --git a/package.json b/package.json index 7d5ed3bc..44d632ae 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "scripts": { "start": "vite --config .config/vite.config.js", - "dev": "npm run build:lib", + "dev": "vite --config .config/vite.config.js", "init": "husky .husky", "rollup": "rollup --config .config/rollup.config.js", "eslint": "eslint --config .config/eslint.config.js --ignore-pattern '**/*.test.js'", @@ -35,12 +35,12 @@ "build": "npm run build:lib && npm run build:docs", "build:lib": "npm run types && npm run rollup && npm run clean:types", "build:docs": "npm run typedoc", - "lint": "npm run lint:src && npm run lint:demos", - "lint:dry": "npm run lint:src-dry && npm run lint:demos-dry", + "lint": "npm run lint:src && npm run lint:examples", + "lint:dry": "npm run lint:src-dry && npm run lint:examples-dry", "lint:src-dry": "npm run eslint -- src", - "lint:demos-dry": "npm run eslint -- demos", + "lint:examples-dry": "npm run eslint -- examples", "lint:src": "npm run lint:src-dry -- --fix", - "lint:demos": "npm run lint:demos-dry -- --fix", + "lint:examples": "npm run lint:examples-dry -- --fix", "tsc:lint": "tsc -p .config/tsc.lint.json", "watch:src": "npm run rollup -- --watch", "watch:docs": "npm run typedoc -- --watch", From d167f74be37218778de423883a7eb0346155e5af Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Wed, 17 Dec 2025 23:19:08 +0300 Subject: [PATCH 5/6] Update tests using external assets --- src/asset/tests/assetserver.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/asset/tests/assetserver.test.js b/src/asset/tests/assetserver.test.js index d476ffa9..ff6c2eca 100644 --- a/src/asset/tests/assetserver.test.js +++ b/src/asset/tests/assetserver.test.js @@ -35,15 +35,15 @@ class TextParser extends Parser { describe('Testing `AssetServer`', () => { test('Asset is cached by server.', () => { const server = createServer() - const handle1 = server.load(Text,"/demos/assets/text/sample.txt") - const handle2 = server.load(Text,"/demos/assets/text/sample.txt") + const handle1 = server.load(Text,"/assets/text/sample.txt") + const handle2 = server.load(Text,"/assets/text/sample.txt") deepStrictEqual(handle1.id(),handle2.id()) }) test('Unloaded asset gets new handle when reloaded.', () => { const server = createServer() - const handle1 = server.load(Text,"/demos/assets/text/sample.txt") + const handle1 = server.load(Text,"/assets/text/sample.txt") handle1.drop() @@ -52,8 +52,8 @@ describe('Testing `AssetServer`', () => { // TODO: Remove when handles are unique // handles arent unique yet, so this ensures handle is at a different index - const handle3 = server.load(Text,"/demos/assets/text/sample2.txt") - const handle2 = server.load(Text,"/demos/assets/text/sample.txt") + const handle3 = server.load(Text,"/assets/text/sample2.txt") + const handle2 = server.load(Text,"/assets/text/sample.txt") notDeepStrictEqual(handle1.id(),handle2.id()) }) From a7a4da9600b58c37595f1fbaaf2157e613277452 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sun, 1 Feb 2026 21:57:27 +0300 Subject: [PATCH 6/6] Lint files --- examples/example.js | 43 +++++++++------- examples/main.js | 49 ++++++++++--------- examples/samples/animation/2d/index.js | 6 +-- examples/samples/animation/3d/basic.js | 13 +++-- examples/samples/animation/3d/index.js | 4 +- examples/samples/animation/index.js | 10 ++-- examples/samples/audio/audioGraph.js | 7 +-- examples/samples/audio/audioOscillator.js | 5 +- examples/samples/audio/audioPlayback.js | 8 +-- examples/samples/audio/audioPlayer.js | 10 ++-- examples/samples/audio/index.js | 16 +++--- examples/samples/ecs/index.js | 8 +-- examples/samples/gizmos/2d/arcs.js | 5 +- examples/samples/gizmos/2d/grid.js | 4 +- examples/samples/gizmos/2d/index.js | 16 +++--- examples/samples/gizmos/2d/linestyle.js | 6 ++- examples/samples/gizmos/2d/shapes.js | 6 ++- examples/samples/gizmos/index.js | 6 +-- examples/samples/index.js | 18 +++---- examples/samples/input/index.js | 12 ++--- examples/samples/input/keyboard.js | 1 - examples/samples/input/touch.js | 1 - examples/samples/render/canvas-2d/index.js | 4 +- examples/samples/render/index.js | 9 ++-- .../samples/render/webgl/basictriangle.js | 3 +- .../render/webgl/cameraorthographic.js | 1 - .../samples/render/webgl/cameraperspective.js | 1 - examples/samples/render/webgl/camerarotate.js | 1 - .../render/webgl/colorchangetriangle.js | 1 - examples/samples/render/webgl/index.js | 24 ++++----- examples/samples/transform/2d/index.js | 20 ++++---- examples/samples/transform/2d/propagate.js | 1 - examples/samples/transform/2d/rotate.js | 2 + examples/samples/transform/2d/scale.js | 2 +- examples/samples/transform/2d/translate.js | 1 - examples/samples/transform/3d/index.js | 20 ++++---- examples/samples/transform/3d/lookat.js | 4 +- examples/samples/transform/3d/propagate.js | 3 +- examples/samples/transform/3d/rotate.js | 3 +- examples/samples/transform/3d/scale.js | 3 +- examples/samples/transform/3d/translate.js | 2 +- examples/samples/transform/index.js | 10 ++-- examples/samples/tween/index.js | 4 +- examples/samples/utils.js | 36 +++++++------- 44 files changed, 209 insertions(+), 200 deletions(-) diff --git a/examples/example.js b/examples/example.js index 61d6feee..365d236b 100644 --- a/examples/example.js +++ b/examples/example.js @@ -1,30 +1,37 @@ -import samples from "./samples/index.js"; +import samples from './samples/index.js' init() +/** + * + */ function init() { - const params = new URLSearchParams(window.location.search); - const name = params.get("example") - - if(!name || name === '') { - const warning = "No example selected." + const params = new URLSearchParams(window.location.search) + const name = params.get('example') + + if (!name || name === '') { + const warning = 'No example selected.' + document.body.append(document.createTextNode(warning)) + return } - + const demo = recursiveSelect( - name.split('/').filter(e=>e.length !== 0), + name.split('/').filter((e) => e.length !== 0), samples ) - if(!demo) { - const warning = "The example selected does not exist." + if (!demo) { + const warning = 'The example selected does not exist.' + document.body.append(document.createTextNode(warning)) + return } const script = document.createElement('script') - + script.type = 'module' script.src = demo document.head.append(script) @@ -32,24 +39,24 @@ function init() { /** * @param {string[]} items - * @param {Record} map + * @param {Record} map * @returns {string | undefined} */ -function recursiveSelect(items,map){ +function recursiveSelect(items, map) { const name = items.shift() - if(!name){ + if (!name) { return undefined } - + const item = map[name] - if(item instanceof URL) { + if (item instanceof URL) { return item.pathname } - if(item === undefined) { + if (item === undefined) { return undefined } - return recursiveSelect(items,item) + return recursiveSelect(items, item) } diff --git a/examples/main.js b/examples/main.js index 1d33718a..4b48f32e 100644 --- a/examples/main.js +++ b/examples/main.js @@ -1,15 +1,17 @@ -import samples from "./samples/index.js" +import samples from './samples/index.js' -const container = document.body.appendChild(document.createElement("div")) -const opts = container.appendChild(document.createElement("select")) +const container = document.body.appendChild(document.createElement('div')) +const opts = container.appendChild(document.createElement('select')) -container.style.position = "absolute" -container.style.top = "0px" -container.style.left = "0px" +container.style.position = 'absolute' +container.style.top = '0px' +container.style.left = '0px' opts.addEventListener('change', (e) => { const { target } = e + if (!(target instanceof HTMLSelectElement)) return - localStorage.setItem("play", target.value) + + localStorage.setItem('play', target.value) switchDemo(target.value) }) @@ -18,37 +20,40 @@ opts.addEventListener('change', (e) => { * @param {string} name */ async function switchDemo(name) { - const frame = document.getElementById("example-frame") - const link = document.getElementById("popper") + const frame = document.getElementById('example-frame') + const link = document.getElementById('popper') if (!(frame instanceof HTMLIFrameElement)) { - throw "The element selected is not an iframe" + throw 'The element selected is not an iframe' } if (!(link instanceof HTMLAnchorElement)) { - throw "The element selected is not an anchor" + throw 'The element selected is not an anchor' } + const linkSource = `./example.html?example=${name}` + frame.src = linkSource link.href = linkSource } /** * @param {Record} demos - * @param {string} prefix + * @param {string} prefix */ function setupOpts(demos, prefix = '') { - if (prefix != '') { - prefix += '/' - } + const fix = prefix !== '' ? `${prefix}/` : prefix for (const name in demos) { - const prename = prefix + name + const prename = fix + name + if (demos[name] instanceof URL) { - const opt = document.createElement("option") - opt.append(document.createTextNode(prefix + name)) + const opt = document.createElement('option') + + opt.append(document.createTextNode(fix + name)) opts.append(opt) continue } + setupOpts(demos[name], prename) } } @@ -57,9 +62,9 @@ function setupOpts(demos, prefix = '') { * @param {Item} demos */ function init(demos) { - let name = localStorage.getItem("play") - if (!name) - name = Object.keys(demos)[0] || null + let name = localStorage.getItem('play') + + if (!name) name = Object.keys(demos)[0] || null if (!name) return switchDemo(name) @@ -70,4 +75,4 @@ setupOpts(samples) /** * @typedef {{ [x: string]: URL | Item}} Item - */ \ No newline at end of file + */ diff --git a/examples/samples/animation/2d/index.js b/examples/samples/animation/2d/index.js index 07f1e1dd..df60245c 100644 --- a/examples/samples/animation/2d/index.js +++ b/examples/samples/animation/2d/index.js @@ -1,5 +1,5 @@ -const basic = new URL("./basic.js", import.meta.url) +const basic = new URL('./basic.js', import.meta.url) export default { - "basic": basic -} \ No newline at end of file + 'basic': basic +} diff --git a/examples/samples/animation/3d/basic.js b/examples/samples/animation/3d/basic.js index b96ecee4..4ec7524b 100644 --- a/examples/samples/animation/3d/basic.js +++ b/examples/samples/animation/3d/basic.js @@ -1,7 +1,6 @@ import { Mesh, World, - Demo, Cleanup, AnimationClip, AnimationTrack, @@ -29,9 +28,10 @@ import { DefaultPlugin, DOMWindowPlugin, FPSDebugger, - WebglRendererPlugin + WebglRendererPlugin, + AnimationPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' const app = new App() @@ -39,13 +39,16 @@ app .registerPlugin(new HackPlugin()) .registerPlugin(new WebglRendererPlugin()) .registerPlugin(new DefaultPlugin()) + .registerPlugin(new AnimationPlugin()) .registerPlugin(new DOMWindowPlugin()) .registerDebugger(new FPSDebugger()) .registerSystem(AppSchedule.Startup, init) - .registerSystem(AppSchedule.Update, addDefaultCamera3D) + .registerSystem(AppSchedule.Startup, addDefaultCamera3D) .registerSystem(AppSchedule.Update, setupViewportWebgl) .run() - + +console.log(app) + /** * @param {World} world */ diff --git a/examples/samples/animation/3d/index.js b/examples/samples/animation/3d/index.js index 74628dd4..df60245c 100644 --- a/examples/samples/animation/3d/index.js +++ b/examples/samples/animation/3d/index.js @@ -1,5 +1,5 @@ -const basic = new URL("./basic.js", import.meta.url) +const basic = new URL('./basic.js', import.meta.url) export default { - "basic": basic + 'basic': basic } diff --git a/examples/samples/animation/index.js b/examples/samples/animation/index.js index 2d83ac05..15ae735d 100644 --- a/examples/samples/animation/index.js +++ b/examples/samples/animation/index.js @@ -1,7 +1,7 @@ -import { default as d2 } from "./2d/index.js"; -import { default as d3 } from "./2d/index.js"; +import { default as d2 } from './2d/index.js' +import { default as d3 } from './3d/index.js' export default { - "2d": d2, - "3d": d3 -} \ No newline at end of file + '2d': d2, + '3d': d3 +} diff --git a/examples/samples/audio/audioGraph.js b/examples/samples/audio/audioGraph.js index 56308a23..c9a0e246 100644 --- a/examples/samples/audio/audioGraph.js +++ b/examples/samples/audio/audioGraph.js @@ -33,12 +33,13 @@ class Playing { // Why use a plugin? The current implentation does not have system sets and // systems registered directly on the App are precede ones registered by plugins. -// This conflict is between internal engine system and external engine systems ordering. +// This conflict is between internal engine system and external engine systems ordering. class MyPlugin extends Plugin { + /** * @param {App} app */ - register(app){ + register(app) { app.registerSystem(AppSchedule.Startup, init) } } @@ -60,7 +61,7 @@ app */ function init(world) { const server = world.getResource(AssetServer) - const handle = server.load(Audio, 'assets/audio/hit.mp3') + const handle = server.load(Audio, '/audio/hit.mp3') world.setResource(new Playing(handle)) } diff --git a/examples/samples/audio/audioOscillator.js b/examples/samples/audio/audioOscillator.js index a240dbdc..a666c776 100644 --- a/examples/samples/audio/audioOscillator.js +++ b/examples/samples/audio/audioOscillator.js @@ -1,5 +1,4 @@ import { - Demo, World, AudioOscillator, EntityCommands, @@ -32,7 +31,7 @@ app */ function init(world) { const commands = world.getResource(EntityCommands) - + commands .spawn() .insertPrefab([ @@ -43,4 +42,4 @@ function init(world) { new Cleanup() ]) .build() -} \ No newline at end of file +} diff --git a/examples/samples/audio/audioPlayback.js b/examples/samples/audio/audioPlayback.js index 135b9b6c..fc69212b 100644 --- a/examples/samples/audio/audioPlayback.js +++ b/examples/samples/audio/audioPlayback.js @@ -1,5 +1,4 @@ import { - Demo, World, Audio, AudioPlayer, @@ -24,12 +23,13 @@ class AudioTimer extends Timer {} // Why use a plugin? The current implentation does not have system sets and // systems registered directly on the App are precede ones registered by plugins. -// This conflict is between internal engine system and external engine systems ordering. +// This conflict is between internal engine system and external engine systems ordering. class MyPlugin extends Plugin { + /** * @param {App} app */ - register(app){ + register(app) { app.registerSystem(AppSchedule.Startup, init) } } @@ -62,7 +62,7 @@ function init(world) { .spawn() .insertPrefab([ new AudioPlayer({ - audio: server.load(Audio, '../assets/audio/bad-apple.m4a') + audio: server.load(Audio, '/audio/bad-apple.m4a') }), new Timer({ mode: TimerMode.Once, diff --git a/examples/samples/audio/audioPlayer.js b/examples/samples/audio/audioPlayer.js index 015ac030..a350c920 100644 --- a/examples/samples/audio/audioPlayer.js +++ b/examples/samples/audio/audioPlayer.js @@ -1,5 +1,4 @@ import { - Demo, World, AssetServer, AudioPlayer, @@ -20,12 +19,13 @@ import { HackPlugin, setupViewport } from '../utils.js' // Why use a plugin? The current implentation does not have system sets and // systems registered directly on the App are precede ones registered by plugins. -// This conflict is between internal engine system and external engine systems ordering. +// This conflict is between internal engine system and external engine systems ordering. class MyPlugin extends Plugin { + /** * @param {App} app */ - register(app){ + register(app) { app.registerSystem(AppSchedule.Startup, init) } } @@ -53,7 +53,7 @@ function init(world) { .spawn() .insertPrefab([ new AudioPlayer({ - audio: server.load(Audio, '../assets/audio/bad-apple.m4a') + audio: server.load(Audio, '/audio/bad-apple.m4a') }), new Timer({ mode: TimerMode.Repeat @@ -61,4 +61,4 @@ function init(world) { new Cleanup() ]) .build() -} \ No newline at end of file +} diff --git a/examples/samples/audio/index.js b/examples/samples/audio/index.js index 0f69d2cf..072fec90 100644 --- a/examples/samples/audio/index.js +++ b/examples/samples/audio/index.js @@ -1,11 +1,11 @@ -const audioGraph = new URL("./audioGraph.js", import.meta.url) -const audioPlayer = new URL("./audioPlayer.js", import.meta.url) -const audioPlayback = new URL("./audioPlayback.js", import.meta.url) -const audioOscillator = new URL("./audioOscillator.js", import.meta.url) +const audioGraph = new URL('./audioGraph.js', import.meta.url) +const audioPlayer = new URL('./audioPlayer.js', import.meta.url) +const audioPlayback = new URL('./audioPlayback.js', import.meta.url) +const audioOscillator = new URL('./audioOscillator.js', import.meta.url) export default { - "audioGraph": audioGraph, - "audioPlayer": audioPlayer, - "audioPlayback": audioPlayback, - "audioOscillator": audioOscillator + 'audioGraph': audioGraph, + 'audioPlayer': audioPlayer, + 'audioPlayback': audioPlayback, + 'audioOscillator': audioOscillator } diff --git a/examples/samples/ecs/index.js b/examples/samples/ecs/index.js index ba87ec7b..fc7462d0 100644 --- a/examples/samples/ecs/index.js +++ b/examples/samples/ecs/index.js @@ -1,7 +1,7 @@ -const spawn = new URL("./spawn.js", import.meta.url) -const despawn = new URL("./despawn.js", import.meta.url) +const spawn = new URL('./spawn.js', import.meta.url) +const despawn = new URL('./despawn.js', import.meta.url) export default { - "spawn": spawn, - "despawn": despawn + 'spawn': spawn, + 'despawn': despawn } diff --git a/examples/samples/gizmos/2d/arcs.js b/examples/samples/gizmos/2d/arcs.js index 2a5363dc..a2c2835a 100644 --- a/examples/samples/gizmos/2d/arcs.js +++ b/examples/samples/gizmos/2d/arcs.js @@ -18,6 +18,7 @@ import { import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' class Demo { } + /** * @augments {Gizmo2D} */ @@ -26,7 +27,7 @@ class DemoGizmo2D extends Gizmo2D { } const app = new App() // We have to alias the gizmo resource manually -app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D, [Demo]), DemoGizmo2D) app .registerPlugin(new HackPlugin()) @@ -125,4 +126,4 @@ function drawEllipticalArcs(world) { .ellipse(radiusX, radiusY, new Color(1, 1, 1, 1)) .axes(20) .reset() -} \ No newline at end of file +} diff --git a/examples/samples/gizmos/2d/grid.js b/examples/samples/gizmos/2d/grid.js index 1546ac80..be256d4f 100644 --- a/examples/samples/gizmos/2d/grid.js +++ b/examples/samples/gizmos/2d/grid.js @@ -26,7 +26,7 @@ class DemoGizmo2D extends Gizmo2D { } const app = new App() // We have to alias the gizmo resource manually -app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D, [Demo]), DemoGizmo2D) app .registerPlugin(new HackPlugin()) @@ -73,4 +73,4 @@ function drawGrid(world) { new BVector2(true, true) ) .reset() -} \ No newline at end of file +} diff --git a/examples/samples/gizmos/2d/index.js b/examples/samples/gizmos/2d/index.js index 35e0aecc..e89be28f 100644 --- a/examples/samples/gizmos/2d/index.js +++ b/examples/samples/gizmos/2d/index.js @@ -1,11 +1,11 @@ -const lineStyle = new URL("./linestyle.js", import.meta.url) -const arcs = new URL("./arcs.js", import.meta.url) -const shapes = new URL("./shapes.js", import.meta.url) -const grid = new URL("./grid.js", import.meta.url) +const lineStyle = new URL('./linestyle.js', import.meta.url) +const arcs = new URL('./arcs.js', import.meta.url) +const shapes = new URL('./shapes.js', import.meta.url) +const grid = new URL('./grid.js', import.meta.url) export default { - "arcs": arcs, - "shapes": shapes, - "grid": grid, - "line styles": lineStyle, + 'arcs': arcs, + 'shapes': shapes, + 'grid': grid, + 'line styles': lineStyle } diff --git a/examples/samples/gizmos/2d/linestyle.js b/examples/samples/gizmos/2d/linestyle.js index f015fd55..a456a053 100644 --- a/examples/samples/gizmos/2d/linestyle.js +++ b/examples/samples/gizmos/2d/linestyle.js @@ -17,10 +17,12 @@ import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' class Demo1 { } class Demo2 { } + /** * @augments {Gizmo2D} */ class Demo1Gizmo2D extends Gizmo2D { } + /** * @augments {Gizmo2D} */ @@ -29,8 +31,8 @@ class Demo2Gizmo2D extends Gizmo2D { } const app = new App() // We have to alias the gizmo resource manually -app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo1]), Demo1Gizmo2D) -app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo2]), Demo2Gizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D, [Demo1]), Demo1Gizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D, [Demo2]), Demo2Gizmo2D) app .registerPlugin(new HackPlugin()) diff --git a/examples/samples/gizmos/2d/shapes.js b/examples/samples/gizmos/2d/shapes.js index 2fc316fc..85f9f948 100644 --- a/examples/samples/gizmos/2d/shapes.js +++ b/examples/samples/gizmos/2d/shapes.js @@ -14,7 +14,9 @@ import { typeidGeneric } from 'wima' import { HackPlugin, addDefaultCamera2D, setupViewport } from '../../utils.js' + class Demo { } + /** * @augments {Gizmo2D} */ @@ -23,7 +25,7 @@ class DemoGizmo2D extends Gizmo2D { } const app = new App() // We have to alias the gizmo resource manually -app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D,[Demo]), DemoGizmo2D) +app.getWorld().setResourceAlias(typeidGeneric(Gizmo2D, [Demo]), DemoGizmo2D) app .registerPlugin(new HackPlugin()) @@ -74,4 +76,4 @@ function update(world) { .line(new Vector2(-50, 0), new Vector2(50, 0)) .axes(20) .reset() -} \ No newline at end of file +} diff --git a/examples/samples/gizmos/index.js b/examples/samples/gizmos/index.js index 0a887089..98a29256 100644 --- a/examples/samples/gizmos/index.js +++ b/examples/samples/gizmos/index.js @@ -1,5 +1,5 @@ -import { default as d2 } from "./2d/index.js"; +import { default as d2 } from './2d/index.js' export default { - "2d": d2 -} \ No newline at end of file + '2d': d2 +} diff --git a/examples/samples/index.js b/examples/samples/index.js index 527ce896..f0dd7903 100644 --- a/examples/samples/index.js +++ b/examples/samples/index.js @@ -8,12 +8,12 @@ import { default as tween } from './tween/index.js' import { default as gizmos } from './gizmos/index.js' export default { - "animation": animation, - "audio": audio, - "transform": transform, - "render": render, - "ecs": ecs, - "input": input, - "tween": tween, - "gizmos": gizmos -} \ No newline at end of file + 'animation': animation, + 'audio': audio, + 'transform': transform, + 'render': render, + 'ecs': ecs, + 'input': input, + 'tween': tween, + 'gizmos': gizmos +} diff --git a/examples/samples/input/index.js b/examples/samples/input/index.js index d11c7b78..731f2421 100644 --- a/examples/samples/input/index.js +++ b/examples/samples/input/index.js @@ -1,9 +1,9 @@ -const keyboard = new URL("./keyboard.js", import.meta.url) -const mouse = new URL("./mouse.js", import.meta.url) -const touch = new URL("./touch.js", import.meta.url) +const keyboard = new URL('./keyboard.js', import.meta.url) +const mouse = new URL('./mouse.js', import.meta.url) +const touch = new URL('./touch.js', import.meta.url) export default { - "keyboard": keyboard, - "mouse": mouse, - "touch": touch + 'keyboard': keyboard, + 'mouse': mouse, + 'touch': touch } diff --git a/examples/samples/input/keyboard.js b/examples/samples/input/keyboard.js index 19f282eb..1fcd70b5 100644 --- a/examples/samples/input/keyboard.js +++ b/examples/samples/input/keyboard.js @@ -3,7 +3,6 @@ import { createTransform2D, World, Color, - Demo, Query, EntityCommands, Cleanup, diff --git a/examples/samples/input/touch.js b/examples/samples/input/touch.js index f166f5c0..5280db50 100644 --- a/examples/samples/input/touch.js +++ b/examples/samples/input/touch.js @@ -3,7 +3,6 @@ import { createTransform2D, World, Color, - Demo, Query, EntityCommands, warn, diff --git a/examples/samples/render/canvas-2d/index.js b/examples/samples/render/canvas-2d/index.js index 908e100c..3af34165 100644 --- a/examples/samples/render/canvas-2d/index.js +++ b/examples/samples/render/canvas-2d/index.js @@ -1,5 +1,5 @@ -const materials = new URL("./material.js", import.meta.url) +const materials = new URL('./material.js', import.meta.url) export default { - "materials": materials + 'materials': materials } diff --git a/examples/samples/render/index.js b/examples/samples/render/index.js index d92a1ad0..2b3492ac 100644 --- a/examples/samples/render/index.js +++ b/examples/samples/render/index.js @@ -1,6 +1,7 @@ -import webgl from "./webgl/index.js" -import canvas2d from "./canvas-2d/index.js" +import webgl from './webgl/index.js' +import canvas2d from './canvas-2d/index.js' + export default { - "canvas2d": canvas2d, - "webgl": webgl + 'canvas2d': canvas2d, + 'webgl': webgl } diff --git a/examples/samples/render/webgl/basictriangle.js b/examples/samples/render/webgl/basictriangle.js index 7d9be598..e65e44e1 100644 --- a/examples/samples/render/webgl/basictriangle.js +++ b/examples/samples/render/webgl/basictriangle.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, World, Cleanup, @@ -52,4 +51,4 @@ function spawnMesh(world) { new Cleanup() ]) .build() -} \ No newline at end of file +} diff --git a/examples/samples/render/webgl/cameraorthographic.js b/examples/samples/render/webgl/cameraorthographic.js index dda48b1c..3d369d06 100644 --- a/examples/samples/render/webgl/cameraorthographic.js +++ b/examples/samples/render/webgl/cameraorthographic.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, OrthographicProjection, Rotation3D, diff --git a/examples/samples/render/webgl/cameraperspective.js b/examples/samples/render/webgl/cameraperspective.js index 32289dda..a65c3712 100644 --- a/examples/samples/render/webgl/cameraperspective.js +++ b/examples/samples/render/webgl/cameraperspective.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, PerspectiveProjection, Camera, diff --git a/examples/samples/render/webgl/camerarotate.js b/examples/samples/render/webgl/camerarotate.js index e10a96ab..89dba837 100644 --- a/examples/samples/render/webgl/camerarotate.js +++ b/examples/samples/render/webgl/camerarotate.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, Rotation3D, World, diff --git a/examples/samples/render/webgl/colorchangetriangle.js b/examples/samples/render/webgl/colorchangetriangle.js index c5bfc47b..0ff670ff 100644 --- a/examples/samples/render/webgl/colorchangetriangle.js +++ b/examples/samples/render/webgl/colorchangetriangle.js @@ -1,5 +1,4 @@ import { - Demo, Mesh, Color, World, diff --git a/examples/samples/render/webgl/index.js b/examples/samples/render/webgl/index.js index 8e6a1927..d1e85cb8 100644 --- a/examples/samples/render/webgl/index.js +++ b/examples/samples/render/webgl/index.js @@ -1,15 +1,15 @@ -const basictriangle = new URL("./basictriangle.js", import.meta.url) -const colorchangetriangle = new URL("./colorchangetriangle.js", import.meta.url) -const geometries = new URL("./geometries.js", import.meta.url) -const camerarotate = new URL("./camerarotate.js", import.meta.url) -const cameraperspective = new URL("./cameraperspective.js", import.meta.url) -const cameraorthographic = new URL("./cameraorthographic.js", import.meta.url) +const basictriangle = new URL('./basictriangle.js', import.meta.url) +const colorchangetriangle = new URL('./colorchangetriangle.js', import.meta.url) +const geometries = new URL('./geometries.js', import.meta.url) +const camerarotate = new URL('./camerarotate.js', import.meta.url) +const cameraperspective = new URL('./cameraperspective.js', import.meta.url) +const cameraorthographic = new URL('./cameraorthographic.js', import.meta.url) export default { - "basictriangle": basictriangle, - "colorchangetriangle": colorchangetriangle, - "geometries": geometries, - "camerarotate": camerarotate, - "cameraperspective": cameraperspective, - "cameraorthographic": cameraorthographic + 'basictriangle': basictriangle, + 'colorchangetriangle': colorchangetriangle, + 'geometries': geometries, + 'camerarotate': camerarotate, + 'cameraperspective': cameraperspective, + 'cameraorthographic': cameraorthographic } diff --git a/examples/samples/transform/2d/index.js b/examples/samples/transform/2d/index.js index a19d9791..bd4e2f5d 100644 --- a/examples/samples/transform/2d/index.js +++ b/examples/samples/transform/2d/index.js @@ -1,13 +1,13 @@ -const translate2d = new URL("./translate.js", import.meta.url) -const rotate2d = new URL("./rotate.js", import.meta.url) -const scale2d = new URL("./scale.js", import.meta.url) -const propagate2d = new URL("./propagate.js", import.meta.url) -const lookat2d = new URL("./lookat.js", import.meta.url) +const translate2d = new URL('./translate.js', import.meta.url) +const rotate2d = new URL('./rotate.js', import.meta.url) +const scale2d = new URL('./scale.js', import.meta.url) +const propagate2d = new URL('./propagate.js', import.meta.url) +const lookat2d = new URL('./lookat.js', import.meta.url) export default { - "translate2d": translate2d, - "rotate2d": rotate2d, - "scale2d": scale2d, - "propagate2d": propagate2d, - "lookat2d": lookat2d + 'translate2d': translate2d, + 'rotate2d': rotate2d, + 'scale2d': scale2d, + 'propagate2d': propagate2d, + 'lookat2d': lookat2d } diff --git a/examples/samples/transform/2d/propagate.js b/examples/samples/transform/2d/propagate.js index f211402f..b574246f 100644 --- a/examples/samples/transform/2d/propagate.js +++ b/examples/samples/transform/2d/propagate.js @@ -1,5 +1,4 @@ import { - Demo, World, VirtualClock, BasicMaterial, diff --git a/examples/samples/transform/2d/rotate.js b/examples/samples/transform/2d/rotate.js index fa776115..cdb37d4d 100644 --- a/examples/samples/transform/2d/rotate.js +++ b/examples/samples/transform/2d/rotate.js @@ -22,6 +22,7 @@ import { import { addDefaultCamera2D, HackPlugin, setupViewport } from '../../utils.js' const app = new App() + app .registerPlugin(new HackPlugin()) .registerPlugin(new DefaultPlugin()) @@ -33,6 +34,7 @@ app .registerSystem(AppSchedule.Update, setupViewport) .registerDebugger(new FPSDebugger()) .run() + /** * @param {World} world */ diff --git a/examples/samples/transform/2d/scale.js b/examples/samples/transform/2d/scale.js index 89bd555f..d7c7753e 100644 --- a/examples/samples/transform/2d/scale.js +++ b/examples/samples/transform/2d/scale.js @@ -1,6 +1,6 @@ import { BasicMaterial, - Demo, + Mesh, Scale2D, World, diff --git a/examples/samples/transform/2d/translate.js b/examples/samples/transform/2d/translate.js index b670a6c4..1a0a15a6 100644 --- a/examples/samples/transform/2d/translate.js +++ b/examples/samples/transform/2d/translate.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, Position2D, World, diff --git a/examples/samples/transform/3d/index.js b/examples/samples/transform/3d/index.js index ad561ee2..3b4b697c 100644 --- a/examples/samples/transform/3d/index.js +++ b/examples/samples/transform/3d/index.js @@ -1,13 +1,13 @@ -const translate3d = new URL("./translate.js", import.meta.url) -const rotate3d = new URL("./rotate.js", import.meta.url) -const scale3d = new URL("./scale.js", import.meta.url) -const lookAt3d = new URL("./lookat.js", import.meta.url) -const propagate3d = new URL("./propagate.js", import.meta.url) +const translate3d = new URL('./translate.js', import.meta.url) +const rotate3d = new URL('./rotate.js', import.meta.url) +const scale3d = new URL('./scale.js', import.meta.url) +const lookAt3d = new URL('./lookat.js', import.meta.url) +const propagate3d = new URL('./propagate.js', import.meta.url) export default { - "translate3d": translate3d, - "rotate3d": rotate3d, - "scale3d": scale3d, - "lookAt3d": lookAt3d, - "propagate3d": propagate3d + 'translate3d': translate3d, + 'rotate3d': rotate3d, + 'scale3d': scale3d, + 'lookAt3d': lookAt3d, + 'propagate3d': propagate3d } diff --git a/examples/samples/transform/3d/lookat.js b/examples/samples/transform/3d/lookat.js index 1cc8a648..d8bcea57 100644 --- a/examples/samples/transform/3d/lookat.js +++ b/examples/samples/transform/3d/lookat.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, World, Cleanup, @@ -25,8 +24,7 @@ import { FPSDebugger, WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' - +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' class Target { } class Looker { } diff --git a/examples/samples/transform/3d/propagate.js b/examples/samples/transform/3d/propagate.js index 2aa1b8b9..46145ab6 100644 --- a/examples/samples/transform/3d/propagate.js +++ b/examples/samples/transform/3d/propagate.js @@ -1,5 +1,4 @@ import { - Demo, World, VirtualClock, BasicMaterial, @@ -26,7 +25,7 @@ import { FPSDebugger, WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' const app = new App() diff --git a/examples/samples/transform/3d/rotate.js b/examples/samples/transform/3d/rotate.js index 585be8e7..dc18f3e3 100644 --- a/examples/samples/transform/3d/rotate.js +++ b/examples/samples/transform/3d/rotate.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, World, Cleanup, @@ -20,7 +19,7 @@ import { FPSDebugger, WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' const app = new App() diff --git a/examples/samples/transform/3d/scale.js b/examples/samples/transform/3d/scale.js index 96d58db5..4ea2e893 100644 --- a/examples/samples/transform/3d/scale.js +++ b/examples/samples/transform/3d/scale.js @@ -1,6 +1,5 @@ import { BasicMaterial, - Demo, Mesh, Scale3D, World, @@ -20,7 +19,7 @@ import { FPSDebugger, WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' const app = new App() diff --git a/examples/samples/transform/3d/translate.js b/examples/samples/transform/3d/translate.js index ef1ffa16..031bf0a2 100644 --- a/examples/samples/transform/3d/translate.js +++ b/examples/samples/transform/3d/translate.js @@ -19,7 +19,7 @@ import { FPSDebugger, WebglRendererPlugin } from 'wima' -import { addDefaultCamera3D, HackPlugin, setupViewport, setupViewportWebgl } from '../../utils.js' +import { addDefaultCamera3D, HackPlugin, setupViewportWebgl } from '../../utils.js' const app = new App() diff --git a/examples/samples/transform/index.js b/examples/samples/transform/index.js index 379f0c48..15ae735d 100644 --- a/examples/samples/transform/index.js +++ b/examples/samples/transform/index.js @@ -1,7 +1,7 @@ -import { default as d2 } from "./2d/index.js"; -import { default as d3 } from "./3d/index.js"; +import { default as d2 } from './2d/index.js' +import { default as d3 } from './3d/index.js' export default { - "2d": d2, - "3d": d3 -} \ No newline at end of file + '2d': d2, + '3d': d3 +} diff --git a/examples/samples/tween/index.js b/examples/samples/tween/index.js index 2db184a6..b9362343 100644 --- a/examples/samples/tween/index.js +++ b/examples/samples/tween/index.js @@ -1,5 +1,5 @@ -const easing = new URL("./easing.js", import.meta.url) +const easing = new URL('./easing.js', import.meta.url) export default { - "easing": easing + 'easing': easing } diff --git a/examples/samples/utils.js b/examples/samples/utils.js index 0f2ef215..c98f7e66 100644 --- a/examples/samples/utils.js +++ b/examples/samples/utils.js @@ -10,7 +10,6 @@ import { Plugin, App, typeidGeneric, - Gizmo2D, Audio, Image, Mesh, @@ -65,30 +64,30 @@ export function setupViewport(world) { } /** -* @param {World} world -*/ + * @param {World} world + */ export function setupViewportWebgl(world) { - const windowcommands = world.getResource(WindowCommands) - const window = new Query(world, [Entity, MainWindow]).single() - const canvases = world.getResource(Windows) - const width = innerWidth - const height = innerHeight + const windowcommands = world.getResource(WindowCommands) + const window = new Query(world, [Entity, MainWindow]).single() + const canvases = world.getResource(Windows) + const width = innerWidth + const height = innerHeight - if (!window) return warn('No main window defined.') + if (!window) return warn('No main window defined.') - const [entity] = window - const canvas = canvases.getWindow(entity) + const [entity] = window + const canvas = canvases.getWindow(entity) - if (!canvas) return + if (!canvas) return - const gl = canvas.getContext('webgl2') + const gl = canvas.getContext('webgl2') - if (!gl) return + if (!gl) return - gl.viewport(0, 0, width, height) - windowcommands - .window(entity) - .resize(width, height) + gl.viewport(0, 0, width, height) + windowcommands + .window(entity) + .resize(width, height) } // Sometimes features that are supposed to be there arent, this plugin @@ -99,6 +98,7 @@ export class HackPlugin extends Plugin { * @param {App} app */ register(app) { + // HACK: This is a hack until system sets and ordering is introduced. { app