@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,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.KeyboardController = void 0;
|
|
13
|
+
const rxjs_1 = require("rxjs");
|
|
14
|
+
const operators_1 = require("rxjs/operators");
|
|
15
|
+
class KeyboardController {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.bindings = {};
|
|
18
|
+
this._running = false;
|
|
19
|
+
this.handleKeys = this.handleKeys.bind(this);
|
|
20
|
+
}
|
|
21
|
+
get running() {
|
|
22
|
+
return this._running;
|
|
23
|
+
}
|
|
24
|
+
bind(code) {
|
|
25
|
+
if (!this.bindings[code]) {
|
|
26
|
+
this.bindings[code] = [];
|
|
27
|
+
}
|
|
28
|
+
const subj = new rxjs_1.BehaviorSubject(false);
|
|
29
|
+
this.bindings[code].push(subj);
|
|
30
|
+
return subj.pipe((0, rxjs_1.finalize)(() => {
|
|
31
|
+
this.bindings[code].splice(this.bindings[code].indexOf(subj), 1);
|
|
32
|
+
subj.complete();
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
bindMany(...codes) {
|
|
36
|
+
if (codes.length == 0) {
|
|
37
|
+
console.warn('[KeyboardController] bindMany called without any key code');
|
|
38
|
+
return rxjs_1.NEVER;
|
|
39
|
+
}
|
|
40
|
+
if (codes.length == 1) {
|
|
41
|
+
return this.bind(codes[0]);
|
|
42
|
+
}
|
|
43
|
+
const subjects = [];
|
|
44
|
+
for (const code of codes) {
|
|
45
|
+
if (!this.bindings[code]) {
|
|
46
|
+
this.bindings[code] = [];
|
|
47
|
+
}
|
|
48
|
+
const subj = new rxjs_1.BehaviorSubject(false);
|
|
49
|
+
this.bindings[code].push(subj);
|
|
50
|
+
subjects.push(subj);
|
|
51
|
+
}
|
|
52
|
+
return (0, rxjs_1.combineLatest)(subjects).pipe((0, rxjs_1.finalize)(() => {
|
|
53
|
+
for (let i = 0; i < codes.length; i++) {
|
|
54
|
+
this.bindings[codes[i]].splice(this.bindings[codes[i]].indexOf(subjects[i]), 1);
|
|
55
|
+
subjects[i].complete();
|
|
56
|
+
}
|
|
57
|
+
}), (0, operators_1.map)(values => values.includes(true)));
|
|
58
|
+
}
|
|
59
|
+
emulateKeyDown(code) {
|
|
60
|
+
if (!this.running) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const subj of this.bindings[code] || []) {
|
|
64
|
+
subj.next(true);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
emulateKeyUp(code) {
|
|
68
|
+
if (!this.running) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
for (const subj of this.bindings[code] || []) {
|
|
72
|
+
subj.next(false);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
emulateKeyPress(code) {
|
|
76
|
+
this.emulateKeyDown(code);
|
|
77
|
+
this.emulateKeyUp(code);
|
|
78
|
+
}
|
|
79
|
+
start() {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
if (this.running) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
window.addEventListener('keydown', this.handleKeys);
|
|
85
|
+
window.addEventListener('keyup', this.handleKeys);
|
|
86
|
+
this._running = true;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
handleKeys(e) {
|
|
90
|
+
if (e.type != 'keydown' && e.type != 'keyup') {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const pressed = e.type == 'keydown';
|
|
94
|
+
for (const subj of this.bindings[e.code] || []) {
|
|
95
|
+
subj.next(pressed);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
stop() {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
if (!this.running) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
window.removeEventListener('keydown', this.handleKeys);
|
|
104
|
+
window.removeEventListener('keyup', this.handleKeys);
|
|
105
|
+
this._running = false;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.KeyboardController = KeyboardController;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { IController } from './i-controller';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { Point2 } from '../models/points';
|
|
4
|
+
export declare type MouseControllerPointLockOptions = {
|
|
5
|
+
ignoreMovementWhenNotLocked: boolean;
|
|
6
|
+
canvas: HTMLCanvasElement;
|
|
7
|
+
};
|
|
8
|
+
export declare type MouseControllerOptions = {
|
|
9
|
+
pointerLock?: MouseControllerPointLockOptions;
|
|
10
|
+
};
|
|
11
|
+
export declare class MouseController implements IController {
|
|
12
|
+
private readonly options;
|
|
13
|
+
private readonly _delta$;
|
|
14
|
+
get deltaX$(): Observable<number>;
|
|
15
|
+
get deltaY$(): Observable<number>;
|
|
16
|
+
get delta$(): Observable<Point2>;
|
|
17
|
+
constructor(options?: MouseControllerOptions);
|
|
18
|
+
private stopped$;
|
|
19
|
+
private _running;
|
|
20
|
+
get running(): boolean;
|
|
21
|
+
start(): Promise<void>;
|
|
22
|
+
private canvasClickListener;
|
|
23
|
+
stop(unlockPointer?: boolean): Promise<void>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MouseController = void 0;
|
|
13
|
+
const rxjs_1 = require("rxjs");
|
|
14
|
+
const operators_1 = require("rxjs/operators");
|
|
15
|
+
class MouseController {
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this._delta$ = new rxjs_1.Subject();
|
|
19
|
+
this.stopped$ = new rxjs_1.Subject();
|
|
20
|
+
this._running = false;
|
|
21
|
+
this.canvasClickListener = this.canvasClickListener.bind(this);
|
|
22
|
+
}
|
|
23
|
+
get deltaX$() {
|
|
24
|
+
return this._delta$.pipe((0, operators_1.map)(d => d.x));
|
|
25
|
+
}
|
|
26
|
+
get deltaY$() {
|
|
27
|
+
return this._delta$.pipe((0, operators_1.map)(d => d.y));
|
|
28
|
+
}
|
|
29
|
+
get delta$() {
|
|
30
|
+
return this._delta$.asObservable();
|
|
31
|
+
}
|
|
32
|
+
get running() {
|
|
33
|
+
return this._running;
|
|
34
|
+
}
|
|
35
|
+
start() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
if (this.running) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
(0, rxjs_1.fromEvent)(window, 'mousemove')
|
|
41
|
+
.pipe((0, rxjs_1.takeUntil)(this.stopped$), (0, rxjs_1.filter)(() => !this.options.pointerLock ||
|
|
42
|
+
!this.options.pointerLock.ignoreMovementWhenNotLocked ||
|
|
43
|
+
!!document.pointerLockElement), (0, operators_1.map)((e) => ({ x: e.movementX, y: e.movementY })))
|
|
44
|
+
.subscribe(v => this._delta$.next(v));
|
|
45
|
+
if (!!this.options.pointerLock) {
|
|
46
|
+
this.options.pointerLock.canvas.addEventListener('click', this.canvasClickListener);
|
|
47
|
+
}
|
|
48
|
+
this._running = true;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
canvasClickListener() {
|
|
52
|
+
this.options.pointerLock.canvas.requestPointerLock();
|
|
53
|
+
}
|
|
54
|
+
stop(unlockPointer = true) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
if (!this.running) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.stopped$.next();
|
|
60
|
+
if (unlockPointer && !!this.options.pointerLock) {
|
|
61
|
+
this.options.pointerLock.canvas.removeEventListener('click', this.canvasClickListener);
|
|
62
|
+
document.exitPointerLock();
|
|
63
|
+
}
|
|
64
|
+
this._running = false;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.MouseController = MouseController;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class Graph<T> {
|
|
2
|
+
static fromArray<T>(array: T[]): Graph<T>;
|
|
3
|
+
static fromSquareGrid<T>(grid: T[][]): Graph<T>;
|
|
4
|
+
data: T;
|
|
5
|
+
private adjacent;
|
|
6
|
+
constructor(data: T);
|
|
7
|
+
addAdjacent(node: Graph<T>): boolean;
|
|
8
|
+
removeAdjacent(node: Graph<T>): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Create an edge between two nodes
|
|
11
|
+
*/
|
|
12
|
+
addEdge(source: Graph<T>, destination: Graph<T>): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Remove an edge between two nodes
|
|
15
|
+
*/
|
|
16
|
+
removeEdge(source: Graph<T>, destination: Graph<T>): boolean;
|
|
17
|
+
walkRead(depth: number): Set<Graph<T>>;
|
|
18
|
+
walkReadPreserveDepth(depth: number): Set<Graph<T>>[];
|
|
19
|
+
nodes(): Graph<T>[];
|
|
20
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Graph = void 0;
|
|
4
|
+
class Graph {
|
|
5
|
+
constructor(data) {
|
|
6
|
+
this.data = data;
|
|
7
|
+
this.adjacent = new Set();
|
|
8
|
+
}
|
|
9
|
+
static fromArray(array) {
|
|
10
|
+
const root = new Graph(array[0]);
|
|
11
|
+
let tail = root;
|
|
12
|
+
for (let i = 1; i < array.length; i++) {
|
|
13
|
+
const newTail = new Graph(array[i]);
|
|
14
|
+
tail.addAdjacent(newTail);
|
|
15
|
+
tail = newTail;
|
|
16
|
+
}
|
|
17
|
+
return root;
|
|
18
|
+
}
|
|
19
|
+
static fromSquareGrid(grid) {
|
|
20
|
+
const nodes = grid.map(sgrid => sgrid.map(item => new Graph(item)));
|
|
21
|
+
// bind them
|
|
22
|
+
for (let j = 0; j < nodes.length; j++) {
|
|
23
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
24
|
+
if (i > 0) {
|
|
25
|
+
nodes[j][i].addAdjacent(nodes[j][i - 1]);
|
|
26
|
+
}
|
|
27
|
+
if (j > 0) {
|
|
28
|
+
nodes[j][i].addAdjacent(nodes[j - 1][i]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return nodes[0][0];
|
|
33
|
+
}
|
|
34
|
+
addAdjacent(node) {
|
|
35
|
+
if (this.adjacent.has(node)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
this.adjacent.add(node);
|
|
39
|
+
node.adjacent.add(this);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
removeAdjacent(node) {
|
|
43
|
+
if (!this.adjacent.has(node)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
this.adjacent.delete(node);
|
|
47
|
+
node.adjacent.delete(this);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an edge between two nodes
|
|
52
|
+
*/
|
|
53
|
+
addEdge(source, destination) {
|
|
54
|
+
if (!this.removeAdjacent(destination)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
this.addAdjacent(source);
|
|
58
|
+
source.addAdjacent(destination);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Remove an edge between two nodes
|
|
63
|
+
*/
|
|
64
|
+
removeEdge(source, destination) {
|
|
65
|
+
if (!source.adjacent.has(this) || !source.adjacent.has(destination)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
source.removeAdjacent(this);
|
|
69
|
+
source.removeAdjacent(destination);
|
|
70
|
+
return this.addAdjacent(destination);
|
|
71
|
+
}
|
|
72
|
+
walkRead(depth) {
|
|
73
|
+
const visited = new Set();
|
|
74
|
+
const stack = [[this, depth]];
|
|
75
|
+
visited.add(this);
|
|
76
|
+
while (stack.length) {
|
|
77
|
+
const next = stack.shift();
|
|
78
|
+
const [node, depthLeft] = next;
|
|
79
|
+
if (depthLeft !== 0) {
|
|
80
|
+
const children = Array.from(node.adjacent).filter(c => !visited.has(c));
|
|
81
|
+
for (const child of children) {
|
|
82
|
+
visited.add(child);
|
|
83
|
+
stack.push([child, depthLeft - 1]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return visited;
|
|
88
|
+
}
|
|
89
|
+
// the same as "walkRead", but returns array of sets (per depth), so distance to each found node can be tracked
|
|
90
|
+
walkReadPreserveDepth(depth) {
|
|
91
|
+
const visited = new Set();
|
|
92
|
+
const result = [];
|
|
93
|
+
const stack = [[this, depth]];
|
|
94
|
+
visited.add(this);
|
|
95
|
+
while (stack.length) {
|
|
96
|
+
const next = stack.shift();
|
|
97
|
+
const [node, depthLeft] = next;
|
|
98
|
+
const distance = depth - depthLeft;
|
|
99
|
+
if (!result[distance]) {
|
|
100
|
+
result[distance] = new Set();
|
|
101
|
+
}
|
|
102
|
+
result[distance].add(node);
|
|
103
|
+
if (depthLeft !== 0) {
|
|
104
|
+
const children = Array.from(node.adjacent).filter(c => !visited.has(c));
|
|
105
|
+
for (const child of children) {
|
|
106
|
+
visited.add(child);
|
|
107
|
+
stack.push([child, depthLeft - 1]);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
// TODO return iterable?
|
|
114
|
+
nodes() {
|
|
115
|
+
return Array.from(this.walkRead(-1));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.Graph = Graph;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ITickListener } from './interfaces/i-tick-listener';
|
|
2
|
+
import { Subject, Subscription } from 'rxjs';
|
|
3
|
+
import { GgEntity } from './gg-entity';
|
|
4
|
+
import { Point2 } from '../models/points';
|
|
5
|
+
export declare type RendererOptions = {
|
|
6
|
+
transparent: boolean;
|
|
7
|
+
background: number;
|
|
8
|
+
forceRendererSize?: Point2;
|
|
9
|
+
forceResolution?: number;
|
|
10
|
+
antialias: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare abstract class BaseGgRenderer extends GgEntity implements ITickListener {
|
|
13
|
+
protected _permanentRenderMethods: Map<number, Function>;
|
|
14
|
+
protected _singularRenderMethods: Map<number, Function>;
|
|
15
|
+
private initialized;
|
|
16
|
+
readonly tick$: Subject<[number, number]>;
|
|
17
|
+
readonly tickOrder = 1000;
|
|
18
|
+
protected tickListener: Subscription | null;
|
|
19
|
+
readonly rendererOptions: RendererOptions;
|
|
20
|
+
protected constructor(canvas?: HTMLCanvasElement, options?: Partial<RendererOptions>);
|
|
21
|
+
get isActive(): boolean;
|
|
22
|
+
activate(): void;
|
|
23
|
+
deactivate(): void;
|
|
24
|
+
init(): void;
|
|
25
|
+
abstract render(): void;
|
|
26
|
+
abstract resize(newSize: Point2): void;
|
|
27
|
+
abstract dispose(): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseGgRenderer = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const gg_entity_1 = require("./gg-entity");
|
|
6
|
+
const gg_viewport_manager_1 = require("../gg-viewport-manager");
|
|
7
|
+
class BaseGgRenderer extends gg_entity_1.GgEntity {
|
|
8
|
+
constructor(canvas, options = {}) {
|
|
9
|
+
super();
|
|
10
|
+
this.initialized = false;
|
|
11
|
+
this.tickOrder = 1000;
|
|
12
|
+
this.tickListener = null;
|
|
13
|
+
this.rendererOptions = Object.assign({ transparent: false, background: 0x000000, antialias: true }, (options || {}));
|
|
14
|
+
this._permanentRenderMethods = new Map();
|
|
15
|
+
this._singularRenderMethods = new Map();
|
|
16
|
+
this.tick$ = new rxjs_1.Subject();
|
|
17
|
+
if (canvas) {
|
|
18
|
+
setTimeout(() => {
|
|
19
|
+
gg_viewport_manager_1.GgViewportManager.instance.assignRendererToCanvas(this, canvas).then();
|
|
20
|
+
}, 0);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
get isActive() {
|
|
24
|
+
return !!this.tickListener;
|
|
25
|
+
}
|
|
26
|
+
activate() {
|
|
27
|
+
if (this.isActive) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!this.initialized) {
|
|
31
|
+
this.init();
|
|
32
|
+
}
|
|
33
|
+
this.tickListener = this.tick$.subscribe(() => {
|
|
34
|
+
this.render();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
deactivate() {
|
|
38
|
+
var _a;
|
|
39
|
+
if (!this.isActive) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
(_a = this.tickListener) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
43
|
+
this.tickListener = null;
|
|
44
|
+
}
|
|
45
|
+
init() {
|
|
46
|
+
this.initialized = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.BaseGgRenderer = BaseGgRenderer;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GgWorld } from '../gg-world';
|
|
2
|
+
export declare abstract class GgEntity {
|
|
3
|
+
get world(): GgWorld<any, any> | null;
|
|
4
|
+
protected _world: GgWorld<any, any> | null;
|
|
5
|
+
protected _name: string;
|
|
6
|
+
get name(): string;
|
|
7
|
+
set name(value: string);
|
|
8
|
+
protected _children: GgEntity[];
|
|
9
|
+
addChildren(...entities: GgEntity[]): void;
|
|
10
|
+
removeChildren(entities: GgEntity[], dispose?: boolean): void;
|
|
11
|
+
onSpawned(world: GgWorld<any, any>): void;
|
|
12
|
+
onRemoved(): void;
|
|
13
|
+
dispose(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GgEntity = void 0;
|
|
4
|
+
class GgEntity {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._world = null;
|
|
7
|
+
this._name = '';
|
|
8
|
+
this._children = [];
|
|
9
|
+
}
|
|
10
|
+
get world() {
|
|
11
|
+
return this._world;
|
|
12
|
+
}
|
|
13
|
+
get name() {
|
|
14
|
+
return this._name;
|
|
15
|
+
}
|
|
16
|
+
set name(value) {
|
|
17
|
+
this._name = value;
|
|
18
|
+
}
|
|
19
|
+
addChildren(...entities) {
|
|
20
|
+
this._children.push(...entities);
|
|
21
|
+
if (this._world) {
|
|
22
|
+
for (const item of entities) {
|
|
23
|
+
this._world.addEntity(item);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
removeChildren(entities, dispose = false) {
|
|
28
|
+
this._children = this._children.filter(c => !entities.includes(c));
|
|
29
|
+
if (this._world) {
|
|
30
|
+
for (const item of entities) {
|
|
31
|
+
this._world.removeEntity(item, dispose);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
onSpawned(world) {
|
|
36
|
+
this._world = world;
|
|
37
|
+
for (const c of this._children) {
|
|
38
|
+
world.addEntity(c);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
onRemoved() {
|
|
42
|
+
const world = this._world;
|
|
43
|
+
this._world = null;
|
|
44
|
+
for (const c of this._children) {
|
|
45
|
+
world.removeEntity(c);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// TODO add some flag to entity that it is disposed, and throw a normal error when trying to add such entity to world again
|
|
49
|
+
dispose() {
|
|
50
|
+
for (const c of this._children) {
|
|
51
|
+
c.dispose();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.GgEntity = GgEntity;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
2
|
+
import { GgEntity } from './gg-entity';
|
|
3
|
+
import { GgWorld } from '../gg-world';
|
|
4
|
+
export declare abstract class GgPositionableEntity<D, R> extends GgEntity {
|
|
5
|
+
protected readonly _position$: BehaviorSubject<D>;
|
|
6
|
+
protected readonly _rotation$: BehaviorSubject<R>;
|
|
7
|
+
protected readonly _scale$: BehaviorSubject<D>;
|
|
8
|
+
abstract getDefaultPosition(): D;
|
|
9
|
+
abstract getDefaultRotation(): R;
|
|
10
|
+
abstract getDefaultScale(): D;
|
|
11
|
+
get world(): GgWorld<D, R> | null;
|
|
12
|
+
get position(): D;
|
|
13
|
+
get position$(): Observable<D>;
|
|
14
|
+
set position(value: D);
|
|
15
|
+
get rotation(): R;
|
|
16
|
+
get rotation$(): Observable<R>;
|
|
17
|
+
set rotation(value: R);
|
|
18
|
+
get scale(): D;
|
|
19
|
+
get scale$(): Observable<D>;
|
|
20
|
+
set scale(value: D);
|
|
21
|
+
protected constructor();
|
|
22
|
+
onSpawned(world: GgWorld<D, R>): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GgPositionableEntity = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const gg_entity_1 = require("./gg-entity");
|
|
6
|
+
class GgPositionableEntity extends gg_entity_1.GgEntity {
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
this._position$ = new rxjs_1.BehaviorSubject(this.getDefaultPosition());
|
|
10
|
+
this._rotation$ = new rxjs_1.BehaviorSubject(this.getDefaultRotation());
|
|
11
|
+
this._scale$ = new rxjs_1.BehaviorSubject(this.getDefaultScale());
|
|
12
|
+
}
|
|
13
|
+
get world() {
|
|
14
|
+
return super.world;
|
|
15
|
+
}
|
|
16
|
+
get position() {
|
|
17
|
+
return this._position$.getValue();
|
|
18
|
+
}
|
|
19
|
+
get position$() {
|
|
20
|
+
return this._position$.asObservable();
|
|
21
|
+
}
|
|
22
|
+
set position(value) {
|
|
23
|
+
this._position$.next(value);
|
|
24
|
+
}
|
|
25
|
+
get rotation() {
|
|
26
|
+
return this._rotation$.getValue();
|
|
27
|
+
}
|
|
28
|
+
get rotation$() {
|
|
29
|
+
return this._rotation$.asObservable();
|
|
30
|
+
}
|
|
31
|
+
set rotation(value) {
|
|
32
|
+
this._rotation$.next(value);
|
|
33
|
+
}
|
|
34
|
+
get scale() {
|
|
35
|
+
return this._scale$.getValue();
|
|
36
|
+
}
|
|
37
|
+
get scale$() {
|
|
38
|
+
return this._scale$.asObservable();
|
|
39
|
+
}
|
|
40
|
+
set scale(value) {
|
|
41
|
+
this._scale$.next(value);
|
|
42
|
+
}
|
|
43
|
+
onSpawned(world) {
|
|
44
|
+
super.onSpawned(world);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.GgPositionableEntity = GgPositionableEntity;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInlineTickController = void 0;
|
|
4
|
+
const gg_entity_1 = require("./gg-entity");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
class InlineTickController extends gg_entity_1.GgEntity {
|
|
7
|
+
constructor(tickOrder) {
|
|
8
|
+
super();
|
|
9
|
+
this.tickOrder = tickOrder;
|
|
10
|
+
this.tick$ = new rxjs_1.Subject();
|
|
11
|
+
}
|
|
12
|
+
dispose() {
|
|
13
|
+
super.dispose();
|
|
14
|
+
this.tick$.unsubscribe();
|
|
15
|
+
this.tick$.complete();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function createInlineTickController(world, tickOrder = 750) {
|
|
19
|
+
const controller = new InlineTickController(tickOrder);
|
|
20
|
+
world.addEntity(controller);
|
|
21
|
+
return controller.tick$.pipe((0, rxjs_1.finalize)(() => {
|
|
22
|
+
world.removeEntity(controller);
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
exports.createInlineTickController = createInlineTickController;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isITickListener = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const isITickListener = entity => (entity === null || entity === void 0 ? void 0 : entity.tick$) instanceof rxjs_1.Subject;
|
|
6
|
+
exports.isITickListener = isITickListener;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GgWorld } from './gg-world';
|
|
2
|
+
export declare class GgStatic {
|
|
3
|
+
private static _instance;
|
|
4
|
+
static get instance(): GgStatic;
|
|
5
|
+
private constructor();
|
|
6
|
+
readonly worlds: GgWorld<any, any>[];
|
|
7
|
+
selectedWorld: GgWorld<any, any> | null;
|
|
8
|
+
console(input: string): Promise<string>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GgStatic = void 0;
|
|
13
|
+
class GgStatic {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.worlds = [];
|
|
16
|
+
this.selectedWorld = null;
|
|
17
|
+
window.gg = this;
|
|
18
|
+
}
|
|
19
|
+
static get instance() {
|
|
20
|
+
if (!GgStatic._instance) {
|
|
21
|
+
GgStatic._instance = new GgStatic();
|
|
22
|
+
}
|
|
23
|
+
return GgStatic._instance;
|
|
24
|
+
}
|
|
25
|
+
console(input) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
if (!this.selectedWorld) {
|
|
28
|
+
return 'World not selected';
|
|
29
|
+
}
|
|
30
|
+
const commands = input.split('\n');
|
|
31
|
+
let output = [];
|
|
32
|
+
for (const command of commands) {
|
|
33
|
+
const parts = command.split(' ');
|
|
34
|
+
output.push(yield this.selectedWorld.runConsoleCommand(parts.splice(0, 1)[0], parts));
|
|
35
|
+
}
|
|
36
|
+
return output.join('\n');
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.GgStatic = GgStatic;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { BaseGgRenderer } from './entities/base-gg-renderer';
|
|
3
|
+
export declare class GgViewportManager {
|
|
4
|
+
private static _instance;
|
|
5
|
+
static get instance(): GgViewportManager;
|
|
6
|
+
private constructor();
|
|
7
|
+
private readonly canvases;
|
|
8
|
+
private gameStage$;
|
|
9
|
+
protected destroyed: Subject<void>;
|
|
10
|
+
private getStageAsync;
|
|
11
|
+
createCanvas(zIndex: number): Promise<HTMLCanvasElement>;
|
|
12
|
+
registerCanvas(canvas: HTMLCanvasElement, zIndex: number): Promise<void>;
|
|
13
|
+
assignRendererToCanvas(renderer: BaseGgRenderer, canvas: HTMLCanvasElement): Promise<void>;
|
|
14
|
+
}
|