@gg-web-engine/core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/.prettierrc +8 -0
  2. package/README.md +8 -0
  3. package/blender_exporter/build_blender_scene.py +180 -0
  4. package/blender_exporter/spherical_to_cube_texture.py +116 -0
  5. package/dist/2d/entities/gg-2d-entity.d.ts +20 -0
  6. package/dist/2d/entities/gg-2d-entity.js +84 -0
  7. package/dist/2d/entities/gg-2d-trigger.entity.d.ts +10 -0
  8. package/dist/2d/entities/gg-2d-trigger.entity.js +17 -0
  9. package/dist/2d/entities/gg-positionable-2d-entity.d.ts +7 -0
  10. package/dist/2d/entities/gg-positionable-2d-entity.js +16 -0
  11. package/dist/2d/factories.d.ts +18 -0
  12. package/dist/2d/factories.js +13 -0
  13. package/dist/2d/gg-2d-world.d.ts +9 -0
  14. package/dist/2d/gg-2d-world.js +34 -0
  15. package/dist/2d/interfaces.d.ts +26 -0
  16. package/dist/2d/interfaces.js +7 -0
  17. package/dist/2d/models/body-options.d.ts +3 -0
  18. package/dist/2d/models/body-options.js +2 -0
  19. package/dist/2d/models/shapes.d.ts +13 -0
  20. package/dist/2d/models/shapes.js +2 -0
  21. package/dist/3d/controllers/car-keyboard.controller.d.ts +25 -0
  22. package/dist/3d/controllers/car-keyboard.controller.js +98 -0
  23. package/dist/3d/controllers/free-camera.controller.d.ts +23 -0
  24. package/dist/3d/controllers/free-camera.controller.js +79 -0
  25. package/dist/3d/entities/controllers/entity-motion.controller.d.ts +32 -0
  26. package/dist/3d/entities/controllers/entity-motion.controller.js +100 -0
  27. package/dist/3d/entities/gg-3d-camera.entity.d.ts +7 -0
  28. package/dist/3d/entities/gg-3d-camera.entity.js +12 -0
  29. package/dist/3d/entities/gg-3d-entity.d.ts +25 -0
  30. package/dist/3d/entities/gg-3d-entity.js +108 -0
  31. package/dist/3d/entities/gg-3d-map-graph.entity.d.ts +51 -0
  32. package/dist/3d/entities/gg-3d-map-graph.entity.js +164 -0
  33. package/dist/3d/entities/gg-3d-raycast-vehicle.entity.d.ts +107 -0
  34. package/dist/3d/entities/gg-3d-raycast-vehicle.entity.js +372 -0
  35. package/dist/3d/entities/gg-3d-trigger.entity.d.ts +10 -0
  36. package/dist/3d/entities/gg-3d-trigger.entity.js +21 -0
  37. package/dist/3d/entities/gg-positionable-3d-entity.d.ts +11 -0
  38. package/dist/3d/entities/gg-positionable-3d-entity.js +27 -0
  39. package/dist/3d/factories.d.ts +21 -0
  40. package/dist/3d/factories.js +22 -0
  41. package/dist/3d/gg-3d-world.d.ts +11 -0
  42. package/dist/3d/gg-3d-world.js +36 -0
  43. package/dist/3d/interfaces.d.ts +65 -0
  44. package/dist/3d/interfaces.js +40 -0
  45. package/dist/3d/loader.d.ts +40 -0
  46. package/dist/3d/loader.js +129 -0
  47. package/dist/3d/models/body-options.d.ts +3 -0
  48. package/dist/3d/models/body-options.js +2 -0
  49. package/dist/3d/models/gg-meta.d.ts +22 -0
  50. package/dist/3d/models/gg-meta.js +2 -0
  51. package/dist/3d/models/shapes.d.ts +35 -0
  52. package/dist/3d/models/shapes.js +2 -0
  53. package/dist/base/clock.d.ts +26 -0
  54. package/dist/base/clock.js +82 -0
  55. package/dist/base/controllers/common.d.ts +8 -0
  56. package/dist/base/controllers/common.js +32 -0
  57. package/dist/base/controllers/i-controller.d.ts +4 -0
  58. package/dist/base/controllers/i-controller.js +2 -0
  59. package/dist/base/controllers/keyboard.controller.d.ts +16 -0
  60. package/dist/base/controllers/keyboard.controller.js +109 -0
  61. package/dist/base/controllers/mouse.controller.d.ts +24 -0
  62. package/dist/base/controllers/mouse.controller.js +68 -0
  63. package/dist/base/data-structures/graph.d.ts +20 -0
  64. package/dist/base/data-structures/graph.js +118 -0
  65. package/dist/base/entities/base-gg-renderer.d.ts +28 -0
  66. package/dist/base/entities/base-gg-renderer.js +49 -0
  67. package/dist/base/entities/gg-entity.d.ts +14 -0
  68. package/dist/base/entities/gg-entity.js +55 -0
  69. package/dist/base/entities/gg-positionable-entity.d.ts +23 -0
  70. package/dist/base/entities/gg-positionable-entity.js +47 -0
  71. package/dist/base/entities/inline-controller.d.ts +3 -0
  72. package/dist/base/entities/inline-controller.js +25 -0
  73. package/dist/base/entities/interfaces/i-tick-listener.d.ts +7 -0
  74. package/dist/base/entities/interfaces/i-tick-listener.js +6 -0
  75. package/dist/base/gg-static.d.ts +9 -0
  76. package/dist/base/gg-static.js +40 -0
  77. package/dist/base/gg-viewport-manager.d.ts +14 -0
  78. package/dist/base/gg-viewport-manager.js +125 -0
  79. package/dist/base/gg-viewport.d.ts +23 -0
  80. package/dist/base/gg-viewport.js +123 -0
  81. package/dist/base/gg-world.d.ts +32 -0
  82. package/dist/base/gg-world.js +172 -0
  83. package/dist/base/interfaces/gg-body.d.ts +15 -0
  84. package/dist/base/interfaces/gg-body.js +2 -0
  85. package/dist/base/interfaces/gg-debug-physics-drawer.d.ts +7 -0
  86. package/dist/base/interfaces/gg-debug-physics-drawer.js +2 -0
  87. package/dist/base/interfaces/gg-object.d.ts +16 -0
  88. package/dist/base/interfaces/gg-object.js +2 -0
  89. package/dist/base/interfaces/gg-physics-world.d.ts +18 -0
  90. package/dist/base/interfaces/gg-physics-world.js +2 -0
  91. package/dist/base/interfaces/gg-trigger.d.ts +8 -0
  92. package/dist/base/interfaces/gg-trigger.js +2 -0
  93. package/dist/base/interfaces/gg-visual-scene.d.ts +9 -0
  94. package/dist/base/interfaces/gg-visual-scene.js +2 -0
  95. package/dist/base/math/box.d.ts +5 -0
  96. package/dist/base/math/box.js +21 -0
  97. package/dist/base/math/matrix4.d.ts +5 -0
  98. package/dist/base/math/matrix4.js +33 -0
  99. package/dist/base/math/numbers.d.ts +2 -0
  100. package/dist/base/math/numbers.js +14 -0
  101. package/dist/base/math/point2.d.ts +15 -0
  102. package/dist/base/math/point2.js +40 -0
  103. package/dist/base/math/point3.d.ts +25 -0
  104. package/dist/base/math/point3.js +104 -0
  105. package/dist/base/math/quaternion.d.ts +28 -0
  106. package/dist/base/math/quaternion.js +145 -0
  107. package/dist/base/models/axis-directions.d.ts +3 -0
  108. package/dist/base/models/axis-directions.js +2 -0
  109. package/dist/base/models/body-options.d.ts +6 -0
  110. package/dist/base/models/body-options.js +2 -0
  111. package/dist/base/models/geometry-nodes.d.ts +7 -0
  112. package/dist/base/models/geometry-nodes.js +2 -0
  113. package/dist/base/models/points.d.ts +15 -0
  114. package/dist/base/models/points.js +2 -0
  115. package/dist/base/ui/gg-console.ui.d.ts +21 -0
  116. package/dist/base/ui/gg-console.ui.js +162 -0
  117. package/dist/base/ui/gg-debugger.ui.d.ts +10 -0
  118. package/dist/base/ui/gg-debugger.ui.js +68 -0
  119. package/dist/index.d.ts +51 -0
  120. package/dist/index.js +67 -0
  121. package/package.json +64 -0
  122. package/src/2d/entities/gg-2d-entity.ts +86 -0
  123. package/src/2d/entities/gg-2d-trigger.entity.ts +17 -0
  124. package/src/2d/entities/gg-positionable-2d-entity.ts +16 -0
  125. package/src/2d/factories.ts +20 -0
  126. package/src/2d/gg-2d-world.ts +32 -0
  127. package/src/2d/interfaces.ts +31 -0
  128. package/src/2d/models/body-options.ts +3 -0
  129. package/src/2d/models/shapes.ts +7 -0
  130. package/src/3d/controllers/car-keyboard.controller.ts +128 -0
  131. package/src/3d/controllers/free-camera.controller.ts +86 -0
  132. package/src/3d/entities/controllers/entity-motion.controller.ts +122 -0
  133. package/src/3d/entities/gg-3d-camera.entity.ts +8 -0
  134. package/src/3d/entities/gg-3d-entity.ts +116 -0
  135. package/src/3d/entities/gg-3d-map-graph.entity.ts +204 -0
  136. package/src/3d/entities/gg-3d-raycast-vehicle.entity.ts +468 -0
  137. package/src/3d/entities/gg-3d-trigger.entity.ts +22 -0
  138. package/src/3d/entities/gg-positionable-3d-entity.ts +31 -0
  139. package/src/3d/factories.ts +29 -0
  140. package/src/3d/gg-3d-world.ts +36 -0
  141. package/src/3d/interfaces.ts +96 -0
  142. package/src/3d/loader.ts +165 -0
  143. package/src/3d/models/body-options.ts +3 -0
  144. package/src/3d/models/gg-meta.ts +12 -0
  145. package/src/3d/models/shapes.ts +13 -0
  146. package/src/base/clock.ts +97 -0
  147. package/src/base/controllers/common.ts +37 -0
  148. package/src/base/controllers/i-controller.ts +5 -0
  149. package/src/base/controllers/keyboard.controller.ts +109 -0
  150. package/src/base/controllers/mouse.controller.ts +73 -0
  151. package/src/base/data-structures/graph.ts +125 -0
  152. package/src/base/entities/base-gg-renderer.ts +77 -0
  153. package/src/base/entities/gg-entity.ts +61 -0
  154. package/src/base/entities/gg-positionable-entity.ts +64 -0
  155. package/src/base/entities/inline-controller.ts +31 -0
  156. package/src/base/entities/interfaces/i-tick-listener.ts +15 -0
  157. package/src/base/gg-static.ts +30 -0
  158. package/src/base/gg-viewport-manager.ts +122 -0
  159. package/src/base/gg-viewport.ts +159 -0
  160. package/src/base/gg-world.ts +198 -0
  161. package/src/base/interfaces/gg-body.ts +23 -0
  162. package/src/base/interfaces/gg-debug-physics-drawer.ts +10 -0
  163. package/src/base/interfaces/gg-object.ts +26 -0
  164. package/src/base/interfaces/gg-physics-world.ts +24 -0
  165. package/src/base/interfaces/gg-trigger.ts +10 -0
  166. package/src/base/interfaces/gg-visual-scene.ts +11 -0
  167. package/src/base/math/box.ts +19 -0
  168. package/src/base/math/matrix4.ts +29 -0
  169. package/src/base/math/numbers.ts +10 -0
  170. package/src/base/math/point2.ts +43 -0
  171. package/src/base/math/point3.ts +119 -0
  172. package/src/base/math/quaternion.ts +172 -0
  173. package/src/base/models/axis-directions.ts +3 -0
  174. package/src/base/models/body-options.ts +6 -0
  175. package/src/base/models/geometry-nodes.ts +5 -0
  176. package/src/base/models/points.ts +3 -0
  177. package/src/base/ui/gg-console.ui.ts +165 -0
  178. package/src/base/ui/gg-debugger.ui.ts +69 -0
  179. package/src/index.ts +53 -0
  180. package/test/base/data-structures/graph.spec.ts +76 -0
  181. package/tsconfig.json +9 -0
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GgDebuggerUI = void 0;
7
+ const gg_static_1 = require("../gg-static");
8
+ const inline_controller_1 = require("../entities/inline-controller");
9
+ const rxjs_1 = require("rxjs");
10
+ const stats_js_1 = __importDefault(require("stats.js"));
11
+ class GgDebuggerUI {
12
+ constructor() {
13
+ this.ui = null;
14
+ this.removed$ = new rxjs_1.Subject();
15
+ }
16
+ static get instance() {
17
+ if (!this._instance) {
18
+ this._instance = new GgDebuggerUI();
19
+ }
20
+ return this._instance;
21
+ }
22
+ get isUIShown() {
23
+ return !!this.ui;
24
+ }
25
+ createUI() {
26
+ var _a;
27
+ const stats = new stats_js_1.default();
28
+ stats.dom.style.left = 'unset';
29
+ stats.dom.style.right = '0';
30
+ stats.showPanel(0); // 0: fps, 1: ms, 2: mb
31
+ document.body.appendChild(stats.dom);
32
+ (0, inline_controller_1.createInlineTickController)(gg_static_1.GgStatic.instance.selectedWorld, -1)
33
+ .pipe((0, rxjs_1.takeUntil)(this.removed$))
34
+ .subscribe(() => {
35
+ stats === null || stats === void 0 ? void 0 : stats.begin();
36
+ });
37
+ (0, inline_controller_1.createInlineTickController)(gg_static_1.GgStatic.instance.selectedWorld, 10000)
38
+ .pipe((0, rxjs_1.takeUntil)(this.removed$))
39
+ .subscribe(() => {
40
+ stats === null || stats === void 0 ? void 0 : stats.end();
41
+ });
42
+ const customContainer = document.createElement('div');
43
+ customContainer.style.cssText =
44
+ 'position:fixed;top:48px;right:0;opacity:0.9;z-index:9999;background-color:#333;color:white';
45
+ customContainer.innerHTML = `<input type="checkbox" name="checkbox" id="physics_debugger_checkbox_id" value="1"${((_a = gg_static_1.GgStatic.instance.selectedWorld) === null || _a === void 0 ? void 0 : _a.physicsWorld.physicsDebugViewActive) ? ' checked' : ''}>
46
+ <label for="physics_debugger_checkbox_id" style="user-select: none;">Show physics bodies in scene</label>`;
47
+ document.body.appendChild(customContainer);
48
+ (0, rxjs_1.fromEvent)(document.getElementById('physics_debugger_checkbox_id'), 'change')
49
+ .pipe((0, rxjs_1.takeUntil)(this.removed$))
50
+ .subscribe(e => {
51
+ gg_static_1.GgStatic.instance.console('dr_drawphysics ' + e.target.checked).then();
52
+ });
53
+ this.ui = {
54
+ stats,
55
+ customContainer,
56
+ };
57
+ }
58
+ destroyUI() {
59
+ if (this.ui) {
60
+ document.body.removeChild(this.ui.stats.dom);
61
+ document.body.removeChild(this.ui.customContainer);
62
+ this.ui.stats.end();
63
+ this.ui = null;
64
+ }
65
+ this.removed$.next();
66
+ }
67
+ }
68
+ exports.GgDebuggerUI = GgDebuggerUI;
@@ -0,0 +1,51 @@
1
+ export * from './base/clock';
2
+ export * from './base/gg-viewport';
3
+ export * from './base/gg-viewport-manager';
4
+ export * from './base/entities/interfaces/i-tick-listener';
5
+ export * from './base/entities/gg-entity';
6
+ export * from './base/entities/base-gg-renderer';
7
+ export * from './base/entities/inline-controller';
8
+ export * from './base/interfaces/gg-body';
9
+ export * from './base/interfaces/gg-debug-physics-drawer';
10
+ export * from './base/interfaces/gg-object';
11
+ export * from './base/interfaces/gg-physics-world';
12
+ export * from './base/interfaces/gg-trigger';
13
+ export * from './base/interfaces/gg-visual-scene';
14
+ export * from './base/models/axis-directions';
15
+ export * from './base/models/body-options';
16
+ export * from './base/models/geometry-nodes';
17
+ export * from './base/models/points';
18
+ export * from './base/math/box';
19
+ export * from './base/math/point2';
20
+ export * from './base/math/point3';
21
+ export * from './base/math/quaternion';
22
+ export * from './base/math/numbers';
23
+ export * from './base/math/matrix4';
24
+ export * from './base/controllers/common';
25
+ export * from './base/controllers/i-controller';
26
+ export * from './base/controllers/keyboard.controller';
27
+ export * from './base/controllers/mouse.controller';
28
+ export * from './2d/entities/gg-2d-entity';
29
+ export * from './2d/entities/gg-positionable-2d-entity';
30
+ export * from './2d/entities/gg-2d-trigger.entity';
31
+ export * from './2d/models/body-options';
32
+ export * from './2d/models/shapes';
33
+ export * from './2d/interfaces';
34
+ export * from './2d/factories';
35
+ export * from './2d/gg-2d-world';
36
+ export * from './3d/controllers/car-keyboard.controller';
37
+ export * from './3d/controllers/free-camera.controller';
38
+ export * from './3d/entities/controllers/entity-motion.controller';
39
+ export * from './3d/entities/gg-3d-entity';
40
+ export * from './3d/entities/gg-positionable-3d-entity';
41
+ export * from './3d/entities/gg-3d-camera.entity';
42
+ export * from './3d/entities/gg-3d-map-graph.entity';
43
+ export * from './3d/entities/gg-3d-raycast-vehicle.entity';
44
+ export * from './3d/entities/gg-3d-trigger.entity';
45
+ export * from './3d/models/body-options';
46
+ export * from './3d/models/gg-meta';
47
+ export * from './3d/models/shapes';
48
+ export * from './3d/interfaces';
49
+ export * from './3d/factories';
50
+ export * from './3d/gg-3d-world';
51
+ export * from './3d/loader';
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base/clock"), exports);
18
+ __exportStar(require("./base/gg-viewport"), exports);
19
+ __exportStar(require("./base/gg-viewport-manager"), exports);
20
+ __exportStar(require("./base/entities/interfaces/i-tick-listener"), exports);
21
+ __exportStar(require("./base/entities/gg-entity"), exports);
22
+ __exportStar(require("./base/entities/base-gg-renderer"), exports);
23
+ __exportStar(require("./base/entities/inline-controller"), exports);
24
+ __exportStar(require("./base/interfaces/gg-body"), exports);
25
+ __exportStar(require("./base/interfaces/gg-debug-physics-drawer"), exports);
26
+ __exportStar(require("./base/interfaces/gg-object"), exports);
27
+ __exportStar(require("./base/interfaces/gg-physics-world"), exports);
28
+ __exportStar(require("./base/interfaces/gg-trigger"), exports);
29
+ __exportStar(require("./base/interfaces/gg-visual-scene"), exports);
30
+ __exportStar(require("./base/models/axis-directions"), exports);
31
+ __exportStar(require("./base/models/body-options"), exports);
32
+ __exportStar(require("./base/models/geometry-nodes"), exports);
33
+ __exportStar(require("./base/models/points"), exports);
34
+ __exportStar(require("./base/math/box"), exports);
35
+ __exportStar(require("./base/math/point2"), exports);
36
+ __exportStar(require("./base/math/point3"), exports);
37
+ __exportStar(require("./base/math/quaternion"), exports);
38
+ __exportStar(require("./base/math/numbers"), exports);
39
+ __exportStar(require("./base/math/matrix4"), exports);
40
+ __exportStar(require("./base/controllers/common"), exports);
41
+ __exportStar(require("./base/controllers/i-controller"), exports);
42
+ __exportStar(require("./base/controllers/keyboard.controller"), exports);
43
+ __exportStar(require("./base/controllers/mouse.controller"), exports);
44
+ __exportStar(require("./2d/entities/gg-2d-entity"), exports);
45
+ __exportStar(require("./2d/entities/gg-positionable-2d-entity"), exports);
46
+ __exportStar(require("./2d/entities/gg-2d-trigger.entity"), exports);
47
+ __exportStar(require("./2d/models/body-options"), exports);
48
+ __exportStar(require("./2d/models/shapes"), exports);
49
+ __exportStar(require("./2d/interfaces"), exports);
50
+ __exportStar(require("./2d/factories"), exports);
51
+ __exportStar(require("./2d/gg-2d-world"), exports);
52
+ __exportStar(require("./3d/controllers/car-keyboard.controller"), exports);
53
+ __exportStar(require("./3d/controllers/free-camera.controller"), exports);
54
+ __exportStar(require("./3d/entities/controllers/entity-motion.controller"), exports);
55
+ __exportStar(require("./3d/entities/gg-3d-entity"), exports);
56
+ __exportStar(require("./3d/entities/gg-positionable-3d-entity"), exports);
57
+ __exportStar(require("./3d/entities/gg-3d-camera.entity"), exports);
58
+ __exportStar(require("./3d/entities/gg-3d-map-graph.entity"), exports);
59
+ __exportStar(require("./3d/entities/gg-3d-raycast-vehicle.entity"), exports);
60
+ __exportStar(require("./3d/entities/gg-3d-trigger.entity"), exports);
61
+ __exportStar(require("./3d/models/body-options"), exports);
62
+ __exportStar(require("./3d/models/gg-meta"), exports);
63
+ __exportStar(require("./3d/models/shapes"), exports);
64
+ __exportStar(require("./3d/interfaces"), exports);
65
+ __exportStar(require("./3d/factories"), exports);
66
+ __exportStar(require("./3d/gg-3d-world"), exports);
67
+ __exportStar(require("./3d/loader"), exports);
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@gg-web-engine/core",
3
+ "version": "0.0.01",
4
+ "description": "An attempt to create open source game engine for browser",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "test": "jest",
9
+ "prettier-format": "prettier --config .prettierrc 'src/**/*.ts' --write",
10
+ "prepublish": "tsc",
11
+ "build": "tsc"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/AndyGura/gg-web-engine.git"
16
+ },
17
+ "keywords": [
18
+ "game-development",
19
+ "game-engine",
20
+ "game-engine-framework",
21
+ "gamedev"
22
+ ],
23
+ "author": "AndyGura",
24
+ "license": "Apache-2.0",
25
+ "bugs": {
26
+ "url": "https://github.com/AndyGura/gg-web-engine/issues"
27
+ },
28
+ "homepage": "https://github.com/AndyGura/gg-web-engine#readme",
29
+ "dependencies": {
30
+ "rxjs": "~7.5.0",
31
+ "stats.js": "^0.17.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/jest": "^29.5.0",
35
+ "@types/stats.js": "^0.17.0",
36
+ "jest": "^29.5.0",
37
+ "prettier": "^2.8.6",
38
+ "ts-jest": "^29.0.5",
39
+ "typescript": "~4.7.2"
40
+ },
41
+ "jest": {
42
+ "moduleFileExtensions": [
43
+ "js",
44
+ "json",
45
+ "ts"
46
+ ],
47
+ "rootDir": ".",
48
+ "testRegex": "\\.spec\\.ts$",
49
+ "transform": {
50
+ "^.+\\.(t|j)s$": "ts-jest"
51
+ },
52
+ "collectCoverageFrom": [
53
+ "**/*.ts",
54
+ "!**/*.module.ts"
55
+ ],
56
+ "coveragePathIgnorePatterns": [
57
+ "<rootDir>/node_modules/",
58
+ "<rootDir>/dist/",
59
+ "<rootDir>/test/"
60
+ ],
61
+ "coverageDirectory": "./coverage",
62
+ "testEnvironment": "node"
63
+ }
64
+ }
@@ -0,0 +1,86 @@
1
+ import { Subject, Subscription } from 'rxjs';
2
+ import { GgPositionable2dEntity } from './gg-positionable-2d-entity';
3
+ import { ITickListener } from '../../base/entities/interfaces/i-tick-listener';
4
+ import { Point2 } from '../../base/models/points';
5
+ import { IGg2dBody, IGg2dObject } from '../interfaces';
6
+ import { Gg2dWorld } from '../gg-2d-world';
7
+
8
+ export class Gg2dEntity extends GgPositionable2dEntity implements ITickListener {
9
+ public readonly tick$: Subject<[number, number]> = new Subject<[number, number]>();
10
+ public readonly tickOrder = 750;
11
+ private tickSub: Subscription | null = null;
12
+
13
+ set position(value: Point2) {
14
+ if (this.object2D) {
15
+ this.object2D.position = value;
16
+ }
17
+ if (this.objectBody) {
18
+ this.objectBody.position = value;
19
+ }
20
+ super.position = value;
21
+ }
22
+
23
+ set rotation(value: number) {
24
+ if (this.object2D) {
25
+ this.object2D.rotation = value;
26
+ }
27
+ if (this.objectBody) {
28
+ this.objectBody.rotation = value;
29
+ }
30
+ super.rotation = value;
31
+ }
32
+
33
+ set scale(value: Point2) {
34
+ if (this.object2D) {
35
+ this.object2D.scale = value;
36
+ }
37
+ if (this.objectBody) {
38
+ this.objectBody.scale = value;
39
+ }
40
+ super.scale = value;
41
+ }
42
+
43
+ constructor(public readonly object2D: IGg2dObject | null, public readonly objectBody: IGg2dBody | null) {
44
+ super();
45
+ if (objectBody && object2D) {
46
+ this.tickSub = this.tick$.subscribe(() => {
47
+ // bind physics body transform to object transform
48
+ const pos = objectBody.position;
49
+ const rot = objectBody.rotation;
50
+ object2D.position = pos;
51
+ object2D.rotation = rot;
52
+ this._position$.next(pos);
53
+ this._rotation$.next(rot);
54
+ });
55
+ } else if (!objectBody && !object2D) {
56
+ throw new Error('Cannot create entity without a sprite and a body');
57
+ }
58
+ if (objectBody) {
59
+ objectBody.entity = this;
60
+ }
61
+ }
62
+
63
+ onSpawned(world: Gg2dWorld) {
64
+ super.onSpawned(world);
65
+ this.object2D?.addToWorld(world.visualScene);
66
+ this.objectBody?.addToWorld(world.physicsWorld);
67
+ }
68
+
69
+ onRemoved() {
70
+ this.object2D?.removeFromWorld(this.world!.visualScene);
71
+ this.objectBody?.removeFromWorld(this.world!.physicsWorld);
72
+ super.onRemoved();
73
+ }
74
+
75
+ dispose(): void {
76
+ super.dispose();
77
+ this.tickSub?.unsubscribe();
78
+ this.tickSub = null;
79
+ if (this.object2D) {
80
+ this.object2D.dispose();
81
+ }
82
+ if (this.objectBody) {
83
+ this.objectBody.dispose();
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,17 @@
1
+ import { IGg2dTrigger } from '../interfaces';
2
+ import { Gg2dEntity } from './gg-2d-entity';
3
+ import { Observable } from 'rxjs';
4
+ import { GgPositionable2dEntity } from './gg-positionable-2d-entity';
5
+
6
+ export class Gg2dTriggerEntity extends Gg2dEntity {
7
+ get onEntityEntered(): Observable<GgPositionable2dEntity> {
8
+ return this.objectBody.onEntityEntered;
9
+ }
10
+ get onEntityLeft(): Observable<GgPositionable2dEntity | null> {
11
+ return this.objectBody.onEntityLeft;
12
+ }
13
+
14
+ constructor(public readonly objectBody: IGg2dTrigger) {
15
+ super(null, objectBody);
16
+ }
17
+ }
@@ -0,0 +1,16 @@
1
+ import { Point2 } from '../../base/models/points';
2
+ import { GgPositionableEntity } from '../../base/entities/gg-positionable-entity';
3
+
4
+ export abstract class GgPositionable2dEntity extends GgPositionableEntity<Point2, number> {
5
+ getDefaultPosition(): Point2 {
6
+ return { x: 0, y: 0 };
7
+ }
8
+
9
+ getDefaultRotation(): number {
10
+ return 0;
11
+ }
12
+
13
+ getDefaultScale(): Point2 {
14
+ return { x: 1, y: 1 };
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ import { BodyShape2DDescriptor, Shape2DDescriptor } from './models/shapes';
2
+ import { Point2 } from '../base/models/points';
3
+ import { IGg2dBody, IGg2dObject, IGg2dTrigger } from './interfaces';
4
+
5
+ export abstract class IGg2dObjectFactory<T extends IGg2dObject = IGg2dObject> {
6
+ abstract createPrimitive(descriptor: Shape2DDescriptor): T;
7
+
8
+ // shortcuts
9
+ createSquare(dimensions: Point2): T {
10
+ return this.createPrimitive({ shape: 'SQUARE', dimensions });
11
+ }
12
+ createCircle(radius: number): T {
13
+ return this.createPrimitive({ shape: 'CIRCLE', radius });
14
+ }
15
+ }
16
+
17
+ export interface IGg2dBodyFactory<T extends IGg2dBody = IGg2dBody, K extends IGg2dTrigger = IGg2dTrigger> {
18
+ createRigidBody(descriptor: BodyShape2DDescriptor, transform?: { position?: Point2; rotation?: number }): T;
19
+ createTrigger(descriptor: Shape2DDescriptor, transform?: { position?: Point2; rotation?: number }): K;
20
+ }
@@ -0,0 +1,32 @@
1
+ import { GgWorld } from '../base/gg-world';
2
+ import { Point2 } from '../base/models/points';
3
+ import { IGg2dPhysicsWorld, IGg2dVisualScene } from './interfaces';
4
+
5
+ export class Gg2dWorld<
6
+ V extends IGg2dVisualScene = IGg2dVisualScene,
7
+ P extends IGg2dPhysicsWorld = IGg2dPhysicsWorld,
8
+ > extends GgWorld<Point2, number, V, P> {
9
+ constructor(
10
+ public readonly visualScene: V,
11
+ public readonly physicsWorld: P,
12
+ protected readonly consoleEnabled: boolean = false,
13
+ ) {
14
+ super(visualScene, physicsWorld, consoleEnabled);
15
+ if (consoleEnabled) {
16
+ this.registerConsoleCommand(
17
+ 'ph_gravity',
18
+ async (...args: string[]) => {
19
+ if (args.length == 1) {
20
+ args = ['0', args[0]]; // mean Y axis
21
+ }
22
+ if (args.length > 0) {
23
+ this.physicsWorld.gravity = { x: +args[0], y: +args[1] };
24
+ }
25
+ return JSON.stringify(this.physicsWorld.gravity);
26
+ },
27
+ 'args: [float] or [float float]; change 2D world gravity vector. 1 argument means ' +
28
+ '{x: 0, y: value}, 2 arguments set the whole vector. Default value is "9.82" or "0 9.82"',
29
+ );
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,31 @@
1
+ import { GgBody } from '../base/interfaces/gg-body';
2
+ import { Point2 } from '../base/models/points';
3
+ import { GgObject } from '../base/interfaces/gg-object';
4
+ import { GgPhysicsWorld } from '../base/interfaces/gg-physics-world';
5
+ import { GgVisualScene } from '../base/interfaces/gg-visual-scene';
6
+ import { BaseGgRenderer } from '../base/entities/base-gg-renderer';
7
+ import { GgTrigger } from '../base/interfaces/gg-trigger';
8
+ import { Observable } from 'rxjs';
9
+ import { GgPositionable2dEntity } from './entities/gg-positionable-2d-entity';
10
+ import { IGg2dBodyFactory, IGg2dObjectFactory } from './factories';
11
+
12
+ // These interfaces have to be implemented for a particular 2D physics engine
13
+ export interface IGg2dPhysicsWorld extends GgPhysicsWorld<Point2, number> {
14
+ readonly factory: IGg2dBodyFactory;
15
+ }
16
+
17
+ export abstract class Gg2dRenderer extends BaseGgRenderer {}
18
+
19
+ export interface IGg2dBody extends GgBody<Point2, number> {}
20
+
21
+ export interface IGg2dTrigger extends GgTrigger<Point2, number> {
22
+ get onEntityEntered(): Observable<GgPositionable2dEntity>;
23
+ get onEntityLeft(): Observable<GgPositionable2dEntity | null>;
24
+ }
25
+
26
+ // These interfaces have to be implemented for a particular 2D rendering engine
27
+ export interface IGg2dVisualScene extends GgVisualScene<Point2, number> {
28
+ readonly factory: IGg2dObjectFactory;
29
+ }
30
+
31
+ export interface IGg2dObject extends GgObject<Point2, number> {}
@@ -0,0 +1,3 @@
1
+ import { BodyOptions } from '../../base/models/body-options';
2
+
3
+ export interface Body2DOptions extends BodyOptions {}
@@ -0,0 +1,7 @@
1
+ import { Point2 } from '../../base/models/points';
2
+ import { Body2DOptions } from './body-options';
3
+
4
+ export type Shape2DDescriptor = { shape: 'SQUARE'; dimensions: Point2 } | { shape: 'CIRCLE'; radius: number };
5
+ // TODO add more shapes
6
+
7
+ export type BodyShape2DDescriptor = { shape: Shape2DDescriptor; body: Partial<Body2DOptions> };
@@ -0,0 +1,128 @@
1
+ import { BehaviorSubject, combineLatest, interval, pipe, Subject, takeUntil, filter } from 'rxjs';
2
+ import { distinctUntilChanged, map, pairwise, startWith, switchMap, take, tap } from 'rxjs/operators';
3
+ import { IController } from '../../base/controllers/i-controller';
4
+ import { KeyboardController } from '../../base/controllers/keyboard.controller';
5
+ import { Gg3dRaycastVehicleEntity } from '../entities/gg-3d-raycast-vehicle.entity';
6
+ import { bindDirectionKeys, DirectionKeymap, DirectionOutput } from '../../base/controllers/common';
7
+
8
+ // TODO pass as settings
9
+ // TODO smooth y?
10
+ const TICKER_INTERVAL = 16;
11
+ const TICKER_MAX_STEPS = 10;
12
+
13
+ type CarKeyboardControllerOptions = {
14
+ keymap: DirectionKeymap;
15
+ gearUpDownKeys: [string, string];
16
+ };
17
+
18
+ export class CarKeyboardController implements IController {
19
+ // emits values -1 - 1; -1 = full turn left; 1 = full turn right
20
+ private readonly x$: BehaviorSubject<number> = new BehaviorSubject<number>(0);
21
+ // emits values -1 - 1; -1 = full brake; 1 = full acceleration
22
+ private readonly y$: BehaviorSubject<number> = new BehaviorSubject<number>(0);
23
+
24
+ private lastX: number = 0;
25
+ private readonly stop$: Subject<void> = new Subject<void>();
26
+
27
+ protected readonly car$: BehaviorSubject<Gg3dRaycastVehicleEntity> = new BehaviorSubject<Gg3dRaycastVehicleEntity>(
28
+ null!,
29
+ );
30
+
31
+ pairTickerPipe = pipe(
32
+ startWith(0),
33
+ pairwise<number>(),
34
+ map(([beforeValue, afterValue]) => [this.lastX, afterValue] as [number, number]),
35
+ switchMap(([beforeValue, afterValue]: [number, number]) =>
36
+ interval(TICKER_INTERVAL).pipe(
37
+ take(TICKER_MAX_STEPS),
38
+ map(count => ++count),
39
+ map(
40
+ count =>
41
+ beforeValue * ((TICKER_MAX_STEPS - count) / TICKER_MAX_STEPS) + afterValue * (count / TICKER_MAX_STEPS),
42
+ ),
43
+ tap(x => {
44
+ this.lastX = x;
45
+ }),
46
+ ),
47
+ ),
48
+ );
49
+
50
+ public set car(value: Gg3dRaycastVehicleEntity) {
51
+ this.car$.next(value);
52
+ }
53
+
54
+ public get car(): Gg3dRaycastVehicleEntity {
55
+ return this.car$.getValue();
56
+ }
57
+
58
+ constructor(
59
+ private readonly keyboardController: KeyboardController,
60
+ car: Gg3dRaycastVehicleEntity,
61
+ private readonly options: CarKeyboardControllerOptions = { keymap: 'arrows', gearUpDownKeys: ['KeyA', 'KeyZ'] },
62
+ ) {
63
+ this.car$.next(car);
64
+ }
65
+
66
+ async start(): Promise<void> {
67
+ let moveDirection: DirectionOutput = {};
68
+ bindDirectionKeys(this.keyboardController, this.options.keymap)
69
+ .pipe(takeUntil(this.stop$))
70
+ .subscribe(d => {
71
+ moveDirection = d;
72
+ });
73
+ this.car$
74
+ .pipe(
75
+ takeUntil(this.stop$),
76
+ switchMap(c => c.tick$),
77
+ takeUntil(this.stop$),
78
+ map(() => {
79
+ const direction = [0, 0];
80
+ if (moveDirection.leftRight !== undefined) direction[0] = moveDirection.leftRight ? -1 : 1;
81
+ if (moveDirection.upDown !== undefined) direction[1] = moveDirection.upDown ? 1 : -1;
82
+ return direction;
83
+ }),
84
+ )
85
+ .subscribe(([x, y]) => {
86
+ this.x$.next(x);
87
+ this.y$.next(y);
88
+ });
89
+ combineLatest([
90
+ this.x$.pipe(takeUntil(this.stop$), distinctUntilChanged(), this.pairTickerPipe),
91
+ this.y$.pipe(takeUntil(this.stop$), distinctUntilChanged()),
92
+ ]).subscribe(([x, y]) => {
93
+ this.car$.getValue().setXAxisControlValue(x);
94
+ this.car$.getValue().setYAxisControlValue(y);
95
+ });
96
+ this.keyboardController
97
+ .bind(this.options.gearUpDownKeys[0])
98
+ .pipe(
99
+ takeUntil(this.stop$),
100
+ filter(x => !!x),
101
+ )
102
+ .subscribe(() => {
103
+ if (
104
+ this.car$.getValue() &&
105
+ (!this.car$.getValue().carProperties.transmission.isAuto || this.car$.getValue().gear <= 0)
106
+ ) {
107
+ this.car$.getValue().gear++;
108
+ }
109
+ });
110
+ this.keyboardController
111
+ .bind(this.options.gearUpDownKeys[1])
112
+ .pipe(
113
+ takeUntil(this.stop$),
114
+ filter(x => !!x),
115
+ )
116
+ .subscribe(() => {
117
+ if (this.car$.getValue().carProperties.transmission.isAuto && this.car.gear > 1) {
118
+ this.car$.getValue().gear = 0;
119
+ } else {
120
+ this.car$.getValue().gear--;
121
+ }
122
+ });
123
+ }
124
+
125
+ async stop(): Promise<void> {
126
+ this.stop$.next();
127
+ }
128
+ }