@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,98 @@
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.CarKeyboardController = void 0;
13
+ const rxjs_1 = require("rxjs");
14
+ const operators_1 = require("rxjs/operators");
15
+ const common_1 = require("../../base/controllers/common");
16
+ // TODO pass as settings
17
+ // TODO smooth y?
18
+ const TICKER_INTERVAL = 16;
19
+ const TICKER_MAX_STEPS = 10;
20
+ class CarKeyboardController {
21
+ constructor(keyboardController, car, options = { keymap: 'arrows', gearUpDownKeys: ['KeyA', 'KeyZ'] }) {
22
+ this.keyboardController = keyboardController;
23
+ this.options = options;
24
+ // emits values -1 - 1; -1 = full turn left; 1 = full turn right
25
+ this.x$ = new rxjs_1.BehaviorSubject(0);
26
+ // emits values -1 - 1; -1 = full brake; 1 = full acceleration
27
+ this.y$ = new rxjs_1.BehaviorSubject(0);
28
+ this.lastX = 0;
29
+ this.stop$ = new rxjs_1.Subject();
30
+ this.car$ = new rxjs_1.BehaviorSubject(null);
31
+ this.pairTickerPipe = (0, rxjs_1.pipe)((0, operators_1.startWith)(0), (0, operators_1.pairwise)(), (0, operators_1.map)(([beforeValue, afterValue]) => [this.lastX, afterValue]), (0, operators_1.switchMap)(([beforeValue, afterValue]) => (0, rxjs_1.interval)(TICKER_INTERVAL).pipe((0, operators_1.take)(TICKER_MAX_STEPS), (0, operators_1.map)(count => ++count), (0, operators_1.map)(count => beforeValue * ((TICKER_MAX_STEPS - count) / TICKER_MAX_STEPS) + afterValue * (count / TICKER_MAX_STEPS)), (0, operators_1.tap)(x => {
32
+ this.lastX = x;
33
+ }))));
34
+ this.car$.next(car);
35
+ }
36
+ set car(value) {
37
+ this.car$.next(value);
38
+ }
39
+ get car() {
40
+ return this.car$.getValue();
41
+ }
42
+ start() {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ let moveDirection = {};
45
+ (0, common_1.bindDirectionKeys)(this.keyboardController, this.options.keymap)
46
+ .pipe((0, rxjs_1.takeUntil)(this.stop$))
47
+ .subscribe(d => {
48
+ moveDirection = d;
49
+ });
50
+ this.car$
51
+ .pipe((0, rxjs_1.takeUntil)(this.stop$), (0, operators_1.switchMap)(c => c.tick$), (0, rxjs_1.takeUntil)(this.stop$), (0, operators_1.map)(() => {
52
+ const direction = [0, 0];
53
+ if (moveDirection.leftRight !== undefined)
54
+ direction[0] = moveDirection.leftRight ? -1 : 1;
55
+ if (moveDirection.upDown !== undefined)
56
+ direction[1] = moveDirection.upDown ? 1 : -1;
57
+ return direction;
58
+ }))
59
+ .subscribe(([x, y]) => {
60
+ this.x$.next(x);
61
+ this.y$.next(y);
62
+ });
63
+ (0, rxjs_1.combineLatest)([
64
+ this.x$.pipe((0, rxjs_1.takeUntil)(this.stop$), (0, operators_1.distinctUntilChanged)(), this.pairTickerPipe),
65
+ this.y$.pipe((0, rxjs_1.takeUntil)(this.stop$), (0, operators_1.distinctUntilChanged)()),
66
+ ]).subscribe(([x, y]) => {
67
+ this.car$.getValue().setXAxisControlValue(x);
68
+ this.car$.getValue().setYAxisControlValue(y);
69
+ });
70
+ this.keyboardController
71
+ .bind(this.options.gearUpDownKeys[0])
72
+ .pipe((0, rxjs_1.takeUntil)(this.stop$), (0, rxjs_1.filter)(x => !!x))
73
+ .subscribe(() => {
74
+ if (this.car$.getValue() &&
75
+ (!this.car$.getValue().carProperties.transmission.isAuto || this.car$.getValue().gear <= 0)) {
76
+ this.car$.getValue().gear++;
77
+ }
78
+ });
79
+ this.keyboardController
80
+ .bind(this.options.gearUpDownKeys[1])
81
+ .pipe((0, rxjs_1.takeUntil)(this.stop$), (0, rxjs_1.filter)(x => !!x))
82
+ .subscribe(() => {
83
+ if (this.car$.getValue().carProperties.transmission.isAuto && this.car.gear > 1) {
84
+ this.car$.getValue().gear = 0;
85
+ }
86
+ else {
87
+ this.car$.getValue().gear--;
88
+ }
89
+ });
90
+ });
91
+ }
92
+ stop() {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ this.stop$.next();
95
+ });
96
+ }
97
+ }
98
+ exports.CarKeyboardController = CarKeyboardController;
@@ -0,0 +1,23 @@
1
+ import { IController } from '../../base/controllers/i-controller';
2
+ import { MouseControllerOptions } from '../../base/controllers/mouse.controller';
3
+ import { Gg3dCameraEntity } from '../entities/gg-3d-camera.entity';
4
+ import { KeyboardController } from '../../base/controllers/keyboard.controller';
5
+ import { DirectionKeymap } from '../../base/controllers/common';
6
+ declare type FreeCameraControllerOptions = {
7
+ keymap: DirectionKeymap;
8
+ movementOptions: {
9
+ speed: number;
10
+ };
11
+ mouseOptions: MouseControllerOptions;
12
+ };
13
+ export declare class FreeCameraController implements IController {
14
+ private readonly keyboardController;
15
+ private readonly camera;
16
+ private readonly options;
17
+ private readonly mController;
18
+ private readonly stop$;
19
+ constructor(keyboardController: KeyboardController, camera: Gg3dCameraEntity, options?: FreeCameraControllerOptions);
20
+ start(): Promise<void>;
21
+ stop(unlockPointer?: boolean): Promise<void>;
22
+ }
23
+ export {};
@@ -0,0 +1,79 @@
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.FreeCameraController = void 0;
13
+ const rxjs_1 = require("rxjs");
14
+ const mouse_controller_1 = require("../../base/controllers/mouse.controller");
15
+ const point3_1 = require("../../base/math/point3");
16
+ const point2_1 = require("../../base/math/point2");
17
+ const quaternion_1 = require("../../base/math/quaternion");
18
+ const common_1 = require("../../base/controllers/common");
19
+ class FreeCameraController {
20
+ constructor(keyboardController, camera, options = {
21
+ keymap: 'wasd',
22
+ movementOptions: { speed: 0.5 },
23
+ mouseOptions: {},
24
+ }) {
25
+ this.keyboardController = keyboardController;
26
+ this.camera = camera;
27
+ this.options = options;
28
+ this.stop$ = new rxjs_1.Subject();
29
+ this.mController = new mouse_controller_1.MouseController(options.mouseOptions);
30
+ }
31
+ start() {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ let controls = { direction: {}, rest: [] };
34
+ const keys = ['KeyE', 'KeyQ'];
35
+ if (this.camera.object3D.supportsFov) {
36
+ keys.push('KeyZ', 'KeyC');
37
+ }
38
+ (0, common_1.bindDirectionKeys)(this.keyboardController, this.options.keymap)
39
+ .pipe((0, rxjs_1.takeUntil)(this.stop$))
40
+ .subscribe(d => {
41
+ controls.direction = d;
42
+ });
43
+ (0, rxjs_1.combineLatest)(keys.map(c => this.keyboardController.bind(c)))
44
+ .pipe((0, rxjs_1.takeUntil)(this.stop$))
45
+ .subscribe((d) => {
46
+ controls.rest = d;
47
+ });
48
+ let rotationDelta = { x: 0, y: 0 };
49
+ this.mController.delta$.pipe((0, rxjs_1.takeUntil)(this.stop$)).subscribe(delta => {
50
+ rotationDelta = point2_1.Pnt2.add(rotationDelta, delta);
51
+ });
52
+ this.camera.tick$.pipe((0, rxjs_1.takeUntil)(this.stop$)).subscribe(() => {
53
+ let translateVector = { x: 0, y: 0, z: 0 };
54
+ const [u, d, zo, zi] = controls.rest;
55
+ if (controls.direction.upDown !== undefined)
56
+ translateVector.z = controls.direction.upDown ? -1 : 1;
57
+ if (controls.direction.leftRight !== undefined)
58
+ translateVector.x = controls.direction.leftRight ? -1 : 1;
59
+ if (u != d)
60
+ translateVector.y = d ? -1 : 1;
61
+ if (zo != zi)
62
+ this.camera.object3D.fov += zo ? 1 : -1;
63
+ this.camera.position = point3_1.Pnt3.add(this.camera.position, point3_1.Pnt3.rot(point3_1.Pnt3.scalarMult(point3_1.Pnt3.norm(translateVector), this.options.movementOptions.speed), this.camera.rotation));
64
+ if (rotationDelta.x != 0 || rotationDelta.y != 0) {
65
+ this.camera.rotation = quaternion_1.Qtrn.combineRotations(quaternion_1.Qtrn.fromAngle({ x: 0, y: 0, z: 1 }, -rotationDelta.x / 300), this.camera.rotation, quaternion_1.Qtrn.fromAngle({ x: 1, y: 0, z: 0 }, -rotationDelta.y / 300));
66
+ rotationDelta = { x: 0, y: 0 };
67
+ }
68
+ });
69
+ yield this.mController.start();
70
+ });
71
+ }
72
+ stop(unlockPointer = true) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ this.stop$.next();
75
+ yield this.mController.stop(unlockPointer);
76
+ });
77
+ }
78
+ }
79
+ exports.FreeCameraController = FreeCameraController;
@@ -0,0 +1,32 @@
1
+ import { GgEntity } from '../../../base/entities/gg-entity';
2
+ import { ITickListener } from '../../../base/entities/interfaces/i-tick-listener';
3
+ import { Subject } from 'rxjs';
4
+ import { Gg3dWorld } from '../../gg-3d-world';
5
+ import { GgPositionable3dEntity } from '../gg-positionable-3d-entity';
6
+ import { Point3, Point4 } from '../../../base/models/points';
7
+ export declare type MotionControlFuncReturn = {
8
+ position: Point3;
9
+ rotation: Point4;
10
+ customParameters: {
11
+ [key: string]: any;
12
+ };
13
+ };
14
+ export declare type MotionControlFunction = (delta: number) => MotionControlFuncReturn;
15
+ export declare class EntityMotionController extends GgEntity implements ITickListener {
16
+ target: GgPositionable3dEntity;
17
+ protected _motionControlFunction: MotionControlFunction;
18
+ customParametersHandleFunc: (target: GgPositionable3dEntity, params: any) => void;
19
+ get motionControlFunction(): MotionControlFunction;
20
+ set motionControlFunction(value: MotionControlFunction);
21
+ readonly tick$: Subject<[number, number]>;
22
+ protected readonly removed$: Subject<void>;
23
+ readonly tickOrder: number;
24
+ constructor(target: GgPositionable3dEntity, _motionControlFunction: MotionControlFunction, customParametersHandleFunc?: (target: GgPositionable3dEntity, params: any) => void);
25
+ protected lastValue: MotionControlFuncReturn | undefined;
26
+ private currentTransition;
27
+ transitFromStaticState(state: MotionControlFuncReturn, newFunc: MotionControlFunction, transitionDuration: number, easing?: (t: number) => number, customParametersLerpFunc?: (a: any, b: any, t: number) => any): void;
28
+ transitControlFunction(newFunc: MotionControlFunction, transitionDuration: number, easing?: (t: number) => number, customParametersLerpFunc?: (a: any, b: any, t: number) => any): void;
29
+ onSpawned(world: Gg3dWorld): void;
30
+ onRemoved(): void;
31
+ dispose(): void;
32
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityMotionController = void 0;
4
+ const gg_entity_1 = require("../../../base/entities/gg-entity");
5
+ const rxjs_1 = require("rxjs");
6
+ const point3_1 = require("../../../base/math/point3");
7
+ const quaternion_1 = require("../../../base/math/quaternion");
8
+ class EntityMotionController extends gg_entity_1.GgEntity {
9
+ constructor(target, _motionControlFunction, customParametersHandleFunc = () => { }) {
10
+ super();
11
+ this.target = target;
12
+ this._motionControlFunction = _motionControlFunction;
13
+ this.customParametersHandleFunc = customParametersHandleFunc;
14
+ this.tick$ = new rxjs_1.Subject();
15
+ this.removed$ = new rxjs_1.Subject();
16
+ this.tickOrder = 750;
17
+ this.currentTransition = null;
18
+ }
19
+ get motionControlFunction() {
20
+ return this._motionControlFunction;
21
+ }
22
+ set motionControlFunction(value) {
23
+ if (this.currentTransition) {
24
+ this.currentTransition.unsubscribe();
25
+ this.currentTransition = null;
26
+ }
27
+ this._motionControlFunction = value;
28
+ }
29
+ // smoothly set controller function, animate from some determined state
30
+ transitFromStaticState(state, newFunc, transitionDuration, easing = x => x, customParametersLerpFunc = (a, b, t) => b) {
31
+ this.lastValue = state;
32
+ this._motionControlFunction = () => state;
33
+ return this.transitControlFunction(newFunc, transitionDuration, easing, customParametersLerpFunc);
34
+ }
35
+ // smoothly change controller function
36
+ transitControlFunction(newFunc, transitionDuration, easing = x => x, customParametersLerpFunc = (a, b, t) => b) {
37
+ let oldControlFunc;
38
+ if (this.currentTransition) {
39
+ this.currentTransition.unsubscribe();
40
+ this.currentTransition = null;
41
+ if (this.lastValue) {
42
+ oldControlFunc = () => this.lastValue;
43
+ }
44
+ else {
45
+ this._motionControlFunction = newFunc;
46
+ return;
47
+ }
48
+ }
49
+ else {
50
+ oldControlFunc = this._motionControlFunction;
51
+ }
52
+ let k = 0;
53
+ this._motionControlFunction = delta => {
54
+ const oldRes = oldControlFunc(delta);
55
+ const newRes = newFunc(delta);
56
+ return {
57
+ customParameters: customParametersLerpFunc(oldRes.customParameters, newRes.customParameters, k),
58
+ position: point3_1.Pnt3.lerp(oldRes.position, newRes.position, k),
59
+ rotation: quaternion_1.Qtrn.slerp(oldRes.rotation, newRes.rotation, k),
60
+ };
61
+ };
62
+ let startTime;
63
+ this.currentTransition = this.tick$.pipe((0, rxjs_1.takeUntil)(this.removed$)).subscribe(([elapsed, _]) => {
64
+ if (startTime === undefined) {
65
+ startTime = elapsed;
66
+ }
67
+ else {
68
+ k = (elapsed - startTime) / transitionDuration;
69
+ if (k >= 1) {
70
+ k = 1;
71
+ this.currentTransition.unsubscribe();
72
+ this.currentTransition = null;
73
+ this._motionControlFunction = newFunc;
74
+ }
75
+ else {
76
+ k = easing(k);
77
+ }
78
+ }
79
+ });
80
+ }
81
+ onSpawned(world) {
82
+ super.onSpawned(world);
83
+ this.tick$.pipe((0, rxjs_1.takeUntil)(this.removed$)).subscribe(([_, delta]) => {
84
+ this.lastValue = this._motionControlFunction(delta);
85
+ this.target.position = this.lastValue.position;
86
+ this.target.rotation = this.lastValue.rotation;
87
+ this.customParametersHandleFunc(this.target, this.lastValue.customParameters);
88
+ });
89
+ }
90
+ onRemoved() {
91
+ super.onRemoved();
92
+ this.removed$.next();
93
+ }
94
+ dispose() {
95
+ super.dispose();
96
+ this.tick$.unsubscribe();
97
+ this.tick$.complete();
98
+ }
99
+ }
100
+ exports.EntityMotionController = EntityMotionController;
@@ -0,0 +1,7 @@
1
+ import { IGg3dBody, IGg3dCamera } from '../interfaces';
2
+ import { Gg3dEntity } from './gg-3d-entity';
3
+ export declare class Gg3dCameraEntity<T extends IGg3dCamera = IGg3dCamera> extends Gg3dEntity {
4
+ readonly object3D: T;
5
+ readonly objectBody: IGg3dBody | null;
6
+ constructor(object3D: T, objectBody?: IGg3dBody | null);
7
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Gg3dCameraEntity = void 0;
4
+ const gg_3d_entity_1 = require("./gg-3d-entity");
5
+ class Gg3dCameraEntity extends gg_3d_entity_1.Gg3dEntity {
6
+ constructor(object3D, objectBody = null) {
7
+ super(object3D, objectBody);
8
+ this.object3D = object3D;
9
+ this.objectBody = objectBody;
10
+ }
11
+ }
12
+ exports.Gg3dCameraEntity = Gg3dCameraEntity;
@@ -0,0 +1,25 @@
1
+ import { Subject } from 'rxjs';
2
+ import { GgPositionable3dEntity } from './gg-positionable-3d-entity';
3
+ import { ITickListener } from '../../base/entities/interfaces/i-tick-listener';
4
+ import { Point3, Point4 } from '../../base/models/points';
5
+ import { Gg3dWorld } from '../gg-3d-world';
6
+ import { IGg3dBody, IGg3dObject } from '../interfaces';
7
+ export declare class Gg3dEntity extends GgPositionable3dEntity implements ITickListener {
8
+ readonly object3D: IGg3dObject | null;
9
+ readonly objectBody: IGg3dBody | null;
10
+ readonly tick$: Subject<[number, number]>;
11
+ readonly tickOrder = 750;
12
+ get position(): Point3;
13
+ set position(value: Point3);
14
+ get rotation(): Point4;
15
+ set rotation(value: Point4);
16
+ get scale(): Point3;
17
+ set scale(value: Point3);
18
+ get visible(): boolean;
19
+ set visible(value: boolean);
20
+ protected runTransformBinding(objectBody: IGg3dBody, object3D: IGg3dObject): void;
21
+ constructor(object3D: IGg3dObject | null, objectBody?: IGg3dBody | null);
22
+ onSpawned(world: Gg3dWorld): void;
23
+ onRemoved(): void;
24
+ dispose(): void;
25
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Gg3dEntity = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const gg_positionable_3d_entity_1 = require("./gg-positionable-3d-entity");
6
+ class Gg3dEntity extends gg_positionable_3d_entity_1.GgPositionable3dEntity {
7
+ constructor(object3D, objectBody = null) {
8
+ super();
9
+ this.object3D = object3D;
10
+ this.objectBody = objectBody;
11
+ this.tick$ = new rxjs_1.Subject();
12
+ this.tickOrder = 750;
13
+ if (objectBody && object3D) {
14
+ this.tick$.subscribe(() => {
15
+ this.runTransformBinding(objectBody, object3D);
16
+ });
17
+ this.runTransformBinding(objectBody, object3D);
18
+ }
19
+ else if (!objectBody && !object3D) {
20
+ throw new Error('Cannot create entity without a mesh and a body');
21
+ }
22
+ if (objectBody) {
23
+ objectBody.entity = this;
24
+ }
25
+ }
26
+ get position() {
27
+ return super.position;
28
+ }
29
+ set position(value) {
30
+ if (this.object3D) {
31
+ this.object3D.position = value;
32
+ }
33
+ if (this.objectBody) {
34
+ this.objectBody.position = value;
35
+ }
36
+ super.position = value;
37
+ }
38
+ get rotation() {
39
+ return super.rotation;
40
+ }
41
+ set rotation(value) {
42
+ if (this.object3D) {
43
+ this.object3D.rotation = value;
44
+ }
45
+ if (this.objectBody) {
46
+ this.objectBody.rotation = value;
47
+ }
48
+ super.rotation = value;
49
+ }
50
+ get scale() {
51
+ return super.scale;
52
+ }
53
+ set scale(value) {
54
+ if (this.object3D) {
55
+ this.object3D.scale = value;
56
+ }
57
+ if (this.objectBody) {
58
+ this.objectBody.scale = value;
59
+ }
60
+ super.scale = value;
61
+ }
62
+ get visible() {
63
+ var _a;
64
+ return !!((_a = this.object3D) === null || _a === void 0 ? void 0 : _a.visible);
65
+ }
66
+ set visible(value) {
67
+ if (this.object3D) {
68
+ this.object3D.visible = value;
69
+ }
70
+ for (const entity of this._children) {
71
+ if (entity instanceof Gg3dEntity && entity.object3D) {
72
+ entity.object3D.visible = value;
73
+ }
74
+ }
75
+ }
76
+ runTransformBinding(objectBody, object3D) {
77
+ // bind physics body transform to mesh transform
78
+ const pos = objectBody.position;
79
+ const quat = objectBody.rotation;
80
+ object3D.position = pos;
81
+ object3D.rotation = quat;
82
+ this._position$.next(pos);
83
+ this._rotation$.next(quat);
84
+ }
85
+ onSpawned(world) {
86
+ var _a, _b;
87
+ super.onSpawned(world);
88
+ (_a = this.object3D) === null || _a === void 0 ? void 0 : _a.addToWorld(world.visualScene);
89
+ (_b = this.objectBody) === null || _b === void 0 ? void 0 : _b.addToWorld(world.physicsWorld);
90
+ }
91
+ onRemoved() {
92
+ var _a, _b;
93
+ (_a = this.object3D) === null || _a === void 0 ? void 0 : _a.removeFromWorld(this.world.visualScene);
94
+ (_b = this.objectBody) === null || _b === void 0 ? void 0 : _b.removeFromWorld(this.world.physicsWorld);
95
+ super.onRemoved();
96
+ }
97
+ dispose() {
98
+ super.dispose();
99
+ this.tick$.unsubscribe();
100
+ if (this.object3D) {
101
+ this.object3D.dispose();
102
+ }
103
+ if (this.objectBody) {
104
+ this.objectBody.dispose();
105
+ }
106
+ }
107
+ }
108
+ exports.Gg3dEntity = Gg3dEntity;
@@ -0,0 +1,51 @@
1
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
2
+ import { Point3, Point4 } from '../../base/models/points';
3
+ import { Graph } from '../../base/data-structures/graph';
4
+ import { GgEntity } from '../../base/entities/gg-entity';
5
+ import { ITickListener } from '../../base/entities/interfaces/i-tick-listener';
6
+ import { GgPositionable3dEntity } from './gg-positionable-3d-entity';
7
+ import { Gg3dWorld } from '../gg-3d-world';
8
+ import { Gg3dEntity } from './gg-3d-entity';
9
+ import { LoadOptions, LoadResultWithProps } from '../loader';
10
+ declare type MapGraphNodeType = {
11
+ path: string;
12
+ position: Point3;
13
+ rotation?: Point4;
14
+ loadOptions: Partial<Omit<LoadOptions, 'position' | 'rotation'>>;
15
+ };
16
+ export declare class MapGraph extends Graph<MapGraphNodeType> {
17
+ static fromMapArray(array: MapGraphNodeType[]): MapGraph;
18
+ static fromMapSquareGrid(grid: MapGraphNodeType[][]): MapGraph;
19
+ getNearestDummy(thisNodes: Graph<MapGraphNodeType>[], cursor: Point3): Graph<MapGraphNodeType>;
20
+ nodes(): MapGraph[];
21
+ }
22
+ export declare type Gg3dMapGraphEntityOptions = {
23
+ loadDepth: number;
24
+ inertia: number;
25
+ };
26
+ export declare class Gg3dMapGraphEntity extends GgEntity implements ITickListener {
27
+ readonly mapGraph: MapGraph;
28
+ readonly tick$: Subject<[number, number]>;
29
+ readonly tickOrder = 1500;
30
+ readonly loaderCursorEntity$: BehaviorSubject<GgPositionable3dEntity | null>;
31
+ readonly loaded: Map<MapGraphNodeType, GgPositionable3dEntity[]>;
32
+ private _initialLoadComplete$;
33
+ get initialLoadComplete$(): Observable<boolean>;
34
+ private _nearestDummy$;
35
+ get nearestDummy(): Graph<MapGraphNodeType> | null;
36
+ private _chunkLoaded$;
37
+ get chunkLoaded$(): Observable<[LoadResultWithProps, {
38
+ position: Point3;
39
+ rotation: Point4;
40
+ }]>;
41
+ get world(): Gg3dWorld | null;
42
+ protected _world: Gg3dWorld | null;
43
+ private readonly mapGraphNodes;
44
+ protected readonly options: Gg3dMapGraphEntityOptions;
45
+ constructor(mapGraph: MapGraph, options?: Partial<Gg3dMapGraphEntityOptions>);
46
+ onSpawned(world: Gg3dWorld): void;
47
+ onRemoved(): void;
48
+ protected loadChunk(node: MapGraphNodeType): Promise<Gg3dEntity[]>;
49
+ protected disposeChunk(node: MapGraphNodeType): void;
50
+ }
51
+ export {};