@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,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GgPositionable3dEntity = void 0;
4
+ const gg_positionable_entity_1 = require("../../base/entities/gg-positionable-entity");
5
+ const operators_1 = require("rxjs/operators");
6
+ const quaternion_1 = require("../../base/math/quaternion");
7
+ class GgPositionable3dEntity extends gg_positionable_entity_1.GgPositionableEntity {
8
+ getDefaultPosition() {
9
+ return { x: 0, y: 0, z: 0 };
10
+ }
11
+ getDefaultRotation() {
12
+ return { x: 0, y: 0, z: 0, w: 1 };
13
+ }
14
+ getDefaultScale() {
15
+ return { x: 1, y: 1, z: 1 };
16
+ }
17
+ get euler$() {
18
+ return this._rotation$.pipe((0, operators_1.map)(q => quaternion_1.Qtrn.toEuler(q)));
19
+ }
20
+ get euler() {
21
+ return quaternion_1.Qtrn.toEuler(this._rotation$.getValue());
22
+ }
23
+ set euler(value) {
24
+ this._rotation$.next(quaternion_1.Qtrn.fromEuler(value));
25
+ }
26
+ }
27
+ exports.GgPositionable3dEntity = GgPositionable3dEntity;
@@ -0,0 +1,21 @@
1
+ import { BodyShape3DDescriptor, Shape3DDescriptor } from './models/shapes';
2
+ import { Point3, Point4 } from '../base/models/points';
3
+ import { IGg3dBody, IGg3dObject, IGg3dTrigger } from './interfaces';
4
+ export declare abstract class IGg3dObjectFactory<T extends IGg3dObject = IGg3dObject> {
5
+ abstract createPrimitive(descriptor: Shape3DDescriptor, material?: any): T;
6
+ createBox(dimensions: Point3, material?: any): T;
7
+ createCapsule(radius: number, centersDistance: number, material?: any): T;
8
+ createCylinder(radius: number, height: number, material?: any): T;
9
+ createCone(radius: number, height: number, material?: any): T;
10
+ createSphere(radius: number): T;
11
+ }
12
+ export interface IGg3dBodyFactory<T extends IGg3dBody = IGg3dBody, K extends IGg3dTrigger = IGg3dTrigger> {
13
+ createRigidBody(descriptor: BodyShape3DDescriptor, transform?: {
14
+ position?: Point3;
15
+ rotation?: Point4;
16
+ }): T;
17
+ createTrigger(descriptor: Shape3DDescriptor, transform?: {
18
+ position?: Point3;
19
+ rotation?: Point4;
20
+ }): K;
21
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IGg3dObjectFactory = void 0;
4
+ class IGg3dObjectFactory {
5
+ // shortcuts
6
+ createBox(dimensions, material) {
7
+ return this.createPrimitive({ shape: 'BOX', dimensions }, material);
8
+ }
9
+ createCapsule(radius, centersDistance, material) {
10
+ return this.createPrimitive({ shape: 'CAPSULE', radius, centersDistance }, material);
11
+ }
12
+ createCylinder(radius, height, material) {
13
+ return this.createPrimitive({ shape: 'CYLINDER', radius, height }, material);
14
+ }
15
+ createCone(radius, height, material) {
16
+ return this.createPrimitive({ shape: 'CONE', radius, height }, material);
17
+ }
18
+ createSphere(radius) {
19
+ return this.createPrimitive({ shape: 'SPHERE', radius });
20
+ }
21
+ }
22
+ exports.IGg3dObjectFactory = IGg3dObjectFactory;
@@ -0,0 +1,11 @@
1
+ import { GgWorld } from '../base/gg-world';
2
+ import { Point3, Point4 } from '../base/models/points';
3
+ import { IGg3dPhysicsWorld, IGg3dVisualScene } from './interfaces';
4
+ import { Gg3dLoader } from './loader';
5
+ export declare class Gg3dWorld<V extends IGg3dVisualScene = IGg3dVisualScene, P extends IGg3dPhysicsWorld = IGg3dPhysicsWorld> extends GgWorld<Point3, Point4, V, P> {
6
+ readonly visualScene: V;
7
+ readonly physicsWorld: P;
8
+ protected readonly consoleEnabled: boolean;
9
+ readonly loader: Gg3dLoader;
10
+ constructor(visualScene: V, physicsWorld: P, consoleEnabled?: boolean);
11
+ }
@@ -0,0 +1,36 @@
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.Gg3dWorld = void 0;
13
+ const gg_world_1 = require("../base/gg-world");
14
+ const loader_1 = require("./loader");
15
+ class Gg3dWorld extends gg_world_1.GgWorld {
16
+ constructor(visualScene, physicsWorld, consoleEnabled = false) {
17
+ super(visualScene, physicsWorld, consoleEnabled);
18
+ this.visualScene = visualScene;
19
+ this.physicsWorld = physicsWorld;
20
+ this.consoleEnabled = consoleEnabled;
21
+ this.loader = new loader_1.Gg3dLoader(this);
22
+ if (consoleEnabled) {
23
+ this.registerConsoleCommand('ph_gravity', (...args) => __awaiter(this, void 0, void 0, function* () {
24
+ if (args.length == 1) {
25
+ args = ['0', '0', '' + -+args[0]]; // mean -Z axis
26
+ }
27
+ if (args.length > 0) {
28
+ this.physicsWorld.gravity = { x: +args[0], y: +args[1], z: +args[2] };
29
+ }
30
+ return JSON.stringify(this.physicsWorld.gravity);
31
+ }), 'args: [float] or [float float float]; change 3D world gravity vector. 1 argument means ' +
32
+ '{x: 0, y: 0, z: -value}, 3 arguments set the whole vector. Default value is "9.82" or "0 0 -9.82"');
33
+ }
34
+ }
35
+ }
36
+ exports.Gg3dWorld = Gg3dWorld;
@@ -0,0 +1,65 @@
1
+ import { GgBody } from '../base/interfaces/gg-body';
2
+ import { Point3, Point4 } 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 { GgMeta } from './models/gg-meta';
7
+ import { BaseGgRenderer } from '../base/entities/base-gg-renderer';
8
+ import { Gg3dCameraEntity } from './entities/gg-3d-camera.entity';
9
+ import { GgWorld } from '../base/gg-world';
10
+ import { SuspensionOptions, WheelOptions } from './entities/gg-3d-raycast-vehicle.entity';
11
+ import { GgTrigger } from '../base/interfaces/gg-trigger';
12
+ import { Observable } from 'rxjs';
13
+ import { GgPositionable3dEntity } from './entities/gg-positionable-3d-entity';
14
+ import { IGg3dBodyFactory, IGg3dObjectFactory } from './factories';
15
+ export interface IGg3dPhysicsWorld extends GgPhysicsWorld<Point3, Point4> {
16
+ readonly factory: IGg3dBodyFactory;
17
+ readonly loader: IGg3dBodyLoader;
18
+ }
19
+ export declare abstract class Gg3dRenderer extends BaseGgRenderer {
20
+ abstract readonly camera: Gg3dCameraEntity;
21
+ onSpawned(world: GgWorld<any, any>): void;
22
+ onRemoved(): void;
23
+ }
24
+ export interface IGg3dBody extends GgBody<Point3, Point4> {
25
+ }
26
+ export interface IGg3dTrigger extends GgTrigger<Point3, Point4> {
27
+ get onEntityEntered(): Observable<GgPositionable3dEntity>;
28
+ get onEntityLeft(): Observable<GgPositionable3dEntity | null>;
29
+ }
30
+ export interface IGg3dRaycastVehicle extends IGg3dBody {
31
+ /** Return speed in m/s, calculated by car itself (which should be shown on the speedometer) */
32
+ get wheelSpeed(): number;
33
+ addWheel(options: WheelOptions, suspensionOptions: SuspensionOptions): void;
34
+ /** Set steering value for wheel. The unit of steering is radian */
35
+ setSteering(wheelIndex: number, steering: number): void;
36
+ /** Apply force to wheel. Units? */
37
+ applyEngineForce(wheelIndex: number, force: number): void;
38
+ /** Apply brake force to wheel. Units? */
39
+ applyBrake(wheelIndex: number, force: number): void;
40
+ isWheelTouchesGround(wheelIndex: number): boolean;
41
+ getWheelTransform(wheelIndex: number): {
42
+ position: Point3;
43
+ rotation: Point4;
44
+ };
45
+ resetSuspension(): void;
46
+ }
47
+ export declare abstract class IGg3dBodyLoader {
48
+ protected readonly world: IGg3dPhysicsWorld;
49
+ protected constructor(world: IGg3dPhysicsWorld);
50
+ loadFromGgGlb(glbFile: ArrayBuffer, meta: GgMeta): Promise<IGg3dBody[]>;
51
+ }
52
+ export interface IGg3dVisualScene extends GgVisualScene<Point3, Point4> {
53
+ readonly factory: IGg3dObjectFactory;
54
+ readonly loader: IGg3dObjectLoader;
55
+ }
56
+ export interface IGg3dObject extends GgObject<Point3, Point4> {
57
+ }
58
+ export interface IGg3dCamera extends IGg3dObject {
59
+ get supportsFov(): boolean;
60
+ get fov(): number;
61
+ set fov(f: number);
62
+ }
63
+ export interface IGg3dObjectLoader {
64
+ loadFromGgGlb(glbFile: ArrayBuffer, meta: GgMeta): Promise<IGg3dObject | null>;
65
+ }
@@ -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.IGg3dBodyLoader = exports.Gg3dRenderer = void 0;
13
+ const base_gg_renderer_1 = require("../base/entities/base-gg-renderer");
14
+ class Gg3dRenderer extends base_gg_renderer_1.BaseGgRenderer {
15
+ onSpawned(world) {
16
+ super.onSpawned(world);
17
+ world.addEntity(this.camera);
18
+ }
19
+ onRemoved() {
20
+ var _a;
21
+ super.onRemoved();
22
+ (_a = this.world) === null || _a === void 0 ? void 0 : _a.removeEntity(this.camera);
23
+ }
24
+ }
25
+ exports.Gg3dRenderer = Gg3dRenderer;
26
+ class IGg3dBodyLoader {
27
+ constructor(world) {
28
+ this.world = world;
29
+ }
30
+ loadFromGgGlb(glbFile, meta) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ return ((meta === null || meta === void 0 ? void 0 : meta.rigidBodies) || []).map(d => {
33
+ const body = this.world.factory.createRigidBody({ shape: d.shape, body: d.body }, { position: d.position, rotation: d.rotation });
34
+ body.name = d.name;
35
+ return body;
36
+ });
37
+ });
38
+ }
39
+ }
40
+ exports.IGg3dBodyLoader = IGg3dBodyLoader;
@@ -0,0 +1,40 @@
1
+ import { Gg3dWorld } from './gg-3d-world';
2
+ import { GgMeta } from './models/gg-meta';
3
+ import { Gg3dEntity } from './entities/gg-3d-entity';
4
+ import { Point3, Point4 } from '../base/models/points';
5
+ import { IGg3dBody, IGg3dObject } from './interfaces';
6
+ export declare enum CachingStrategy {
7
+ Nothing = 0,
8
+ Files = 1,
9
+ Entities = 2
10
+ }
11
+ export declare type LoadOptions = {
12
+ cachingStrategy: CachingStrategy;
13
+ position: Point3;
14
+ rotation: Point4;
15
+ loadProps: boolean;
16
+ propsPath?: string;
17
+ };
18
+ export declare type LoadResourcesResult = {
19
+ resources: {
20
+ object3D: IGg3dObject | null;
21
+ body: IGg3dBody | null;
22
+ }[];
23
+ meta: GgMeta;
24
+ };
25
+ export declare type LoadResult = {
26
+ entities: Gg3dEntity[];
27
+ meta: GgMeta;
28
+ };
29
+ export declare type LoadResultWithProps = LoadResult & {
30
+ props?: LoadResult[];
31
+ };
32
+ export declare class Gg3dLoader {
33
+ protected readonly world: Gg3dWorld;
34
+ readonly filesCache: Map<string, [ArrayBuffer, GgMeta] | Promise<[ArrayBuffer, GgMeta]>>;
35
+ readonly loadResultCache: Map<string, LoadResourcesResult | Promise<LoadResourcesResult>>;
36
+ constructor(world: Gg3dWorld);
37
+ loadGgGlbFiles(path: string, useCache?: boolean): Promise<[ArrayBuffer, GgMeta]>;
38
+ loadGgGlbResources(path: string, cachingStrategy?: CachingStrategy): Promise<LoadResourcesResult>;
39
+ loadGgGlb(path: string, options?: Partial<LoadOptions>): Promise<LoadResultWithProps>;
40
+ }
@@ -0,0 +1,129 @@
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.Gg3dLoader = exports.CachingStrategy = void 0;
13
+ const gg_3d_entity_1 = require("./entities/gg-3d-entity");
14
+ const point3_1 = require("../base/math/point3");
15
+ const quaternion_1 = require("../base/math/quaternion");
16
+ var CachingStrategy;
17
+ (function (CachingStrategy) {
18
+ CachingStrategy[CachingStrategy["Nothing"] = 0] = "Nothing";
19
+ CachingStrategy[CachingStrategy["Files"] = 1] = "Files";
20
+ CachingStrategy[CachingStrategy["Entities"] = 2] = "Entities";
21
+ })(CachingStrategy = exports.CachingStrategy || (exports.CachingStrategy = {}));
22
+ const defaultLoadOptions = {
23
+ cachingStrategy: CachingStrategy.Nothing,
24
+ position: { x: 0, y: 0, z: 0 },
25
+ rotation: { x: 0, y: 0, z: 0, w: 1 },
26
+ loadProps: true,
27
+ };
28
+ const cloneLoadResourcesResult = (loadResult) => ({
29
+ meta: loadResult.meta,
30
+ resources: loadResult.resources.map(({ object3D, body }) => ({
31
+ object3D: object3D && object3D.clone(),
32
+ body: body && body.clone(),
33
+ })),
34
+ });
35
+ class Gg3dLoader {
36
+ constructor(world) {
37
+ this.world = world;
38
+ this.filesCache = new Map();
39
+ this.loadResultCache = new Map();
40
+ }
41
+ loadGgGlbFiles(path, useCache = false) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ if (useCache && this.filesCache.has(path)) {
44
+ return this.filesCache.get(path);
45
+ }
46
+ const loadPromise = Promise.all([
47
+ fetch(`${path}.glb`).then(r => r.arrayBuffer()),
48
+ fetch(`${path}.meta`)
49
+ .then(r => r.text())
50
+ .then(r => JSON.parse(r)),
51
+ ]);
52
+ if (useCache) {
53
+ this.filesCache.set(path, loadPromise);
54
+ }
55
+ const result = yield loadPromise;
56
+ if (useCache) {
57
+ this.filesCache.set(path, result);
58
+ }
59
+ return result;
60
+ });
61
+ }
62
+ loadGgGlbResources(path, cachingStrategy = CachingStrategy.Nothing) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ if (cachingStrategy == CachingStrategy.Entities && this.loadResultCache.has(path)) {
65
+ const cached = this.loadResultCache.get(path);
66
+ const cachedResult = cached instanceof Promise ? yield cached : cached;
67
+ return cloneLoadResourcesResult(cachedResult);
68
+ }
69
+ const [glb, meta] = yield this.loadGgGlbFiles(path, cachingStrategy == CachingStrategy.Files);
70
+ if (!glb) {
71
+ throw new Error('GLB not found');
72
+ }
73
+ const [object, bodies] = yield Promise.all([
74
+ this.world.visualScene.loader.loadFromGgGlb(glb, meta),
75
+ this.world.physicsWorld.loader.loadFromGgGlb(glb, meta),
76
+ ]);
77
+ const result = { resources: [], meta };
78
+ if (!object) {
79
+ return result;
80
+ }
81
+ if (bodies.length == 0) {
82
+ result.resources.push({ object3D: object, body: null });
83
+ }
84
+ else if (bodies.length == 1) {
85
+ result.resources.push({ object3D: object, body: bodies[0] });
86
+ }
87
+ else {
88
+ for (const body of bodies) {
89
+ result.resources.push({ object3D: object.popChild(body.name), body });
90
+ }
91
+ if (!object.isEmpty()) {
92
+ result.resources.push({ object3D: object, body: null });
93
+ }
94
+ }
95
+ if (cachingStrategy == CachingStrategy.Entities) {
96
+ this.loadResultCache.set(path, cloneLoadResourcesResult(result));
97
+ }
98
+ return result;
99
+ });
100
+ }
101
+ loadGgGlb(path, options = defaultLoadOptions) {
102
+ return __awaiter(this, void 0, void 0, function* () {
103
+ const loadOptions = Object.assign(Object.assign({}, defaultLoadOptions), options);
104
+ const { resources, meta } = yield this.loadGgGlbResources(path, loadOptions.cachingStrategy);
105
+ const result = {
106
+ entities: resources.map(({ object3D, body }) => new gg_3d_entity_1.Gg3dEntity(object3D, body)),
107
+ meta,
108
+ };
109
+ if (loadOptions.loadProps) {
110
+ result.props = yield Promise.all(meta.dummies
111
+ .filter(x => x.is_prop || x.is_scene)
112
+ .map(dummy => this.loadGgGlb(dummy.is_prop
113
+ ? (loadOptions.propsPath || path.substring(0, path.lastIndexOf('/') + 1)) + dummy.prop_id
114
+ : dummy.scene_id, {
115
+ loadProps: !!dummy.is_scene,
116
+ position: point3_1.Pnt3.add(point3_1.Pnt3.rot(dummy.position, loadOptions.rotation), loadOptions.position),
117
+ rotation: quaternion_1.Qtrn.combineRotations(dummy.rotation, loadOptions.rotation),
118
+ })));
119
+ }
120
+ result.entities.forEach(e => {
121
+ e.position = point3_1.Pnt3.add(point3_1.Pnt3.rot(point3_1.Pnt3.clone(e.position), loadOptions.rotation), loadOptions.position);
122
+ // FIXME this rotation is wrong
123
+ e.rotation = quaternion_1.Qtrn.mult(quaternion_1.Qtrn.clone(e.rotation), loadOptions.rotation);
124
+ });
125
+ return result;
126
+ });
127
+ }
128
+ }
129
+ exports.Gg3dLoader = Gg3dLoader;
@@ -0,0 +1,3 @@
1
+ import { BodyOptions } from '../../base/models/body-options';
2
+ export interface Body3DOptions extends BodyOptions {
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,22 @@
1
+ import { Point3, Point4 } from '../../base/models/points';
2
+ import { BodyShape3DDescriptor } from './shapes';
3
+ export declare type GgDummy = {
4
+ name: string;
5
+ position: Point3;
6
+ rotation: Point4;
7
+ } & any;
8
+ export declare type GgCurve = {
9
+ name: string;
10
+ cyclic: boolean;
11
+ points: Point3[];
12
+ } & any;
13
+ export declare type GgRigidBody = {
14
+ name: string;
15
+ position: Point3;
16
+ rotation: Point4;
17
+ } & BodyShape3DDescriptor;
18
+ export declare type GgMeta = {
19
+ dummies: GgDummy[];
20
+ curves: GgCurve[];
21
+ rigidBodies: GgRigidBody[];
22
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,35 @@
1
+ import { Point3, Point4 } from '../../base/models/points';
2
+ import { Body3DOptions } from './body-options';
3
+ export declare type Shape3DDescriptor = {
4
+ shape: 'BOX';
5
+ dimensions: Point3;
6
+ } | {
7
+ shape: 'CONE' | 'CYLINDER';
8
+ radius: number;
9
+ height: number;
10
+ } | {
11
+ shape: 'CAPSULE';
12
+ radius: number;
13
+ centersDistance: number;
14
+ } | {
15
+ shape: 'SPHERE';
16
+ radius: number;
17
+ } | {
18
+ shape: 'COMPOUND';
19
+ children: {
20
+ position?: Point3;
21
+ rotation?: Point4;
22
+ shape: Shape3DDescriptor;
23
+ }[];
24
+ } | {
25
+ shape: 'CONVEX_HULL';
26
+ vertices: Point3[];
27
+ } | {
28
+ shape: 'MESH';
29
+ vertices: Point3[];
30
+ faces: [number, number, number][];
31
+ };
32
+ export declare type BodyShape3DDescriptor = {
33
+ shape: Shape3DDescriptor;
34
+ body: Partial<Body3DOptions>;
35
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,26 @@
1
+ import { Observable } from 'rxjs';
2
+ /**
3
+ * A class, providing ability to track time, fire ticks, provide time elapsed + tick delta with ability to suspend/resume it.
4
+ */
5
+ export declare class Clock {
6
+ private readonly tickSource;
7
+ /**
8
+ * A global clock, based on animation frame ticks
9
+ */
10
+ static readonly animationFrameClock: Clock;
11
+ get tick$(): Observable<[number, number]>;
12
+ get isRunning(): boolean;
13
+ get isPaused(): boolean;
14
+ get elapsedTime(): number;
15
+ private tickSub;
16
+ private readonly _tick$;
17
+ private startedAt;
18
+ private pausedAt;
19
+ constructor(tickSource: Observable<any>, autoStart?: boolean);
20
+ start(): void;
21
+ stop(): void;
22
+ pause(): void;
23
+ resume(): void;
24
+ private startListeningTicks;
25
+ private stopListeningTicks;
26
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Clock = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const now = () => {
7
+ return (typeof performance === 'undefined' ? Date : performance).now();
8
+ };
9
+ /**
10
+ * A class, providing ability to track time, fire ticks, provide time elapsed + tick delta with ability to suspend/resume it.
11
+ */
12
+ class Clock {
13
+ constructor(tickSource, autoStart = false) {
14
+ this.tickSource = tickSource;
15
+ this.tickSub = null;
16
+ this._tick$ = new rxjs_1.Subject();
17
+ // state
18
+ this.startedAt = -1;
19
+ this.pausedAt = -1;
20
+ if (autoStart) {
21
+ this.start();
22
+ }
23
+ }
24
+ // value is global clock time, delta ms from last tick
25
+ get tick$() {
26
+ return this._tick$.pipe((0, operators_1.map)(([oldTime, newTime]) => [newTime, newTime - oldTime]));
27
+ }
28
+ get isRunning() {
29
+ return !!this.tickSub;
30
+ }
31
+ get isPaused() {
32
+ return this.pausedAt !== -1;
33
+ }
34
+ get elapsedTime() {
35
+ if (this.isPaused) {
36
+ return this.pausedAt - this.startedAt;
37
+ }
38
+ return now() - this.startedAt;
39
+ }
40
+ start() {
41
+ if (this.isRunning) {
42
+ return;
43
+ }
44
+ this.startedAt = now();
45
+ this.startListeningTicks();
46
+ }
47
+ stop() {
48
+ this.stopListeningTicks();
49
+ this.startedAt = this.pausedAt = -1;
50
+ }
51
+ pause() {
52
+ this.stopListeningTicks();
53
+ this.pausedAt = now();
54
+ }
55
+ resume() {
56
+ if (this.isRunning || this.pausedAt == -1) {
57
+ return;
58
+ }
59
+ this.startedAt += now() - this.pausedAt;
60
+ this.pausedAt = -1;
61
+ this.startListeningTicks();
62
+ }
63
+ startListeningTicks() {
64
+ if (this.tickSub) {
65
+ throw new Error('Clock is already ticking!');
66
+ }
67
+ let oldRelativeTime = 0;
68
+ this.tickSub = this.tickSource
69
+ .pipe((0, operators_1.map)(() => [oldRelativeTime, now() - this.startedAt]), (0, operators_1.tap)(([_, cur]) => (oldRelativeTime = cur)))
70
+ .subscribe(this._tick$);
71
+ }
72
+ stopListeningTicks() {
73
+ var _a;
74
+ (_a = this.tickSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
75
+ this.tickSub = null;
76
+ }
77
+ }
78
+ exports.Clock = Clock;
79
+ /**
80
+ * A global clock, based on animation frame ticks
81
+ */
82
+ Clock.animationFrameClock = new Clock((0, rxjs_1.of)(undefined, rxjs_1.animationFrameScheduler).pipe((0, operators_1.repeat)()), true);
@@ -0,0 +1,8 @@
1
+ import { Observable } from 'rxjs';
2
+ import { KeyboardController } from './keyboard.controller';
3
+ export declare type DirectionKeymap = 'arrows' | 'wasd' | 'wasd+arrows';
4
+ export declare type DirectionOutput = {
5
+ upDown?: boolean;
6
+ leftRight?: boolean;
7
+ };
8
+ export declare const bindDirectionKeys: (keyboard: KeyboardController, keymap: DirectionKeymap) => Observable<DirectionOutput>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindDirectionKeys = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const bindDirectionKeys = (keyboard, keymap) => {
7
+ const keys = [[], [], [], []];
8
+ if (keymap.includes('wasd')) {
9
+ keys[0].push('KeyW');
10
+ keys[1].push('KeyA');
11
+ keys[2].push('KeyS');
12
+ keys[3].push('KeyD');
13
+ }
14
+ if (keymap.includes('arrows')) {
15
+ keys[0].push('ArrowUp');
16
+ keys[1].push('ArrowLeft');
17
+ keys[2].push('ArrowDown');
18
+ keys[3].push('ArrowRight');
19
+ }
20
+ return (0, rxjs_1.combineLatest)(keys.map(x => keyboard.bindMany(...x))).pipe((0, operators_1.map)(moveDirection => {
21
+ const result = {};
22
+ if (moveDirection.includes(true)) {
23
+ const [f, l, b, r] = moveDirection;
24
+ if (f != b)
25
+ result.upDown = f;
26
+ if (l != r)
27
+ result.leftRight = l;
28
+ }
29
+ return result;
30
+ }));
31
+ };
32
+ exports.bindDirectionKeys = bindDirectionKeys;
@@ -0,0 +1,4 @@
1
+ export interface IController {
2
+ start(): Promise<void>;
3
+ stop(): Promise<void>;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ import { IController } from './i-controller';
2
+ import { Observable } from 'rxjs';
3
+ export declare class KeyboardController implements IController {
4
+ private bindings;
5
+ constructor();
6
+ private _running;
7
+ get running(): boolean;
8
+ bind(code: string): Observable<boolean>;
9
+ bindMany(...codes: string[]): Observable<boolean>;
10
+ emulateKeyDown(code: string): void;
11
+ emulateKeyUp(code: string): void;
12
+ emulateKeyPress(code: string): void;
13
+ start(): Promise<void>;
14
+ private handleKeys;
15
+ stop(): Promise<void>;
16
+ }