angular-three-cannon 2.2.0 → 2.2.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.
@@ -72,10 +72,10 @@ export class NgtcDebug {
72
72
  this.bodies.splice(debugBodyIndex, 1);
73
73
  delete this.bodyMap[uuid];
74
74
  }
75
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
76
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtcDebug, isStandalone: true, selector: "ngtc-physics[debug]", inputs: { debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
75
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
76
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.4", type: NgtcDebug, isStandalone: true, selector: "ngtc-physics[debug]", inputs: { debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
77
77
  }
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, decorators: [{
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcDebug, decorators: [{
79
79
  type: Directive,
80
80
  args: [{ selector: 'ngtc-physics[debug]', standalone: true }]
81
81
  }], ctorParameters: () => [] });
@@ -1,7 +1,6 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, afterNextRender, computed, inject, input, signal, untracked, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, afterNextRender, effect, inject, input, signal, untracked, } from '@angular/core';
2
2
  import { CannonWorkerAPI, } from '@pmndrs/cannon-worker-api';
3
- import { injectBeforeRender, injectStore } from 'angular-three';
4
- import { injectAutoEffect } from 'ngxtension/auto-effect';
3
+ import { injectBeforeRender, injectStore, pick } from 'angular-three';
5
4
  import { mergeInputs } from 'ngxtension/inject-inputs';
6
5
  import { InstancedMesh, Matrix4, Quaternion, Vector3 } from 'three';
7
6
  import * as i0 from "@angular/core";
@@ -44,9 +43,13 @@ const defaultOptions = {
44
43
  };
45
44
  export class NgtcPhysics {
46
45
  constructor() {
47
- this.autoEffect = injectAutoEffect();
48
46
  this.store = injectStore();
49
47
  this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
48
+ this.axisIndex = pick(this.options, 'axisIndex');
49
+ this.broadphase = pick(this.options, 'broadphase');
50
+ this.gravity = pick(this.options, 'gravity');
51
+ this.iterations = pick(this.options, 'iterations');
52
+ this.tolerance = pick(this.options, 'tolerance');
50
53
  this.invalidate = this.store.select('invalidate');
51
54
  // @ts-expect-error - worker is not nullable, and we don't want to use ! operator
52
55
  this.worker = signal(null);
@@ -60,12 +63,17 @@ export class NgtcPhysics {
60
63
  };
61
64
  afterNextRender(() => {
62
65
  this.worker.set(new CannonWorkerAPI(this.options()));
63
- this.connectWorker();
64
- this.updateWorkerState('axisIndex');
65
- this.updateWorkerState('broadphase');
66
- this.updateWorkerState('gravity');
67
- this.updateWorkerState('iterations');
68
- this.updateWorkerState('tolerance');
66
+ });
67
+ effect((onCleanup) => {
68
+ const cleanup = this.connectWorkerEffect();
69
+ onCleanup(() => cleanup?.());
70
+ });
71
+ effect(() => {
72
+ this.updateWorkerStateEffect('axisIndex', this.axisIndex);
73
+ this.updateWorkerStateEffect('broadphase', this.broadphase);
74
+ this.updateWorkerStateEffect('gravity', this.gravity);
75
+ this.updateWorkerStateEffect('iterations', this.iterations);
76
+ this.updateWorkerStateEffect('tolerance', this.tolerance);
69
77
  });
70
78
  let timeSinceLastCalled = 0;
71
79
  injectBeforeRender(({ delta }) => {
@@ -80,31 +88,27 @@ export class NgtcPhysics {
80
88
  this.ref?.destroy();
81
89
  });
82
90
  }
83
- connectWorker() {
84
- this.autoEffect(() => {
85
- const worker = this.worker();
86
- if (!worker)
87
- return;
88
- worker.connect();
89
- worker.init();
90
- worker.on('collide', this.collideHandler.bind(this));
91
- worker.on('collideBegin', this.collideBeginHandler.bind(this));
92
- worker.on('collideEnd', this.collideEndHandler.bind(this));
93
- worker.on('frame', this.frameHandler.bind(this));
94
- worker.on('rayhit', this.rayhitHandler.bind(this));
95
- return () => {
96
- worker.terminate();
97
- worker.removeAllListeners();
98
- };
99
- });
91
+ connectWorkerEffect() {
92
+ const worker = this.worker();
93
+ if (!worker)
94
+ return;
95
+ worker.connect();
96
+ worker.init();
97
+ worker.on('collide', this.collideHandler.bind(this));
98
+ worker.on('collideBegin', this.collideBeginHandler.bind(this));
99
+ worker.on('collideEnd', this.collideEndHandler.bind(this));
100
+ worker.on('frame', this.frameHandler.bind(this));
101
+ worker.on('rayhit', this.rayhitHandler.bind(this));
102
+ return () => {
103
+ worker.terminate();
104
+ worker.removeAllListeners();
105
+ };
100
106
  }
101
- updateWorkerState(key) {
102
- const computedValue = computed(() => this.options()[key]);
103
- this.autoEffect(() => {
104
- const [worker, value] = [untracked(this.worker), computedValue()];
105
- // @ts-expect-error - we know key is a valid key of CannonWorkerAPI
106
- worker[key] = value;
107
- });
107
+ updateWorkerStateEffect(key, option) {
108
+ const worker = this.worker();
109
+ if (!worker)
110
+ return;
111
+ Object.assign(worker, { [key]: option() });
108
112
  }
109
113
  collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
110
114
  const { events, refs } = this.api;
@@ -173,12 +177,12 @@ export class NgtcPhysics {
173
177
  if (cb)
174
178
  cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
175
179
  }
176
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
177
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
181
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.4", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
178
182
  <ng-content />
179
183
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
180
184
  }
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, decorators: [{
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcPhysics, decorators: [{
182
186
  type: Component,
183
187
  args: [{
184
188
  selector: 'ngtc-physics',
@@ -189,4 +193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
189
193
  changeDetection: ChangeDetectionStrategy.OnPush,
190
194
  }]
191
195
  }], ctorParameters: () => [] });
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNOLGVBQWUsR0FhZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFZLFVBQVUsRUFBbUIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQWUvRixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRXhCLFNBQVMsS0FBSyxDQUNiLEtBQWEsRUFDYixTQUE0QixFQUM1QixXQUE4QixFQUM5QixLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQWlCO0lBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxF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LEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNwRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksZ0JBQWdCO1lBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBNkI7UUFDNUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsSUFBSSxFQUFFO1lBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7OEdBakpXLFdBQVc7a0dBQVgsV0FBVyxrTkFMYjs7RUFFVDs7MkZBR1csV0FBVztrQkFSdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHREZXN0cm95UmVmLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdFNpZ25hbCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHRDYW5ub25Xb3JrZXJQcm9wcyxcblx0Q29sbGlkZUJlZ2luRXZlbnQsXG5cdENvbGxpZGVFbmRFdmVudCxcblx0Q29sbGlkZUV2ZW50LFxuXHRSYXloaXRFdmVudCxcblx0UmVmcyxcblx0U3Vic2NyaXB0aW9ucyxcblx0V29ya2VyQ29sbGlkZUJlZ2luRXZlbnQsXG5cdFdvcmtlckNvbGxpZGVFbmRFdmVudCxcblx0V29ya2VyQ29sbGlkZUV2ZW50LFxuXHRXb3JrZXJGcmFtZU1lc3NhZ2UsXG5cdFdvcmtlclJheWhpdEV2ZW50LFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEluc3RhbmNlZE1lc2gsIE1hdHJpeDQsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBRdWF0ZXJuaW9uVHVwbGUsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0Nhbm5vbldvcmtlckV2ZW50cyB7XG5cdGNvbGxpZGU6IFdvcmtlckNvbGxpZGVFdmVudDtcblx0Y29sbGlkZUJlZ2luOiBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudDtcblx0Y29sbGlkZUVuZDogV29ya2VyQ29sbGlkZUVuZEV2ZW50O1xuXHRmcmFtZTogV29ya2VyRnJhbWVNZXNzYWdlO1xuXHRyYXloaXQ6IFdvcmtlclJheWhpdEV2ZW50O1xufVxuXG5leHBvcnQgdHlwZSBOZ3RjQ2Fubm9uV29ya2VyID0gQ2Fubm9uV29ya2VyQVBJICYge1xuXHRvbjogPEsgZXh0ZW5kcyBrZXlvZiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzPihldmVudDogSywgY2I6IChkYXRhOiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzW0tdWydkYXRhJ10pID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHYgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgcyA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpO1xuY29uc3QgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5jb25zdCBtID0gbmV3IE1hdHJpeDQoKTtcblxuZnVuY3Rpb24gYXBwbHkoXG5cdGluZGV4OiBudW1iZXIsXG5cdHBvc2l0aW9uczogQXJyYXlMaWtlPG51bWJlcj4sXG5cdHF1YXRlcm5pb25zOiBBcnJheUxpa2U8bnVtYmVyPixcblx0c2NhbGUgPSBzLFxuXHRvYmplY3Q/OiBPYmplY3QzRCxcbikge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zIGFzIFF1YXRlcm5pb25UdXBsZSwgaW5kZXggKiA0KSwgc2NhbGUpO1xuXHRcdGlmIChvYmplY3QpIHtcblx0XHRcdG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRvYmplY3QubWF0cml4LmNvcHkobSk7XG5cdFx0fVxuXHRcdHJldHVybiBtO1xuXHR9XG5cdHJldHVybiBtLmlkZW50aXR5KCk7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZSgpIHtcblx0Y29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblx0cmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKHZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkgPyBmYWxzZSA6ICEhdmFsdWVzLnB1c2godmFsdWUpKTtcbn1cblxudHlwZSBOZ3RjQ2Fubm9uRXZlbnQgPSBDb2xsaWRlQmVnaW5FdmVudCB8IENvbGxpZGVFbmRFdmVudCB8IENvbGxpZGVFdmVudCB8IFJheWhpdEV2ZW50O1xudHlwZSBOZ3RjQ2FsbGJhY2tCeVR5cGU8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+ID0ge1xuXHRbSyBpbiBUWyd0eXBlJ11dPzogVCBleHRlbmRzIHsgdHlwZTogSyB9ID8gKGU6IFQpID0+IHZvaWQgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNDYW5ub25FdmVudHMgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsPE5ndGNDYWxsYmFja0J5VHlwZTxOZ3RjQ2Fubm9uRXZlbnQ+Pj47XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0gUmVjb3JkPHN0cmluZywgVmVjdG9yMz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y1BoeXNpY3NJbnB1dHMgZXh0ZW5kcyBDYW5ub25Xb3JrZXJQcm9wcyB7XG5cdGlzUGF1c2VkPzogYm9vbGVhbjtcblx0bWF4U3ViU3RlcHM/OiBudW1iZXI7XG5cdHNob3VsZEludmFsaWRhdGU/OiBib29sZWFuO1xuXHRzdGVwU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUGh5c2ljc0FwaSB7XG5cdGJvZGllczogeyBbdXVpZDogc3RyaW5nXTogbnVtYmVyIH07XG5cdGV2ZW50czogTmd0Y0Nhbm5vbkV2ZW50cztcblx0cmVmczogUmVmcztcblx0c2NhbGVPdmVycmlkZXM6IFNjYWxlT3ZlcnJpZGVzO1xuXHRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25zO1xuXHR3b3JrZXI6IFNpZ25hbDxDYW5ub25Xb3JrZXJBUEk+O1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0Y1BoeXNpY3NJbnB1dHMgPSB7XG5cdGFsbG93U2xlZXA6IGZhbHNlLFxuXHRheGlzSW5kZXg6IDAsXG5cdGJyb2FkcGhhc2U6ICdOYWl2ZScsXG5cdGRlZmF1bHRDb250YWN0TWF0ZXJpYWw6IHsgY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzOiAxZTYgfSxcblx0ZnJpY3Rpb25HcmF2aXR5OiBudWxsLFxuXHRncmF2aXR5OiBbMCwgLTkuODEsIDBdLFxuXHRpc1BhdXNlZDogZmFsc2UsXG5cdGl0ZXJhdGlvbnM6IDUsXG5cdG1heFN1YlN0ZXBzOiAxMCxcblx0cXVhdE5vcm1hbGl6ZUZhc3Q6IGZhbHNlLFxuXHRxdWF0Tm9ybWFsaXplU2tpcDogMCxcblx0c2hvdWxkSW52YWxpZGF0ZTogdHJ1ZSxcblx0c2l6ZTogMTAwMCxcblx0c29sdmVyOiAnR1MnLFxuXHRzdGVwU2l6ZTogMSAvIDYwLFxuXHR0b2xlcmFuY2U6IDAuMDAxLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0Yy1waHlzaWNzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGVudCAvPlxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0Y1BoeXNpY3Mge1xuXHRwcml2YXRlIGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd29ya2VyIGlzIG5vdCBudWxsYWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlICEgb3BlcmF0b3Jcblx0cHJpdmF0ZSB3b3JrZXIgPSBzaWduYWw8Q2Fubm9uV29ya2VyQVBJPihudWxsKTtcblxuXHRhcGk6IE5ndGNQaHlzaWNzQXBpID0ge1xuXHRcdGJvZGllczoge30sXG5cdFx0ZXZlbnRzOiB7fSxcblx0XHRyZWZzOiB7fSxcblx0XHRzY2FsZU92ZXJyaWRlczoge30sXG5cdFx0c3Vic2NyaXB0aW9uczoge30sXG5cdFx0d29ya2VyOiB0aGlzLndvcmtlci5hc1JlYWRvbmx5KCksXG5cdH07XG5cblx0cHJpdmF0ZSByZWY/OiBFbWJlZGRlZFZpZXdSZWY8eyAkaW1wbGljaXQ6IE5ndGNQaHlzaWNzQXBpIH0+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLndvcmtlci5zZXQobmV3IENhbm5vbldvcmtlckFQSSh0aGlzLm9wdGlvbnMoKSkpO1xuXHRcdFx0dGhpcy5jb25uZWN0V29ya2VyKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdheGlzSW5kZXgnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2Jyb2FkcGhhc2UnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2dyYXZpdHknKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2l0ZXJhdGlvbnMnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ3RvbGVyYW5jZScpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSAwO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0aWYgKGlzUGF1c2VkIHx8ICF3b3JrZXIgfHwgc3RlcFNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCArPSBkZWx0YTtcblx0XHRcdHdvcmtlci5zdGVwKHsgbWF4U3ViU3RlcHMsIHN0ZXBTaXplLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMucmVmPy5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbm5lY3RXb3JrZXIoKSB7XG5cdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCkgYXMgTmd0Y0Nhbm5vbldvcmtlcjtcblx0XHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHRcdHdvcmtlci5jb25uZWN0KCk7XG5cdFx0XHR3b3JrZXIuaW5pdCgpO1xuXG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdjb2xsaWRlQmVnaW4nLCB0aGlzLmNvbGxpZGVCZWdpbkhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGVFbmQnLCB0aGlzLmNvbGxpZGVFbmRIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdyYXloaXQnLCB0aGlzLnJheWhpdEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdFx0d29ya2VyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlV29ya2VyU3RhdGUoa2V5OiBrZXlvZiBOZ3RjUGh5c2ljc0lucHV0cykge1xuXHRcdGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKVtrZXldKTtcblxuXHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbd29ya2VyLCB2YWx1ZV0gPSBbdW50cmFja2VkKHRoaXMud29ya2VyKSwgY29tcHV0ZWRWYWx1ZSgpXTtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSB3ZSBrbm93IGtleSBpcyBhIHZhbGlkIGtleSBvZiBDYW5ub25Xb3JrZXJBUElcblx0XHRcdHdvcmtlcltrZXldID0gdmFsdWU7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVIYW5kbGVyKHsgYm9keSwgY29udGFjdDogeyBiaSwgYmosIC4uLmNvbnRhY3RSZXN0IH0sIHRhcmdldCwgLi4ucmVzdCB9OiBXb3JrZXJDb2xsaWRlRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t0YXJnZXRdPy5jb2xsaWRlO1xuXHRcdGlmIChjYikge1xuXHRcdFx0Y2IoeyBib2R5OiByZWZzW2JvZHldLCBjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQ6IHJlZnNbdGFyZ2V0XSwgLi4ucmVzdCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVCZWdpbkhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUJlZ2luRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQSkgY2JBKHsgYm9keTogcmVmc1tib2R5Ql0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUFdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUVuZEhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUVuZEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGk7XG5cdFx0Y29uc3QgY2JBID0gZXZlbnRzW2JvZHlBXT8uY29sbGlkZUVuZDtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlRW5kJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkIpIGNiQih7IGJvZHk6IHJlZnNbYm9keUFdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlCXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmcmFtZUhhbmRsZXIoe1xuXHRcdGFjdGl2ZSxcblx0XHRib2RpZXM6IHV1aWRzID0gW10sXG5cdFx0b2JzZXJ2YXRpb25zLFxuXHRcdHBvc2l0aW9ucyxcblx0XHRxdWF0ZXJuaW9ucyxcblx0fTogV29ya2VyRnJhbWVNZXNzYWdlWydkYXRhJ10pIHtcblx0XHRjb25zdCBbeyBzaG91bGRJbnZhbGlkYXRlIH0sIHsgYm9kaWVzLCBzdWJzY3JpcHRpb25zLCByZWZzLCBzY2FsZU92ZXJyaWRlcyB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLFxuXHRcdFx0dGhpcy5hcGksXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXVpZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGJvZGllc1t1dWlkc1tpXV0gPSBpO1xuXHRcdH1cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2UgY2xlYXJseSBrbm93IHRoZSB0eXBlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHR5cGVzY3JpcHQgY2FuJ3QgZGVhbCB3aXRoIGl0XG5cdFx0XHRjYiAmJiBjYih2YWx1ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKCFhY3RpdmUpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBJbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cbn1cbiJdfQ==
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsZUFBZSxFQUNmLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNOLGVBQWUsR0FhZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBWSxVQUFVLEVBQW1CLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFlL0YsTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN4QixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7QUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUV4QixTQUFTLEtBQUssQ0FDYixLQUFhLEVBQ2IsU0FBNEIsRUFDNUIsV0FBOEIsRUFDOUIsS0FBSyxHQUFHLENBQUMsRUFDVCxNQUFpQjtJQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQThCLEVBQUUs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QUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDOzhHQTFKVyxXQUFXO2tHQUFYLFdBQVcsa05BTGI7O0VBRVQ7OzJGQUdXLFdBQVc7a0JBUnZCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7O0VBRVQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RGVzdHJveVJlZixcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRTaWduYWwsXG5cdGFmdGVyTmV4dFJlbmRlcixcblx0ZWZmZWN0LFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuXHRDYW5ub25Xb3JrZXJBUEksXG5cdENhbm5vbldvcmtlclByb3BzLFxuXHRDb2xsaWRlQmVnaW5FdmVudCxcblx0Q29sbGlkZUVuZEV2ZW50LFxuXHRDb2xsaWRlRXZlbnQsXG5cdFJheWhpdEV2ZW50LFxuXHRSZWZzLFxuXHRTdWJzY3JpcHRpb25zLFxuXHRXb3JrZXJDb2xsaWRlQmVnaW5FdmVudCxcblx0V29ya2VyQ29sbGlkZUVuZEV2ZW50LFxuXHRXb3JrZXJDb2xsaWRlRXZlbnQsXG5cdFdvcmtlckZyYW1lTWVzc2FnZSxcblx0V29ya2VyUmF5aGl0RXZlbnQsXG59IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHsgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgSW5zdGFuY2VkTWVzaCwgTWF0cml4NCwgT2JqZWN0M0QsIFF1YXRlcm5pb24sIFF1YXRlcm5pb25UdXBsZSwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzIHtcblx0Y29sbGlkZTogV29ya2VyQ29sbGlkZUV2ZW50O1xuXHRjb2xsaWRlQmVnaW46IFdvcmtlckNvbGxpZGVCZWdpbkV2ZW50O1xuXHRjb2xsaWRlRW5kOiBXb3JrZXJDb2xsaWRlRW5kRXZlbnQ7XG5cdGZyYW1lOiBXb3JrZXJGcmFtZU1lc3NhZ2U7XG5cdHJheWhpdDogV29ya2VyUmF5aGl0RXZlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIE5ndGNDYW5ub25Xb3JrZXIgPSBDYW5ub25Xb3JrZXJBUEkgJiB7XG5cdG9uOiA8SyBleHRlbmRzIGtleW9mIE5ndGNDYW5ub25Xb3JrZXJFdmVudHM+KGV2ZW50OiBLLCBjYjogKGRhdGE6IE5ndGNDYW5ub25Xb3JrZXJFdmVudHNbS11bJ2RhdGEnXSkgPT4gdm9pZCkgPT4gdm9pZDtcblx0cmVtb3ZlQWxsTGlzdGVuZXJzOiAoKSA9PiB2b2lkO1xufTtcblxuY29uc3QgdiA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBzID0gbmV3IFZlY3RvcjMoMSwgMSwgMSk7XG5jb25zdCBxID0gbmV3IFF1YXRlcm5pb24oKTtcbmNvbnN0IG0gPSBuZXcgTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBhcHBseShcblx0aW5kZXg6IG51bWJlcixcblx0cG9zaXRpb25zOiBBcnJheUxpa2U8bnVtYmVyPixcblx0cXVhdGVybmlvbnM6IEFycmF5TGlrZTxudW1iZXI+LFxuXHRzY2FsZSA9IHMsXG5cdG9iamVjdD86IE9iamVjdDNELFxuKSB7XG5cdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0bS5jb21wb3NlKHYuZnJvbUFycmF5KHBvc2l0aW9ucywgaW5kZXggKiAzKSwgcS5mcm9tQXJyYXkocXVhdGVybmlvbnMgYXMgUXVhdGVybmlvblR1cGxlLCBpbmRleCAqIDQpLCBzY2FsZSk7XG5cdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0b2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdG9iamVjdC5tYXRyaXguY29weShtKTtcblx0XHR9XG5cdFx0cmV0dXJuIG07XG5cdH1cblx0cmV0dXJuIG0uaWRlbnRpdHkoKTtcbn1cblxuZnVuY3Rpb24gdW5pcXVlKCkge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRyZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiAodmFsdWVzLmluY2x1ZGVzKHZhbHVlKSA/IGZhbHNlIDogISF2YWx1ZXMucHVzaCh2YWx1ZSkpO1xufVxuXG50eXBlIE5ndGNDYW5ub25FdmVudCA9IENvbGxpZGVCZWdpbkV2ZW50IHwgQ29sbGlkZUVuZEV2ZW50IHwgQ29sbGlkZUV2ZW50IHwgUmF5aGl0RXZlbnQ7XG50eXBlIE5ndGNDYWxsYmFja0J5VHlwZTxUIGV4dGVuZHMgeyB0eXBlOiBzdHJpbmcgfT4gPSB7XG5cdFtLIGluIFRbJ3R5cGUnXV0/OiBUIGV4dGVuZHMgeyB0eXBlOiBLIH0gPyAoZTogVCkgPT4gdm9pZCA6IG5ldmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y0Nhbm5vbkV2ZW50cyA9IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8Tmd0Y0NhbGxiYWNrQnlUeXBlPE5ndGNDYW5ub25FdmVudD4+PjtcblxuZXhwb3J0IHR5cGUgU2NhbGVPdmVycmlkZXMgPSBSZWNvcmQ8c3RyaW5nLCBWZWN0b3IzPjtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUGh5c2ljc09wdGlvbnMgZXh0ZW5kcyBDYW5ub25Xb3JrZXJQcm9wcyB7XG5cdGlzUGF1c2VkPzogYm9vbGVhbjtcblx0bWF4U3ViU3RlcHM/OiBudW1iZXI7XG5cdHNob3VsZEludmFsaWRhdGU/OiBib29sZWFuO1xuXHRzdGVwU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUGh5c2ljc0FwaSB7XG5cdGJvZGllczogeyBbdXVpZDogc3RyaW5nXTogbnVtYmVyIH07XG5cdGV2ZW50czogTmd0Y0Nhbm5vbkV2ZW50cztcblx0cmVmczogUmVmcztcblx0c2NhbGVPdmVycmlkZXM6IFNjYWxlT3ZlcnJpZGVzO1xuXHRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25zO1xuXHR3b3JrZXI6IFNpZ25hbDxDYW5ub25Xb3JrZXJBUEk+O1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0Y1BoeXNpY3NPcHRpb25zID0ge1xuXHRhbGxvd1NsZWVwOiBmYWxzZSxcblx0YXhpc0luZGV4OiAwLFxuXHRicm9hZHBoYXNlOiAnTmFpdmUnLFxuXHRkZWZhdWx0Q29udGFjdE1hdGVyaWFsOiB7IGNvbnRhY3RFcXVhdGlvblN0aWZmbmVzczogMWU2IH0sXG5cdGZyaWN0aW9uR3Jhdml0eTogbnVsbCxcblx0Z3Jhdml0eTogWzAsIC05LjgxLCAwXSxcblx0aXNQYXVzZWQ6IGZhbHNlLFxuXHRpdGVyYXRpb25zOiA1LFxuXHRtYXhTdWJTdGVwczogMTAsXG5cdHF1YXROb3JtYWxpemVGYXN0OiBmYWxzZSxcblx0cXVhdE5vcm1hbGl6ZVNraXA6IDAsXG5cdHNob3VsZEludmFsaWRhdGU6IHRydWUsXG5cdHNpemU6IDEwMDAsXG5cdHNvbHZlcjogJ0dTJyxcblx0c3RlcFNpemU6IDEgLyA2MCxcblx0dG9sZXJhbmNlOiAwLjAwMSxcbn07XG5cbnR5cGUgTmd0c1BoeXNpY3NVcGRhdGFibGVPcHRpb25zID0gRXh0cmFjdDxcblx0a2V5b2YgTmd0Y1BoeXNpY3NPcHRpb25zLFxuXHQnZ3Jhdml0eScgfCAnaXRlcmF0aW9ucycgfCAndG9sZXJhbmNlJyB8ICdicm9hZHBoYXNlJyB8ICdheGlzSW5kZXgnXG4+O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RjLXBoeXNpY3MnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZy1jb250ZW50IC8+XG5cdGAsXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RjUGh5c2ljcyB7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIGF4aXNJbmRleCA9IHBpY2sodGhpcy5vcHRpb25zLCAnYXhpc0luZGV4Jyk7XG5cdHByaXZhdGUgYnJvYWRwaGFzZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnYnJvYWRwaGFzZScpO1xuXHRwcml2YXRlIGdyYXZpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2dyYXZpdHknKTtcblx0cHJpdmF0ZSBpdGVyYXRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsICdpdGVyYXRpb25zJyk7XG5cdHByaXZhdGUgdG9sZXJhbmNlID0gcGljayh0aGlzLm9wdGlvbnMsICd0b2xlcmFuY2UnKTtcblxuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd29ya2VyIGlzIG5vdCBudWxsYWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlICEgb3BlcmF0b3Jcblx0cHJpdmF0ZSB3b3JrZXIgPSBzaWduYWw8Q2Fubm9uV29ya2VyQVBJPihudWxsKTtcblxuXHRhcGk6IE5ndGNQaHlzaWNzQXBpID0ge1xuXHRcdGJvZGllczoge30sXG5cdFx0ZXZlbnRzOiB7fSxcblx0XHRyZWZzOiB7fSxcblx0XHRzY2FsZU92ZXJyaWRlczoge30sXG5cdFx0c3Vic2NyaXB0aW9uczoge30sXG5cdFx0d29ya2VyOiB0aGlzLndvcmtlci5hc1JlYWRvbmx5KCksXG5cdH07XG5cblx0cHJpdmF0ZSByZWY/OiBFbWJlZGRlZFZpZXdSZWY8eyAkaW1wbGljaXQ6IE5ndGNQaHlzaWNzQXBpIH0+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLndvcmtlci5zZXQobmV3IENhbm5vbldvcmtlckFQSSh0aGlzLm9wdGlvbnMoKSkpO1xuXHRcdH0pO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGNsZWFudXAgPSB0aGlzLmNvbm5lY3RXb3JrZXJFZmZlY3QoKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBjbGVhbnVwPy4oKSk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0dGhpcy51cGRhdGVXb3JrZXJTdGF0ZUVmZmVjdCgnYXhpc0luZGV4JywgdGhpcy5heGlzSW5kZXgpO1xuXHRcdFx0dGhpcy51cGRhdGVXb3JrZXJTdGF0ZUVmZmVjdCgnYnJvYWRwaGFzZScsIHRoaXMuYnJvYWRwaGFzZSk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlRWZmZWN0KCdncmF2aXR5JywgdGhpcy5ncmF2aXR5KTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGVFZmZlY3QoJ2l0ZXJhdGlvbnMnLCB0aGlzLml0ZXJhdGlvbnMpO1xuXHRcdFx0dGhpcy51cGRhdGVXb3JrZXJTdGF0ZUVmZmVjdCgndG9sZXJhbmNlJywgdGhpcy50b2xlcmFuY2UpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSAwO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0aWYgKGlzUGF1c2VkIHx8ICF3b3JrZXIgfHwgc3RlcFNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCArPSBkZWx0YTtcblx0XHRcdHdvcmtlci5zdGVwKHsgbWF4U3ViU3RlcHMsIHN0ZXBTaXplLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMucmVmPy5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbm5lY3RXb3JrZXJFZmZlY3QoKSB7XG5cdFx0Y29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXIoKSBhcyBOZ3RjQ2Fubm9uV29ya2VyO1xuXHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHR3b3JrZXIuY29ubmVjdCgpO1xuXHRcdHdvcmtlci5pbml0KCk7XG5cblx0XHR3b3JrZXIub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdHdvcmtlci5vbignY29sbGlkZUJlZ2luJywgdGhpcy5jb2xsaWRlQmVnaW5IYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdHdvcmtlci5vbignY29sbGlkZUVuZCcsIHRoaXMuY29sbGlkZUVuZEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0d29ya2VyLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdHdvcmtlci5vbigncmF5aGl0JywgdGhpcy5yYXloaXRIYW5kbGVyLmJpbmQodGhpcykpO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdHdvcmtlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVXb3JrZXJTdGF0ZUVmZmVjdDxUVXBkYXRhYmxlS2V5IGV4dGVuZHMgTmd0c1BoeXNpY3NVcGRhdGFibGVPcHRpb25zPihcblx0XHRrZXk6IFRVcGRhdGFibGVLZXksXG5cdFx0b3B0aW9uOiAoKSA9PiBOZ3RjUGh5c2ljc09wdGlvbnNbVFVwZGF0YWJsZUtleV0sXG5cdCkge1xuXHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCk7XG5cdFx0aWYgKCF3b3JrZXIpIHJldHVybjtcblx0XHRPYmplY3QuYXNzaWduKHdvcmtlciwgeyBba2V5XTogb3B0aW9uKCkgfSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVIYW5kbGVyKHsgYm9keSwgY29udGFjdDogeyBiaSwgYmosIC4uLmNvbnRhY3RSZXN0IH0sIHRhcmdldCwgLi4ucmVzdCB9OiBXb3JrZXJDb2xsaWRlRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t0YXJnZXRdPy5jb2xsaWRlO1xuXHRcdGlmIChjYikge1xuXHRcdFx0Y2IoeyBib2R5OiByZWZzW2JvZHldLCBjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQ6IHJlZnNbdGFyZ2V0XSwgLi4ucmVzdCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVCZWdpbkhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUJlZ2luRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQSkgY2JBKHsgYm9keTogcmVmc1tib2R5Ql0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUFdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUVuZEhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUVuZEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGk7XG5cdFx0Y29uc3QgY2JBID0gZXZlbnRzW2JvZHlBXT8uY29sbGlkZUVuZDtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlRW5kJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkIpIGNiQih7IGJvZHk6IHJlZnNbYm9keUFdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlCXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmcmFtZUhhbmRsZXIoe1xuXHRcdGFjdGl2ZSxcblx0XHRib2RpZXM6IHV1aWRzID0gW10sXG5cdFx0b2JzZXJ2YXRpb25zLFxuXHRcdHBvc2l0aW9ucyxcblx0XHRxdWF0ZXJuaW9ucyxcblx0fTogV29ya2VyRnJhbWVNZXNzYWdlWydkYXRhJ10pIHtcblx0XHRjb25zdCBbeyBzaG91bGRJbnZhbGlkYXRlIH0sIHsgYm9kaWVzLCBzdWJzY3JpcHRpb25zLCByZWZzLCBzY2FsZU92ZXJyaWRlcyB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLFxuXHRcdFx0dGhpcy5hcGksXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXVpZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGJvZGllc1t1dWlkc1tpXV0gPSBpO1xuXHRcdH1cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2UgY2xlYXJseSBrbm93IHRoZSB0eXBlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHR5cGVzY3JpcHQgY2FuJ3QgZGVhbCB3aXRoIGl0XG5cdFx0XHRjYiAmJiBjYih2YWx1ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKCFhY3RpdmUpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBJbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cbn1cbiJdfQ==
@@ -73,10 +73,10 @@ class NgtcDebug {
73
73
  this.bodies.splice(debugBodyIndex, 1);
74
74
  delete this.bodyMap[uuid];
75
75
  }
76
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
77
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtcDebug, isStandalone: true, selector: "ngtc-physics[debug]", inputs: { debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
76
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
77
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.4", type: NgtcDebug, isStandalone: true, selector: "ngtc-physics[debug]", inputs: { debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
78
78
  }
79
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, decorators: [{
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcDebug, decorators: [{
80
80
  type: Directive,
81
81
  args: [{ selector: 'ngtc-physics[debug]', standalone: true }]
82
82
  }], ctorParameters: () => [] });
@@ -1,8 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, signal, afterNextRender, inject, DestroyRef, computed, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { input, signal, afterNextRender, effect, inject, DestroyRef, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { CannonWorkerAPI } from '@pmndrs/cannon-worker-api';
4
- import { injectStore, injectBeforeRender } from 'angular-three';
5
- import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { injectStore, pick, injectBeforeRender } from 'angular-three';
6
5
  import { mergeInputs } from 'ngxtension/inject-inputs';
7
6
  import { Vector3, Quaternion, Matrix4, InstancedMesh } from 'three';
8
7
 
@@ -45,9 +44,13 @@ const defaultOptions = {
45
44
  };
46
45
  class NgtcPhysics {
47
46
  constructor() {
48
- this.autoEffect = injectAutoEffect();
49
47
  this.store = injectStore();
50
48
  this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
49
+ this.axisIndex = pick(this.options, 'axisIndex');
50
+ this.broadphase = pick(this.options, 'broadphase');
51
+ this.gravity = pick(this.options, 'gravity');
52
+ this.iterations = pick(this.options, 'iterations');
53
+ this.tolerance = pick(this.options, 'tolerance');
51
54
  this.invalidate = this.store.select('invalidate');
52
55
  // @ts-expect-error - worker is not nullable, and we don't want to use ! operator
53
56
  this.worker = signal(null);
@@ -61,12 +64,17 @@ class NgtcPhysics {
61
64
  };
62
65
  afterNextRender(() => {
63
66
  this.worker.set(new CannonWorkerAPI(this.options()));
64
- this.connectWorker();
65
- this.updateWorkerState('axisIndex');
66
- this.updateWorkerState('broadphase');
67
- this.updateWorkerState('gravity');
68
- this.updateWorkerState('iterations');
69
- this.updateWorkerState('tolerance');
67
+ });
68
+ effect((onCleanup) => {
69
+ const cleanup = this.connectWorkerEffect();
70
+ onCleanup(() => cleanup?.());
71
+ });
72
+ effect(() => {
73
+ this.updateWorkerStateEffect('axisIndex', this.axisIndex);
74
+ this.updateWorkerStateEffect('broadphase', this.broadphase);
75
+ this.updateWorkerStateEffect('gravity', this.gravity);
76
+ this.updateWorkerStateEffect('iterations', this.iterations);
77
+ this.updateWorkerStateEffect('tolerance', this.tolerance);
70
78
  });
71
79
  let timeSinceLastCalled = 0;
72
80
  injectBeforeRender(({ delta }) => {
@@ -81,31 +89,27 @@ class NgtcPhysics {
81
89
  this.ref?.destroy();
82
90
  });
83
91
  }
84
- connectWorker() {
85
- this.autoEffect(() => {
86
- const worker = this.worker();
87
- if (!worker)
88
- return;
89
- worker.connect();
90
- worker.init();
91
- worker.on('collide', this.collideHandler.bind(this));
92
- worker.on('collideBegin', this.collideBeginHandler.bind(this));
93
- worker.on('collideEnd', this.collideEndHandler.bind(this));
94
- worker.on('frame', this.frameHandler.bind(this));
95
- worker.on('rayhit', this.rayhitHandler.bind(this));
96
- return () => {
97
- worker.terminate();
98
- worker.removeAllListeners();
99
- };
100
- });
92
+ connectWorkerEffect() {
93
+ const worker = this.worker();
94
+ if (!worker)
95
+ return;
96
+ worker.connect();
97
+ worker.init();
98
+ worker.on('collide', this.collideHandler.bind(this));
99
+ worker.on('collideBegin', this.collideBeginHandler.bind(this));
100
+ worker.on('collideEnd', this.collideEndHandler.bind(this));
101
+ worker.on('frame', this.frameHandler.bind(this));
102
+ worker.on('rayhit', this.rayhitHandler.bind(this));
103
+ return () => {
104
+ worker.terminate();
105
+ worker.removeAllListeners();
106
+ };
101
107
  }
102
- updateWorkerState(key) {
103
- const computedValue = computed(() => this.options()[key]);
104
- this.autoEffect(() => {
105
- const [worker, value] = [untracked(this.worker), computedValue()];
106
- // @ts-expect-error - we know key is a valid key of CannonWorkerAPI
107
- worker[key] = value;
108
- });
108
+ updateWorkerStateEffect(key, option) {
109
+ const worker = this.worker();
110
+ if (!worker)
111
+ return;
112
+ Object.assign(worker, { [key]: option() });
109
113
  }
110
114
  collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
111
115
  const { events, refs } = this.api;
@@ -174,12 +178,12 @@ class NgtcPhysics {
174
178
  if (cb)
175
179
  cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
176
180
  }
177
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
181
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
182
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.4", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
179
183
  <ng-content />
180
184
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
181
185
  }
182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, decorators: [{
186
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgtcPhysics, decorators: [{
183
187
  type: Component,
184
188
  args: [{
185
189
  selector: 'ngtc-physics',
@@ -1 +1 @@
1
- {"version":3,"file":"angular-three-cannon.mjs","sources":["../../../../libs/cannon/src/lib/physics.ts","../../../../libs/cannon/src/angular-three-cannon.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\tEmbeddedViewRef,\n\tSignal,\n\tafterNextRender,\n\tcomputed,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCannonWorkerAPI,\n\tCannonWorkerProps,\n\tCollideBeginEvent,\n\tCollideEndEvent,\n\tCollideEvent,\n\tRayhitEvent,\n\tRefs,\n\tSubscriptions,\n\tWorkerCollideBeginEvent,\n\tWorkerCollideEndEvent,\n\tWorkerCollideEvent,\n\tWorkerFrameMessage,\n\tWorkerRayhitEvent,\n} from '@pmndrs/cannon-worker-api';\nimport { injectBeforeRender, injectStore } from 'angular-three';\nimport { injectAutoEffect } from 'ngxtension/auto-effect';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { InstancedMesh, Matrix4, Object3D, Quaternion, QuaternionTuple, Vector3 } from 'three';\n\nexport interface NgtcCannonWorkerEvents {\n\tcollide: WorkerCollideEvent;\n\tcollideBegin: WorkerCollideBeginEvent;\n\tcollideEnd: WorkerCollideEndEvent;\n\tframe: WorkerFrameMessage;\n\trayhit: WorkerRayhitEvent;\n}\n\nexport type NgtcCannonWorker = CannonWorkerAPI & {\n\ton: <K extends keyof NgtcCannonWorkerEvents>(event: K, cb: (data: NgtcCannonWorkerEvents[K]['data']) => void) => void;\n\tremoveAllListeners: () => void;\n};\n\nconst v = new Vector3();\nconst s = new Vector3(1, 1, 1);\nconst q = new Quaternion();\nconst m = new Matrix4();\n\nfunction apply(\n\tindex: number,\n\tpositions: ArrayLike<number>,\n\tquaternions: ArrayLike<number>,\n\tscale = s,\n\tobject?: Object3D,\n) {\n\tif (index !== undefined) {\n\t\tm.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions as QuaternionTuple, index * 4), scale);\n\t\tif (object) {\n\t\t\tobject.matrixAutoUpdate = false;\n\t\t\tobject.matrix.copy(m);\n\t\t}\n\t\treturn m;\n\t}\n\treturn m.identity();\n}\n\nfunction unique() {\n\tconst values: unknown[] = [];\n\treturn (value: unknown) => (values.includes(value) ? false : !!values.push(value));\n}\n\ntype NgtcCannonEvent = CollideBeginEvent | CollideEndEvent | CollideEvent | RayhitEvent;\ntype NgtcCallbackByType<T extends { type: string }> = {\n\t[K in T['type']]?: T extends { type: K } ? (e: T) => void : never;\n};\n\nexport type NgtcCannonEvents = Record<string, Partial<NgtcCallbackByType<NgtcCannonEvent>>>;\n\nexport type ScaleOverrides = Record<string, Vector3>;\n\nexport interface NgtcPhysicsInputs extends CannonWorkerProps {\n\tisPaused?: boolean;\n\tmaxSubSteps?: number;\n\tshouldInvalidate?: boolean;\n\tstepSize?: number;\n}\n\nexport interface NgtcPhysicsApi {\n\tbodies: { [uuid: string]: number };\n\tevents: NgtcCannonEvents;\n\trefs: Refs;\n\tscaleOverrides: ScaleOverrides;\n\tsubscriptions: Subscriptions;\n\tworker: Signal<CannonWorkerAPI>;\n}\n\nconst defaultOptions: NgtcPhysicsInputs = {\n\tallowSleep: false,\n\taxisIndex: 0,\n\tbroadphase: 'Naive',\n\tdefaultContactMaterial: { contactEquationStiffness: 1e6 },\n\tfrictionGravity: null,\n\tgravity: [0, -9.81, 0],\n\tisPaused: false,\n\titerations: 5,\n\tmaxSubSteps: 10,\n\tquatNormalizeFast: false,\n\tquatNormalizeSkip: 0,\n\tshouldInvalidate: true,\n\tsize: 1000,\n\tsolver: 'GS',\n\tstepSize: 1 / 60,\n\ttolerance: 0.001,\n};\n\n@Component({\n\tselector: 'ngtc-physics',\n\tstandalone: true,\n\ttemplate: `\n\t\t<ng-content />\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgtcPhysics {\n\tprivate autoEffect = injectAutoEffect();\n\tprivate store = injectStore();\n\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate invalidate = this.store.select('invalidate');\n\t// @ts-expect-error - worker is not nullable, and we don't want to use ! operator\n\tprivate worker = signal<CannonWorkerAPI>(null);\n\n\tapi: NgtcPhysicsApi = {\n\t\tbodies: {},\n\t\tevents: {},\n\t\trefs: {},\n\t\tscaleOverrides: {},\n\t\tsubscriptions: {},\n\t\tworker: this.worker.asReadonly(),\n\t};\n\n\tprivate ref?: EmbeddedViewRef<{ $implicit: NgtcPhysicsApi }>;\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.worker.set(new CannonWorkerAPI(this.options()));\n\t\t\tthis.connectWorker();\n\t\t\tthis.updateWorkerState('axisIndex');\n\t\t\tthis.updateWorkerState('broadphase');\n\t\t\tthis.updateWorkerState('gravity');\n\t\t\tthis.updateWorkerState('iterations');\n\t\t\tthis.updateWorkerState('tolerance');\n\t\t});\n\n\t\tlet timeSinceLastCalled = 0;\n\t\tinjectBeforeRender(({ delta }) => {\n\t\t\tconst [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];\n\t\t\tif (isPaused || !worker || stepSize == null) return;\n\t\t\ttimeSinceLastCalled += delta;\n\t\t\tworker.step({ maxSubSteps, stepSize, timeSinceLastCalled });\n\t\t\ttimeSinceLastCalled = 0;\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.ref?.destroy();\n\t\t});\n\t}\n\n\tprivate connectWorker() {\n\t\tthis.autoEffect(() => {\n\t\t\tconst worker = this.worker() as NgtcCannonWorker;\n\t\t\tif (!worker) return;\n\n\t\t\tworker.connect();\n\t\t\tworker.init();\n\n\t\t\tworker.on('collide', this.collideHandler.bind(this));\n\t\t\tworker.on('collideBegin', this.collideBeginHandler.bind(this));\n\t\t\tworker.on('collideEnd', this.collideEndHandler.bind(this));\n\t\t\tworker.on('frame', this.frameHandler.bind(this));\n\t\t\tworker.on('rayhit', this.rayhitHandler.bind(this));\n\n\t\t\treturn () => {\n\t\t\t\tworker.terminate();\n\t\t\t\tworker.removeAllListeners();\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate updateWorkerState(key: keyof NgtcPhysicsInputs) {\n\t\tconst computedValue = computed(() => this.options()[key]);\n\n\t\tthis.autoEffect(() => {\n\t\t\tconst [worker, value] = [untracked(this.worker), computedValue()];\n\t\t\t// @ts-expect-error - we know key is a valid key of CannonWorkerAPI\n\t\t\tworker[key] = value;\n\t\t});\n\t}\n\n\tprivate collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }: WorkerCollideEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[target]?.collide;\n\t\tif (cb) {\n\t\t\tcb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });\n\t\t}\n\t}\n\n\tprivate collideBeginHandler({ bodyA, bodyB }: WorkerCollideBeginEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideBegin;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });\n\t\tconst cbB = events[bodyB]?.collideBegin;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });\n\t}\n\n\tprivate collideEndHandler({ bodyA, bodyB }: WorkerCollideEndEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideEnd;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });\n\t\tconst cbB = events[bodyB]?.collideEnd;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideEnd' });\n\t}\n\n\tprivate frameHandler({\n\t\tactive,\n\t\tbodies: uuids = [],\n\t\tobservations,\n\t\tpositions,\n\t\tquaternions,\n\t}: WorkerFrameMessage['data']) {\n\t\tconst [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [\n\t\t\tuntracked(this.options),\n\t\t\tthis.api,\n\t\t\tthis.invalidate(),\n\t\t];\n\t\tfor (let i = 0; i < uuids.length; i++) {\n\t\t\tbodies[uuids[i]] = i;\n\t\t}\n\t\tobservations.forEach(([id, value, type]) => {\n\t\t\tconst subscription = subscriptions[id] || {};\n\t\t\tconst cb = subscription[type];\n\t\t\t// @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it\n\t\t\tcb && cb(value);\n\t\t});\n\t\tif (!active) return;\n\t\tfor (const ref of Object.values(refs).filter(unique())) {\n\t\t\tif (ref instanceof InstancedMesh) {\n\t\t\t\tfor (let i = 0; i < ref.count; i++) {\n\t\t\t\t\tconst uuid = `${ref.uuid}/${i}`;\n\t\t\t\t\tconst index = bodies[uuid];\n\t\t\t\t\tif (index !== undefined) {\n\t\t\t\t\t\tref.setMatrixAt(i, apply(index, positions, quaternions, scaleOverrides[uuid]));\n\t\t\t\t\t\tref.instanceMatrix.needsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst scale = scaleOverrides[ref.uuid] || ref.scale;\n\t\t\t\tapply(bodies[ref.uuid], positions, quaternions, scale, ref);\n\t\t\t}\n\t\t}\n\t\tif (shouldInvalidate) invalidate();\n\t}\n\n\tprivate rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }: WorkerRayhitEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[uuid]?.rayhit;\n\t\tif (cb) cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angular-three-cannon.mjs","sources":["../../../../libs/cannon/src/lib/physics.ts","../../../../libs/cannon/src/angular-three-cannon.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\tEmbeddedViewRef,\n\tSignal,\n\tafterNextRender,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCannonWorkerAPI,\n\tCannonWorkerProps,\n\tCollideBeginEvent,\n\tCollideEndEvent,\n\tCollideEvent,\n\tRayhitEvent,\n\tRefs,\n\tSubscriptions,\n\tWorkerCollideBeginEvent,\n\tWorkerCollideEndEvent,\n\tWorkerCollideEvent,\n\tWorkerFrameMessage,\n\tWorkerRayhitEvent,\n} from '@pmndrs/cannon-worker-api';\nimport { injectBeforeRender, injectStore, pick } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { InstancedMesh, Matrix4, Object3D, Quaternion, QuaternionTuple, Vector3 } from 'three';\n\nexport interface NgtcCannonWorkerEvents {\n\tcollide: WorkerCollideEvent;\n\tcollideBegin: WorkerCollideBeginEvent;\n\tcollideEnd: WorkerCollideEndEvent;\n\tframe: WorkerFrameMessage;\n\trayhit: WorkerRayhitEvent;\n}\n\nexport type NgtcCannonWorker = CannonWorkerAPI & {\n\ton: <K extends keyof NgtcCannonWorkerEvents>(event: K, cb: (data: NgtcCannonWorkerEvents[K]['data']) => void) => void;\n\tremoveAllListeners: () => void;\n};\n\nconst v = new Vector3();\nconst s = new Vector3(1, 1, 1);\nconst q = new Quaternion();\nconst m = new Matrix4();\n\nfunction apply(\n\tindex: number,\n\tpositions: ArrayLike<number>,\n\tquaternions: ArrayLike<number>,\n\tscale = s,\n\tobject?: Object3D,\n) {\n\tif (index !== undefined) {\n\t\tm.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions as QuaternionTuple, index * 4), scale);\n\t\tif (object) {\n\t\t\tobject.matrixAutoUpdate = false;\n\t\t\tobject.matrix.copy(m);\n\t\t}\n\t\treturn m;\n\t}\n\treturn m.identity();\n}\n\nfunction unique() {\n\tconst values: unknown[] = [];\n\treturn (value: unknown) => (values.includes(value) ? false : !!values.push(value));\n}\n\ntype NgtcCannonEvent = CollideBeginEvent | CollideEndEvent | CollideEvent | RayhitEvent;\ntype NgtcCallbackByType<T extends { type: string }> = {\n\t[K in T['type']]?: T extends { type: K } ? (e: T) => void : never;\n};\n\nexport type NgtcCannonEvents = Record<string, Partial<NgtcCallbackByType<NgtcCannonEvent>>>;\n\nexport type ScaleOverrides = Record<string, Vector3>;\n\nexport interface NgtcPhysicsOptions extends CannonWorkerProps {\n\tisPaused?: boolean;\n\tmaxSubSteps?: number;\n\tshouldInvalidate?: boolean;\n\tstepSize?: number;\n}\n\nexport interface NgtcPhysicsApi {\n\tbodies: { [uuid: string]: number };\n\tevents: NgtcCannonEvents;\n\trefs: Refs;\n\tscaleOverrides: ScaleOverrides;\n\tsubscriptions: Subscriptions;\n\tworker: Signal<CannonWorkerAPI>;\n}\n\nconst defaultOptions: NgtcPhysicsOptions = {\n\tallowSleep: false,\n\taxisIndex: 0,\n\tbroadphase: 'Naive',\n\tdefaultContactMaterial: { contactEquationStiffness: 1e6 },\n\tfrictionGravity: null,\n\tgravity: [0, -9.81, 0],\n\tisPaused: false,\n\titerations: 5,\n\tmaxSubSteps: 10,\n\tquatNormalizeFast: false,\n\tquatNormalizeSkip: 0,\n\tshouldInvalidate: true,\n\tsize: 1000,\n\tsolver: 'GS',\n\tstepSize: 1 / 60,\n\ttolerance: 0.001,\n};\n\ntype NgtsPhysicsUpdatableOptions = Extract<\n\tkeyof NgtcPhysicsOptions,\n\t'gravity' | 'iterations' | 'tolerance' | 'broadphase' | 'axisIndex'\n>;\n\n@Component({\n\tselector: 'ngtc-physics',\n\tstandalone: true,\n\ttemplate: `\n\t\t<ng-content />\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgtcPhysics {\n\tprivate store = injectStore();\n\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate axisIndex = pick(this.options, 'axisIndex');\n\tprivate broadphase = pick(this.options, 'broadphase');\n\tprivate gravity = pick(this.options, 'gravity');\n\tprivate iterations = pick(this.options, 'iterations');\n\tprivate tolerance = pick(this.options, 'tolerance');\n\n\tprivate invalidate = this.store.select('invalidate');\n\t// @ts-expect-error - worker is not nullable, and we don't want to use ! operator\n\tprivate worker = signal<CannonWorkerAPI>(null);\n\n\tapi: NgtcPhysicsApi = {\n\t\tbodies: {},\n\t\tevents: {},\n\t\trefs: {},\n\t\tscaleOverrides: {},\n\t\tsubscriptions: {},\n\t\tworker: this.worker.asReadonly(),\n\t};\n\n\tprivate ref?: EmbeddedViewRef<{ $implicit: NgtcPhysicsApi }>;\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.worker.set(new CannonWorkerAPI(this.options()));\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst cleanup = this.connectWorkerEffect();\n\t\t\tonCleanup(() => cleanup?.());\n\t\t});\n\n\t\teffect(() => {\n\t\t\tthis.updateWorkerStateEffect('axisIndex', this.axisIndex);\n\t\t\tthis.updateWorkerStateEffect('broadphase', this.broadphase);\n\t\t\tthis.updateWorkerStateEffect('gravity', this.gravity);\n\t\t\tthis.updateWorkerStateEffect('iterations', this.iterations);\n\t\t\tthis.updateWorkerStateEffect('tolerance', this.tolerance);\n\t\t});\n\n\t\tlet timeSinceLastCalled = 0;\n\t\tinjectBeforeRender(({ delta }) => {\n\t\t\tconst [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];\n\t\t\tif (isPaused || !worker || stepSize == null) return;\n\t\t\ttimeSinceLastCalled += delta;\n\t\t\tworker.step({ maxSubSteps, stepSize, timeSinceLastCalled });\n\t\t\ttimeSinceLastCalled = 0;\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.ref?.destroy();\n\t\t});\n\t}\n\n\tprivate connectWorkerEffect() {\n\t\tconst worker = this.worker() as NgtcCannonWorker;\n\t\tif (!worker) return;\n\n\t\tworker.connect();\n\t\tworker.init();\n\n\t\tworker.on('collide', this.collideHandler.bind(this));\n\t\tworker.on('collideBegin', this.collideBeginHandler.bind(this));\n\t\tworker.on('collideEnd', this.collideEndHandler.bind(this));\n\t\tworker.on('frame', this.frameHandler.bind(this));\n\t\tworker.on('rayhit', this.rayhitHandler.bind(this));\n\n\t\treturn () => {\n\t\t\tworker.terminate();\n\t\t\tworker.removeAllListeners();\n\t\t};\n\t}\n\n\tprivate updateWorkerStateEffect<TUpdatableKey extends NgtsPhysicsUpdatableOptions>(\n\t\tkey: TUpdatableKey,\n\t\toption: () => NgtcPhysicsOptions[TUpdatableKey],\n\t) {\n\t\tconst worker = this.worker();\n\t\tif (!worker) return;\n\t\tObject.assign(worker, { [key]: option() });\n\t}\n\n\tprivate collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }: WorkerCollideEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[target]?.collide;\n\t\tif (cb) {\n\t\t\tcb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });\n\t\t}\n\t}\n\n\tprivate collideBeginHandler({ bodyA, bodyB }: WorkerCollideBeginEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideBegin;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });\n\t\tconst cbB = events[bodyB]?.collideBegin;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });\n\t}\n\n\tprivate collideEndHandler({ bodyA, bodyB }: WorkerCollideEndEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideEnd;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });\n\t\tconst cbB = events[bodyB]?.collideEnd;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideEnd' });\n\t}\n\n\tprivate frameHandler({\n\t\tactive,\n\t\tbodies: uuids = [],\n\t\tobservations,\n\t\tpositions,\n\t\tquaternions,\n\t}: WorkerFrameMessage['data']) {\n\t\tconst [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [\n\t\t\tuntracked(this.options),\n\t\t\tthis.api,\n\t\t\tthis.invalidate(),\n\t\t];\n\t\tfor (let i = 0; i < uuids.length; i++) {\n\t\t\tbodies[uuids[i]] = i;\n\t\t}\n\t\tobservations.forEach(([id, value, type]) => {\n\t\t\tconst subscription = subscriptions[id] || {};\n\t\t\tconst cb = subscription[type];\n\t\t\t// @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it\n\t\t\tcb && cb(value);\n\t\t});\n\t\tif (!active) return;\n\t\tfor (const ref of Object.values(refs).filter(unique())) {\n\t\t\tif (ref instanceof InstancedMesh) {\n\t\t\t\tfor (let i = 0; i < ref.count; i++) {\n\t\t\t\t\tconst uuid = `${ref.uuid}/${i}`;\n\t\t\t\t\tconst index = bodies[uuid];\n\t\t\t\t\tif (index !== undefined) {\n\t\t\t\t\t\tref.setMatrixAt(i, apply(index, positions, quaternions, scaleOverrides[uuid]));\n\t\t\t\t\t\tref.instanceMatrix.needsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst scale = scaleOverrides[ref.uuid] || ref.scale;\n\t\t\t\tapply(bodies[ref.uuid], positions, quaternions, scale, ref);\n\t\t\t}\n\t\t}\n\t\tif (shouldInvalidate) invalidate();\n\t}\n\n\tprivate rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }: WorkerRayhitEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[uuid]?.rayhit;\n\t\tif (cb) cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/lib/physics.d.ts CHANGED
@@ -23,7 +23,7 @@ type NgtcCallbackByType<T extends {
23
23
  };
24
24
  export type NgtcCannonEvents = Record<string, Partial<NgtcCallbackByType<NgtcCannonEvent>>>;
25
25
  export type ScaleOverrides = Record<string, Vector3>;
26
- export interface NgtcPhysicsInputs extends CannonWorkerProps {
26
+ export interface NgtcPhysicsOptions extends CannonWorkerProps {
27
27
  isPaused?: boolean;
28
28
  maxSubSteps?: number;
29
29
  shouldInvalidate?: boolean;
@@ -40,16 +40,20 @@ export interface NgtcPhysicsApi {
40
40
  worker: Signal<CannonWorkerAPI>;
41
41
  }
42
42
  export declare class NgtcPhysics {
43
- private autoEffect;
44
43
  private store;
45
- options: import("@angular/core").InputSignalWithTransform<NgtcPhysicsInputs, "" | Partial<NgtcPhysicsInputs>>;
44
+ options: import("@angular/core").InputSignalWithTransform<NgtcPhysicsOptions, "" | Partial<NgtcPhysicsOptions>>;
45
+ private axisIndex;
46
+ private broadphase;
47
+ private gravity;
48
+ private iterations;
49
+ private tolerance;
46
50
  private invalidate;
47
51
  private worker;
48
52
  api: NgtcPhysicsApi;
49
53
  private ref?;
50
54
  constructor();
51
- private connectWorker;
52
- private updateWorkerState;
55
+ private connectWorkerEffect;
56
+ private updateWorkerStateEffect;
53
57
  private collideHandler;
54
58
  private collideBeginHandler;
55
59
  private collideEndHandler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-three-cannon",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -70,4 +70,4 @@
70
70
  "default": "./fesm2022/angular-three-cannon-debug.mjs"
71
71
  }
72
72
  }
73
- }
73
+ }