@gg-web-engine/core 0.0.37 → 0.0.39

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 (45) hide show
  1. package/dist/2d/components/physics/i-rigid-body-2d.component.d.ts +3 -0
  2. package/dist/2d/components/physics/i-trigger-2d.component.d.ts +3 -0
  3. package/dist/2d/models/body-options.d.ts +5 -1
  4. package/dist/3d/components/physics/i-physics-world-3d.component.d.ts +7 -0
  5. package/dist/3d/components/physics/i-rigid-body-3d.component.d.ts +3 -0
  6. package/dist/3d/components/physics/i-trigger-3d.component.d.ts +3 -0
  7. package/dist/3d/entities/controllers/input/car-keyboard-handling.controller.js +2 -2
  8. package/dist/3d/entities/controllers/input/gg-car-keyboard-handling.controller.js +3 -3
  9. package/dist/3d/entities/gg-car/gg-car.entity.js +4 -2
  10. package/dist/3d/entities/map-graph-3d.entity.d.ts +1 -1
  11. package/dist/3d/entities/map-graph-3d.entity.js +3 -4
  12. package/dist/3d/entities/raycast-vehicle-3d.entity.d.ts +8 -5
  13. package/dist/3d/entities/raycast-vehicle-3d.entity.js +41 -25
  14. package/dist/3d/factories.d.ts +3 -3
  15. package/dist/3d/models/body-options.d.ts +5 -1
  16. package/dist/3d/models/shapes.d.ts +41 -1
  17. package/dist/base/clock/pausable-clock.d.ts +56 -1
  18. package/dist/base/clock/pausable-clock.js +88 -5
  19. package/dist/base/components/physics/i-body.component.d.ts +3 -1
  20. package/dist/base/components/physics/i-physics-world.component.d.ts +8 -6
  21. package/dist/base/components/rendering/i-renderer.component.d.ts +4 -0
  22. package/dist/base/components/rendering/i-visual-scene.component.d.ts +0 -4
  23. package/dist/base/entities/i-entity.d.ts +4 -2
  24. package/dist/base/entities/i-entity.js +9 -3
  25. package/dist/base/entities/i-renderer.entity.d.ts +4 -0
  26. package/dist/base/entities/i-renderer.entity.js +8 -0
  27. package/dist/base/gg-world.d.ts +0 -2
  28. package/dist/base/gg-world.js +26 -25
  29. package/dist/base/index.d.ts +0 -1
  30. package/dist/base/index.js +0 -1
  31. package/dist/base/math/point2.d.ts +12 -0
  32. package/dist/base/math/point2.js +35 -0
  33. package/dist/base/math/point3.d.ts +8 -0
  34. package/dist/base/math/point3.js +16 -0
  35. package/dist/base/math/quaternion.d.ts +2 -0
  36. package/dist/base/math/quaternion.js +4 -0
  37. package/dist/base/models/body-options.d.ts +9 -0
  38. package/dist/dev/gg-console.ui.js +16 -8
  39. package/dist/dev/gg-debugger.ui.d.ts +4 -0
  40. package/dist/dev/gg-debugger.ui.js +83 -32
  41. package/dist/dev/gg-static.d.ts +0 -1
  42. package/dist/dev/gg-static.js +3 -4
  43. package/package.json +3 -3
  44. package/dist/base/interfaces/i-debug-physics-drawer.d.ts +0 -8
  45. package/dist/base/interfaces/i-debug-physics-drawer.js +0 -1
@@ -1,6 +1,22 @@
1
- import { createInlineTickController } from '../base';
2
- import { fromEvent, Subject, takeUntil } from 'rxjs';
1
+ import { createInlineTickController, IRendererEntity } from '../base';
2
+ import { animationFrameScheduler, fromEvent, of, Subject, takeUntil } from 'rxjs';
3
3
  import Stats from 'stats.js';
4
+ import { repeat } from 'rxjs/operators';
5
+ const snapshotEqual = (a, b) => {
6
+ if (a.timeScale !== b.timeScale)
7
+ return false;
8
+ if (a.renderers.length !== b.renderers.length)
9
+ return false;
10
+ for (let i = 0; i < a.renderers.length; i++) {
11
+ if (a.renderers[i].name !== b.renderers[i].name)
12
+ return false;
13
+ if (a.renderers[i].entity !== b.renderers[i].entity)
14
+ return false;
15
+ if (a.renderers[i].physicsDebugViewActive !== b.renderers[i].physicsDebugViewActive)
16
+ return false;
17
+ }
18
+ return true;
19
+ };
4
20
  export class GgDebuggerUI {
5
21
  constructor() {
6
22
  this.ui = {
@@ -10,6 +26,11 @@ export class GgDebuggerUI {
10
26
  this.statsRemoved$ = new Subject();
11
27
  this.currentWorld = null;
12
28
  this.debugControlsRemoved$ = new Subject();
29
+ this.viewUpdated$ = new Subject();
30
+ this.snapshot = {
31
+ timeScale: 1,
32
+ renderers: [],
33
+ };
13
34
  }
14
35
  get showStats() {
15
36
  return !!this.ui.stats;
@@ -64,48 +85,78 @@ export class GgDebuggerUI {
64
85
  this.currentWorld = selectedWorld;
65
86
  if (value) {
66
87
  const debugControlsContainer = document.createElement('div');
88
+ document.body.appendChild(debugControlsContainer);
67
89
  this.ui.debugControlsContainer = debugControlsContainer;
68
- const debugLabelCss = "style='display:flex;align-items:center;margin:0.25rem;'";
69
90
  debugControlsContainer.style.cssText =
70
91
  'position:fixed;top:48px;right:0;opacity:0.9;z-index:9999;background-color:#333;color:white;display:flex;flex-direction:column';
71
- debugControlsContainer.innerHTML = `
92
+ this.snapshot = this.makeSnapshot();
93
+ this.renderControls(debugControlsContainer);
94
+ of(undefined, animationFrameScheduler)
95
+ .pipe(repeat(), takeUntil(this.debugControlsRemoved$))
96
+ .subscribe(() => {
97
+ const newSnapshot = this.makeSnapshot();
98
+ if (!snapshotEqual(this.snapshot, newSnapshot)) {
99
+ this.snapshot = newSnapshot;
100
+ this.renderControls(debugControlsContainer);
101
+ }
102
+ });
103
+ }
104
+ else {
105
+ this.debugControlsRemoved$.next();
106
+ document.body.removeChild(this.ui.debugControlsContainer);
107
+ this.ui.debugControlsContainer = null;
108
+ }
109
+ }
110
+ makeSnapshot() {
111
+ return {
112
+ timeScale: this.currentWorld.worldClock.timeScale,
113
+ renderers: this.currentWorld.children
114
+ .filter(x => x instanceof IRendererEntity)
115
+ .map(r => ({
116
+ name: r.name,
117
+ entity: r,
118
+ physicsDebugViewActive: r.physicsDebugViewActive,
119
+ })),
120
+ };
121
+ }
122
+ renderControls(debugControlsContainer) {
123
+ const debugLabelCss = "style='display:flex;align-items:center;margin:0.25rem;'";
124
+ let html = '';
125
+ for (const { entity, physicsDebugViewActive } of this.snapshot.renderers) {
126
+ html += `
72
127
  <div ${debugLabelCss}>
73
- <input type='checkbox' name='checkbox' id='physics_debugger_checkbox_id' value='1'${this.currentWorld.physicsWorld.physicsDebugViewActive ? ' checked' : ''}>
74
- <label for='physics_debugger_checkbox_id' style='user-select: none;'>Show physics bodies in scene</label>
128
+ <input type='checkbox' name='checkbox' id='physics_debugger_checkbox_id_${entity.name}' value='1'${physicsDebugViewActive ? ' checked' : ''}>
129
+ <label for='physics_debugger_checkbox_id_${entity.name}' style='user-select: none;'>Physics debugger${this.snapshot.renderers.length > 1 ? ' (' + entity.name + ')' : ''}</label>
75
130
  </div>`;
76
- // <div ${debugLabelCss}>
77
- // <input id="time_scale_slider" type="range" min="0" max="10" step="0.1" style="flex-grow:1" value="${
78
- // this.currentWorld.physicsWorld.timeScale
79
- // }"/>
80
- // <label for="time_scale_slider" style="user-select: none;">Time scale</label>
81
- // </div>`;
82
- document.body.appendChild(debugControlsContainer);
83
- fromEvent(document.getElementById('physics_debugger_checkbox_id'), 'change')
84
- .pipe(takeUntil(this.debugControlsRemoved$))
131
+ }
132
+ html += `
133
+ <div ${debugLabelCss}>
134
+ <input id='time_scale_slider' type='range' min='0' max='5' step='0.01' style='flex-grow:1' value='${this.snapshot.timeScale}'/>
135
+ <label for='time_scale_slider' style='user-select: none;'>Time scale</label>
136
+ </div>`;
137
+ debugControlsContainer.innerHTML = html;
138
+ this.viewUpdated$.next();
139
+ for (const { entity } of this.snapshot.renderers) {
140
+ fromEvent(document.getElementById('physics_debugger_checkbox_id_' + entity.name), 'change')
141
+ .pipe(takeUntil(this.debugControlsRemoved$), takeUntil(this.viewUpdated$))
85
142
  .subscribe(e => {
86
143
  try {
87
- this.currentWorld.physicsDebugViewActive = e.target.checked;
144
+ entity.physicsDebugViewActive = e.target.checked;
88
145
  }
89
146
  catch (err) {
90
147
  console.error(err);
91
148
  }
92
- e.target.checked = this.currentWorld.physicsDebugViewActive;
93
149
  });
94
- // fromEvent(document.getElementById('time_scale_slider')! as HTMLInputElement, 'change')
95
- // .pipe(takeUntil(this.debugControlsRemoved$))
96
- // .subscribe(e => {
97
- // try {
98
- // this.currentWorld.physicsWorld.timeScale = +(e.target as HTMLInputElement).value;
99
- // } catch (err) {
100
- // console.error(err);
101
- // }
102
- // (e.target as HTMLInputElement).value = '' + ( this.currentWorld.physicsWorld.timeScale || 1);
103
- // });
104
- }
105
- else {
106
- this.debugControlsRemoved$.next();
107
- document.body.removeChild(this.ui.debugControlsContainer);
108
- this.ui.debugControlsContainer = null;
109
150
  }
151
+ fromEvent(document.getElementById('time_scale_slider'), 'change')
152
+ .pipe(takeUntil(this.debugControlsRemoved$), takeUntil(this.viewUpdated$))
153
+ .subscribe(e => {
154
+ try {
155
+ this.currentWorld.worldClock.timeScale = +e.target.value;
156
+ }
157
+ catch (err) {
158
+ console.error(err);
159
+ }
160
+ });
110
161
  }
111
162
  }
@@ -1,6 +1,5 @@
1
1
  import { GgWorld } from '../base';
2
2
  export declare class GgStatic {
3
- private static _instance;
4
3
  static get instance(): GgStatic;
5
4
  private readonly debuggerUI;
6
5
  private readonly consoleUI;
@@ -51,10 +51,10 @@ export class GgStatic {
51
51
  }), 'args: [string]; select world by name');
52
52
  }
53
53
  static get instance() {
54
- if (!GgStatic._instance) {
55
- GgStatic._instance = new GgStatic();
54
+ if (!window.ggstatic) {
55
+ window.ggstatic = new GgStatic();
56
56
  }
57
- return GgStatic._instance;
57
+ return window.ggstatic;
58
58
  }
59
59
  get devConsoleEnabled() {
60
60
  return this._devConsoleEnabled;
@@ -138,4 +138,3 @@ export class GgStatic {
138
138
  });
139
139
  }
140
140
  }
141
- window.ggstatic = GgStatic.instance;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gg-web-engine/core",
3
- "version": "0.0.37",
3
+ "version": "0.0.39",
4
4
  "description": "An attempt to create open source game engine for browser",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -27,11 +27,11 @@
27
27
  },
28
28
  "homepage": "https://github.com/AndyGura/gg-web-engine#readme",
29
29
  "dependencies": {
30
- "rxjs": "7.8.0",
30
+ "rxjs": "7.8.1",
31
31
  "stats.js": "0.17.0"
32
32
  },
33
33
  "devDependencies": {
34
- "@types/jest": "^29.5.0",
34
+ "@types/jest": "^29.5.12",
35
35
  "@types/stats.js": "^0.17.0",
36
36
  "jest": "^29.5.0",
37
37
  "jest-environment-jsdom": "^29.5.0",
@@ -1,8 +0,0 @@
1
- import { IDisplayObjectComponent } from '../components/rendering/i-display-object.component';
2
- import { Point3 } from '../models/points';
3
- import { VisualTypeDocRepo } from '../gg-world';
4
- export interface IDebugPhysicsDrawer<D, R, TypeDoc extends VisualTypeDocRepo<D, R> = VisualTypeDocRepo<D, R>> extends IDisplayObjectComponent<D, R, TypeDoc> {
5
- drawContactPoint(point: D, normal: D, color?: Point3): void;
6
- drawLine(from: D, to: D, color?: Point3): void;
7
- update(): void;
8
- }
@@ -1 +0,0 @@
1
- export {};