@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.
- package/.prettierrc +8 -0
- package/README.md +8 -0
- package/blender_exporter/build_blender_scene.py +180 -0
- package/blender_exporter/spherical_to_cube_texture.py +116 -0
- package/dist/2d/entities/gg-2d-entity.d.ts +20 -0
- package/dist/2d/entities/gg-2d-entity.js +84 -0
- package/dist/2d/entities/gg-2d-trigger.entity.d.ts +10 -0
- package/dist/2d/entities/gg-2d-trigger.entity.js +17 -0
- package/dist/2d/entities/gg-positionable-2d-entity.d.ts +7 -0
- package/dist/2d/entities/gg-positionable-2d-entity.js +16 -0
- package/dist/2d/factories.d.ts +18 -0
- package/dist/2d/factories.js +13 -0
- package/dist/2d/gg-2d-world.d.ts +9 -0
- package/dist/2d/gg-2d-world.js +34 -0
- package/dist/2d/interfaces.d.ts +26 -0
- package/dist/2d/interfaces.js +7 -0
- package/dist/2d/models/body-options.d.ts +3 -0
- package/dist/2d/models/body-options.js +2 -0
- package/dist/2d/models/shapes.d.ts +13 -0
- package/dist/2d/models/shapes.js +2 -0
- package/dist/3d/controllers/car-keyboard.controller.d.ts +25 -0
- package/dist/3d/controllers/car-keyboard.controller.js +98 -0
- package/dist/3d/controllers/free-camera.controller.d.ts +23 -0
- package/dist/3d/controllers/free-camera.controller.js +79 -0
- package/dist/3d/entities/controllers/entity-motion.controller.d.ts +32 -0
- package/dist/3d/entities/controllers/entity-motion.controller.js +100 -0
- package/dist/3d/entities/gg-3d-camera.entity.d.ts +7 -0
- package/dist/3d/entities/gg-3d-camera.entity.js +12 -0
- package/dist/3d/entities/gg-3d-entity.d.ts +25 -0
- package/dist/3d/entities/gg-3d-entity.js +108 -0
- package/dist/3d/entities/gg-3d-map-graph.entity.d.ts +51 -0
- package/dist/3d/entities/gg-3d-map-graph.entity.js +164 -0
- package/dist/3d/entities/gg-3d-raycast-vehicle.entity.d.ts +107 -0
- package/dist/3d/entities/gg-3d-raycast-vehicle.entity.js +372 -0
- package/dist/3d/entities/gg-3d-trigger.entity.d.ts +10 -0
- package/dist/3d/entities/gg-3d-trigger.entity.js +21 -0
- package/dist/3d/entities/gg-positionable-3d-entity.d.ts +11 -0
- package/dist/3d/entities/gg-positionable-3d-entity.js +27 -0
- package/dist/3d/factories.d.ts +21 -0
- package/dist/3d/factories.js +22 -0
- package/dist/3d/gg-3d-world.d.ts +11 -0
- package/dist/3d/gg-3d-world.js +36 -0
- package/dist/3d/interfaces.d.ts +65 -0
- package/dist/3d/interfaces.js +40 -0
- package/dist/3d/loader.d.ts +40 -0
- package/dist/3d/loader.js +129 -0
- package/dist/3d/models/body-options.d.ts +3 -0
- package/dist/3d/models/body-options.js +2 -0
- package/dist/3d/models/gg-meta.d.ts +22 -0
- package/dist/3d/models/gg-meta.js +2 -0
- package/dist/3d/models/shapes.d.ts +35 -0
- package/dist/3d/models/shapes.js +2 -0
- package/dist/base/clock.d.ts +26 -0
- package/dist/base/clock.js +82 -0
- package/dist/base/controllers/common.d.ts +8 -0
- package/dist/base/controllers/common.js +32 -0
- package/dist/base/controllers/i-controller.d.ts +4 -0
- package/dist/base/controllers/i-controller.js +2 -0
- package/dist/base/controllers/keyboard.controller.d.ts +16 -0
- package/dist/base/controllers/keyboard.controller.js +109 -0
- package/dist/base/controllers/mouse.controller.d.ts +24 -0
- package/dist/base/controllers/mouse.controller.js +68 -0
- package/dist/base/data-structures/graph.d.ts +20 -0
- package/dist/base/data-structures/graph.js +118 -0
- package/dist/base/entities/base-gg-renderer.d.ts +28 -0
- package/dist/base/entities/base-gg-renderer.js +49 -0
- package/dist/base/entities/gg-entity.d.ts +14 -0
- package/dist/base/entities/gg-entity.js +55 -0
- package/dist/base/entities/gg-positionable-entity.d.ts +23 -0
- package/dist/base/entities/gg-positionable-entity.js +47 -0
- package/dist/base/entities/inline-controller.d.ts +3 -0
- package/dist/base/entities/inline-controller.js +25 -0
- package/dist/base/entities/interfaces/i-tick-listener.d.ts +7 -0
- package/dist/base/entities/interfaces/i-tick-listener.js +6 -0
- package/dist/base/gg-static.d.ts +9 -0
- package/dist/base/gg-static.js +40 -0
- package/dist/base/gg-viewport-manager.d.ts +14 -0
- package/dist/base/gg-viewport-manager.js +125 -0
- package/dist/base/gg-viewport.d.ts +23 -0
- package/dist/base/gg-viewport.js +123 -0
- package/dist/base/gg-world.d.ts +32 -0
- package/dist/base/gg-world.js +172 -0
- package/dist/base/interfaces/gg-body.d.ts +15 -0
- package/dist/base/interfaces/gg-body.js +2 -0
- package/dist/base/interfaces/gg-debug-physics-drawer.d.ts +7 -0
- package/dist/base/interfaces/gg-debug-physics-drawer.js +2 -0
- package/dist/base/interfaces/gg-object.d.ts +16 -0
- package/dist/base/interfaces/gg-object.js +2 -0
- package/dist/base/interfaces/gg-physics-world.d.ts +18 -0
- package/dist/base/interfaces/gg-physics-world.js +2 -0
- package/dist/base/interfaces/gg-trigger.d.ts +8 -0
- package/dist/base/interfaces/gg-trigger.js +2 -0
- package/dist/base/interfaces/gg-visual-scene.d.ts +9 -0
- package/dist/base/interfaces/gg-visual-scene.js +2 -0
- package/dist/base/math/box.d.ts +5 -0
- package/dist/base/math/box.js +21 -0
- package/dist/base/math/matrix4.d.ts +5 -0
- package/dist/base/math/matrix4.js +33 -0
- package/dist/base/math/numbers.d.ts +2 -0
- package/dist/base/math/numbers.js +14 -0
- package/dist/base/math/point2.d.ts +15 -0
- package/dist/base/math/point2.js +40 -0
- package/dist/base/math/point3.d.ts +25 -0
- package/dist/base/math/point3.js +104 -0
- package/dist/base/math/quaternion.d.ts +28 -0
- package/dist/base/math/quaternion.js +145 -0
- package/dist/base/models/axis-directions.d.ts +3 -0
- package/dist/base/models/axis-directions.js +2 -0
- package/dist/base/models/body-options.d.ts +6 -0
- package/dist/base/models/body-options.js +2 -0
- package/dist/base/models/geometry-nodes.d.ts +7 -0
- package/dist/base/models/geometry-nodes.js +2 -0
- package/dist/base/models/points.d.ts +15 -0
- package/dist/base/models/points.js +2 -0
- package/dist/base/ui/gg-console.ui.d.ts +21 -0
- package/dist/base/ui/gg-console.ui.js +162 -0
- package/dist/base/ui/gg-debugger.ui.d.ts +10 -0
- package/dist/base/ui/gg-debugger.ui.js +68 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +67 -0
- package/package.json +64 -0
- package/src/2d/entities/gg-2d-entity.ts +86 -0
- package/src/2d/entities/gg-2d-trigger.entity.ts +17 -0
- package/src/2d/entities/gg-positionable-2d-entity.ts +16 -0
- package/src/2d/factories.ts +20 -0
- package/src/2d/gg-2d-world.ts +32 -0
- package/src/2d/interfaces.ts +31 -0
- package/src/2d/models/body-options.ts +3 -0
- package/src/2d/models/shapes.ts +7 -0
- package/src/3d/controllers/car-keyboard.controller.ts +128 -0
- package/src/3d/controllers/free-camera.controller.ts +86 -0
- package/src/3d/entities/controllers/entity-motion.controller.ts +122 -0
- package/src/3d/entities/gg-3d-camera.entity.ts +8 -0
- package/src/3d/entities/gg-3d-entity.ts +116 -0
- package/src/3d/entities/gg-3d-map-graph.entity.ts +204 -0
- package/src/3d/entities/gg-3d-raycast-vehicle.entity.ts +468 -0
- package/src/3d/entities/gg-3d-trigger.entity.ts +22 -0
- package/src/3d/entities/gg-positionable-3d-entity.ts +31 -0
- package/src/3d/factories.ts +29 -0
- package/src/3d/gg-3d-world.ts +36 -0
- package/src/3d/interfaces.ts +96 -0
- package/src/3d/loader.ts +165 -0
- package/src/3d/models/body-options.ts +3 -0
- package/src/3d/models/gg-meta.ts +12 -0
- package/src/3d/models/shapes.ts +13 -0
- package/src/base/clock.ts +97 -0
- package/src/base/controllers/common.ts +37 -0
- package/src/base/controllers/i-controller.ts +5 -0
- package/src/base/controllers/keyboard.controller.ts +109 -0
- package/src/base/controllers/mouse.controller.ts +73 -0
- package/src/base/data-structures/graph.ts +125 -0
- package/src/base/entities/base-gg-renderer.ts +77 -0
- package/src/base/entities/gg-entity.ts +61 -0
- package/src/base/entities/gg-positionable-entity.ts +64 -0
- package/src/base/entities/inline-controller.ts +31 -0
- package/src/base/entities/interfaces/i-tick-listener.ts +15 -0
- package/src/base/gg-static.ts +30 -0
- package/src/base/gg-viewport-manager.ts +122 -0
- package/src/base/gg-viewport.ts +159 -0
- package/src/base/gg-world.ts +198 -0
- package/src/base/interfaces/gg-body.ts +23 -0
- package/src/base/interfaces/gg-debug-physics-drawer.ts +10 -0
- package/src/base/interfaces/gg-object.ts +26 -0
- package/src/base/interfaces/gg-physics-world.ts +24 -0
- package/src/base/interfaces/gg-trigger.ts +10 -0
- package/src/base/interfaces/gg-visual-scene.ts +11 -0
- package/src/base/math/box.ts +19 -0
- package/src/base/math/matrix4.ts +29 -0
- package/src/base/math/numbers.ts +10 -0
- package/src/base/math/point2.ts +43 -0
- package/src/base/math/point3.ts +119 -0
- package/src/base/math/quaternion.ts +172 -0
- package/src/base/models/axis-directions.ts +3 -0
- package/src/base/models/body-options.ts +6 -0
- package/src/base/models/geometry-nodes.ts +5 -0
- package/src/base/models/points.ts +3 -0
- package/src/base/ui/gg-console.ui.ts +165 -0
- package/src/base/ui/gg-debugger.ui.ts +69 -0
- package/src/index.ts +53 -0
- package/test/base/data-structures/graph.spec.ts +76 -0
- 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;
|
package/dist/index.d.ts
ADDED
|
@@ -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,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
|
+
}
|